在物联网领域,传感器与服务器的通信、信息的收集以及MQTT协议都是可以考虑的方案之一。MQTT通常用于需要低功耗和低带宽的场景,如物联网设备、传感器网络、移动应用等。它的轻量级和高效特性使其非常适合在资源受限的设备和不可靠网络环境中使用。
什么是MQTT协议
MQTT(Message Queuing Telemetry Transport)是一种轻量级的消息传递协议,专为资源受限的设备和低带宽、不可靠网络环境设计。它最初由IBM开发,现已成为物联网(IoT)领域的标准协议之一。MQTT的主要特点包括:
发布/订阅模型:MQTT使用发布/订阅(Pub/Sub)通信模式,这与传统的请求/响应模型不同。在这种模式下,客户端可以发布消息到某个主题(Topic),而其他对该主题感兴趣的客户端可以订阅该主题,并接收相应的消息。
轻量级和高效:MQTT协议头部非常小,开销低,适用于带宽受限的网络环境。
可靠性:MQTT提供了三种不同的服务质量(QoS)级别,确保消息的传递可靠性:
QoS 0:最多一次传递(At most once)
QoS 1:至少一次传递(At least once)
QoS 2:只有一次传递(Exactly once)
持久会话:MQTT支持持久会话,即客户端断开连接后,服务器可以保存该客户端的订阅信息和未接收的消息,当客户端重新连接时,可以继续接收未接收的消息。
保留消息:发布者可以发送一条带有保留标志的消息,服务器会保存这条消息,并在有新的订阅者订阅该主题时,将这条消息发送给订阅者。
遗嘱消息:客户端可以在连接时指定一条遗嘱消息,当客户端意外断开连接时,服务器会将这条遗嘱消息发布到指定的主题。
安全性:MQTT可以通过TLS/SSL进行加密,确保传输数据的安全性。此外,MQTT还支持用户名和密码认证机制。
OneNet平台准备
首先,在OneNet平台创建一个产品。
OneNET平台官网地址:https://open.iot.10086.cn
在「物联网开放平台」中找到「产品开发」,然后创建一个新的产品。
在产品品类中,提供了一些预设的模版,可以直接使用。
根据实际使用情况填入信息即可。为了方便后续数据观察,数据协议选择数据流协议,以便后续建立可视化模版。
确保接入协议为MQTT,其他信息根据实际情况进行设置。确认无误后创建新的产品。
成功创建产品后,可以在产品开发页面看到刚才创建的产品。接着,进入产品开发页面。
添加一个数据流模版,数据流名称、单位名称及单位符号根据实际情况填写。这里为了演示,模拟采集环境的温湿度情况。
创建成功后,记录下创建的数据流模版名称,稍后发布消息需要用到。
接下来需要创建新的设备。在设备接入管理中的设备管理页面,点击添加设备。
在所属产品中选择刚才创建的产品,在设备名称中自定义设置一个设备名称。其他信息根据情况设置。
成功配置后,可以在设备管理中看到刚才创建的设备。
随后,点击详情,进入设备相关页面。可以看到一些基本信息,如设备ID、产品ID、设备名称及设备密钥。记录下这些数据,随后连接与通讯需要用到。
MQTT连接通讯元素
成功创建OneNet产品后,准备MQTT连接通讯所需的三要素及订阅发布主题。
MQTT三要素
使用标准的MQTT三要素通讯,需要了解产品的连接地址、端口、ClientID、UserName、Password。连接地址、端口在产品相关手册中可以找到。在产品文档中搜索“MQTT地址”即可快速定位到接入地址及端口。
注意⚠️:
MQTT接入地址可能发生变化,实际接入地址请以实际文档说明为准。
ClientID、UserName在设备详情中可以直接得到,password需要经过key计算得到token。
具体的Token算法可以通过产品手册了解。这里使用官方提供的工具进行计算。
官方下载地址:https://open.iot.10086.cn/college/video/onenet-portal/2024-04-19/17134946071850.exe
镜像下载地址:17134946071850.exe
软件中的「res」在手册中阐述了相关参数。「et」为时间戳:
根据手册中的介绍格式:products/{产品ID}/devices/{设备名称}
,将产品ID与设备名称进行修改,即可得到res值。
et为时间戳,填写过期时间。这里为了演示,直接填写「9999999999」。
注意:et是unix时间,通常不建议直接设置为9999999999。
key是设备密钥,将对应的值填入即可。确认填入信息无误后,即可生成MQTT连接需要的Password。
到这里我们就准备好了MQTT连接的所有要素连接地址、端口、ClientID,UserName,Password。
订阅与发布主题
接下来,还需要获取上报与接受的订阅发布主题。同样,这里我们通过手册也可以找到官方发布的订阅与发布主题属性。
这里需要根据实际的使用情况选用适合的订阅与发布。这里找到我们需要的订阅与发布主题。这里演示使用订阅全部主题以及上报数据点这两个订阅与发布主题。
订阅全部物模型相关主题:$sys/{pid}/{device-name}/#
设备上传数据点请求:$sys/{pid}/{device-name}/dp/post/json
根据手册中的要求,将「设备名称」以及「产品ID」填入即可。
发布消息
确认连接地址与订阅发布主题后,了解发布消息时使用的格式。这里演示使用数据流payload格式进行发布。payload示例如下:
{
"id": 123,
"dp": {
"数据流名称": [{
"v": #值
}],
"数据流名称": [{
"v": #值
}]
}
}
这里演示上报的是温度与湿度,将准备的温度与湿度名称填入即可。
连接测试
接下来,即可开始使用设备连接。这里首先我们确认下得到的参数是否能够正常连接与通讯。
MQTTX模拟通讯
使用MQTT相关软件进行模拟,这里演示使用的是MQTTX软件进行模拟,首先将连接要素填入对应的位置。
注意⚠️:这里可能会由于MQTT版本导致连接错误。目前尝试「MQTT 3.1.1」版本可以正常连接。需要特别留意版本。
随后将准备好的发布与订阅主题填入对应的位置。随后尝试连接,如果成功连接到OneNet平台,在设备管理中我们可以看到设备在线的提示。
接下来我们再把订阅与发布主题填入对应的位置。
准备就绪,接下来即可开始尝试进行发布消息,根据前面准备好的payload消息填入对应的位置。然后发布消息。
可以看到,成功发送消息后,服务器返回了一个消息,告诉我们“id:xxx”的消息已经收到。我们返回OneNet平台的设备管理中的数据流可以看到刚才发布的消息已经成功收到。
实物连接与通讯
确认获取的参数都无误后,接下来我们可以通过一个实际的设备进行模拟实际使用中的情况。在实际使用中,设备可能多种多样,这里为了方便,使用一个串口服务器进行模拟。关于产品的使用可以根据产品手册或者相关视频了解,这里具体就不展开讲解。首先将产品设置为MQTT工作模式,并将对应的参数分别填入。
确认无误后,保存参数并重启,稍等片刻,在OneNet中的设备管理页面查看是否正常接入。
这里为了方便演示,我们使用电脑模拟温度采集模块,将采集到的温湿度数据进行处理后通过串口发送给串口服务器。这里使用一个串口工具,将刚才我们准备好的上报消息,直接通过串口发送飞串口服务器。
然后观察OneNet平台是否能够正常收到数据。
可以看到,OneNet成功收到了串口服务器上报的消息。
可视化界面
到这里,关于产品的MQTT连接与通讯就全部完成了。但目前观察产品上报的数据有些繁琐,OneNet可以自行开发简单的云平台。这里我们根据这里的演示。建立个数据可视化的平台。我们在物联网平台中,找到应用开发中的数据可视化。
首先,我们新建一个项目。这里OneNet提供了一些模版可以直接使用,我们可以直接使用或者自己新建。
这里我们只是为了演示,所以使用一个空白模版,自己创建一个页面。
完成后,进入项目进行编辑。
接下来我们就可以看到一个可视化的编辑页面,这里我们可以更具自己喜好进行设计。这里我们演示只是为了演示效果,所以这里任意选择一个图标表示即可
随后,我们将数据绑定。在右侧的数据页面中,选择管理数据源。
数据类型选择物联网平台。其中名称,设定为我们的数据流名称,UserID是OneNet用户管理页面中可以找到。
accessKey就是设备密钥,产品ID、设备名称都可以在设备的详情中可以找到。
填写完成后,数据流会自动匹配,下拉即可看到刚才我们设置的两个属性。
刷新时间与获取点数任意设置即可。完成后点击创建。
随后下拉刚才我们创建的数据源,即可看到已经获取到了数据。
同样,我们再把湿度同样的方法创建湿度数据。
接下里即可开始绑定数据。选择刚才创建的数据源,随后,需要根据要求,在数据过滤器中设置对应数据。
然后点击数据处理结果,检查输出数据是否符合要求。
同样的方法,设置湿度、温度显示。
随后,确认无误后,保存发布项目,即可通过链接访问。
复制连接,然后确认发布,通过链接,检查是否能够成功访问
随后,我们再使用串口工具上报数据,检查数据是否能够同步刷新。