设备接入-mqtt驱动设备接入
-
1.MQTT简介:
MQTT全称为消息队列遥测传输,是ISO 标准(ISO/IEC PRF 20922)下基于发布
(Publish)/订阅 (Subscribe)范式的消息协议,工作在 TCP/IP协议族上。
MQTT 协议定义两种网络实体:消息代理(message broker)与客户端(client)- 消息代理用于接收来自客户端的消息并转发至目标客户端,也被称为MQTT服务器。
- MQTT 客户端可以是任何运行有 MQTT 库并通过网络连接至消息代理的设备,例如微型控制器或大型服务器。
MQTT 协议中,消息的传输是通过主题(topic)管理的,消息的发布者和订阅者均为客户端(client)。消息由主题(Topic)和负载(payload)两部分组成。
当某个客户端有需要分发的数据时,会向连接的消息代理(MQTT服务器)发送指定主题的携带有负载的消息。
服务器收到消息后,会向订阅此主题的客户端分发此消息。发布者不需要配置订阅者的相关信息和具体位置;同样,订阅者也不需要配置发布者的相关信息和具体位置。2.平台配置说明
添加设备表-安装mqtt驱动-添加设备-配置驱动内容-添加数据点。
配置驱动参数
-
MQTT服务器:填写要连接的mqtt服务器的地址。格式为tcp://服务器IP或域名:服务器端口 例如:tcp://127.0.0.1:1883(填写的是需要订阅的mqtt服务器,平台是mqtt的客户端)
-
用户名、密码:填写MQTT服务器的用户名和密码。
-
订阅消息主题:填写该模型要订阅的消息主题,可使用通配符#和+。
Topic是个utf-8编码的字符串,可由多个'/'分割开。 +:为单级通配符,如:check/+/baseline #:为多级通配符,必须放在topic的最后,前一个字符必须是'/' 建议Topic中不要包含空格符。
-
通讯监控参数:平台通用配置,当某个资产数据点中的最新上数时间距离当前时间超过此参数时,平台判定资产掉线。
-
自定义脚本:由于mqtt协议中未规定具体的消息内容格式,因此需要用户编写自定义脚本,用于解析消息和组装要发送的消息内容。
3.使用示例
示例1
由于MQTT协议通过主题区分不同种类的消息,因此在使用时,不同的主题需要建立不同的模型,下边以网关常用的MQTT格式为例,介绍脚本的编写方法。示例中d1为数据点编号,资产id为订阅主题中间部分abcd1234。消息格式
脚本
脚本示例:
示例2:资产id在报文中
数据格式案例:
{
"timestamp": 1617860319, //时间戳
"version": "5.0",
"messageId": "3",
"devices": [{
"deviceId": "xbzc-001", //资产id
"deviceState": 1,
"deviceData": {
"xbzc-temp": 37.0 //数据点标识和数据
}
}]
}自定义脚本案例:
ParseHandle = function (topic, package) {
// 解析数据
let msg = JSON.parse(package.toString())
// console.log(package.toString())
// { id, values, time }
let arr = []
if (msg.devices) {
for (let i = 0; i < msg.devices.length; i++) {
let id = msg.devices[i].deviceId
let values = msg.devices[i].deviceData
let time = msg.timestamp * 1000
arr.push({ id, values, time })
}
}
return arr
}平台未采集到数据需检查如下内容
1.mqttbox或者其他客户端能否订阅到该主题消息(以mqttbox演示数据订阅)
- 打开工具界面如图,点击按钮,创建链接。
- 配置如图。
- 链接成功后提示绿色图标,设置右侧订阅的主题,主题内容与服务器发送主题保持一致,填写完成主题后,点击下方橙色按钮,等待消息。
- 如果成功订阅,订阅的消息就会显示在页面。
2.mqtt驱动的运维日志:运维管理地址(ip:13030)点击查看driver-mqtt-client的驱动日志,滚动条拉至最下方查看驱动日志error内容。
3.检查用户名,密码是否是mqtt服务器用户名密码,检查自定义脚本解析内容是否修改,检查资产编号是否对应。
.平台mqtt下发指令配置
op是对象
op.name 是指令名称
op.tag是指令配置的tag:写入
op.value是执行的时候输入的那个值 或者默认值
脚本例子:
CommandHandle = function (topic, id, op) {
let sendTopic = topic
let sendData = JSON.stringify([{ [op.tag]:op.value}])
return { sendTopic, sendData } //返回的对象中的key的名字必须为sendTopic,sendData
}
指令配置案例:
4.新建MQTT服务器方法
1. Windows
-
在软件安装的目录下找到mosquitto文件夹复制并重命名,重命名后在文件夹下找到mosquitto.conf文件以记事本方式打开,在211行找到port 1883。将端口进行修改 例如1884 然后在文件夹窗口下输入cmd进入命令窗口输入mosquitto.exe -c mosquitto.conf运行。
-
在软件平台中添加mqtt的服务器
进入到运维平台127.0.0.1:13030中,点击服务管理—— 添加服务——高级添加应用名称例如:mqtt2, 命令:mosquitto.exe -c mosquitto.conf 目录:../mqtt2 (mqtt2为本文档一中复制的文件夹重命名后名称)
2. Linux
-
Linux平台启用mqtt server:
找到docker-compose.yml文件位置
-
将下面这句复制到docker-compose.yml里,按照截图修改格式。
mqttserver: container_name: mqttserver
environment:
RABBITMQ_DEFAULT_USER=admin
RABBITMQ_DEFAULT_PASS=public
image: airiot/rabbitmq:3.8.3-management-alpine logging: driver: json-file
options: max-size: 100m max-file: "1" networks: backend
ports:1884:1883 restart: always ulimits: nproc: 40960 nofile: soft: 10240 hard: 30720 volumes:
/etc/localtime:/etc/localtime:ro
配置完成后需要进入平台安装目录下 创建并启动服务:docker-compose up -d
查看mqtt服务是否启动:docker ps | grep mqtt