使用Docker搭建MQTT服务器的过程详解

1. 拉取镜像

docker pull registry.cn-hangzhou.aliyuncs.com/synbop/emqttd:2.3.6

2. 运行镜像

  • –name 名字
  • -p 18083 服务器启动端口
  • -p 1882 TCP端口
  • -p 8083 WS端口
  • -p 8084 WSS端口
  • -p 8883 SSL端口
  • -d 指定容器

docker run --name emq -p 18083:18083 -p 1883:1883 -p 8084:8084 -p 8883:8883 -p 8083:8083 -d registry.cn-hangzhou.aliyuncs.com/synbop/emqttd:2.3.6

3. 进入emq服务页面

  在浏览器输入机器IP:18083就可以进入emqtt页面

  初始的账户 admin, 密码 public

4. 配置emq(对于V3.1.0)

  为emq的用户配置权限 , emq还支持多种数据库验证, 包括 mongo, redis, pgsql 等等, 有兴趣可以自行研究

# 进入容器, 不能用 /bin/bash 进入
docker exec -it emq /bin/sh

1.首先先关闭匿名认证(默认是开启的谁都能够登录)

# 编辑配置文件
vi /opt/emqttd/etc/emq.conf
# 更改允许匿名 True -> false
allow_anonymous = false

2.建立用户和权限的 mysql 表, 可以拉一个 mysql 容器, 也可以直接在你的 ubuntu 里的 mysql 中创建

CREATE DATABASE emq charset utf8;

use eqm;

CREATE TABLE mqtt_user (
id int(11) unsigned NOT NULL AUTO_INCREMENT,
username varchar(100) DEFAULT NULL,
password varchar(100) DEFAULT NULL,
salt varchar(20) DEFAULT NULL,
is_superuser tinyint(1) DEFAULT 0,
created datetime DEFAULT NULL,
PRIMARY KEY (id),
UNIQUE KEY mqtt_username (username)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

CREATE TABLE mqtt_acl (
id int(11) unsigned NOT NULL AUTO_INCREMENT,
allow int(1) DEFAULT NULL COMMENT '0: deny, 1: allow',
ipaddr varchar(60) DEFAULT NULL COMMENT 'IpAddress',
username varchar(100) DEFAULT NULL COMMENT 'Username',
clientid varchar(100) DEFAULT NULL COMMENT 'ClientId',
access int(2) NOT NULL COMMENT '1: subscribe, 2: publish, 3: pubsub',
topic varchar(100) NOT NULL DEFAULT '' COMMENT 'Topic Filter',
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

3.插入ACL规则 -ACL规则

   tips: !!! 不要直接按照下面的例子设置, 先查看ACL规则了解之后在根据自己情况进行配置

INSERT INTO `mqtt_acl` (`id`, `allow`, `ipaddr`, `username`, `clientid`, `access`, `topic`) VALUES
(1,1,NULL,'$all',NULL,2,'#'),
(2,0,NULL,'$all',NULL,1,'$SYS/#'),
(3,0,NULL,'$all',NULL,1,'eq #'),
(5,1,'127.0.0.1',NULL,NULL,2,'$SYS/#'),
(6,1,'127.0.0.1',NULL,NULL,2,'#'),
(7,1,NULL,'dashboard',NULL,1,'$SYS/#');

4.插入用户, 由此开始订阅与发布的 Client 都必须通过用户验证(sha256值请自行转换)

# 可以配置超级管理员(超级管理员会无视ACL规则对所有的topic都有订阅和推送的权限)
insert into mqtt_user (`username`, `password`) values ('admin', '03ac674216f3e15c761ee1a5e255f067953623c8b388b4459e13f978d7c846f4');
update mqtt_user set is_superuser=1 where id= 超级管理员ID ;

ps:注意 auth.mysql.password_hash(默认为sha256) 为sha256的话,新增用户时需要手动传递加密后的值,plain的话则无需加密,明码存放

5.修改emq的mysql配置文件

vi /opt/emqttd/etc/plugins/emq_auth_mysql.conf
auth.mysql.server = 你的mysql-IP:3306
auth.mysql.username = root
auth.mysql.password = xxxxxxxx
auth.mysql.database = emq

6.重启emq

/opt/emqttd/bin/ emqx stop
/opt/emqttd/bin/ emqx start
/opt/emqttd/bin/emqttd_ctl plugins load emq_auth_mysql   #开启mysql认证插件
  • ACL规则

  规则表字段说明:

  • allow:禁止(0),允许(1)
  • ipaddr:设置 IP 地址
  • username:连接客户端的用户名,此处的值如果设置为 $all 表示该规则适用于所有的用户
  • clientid:连接客户端的 Client ID
  • access:允许的操作:订阅(1),发布(2),订阅发布都可以(3)
  • topic:控制的主题,可以使用通配符,并且可以在主题中加入占位符来匹配客户端信息,例如 t/%c则在匹配时主题将会替换为当前客户端的 Client ID

%u:用户名

%c:Client ID

  示例

-- 所有用户不可以订阅系统主题
INSERT INTO mqtt_acl (allow, ipaddr, username, clientid, access, topic) VALUES (0, NULL, '$all', NULL, 1, '$SYS/#');

-- 允许 10.59.1.100 上的客户端订阅系统主题
INSERT INTO mqtt_acl (allow, ipaddr, username, clientid, access, topic) VALUES (1, '10.59.1.100', NULL, NULL, 1, '$SYS/#');

-- 禁止客户端订阅 /smarthome/+/temperature 主题
INSERT INTO mqtt_acl (allow, ipaddr, username, clientid, access, topic) VALUES (0, NULL, NULL, NULL, 1, '/smarthome/+/temperature');

-- 允许客户端订阅包含自身 Client ID 的 /smarthome/${clientid}/temperature 主题
INSERT INTO mqtt_acl (allow, ipaddr, username, clientid, access, topic) VALUES (1, NULL, NULL, NULL, 1, '/smarthome/%c/temperature');

到此这篇关于使用Docker搭建MQTT服务器的文章就介绍到这了,更多相关Docker MQTT服务器内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Docker MQTT安装使用教程

    MQTT简介 MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是IBM开发的一个即时通讯协议,有可能成为物联网的重要组成部分.该协议支持所有平台,几乎可以把所有联网物品和外部连接起来,被用来当做传感器和制动器(比如通过Twitter让房屋联网)的通信协议. Docker安装RabbitMQ配置MQTT 使用RabbitMQ作为MQTT服务端,Eclipse Paho作为客户端.宿主机系统为ubuntu16.04 Docker下载镜像 docke

  • 微信小程序连接服务器展示MQTT数据信息的实现

    一. 实现工具--微信开发者工具 为何使用微信小程序作为展示? (1)范围广且能跨平台访问; (2)小而快能够快速的访问; 二. 实现步骤 1.总体大概: (1)界面设计:数据直观展示+历史数据+物联网调试信息 (2)连接服务器与回调 利用wx.request(Object object)发起 HTTPS 网络请求. 参数: url:开发者服务器接口地址: data:请求的参数: header:设置请求的 header,header 中不能设置 Referer. 成功连接将会调用success:

  • 使用Docker搭建MQTT服务器的过程详解

    1. 拉取镜像 docker pull registry.cn-hangzhou.aliyuncs.com/synbop/emqttd:2.3.6 2. 运行镜像 –name 名字 -p 18083 服务器启动端口 -p 1882 TCP端口 -p 8083 WS端口 -p 8084 WSS端口 -p 8883 SSL端口 -d 指定容器 docker run --name emq -p 18083:18083 -p 1883:1883 -p 8084:8084 -p 8883:8883 -p

  • 基于docker 搭建Prometheus+Grafana的过程详解

    一.介绍Prometheus Prometheus(普罗米修斯)是一套开源的监控&报警&时间序列数据库的组合,起始是由SoundCloud公司开发的.随着发展,越来越多公司和组织接受采用Prometheus,社会也十分活跃,他们便将它独立成开源项目,并且有公司来运作.Google SRE的书内也曾提到跟他们BorgMon监控系统相似的实现是Prometheus.现在最常见的Kubernetes容器管理系统中,通常会搭配Prometheus进行监控. Prometheus基本原理是通过HTT

  • Springcould多模块搭建Eureka服务器端口过程详解

    这篇文章主要介绍了Springcould多模块搭建Eureka服务器端口过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1创建一个普通父maven 在pom修改为因为spring could依赖spring boot所以首先在父maven <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-star

  • nginx搭建图片服务器的过程详解(root和alias的区别)

    安装过程略(我是直接用 yum -y install nginx; 安装的). 启动 启动(重启)nginx,以下2个命令都可以: systemctl restart nginx; # 注:这里的nginx不是目录,是cd不进去的 /usr/sbin/nginx -s reload; 一般不报错就是启动成功. 页面验证nginx是否启动 浏览器输入ip,返回centos页面,这不对吧? 看下配置文件: root /usr/share/nginx/html; 该目录下的index.html 内容就

  • 使用 Koa + TS + ESLlint 搭建node服务器的过程详解

    目录 初始化项目 环境准备 安装环境 初始化 tsconfig.json 简单搭建 Koa 服务器 完整项目搭建 依赖安装 构建目录结构 修改 package.json 代码规范 eslint prettier 初始化项目 环境准备 与之前使用JavaScript 开发后台不同,区别如下: 自动编译运行的插件由nodemon替换为ts-node-dev. 在TypeScript环境下,需要使用到ES6模块化规范.而非CommonJS规则. 使用TypeScript语法进行开发,再开发结束后,需要

  • pm2与Verdaccio搭建私有npm库过程详解

    目录 前言 一般私有化的npm仓库有以下几种方法实现: 下面对各个方案进行一个粗浅的对比: 为什么选用Verdaccio? 安装 修改配置 配置文件 权限把控 部署 docker部署 pm2部署 管理npm仓库源 npm包发布 注册 登录 发布 删除 前言 最近开会的时候讨论到前端组件库搭建,因为需要多人协作,使用npm link等都比较麻烦,且当业务规模较大了之后,我们一般会有自己的脚手架,自己的全局工具包等等.其中可能包含了自身的业务代码不能公开,因此我们都需要一个私有化的npm仓库. 一般

  • nginx搭建jsdelivr镜像站过程详解

    目录 创建 jsdelivr 镜像站 使用 jsdelivr 镜像站 ​最近 jsdelivr 可谓国内站长圈的头条常客,这不,又双叒叕(yòu shuāng ruò zhuó)打不开了. 如何解决这个问题?最简单的方法当然是使用别人建立的jsd镜像站,但是稳定性和可靠性就只能看镜像站长的心情了吧.自己动手丰衣足食,还是自己搞个镜像吧. 创建 jsdelivr 镜像站 首先,你需要有一台安装了 nginx 的服务器.推荐使用腾讯云轻量服务器的Matomo镜像,其中集成了最新稳定版 nginx.p

  • 使用vue cli4.x搭建vue项目的过程详解

    cli-4.x已经发布好久了,斟酌了好久,还是决定将原来的cli-2.x升级到4.x,详细的升级过程可以戳这里 1.创建项目 vue create vuetest 2.选择配置方式 ? Please pick a preset: (Use arrow keys) ☜(使用箭头键) > default (babel, eslint) ☜(使用默认的配置,会安装babel和eslint) Manually select features ☜(手动配置) 这里我选择的是手动配置(使用↑ ↓箭头切换,E

  • Java 用Prometheus搭建实时监控系统过程详解

    上帝之火 本系列讲述的是开源实时监控告警解决方案Prometheus,这个单词很牛逼.每次我都能联想到带来上帝之火的希腊之神,普罗米修斯.而这个开源的logo也是火,个人挺喜欢这个logo的设计. 本系列着重介绍Prometheus以及如何用它和其周边的生态来搭建一套属于自己的实时监控告警平台. 本系列受众对象为初次接触Prometheus的用户,大神勿喷,偏重于操作和实战,但是重要的概念也会精炼出提及下.系列主要分为以下几块 Prometheus各个概念介绍和搭建,如何抓取数据(本次分享内容)

  • java使用xfire搭建webservice服务的过程详解

    前言 以前用的都是 apache 的cxf来搞webservice,今天做项目发现这个项目用的是 xfire,于是搭一个,写个demo用一下,在此记录一下过程. 搭建过程 本文使用的是maven形式的web工程.不知道如何搭建web工程的看上一篇博文. 引入xfire的依赖 <dependency> <groupId>org.codehaus.xfire</groupId> <artifactId>xfire-all</artifactId> &

随机推荐