应用场景:
设备通过扫码开机,在设备状态发生变更的时候上报设备状态
实现方法:
EMQX 开源的MQTT服务
安装步骤:
我是CentOS,所以我直接
yum install emqx
安装好以后在浏览器中输入
http://IP:18083
可以看到 EMQX Dashboard
一个单节点的MQTT服务就算搞定了,多节点等我设备足够多的量 我再去研究~~~
接下来 硬件 AT 指令 操作GM510 模块 实现MQTT联网
我就提供下 AT 指令的顺序,按序执行命令即可,建议所有的步骤 都通过串口中断触发
联网步骤的结构体
typedef struct network_content_step_struct {
int step; //步骤顺序
uint8_t is_use; //是否执行
char at[100]; //默认at命令
char at_err[100]; //失败后执行的at命令
}NetWork_Step;
创建了结构体数组
NetWork_Step steps[12] = {
{0,1,"AT+ZVN\r\n"},
{1,1,"AT+CSQ\r\n"},
{2,1,"AT+CPIN?\r\n"},
{3,1,"AT+CREG?\r\n"},
{4,1,"AT+ZPAS?\r\n"},
{5,1,"AT+CEREG?\r\n"},
{6,1,"AT+ZIPCALL=1\r\n"},
{7,1,"AT+ZIPCALL?\r\n",},
{8,1,"AT+ZMQCFG=1,RX_RPT\r\n"},
{9,1,"AT+ZMQCFG=1,KEEPALIVE,10\r\n"},
{10,1,"AT+ZMQCON=1,$,{IP 填你自己的},1883,username,password\r\n"},
{11,1,"AT+ZMQSUB=1,topic,0\r\n"}
};
11部全都OK,那么你的模块 mqtt 链接/订阅 都已经成功了
接下来就需要 通过AT命令发布报文
{"AT+ZMQPUB=1,topic,0,0,@\r\n"}
这里的 @ 我用来最为占位符,硬件上发送指令是一位一位发送,所以当发送的这一位等于@,那么就替换成我的内容,内容自定义
以上就完成了 设备Client 和服务器的MQTT server 互联互通
再然后需要我的业务层 也作为一个client ,通过 MQTT server 这个中间件 获取 设备上报状态,发送设备指令 等
这里我的后端是golang,所以 用了 MQTX 的 go SDK
GitHub - eclipse/paho.mqtt.golang
业务层 通过 web hook 来获取 设备在线,离线,订阅,消息是否发送,消息是否接受
当频道 和发送的消息 QoS 为2 时,web hook 能有消息的 ack 事件回调
通过这个来判断设备是否收到消息
业务逻辑没啥说的
接下来就是 小程序的对接部署
小程序只支持 wss 好嘛 ,只能通过nginx 转发来实现了
贴个转发配置
我的nginx 配置过了 https
所以只需要转发
location /mqtt {
proxy_pass http://127.0.0.1:8083/mqtt;
proxy_read_timeout 300s;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
}
https 证书配置也比较简单,我顺带贴一些
server {
#listen 80;
listen 443 ssl;
server_name goserver.njgzzz.com;
ssl_certificate /etc/nginx/conf.d/cert/xxxxx.pem;
ssl_certificate_key /etc/nginx/conf.d/cert/xxxxx.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
error_page 500 502 503 504 /50x.html;
client_max_body_size 20M;
location /mqtt {
proxy_pass http://127.0.0.1:8083/mqtt;
proxy_read_timeout 300s;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
}
}
顺带说一句,小程序的wss协议头被腾讯封装了,js中要用 wxs:// 很奇怪吧,啥都要封装一下~~~
好了, 一路部署下来,除了业务层的东西,整个框架雏形出来了
最后提一下 EMQT Dashboard 静态资源 的 重新部署
首先配置一个 子域名 mqtt.xxx.com
然后把 静态资源 copy 到 nginx/html/www 下
静态资源的路径:
/usr/lib/emqx/lib/emqx_dashboard-5.0.2/priv/www/
新增nginx 配置项
server{
listen 80 ;
server_name mqtt.xxxx.com;
location / {
root /usr/share/nginx/html/www/mqtt;
index index.html;
}
执行nginx 命令
nginx -t
nginx -s reload
EMQT 官方文档有 服务优化,我因为设备还算少,就没去深究
贴下优化文档
有兴趣的可以留言~~交流学习~~~