有很多通信模块只有TCP功能,没有MQTT功能,比如WIFI,W5500等模块,还有一些NBIOT模块,但是又想连接
阿里云物联网平台,官方提供了操作系统,需要自己移植,很麻烦,比较难看得懂。就在想有没有一些简单一定的方法。心想MQTT是基于TCP的,能否使用TCP转MQTT?因此就想使用TCP
协议然后转MQTT协议连接阿里云物联网平台,经过试验证明是可以的。首先我们先分析一下如何登陆接入Onenet平台。先从它
数据格式开始分析。首先我们要从后台取出三个信息,我们以这个为例。我们把产品ID,设备名称,设备秘钥,简称三要素 (具体是什么看你自己的设备)其实阿里云物联网平台的MQTT协议用的就是标准的,不过它加入了自己的认证方式。MQTT协议需要上传四个参数,报活时间,clientID,用户名,密码。那么阿里云的就在clientID,用户名,密码做了手脚。clientID比较长,按照一定的格式用户名:设备名和秘钥组成密码:使用了加密串进行了加密,有sha1或者MD5加密方式下面我们来介绍一下MQTT接入都是发十六进制的数据。么我们发送的时候就是这样子的一串数据0x74 0x00 0x04 0x4d 0x51 0x54 0x54 0x04 0xC0 0078 0033 0x61 0x62 0x63 0x7c 0x73 0x65 0x63 0x75 0x72 0x65 0x6d 0x6f 0x64 0x65 0x3d 0x33 0x2c 0x73 0x69 0x670x6e 0x6d 0x65 0x74 0x68 0x6f 0x64 0x3d 0x68 0x6d 0x61 0x63 0x73 0x68 0x61 0x31 0x2c 0x74 0x69 0x6d 0x65 0x73 0x74 0x61 0x6d 0x70 0x3d 0x31 0x32 0x30 0x7c 00090x35 0x36 0x37 0x38 0x26 0x31 0x32 0x33 0x34 0028 0x32 0x32 0x32 0x37 0x35 0x30 0x44 0x45 0x44 0x46 0x45 0x34 0x46 0x37 0x37 0x34 0x30 0x30 0x32 0x45 0x45 0x38 0x37 0x45 0x45 0x44 0x32 0x39 0x43 0x46 0x44 0x30 0x36 0x33 0x38 0x43 0x35 0x46 0x36 0x36十六进制解释数据长度:0x74协议数据长度 0x00 0x04协议类型: 0x4d 0x51 0x54 0x54协议数据: 0x04 0xC0keepAlive数据:0078ClientID长度:0033ClientID: 0x61 0x62 0x63 0x7c 0x73 0x65 0x63 0x75 0x72 0x65 0x6d 0x6f 0x64 0x65 0x3d 0x33 0x2c 0x73 0x69 0x67 0x6e 0x6d 0x65 0x74 0x68 0x6f 0x64 0x3d 0x68 0x6d 0x61 0x63 0x73 0x68 0x61 0x31 0x2c 0x74 0x69 0x6d 0x65 0x73 0x74 0x61 0x6d 0x70 0x3d 0x31 0x32 0x30 0x7c用户名:0009用户名: 0x35 0x36 0x37 0x38 0x26 0x31 0x32 0x33 0x34密码长度:0028密码: 0x32 0x32 0x32 0x37 0x35 0x30 0x44 0x45 0x44 0x46 0x45 0x34 0x46 0x37 0x37 0x34 0x30 0x30 0x32 0x45 0x45 0x38 0x37 0x45 0x45 0x44 0x32 0x39 0x43 0x46 0x44 0x30 0x36 0x33 0x38 0x43 0x35 0x46 0x36 0x36复制代码上面的就是连接服务器的连接包下面呢,我们来做个发布包(上传数据到服务器)0x30 0x1D 0009 2f7379732f706f7374 0x7b 0x70 0x61 0x72 0x61 0x6d 0x73 0x3a 0x7b 0x74 0x65 0x6d 0x70 0x3a 0x31 0x30 0x7d 0x7d十六进制数据解释数据头:0x30数据长度:0x1DTopicName数据长度:0009TopicName数据内容:2f7379732f706f7374主体json数据: 0x7b 0x70 0x61 0x72 0x61 0x6d 0x73 0x3a 0x7b 0x74 0x65 0x6d 0x70 0x3a 0x31 0x30 0x7d 0x7d复制代码以上就是连接阿里云的数据包格式及发布数据的格式,由于时间问题没有做订阅的数据包分析,下一次更新订阅的内容。MQTT协议是广泛应用的物联网协议,使用测试MQTT协议需要MQTT的代理。有两种方法使用MQTT服务,一是租用现成的MQTT服务器,如阿里云,百度云,华为云等公用的云平台提供的MQTT服务,使用公用的MQTT服务器的好处是省事,但如果仅仅用于测试学习还需要注册帐号,灵活性差些,有的平台还需要付费。另一方法是自己使用开源的MQTT组件来搭建。MQTT服务器非常多,如apache的ActiveMQ,emtqqd,HiveMQ,Emitter,Mosquitto,Moquette等等。这里介绍的是用轻量级的mosquitto开源项目来搭建一个属于自己的MQTT服务器。第一步:需要安装一台linux主机,这不多介绍,可以使用真机安装也可以使用虚拟机安装。如果仅仅是自己测试使用都可以。第二步:下载mosquitto需要的依赖sudo apt-get install libssl-devsudo apt-get install uuid-devsudo apt-get install cmake第三步:下载mosquitto并解压,现在mosquitto官网最新的版本是1.5.1tar xzvf mosquitto-1.5.1.tar.gz第四步:编译cd mosquitto-1.5.1/makemake install第五步:启动mosquitto./mosquitto -v1535473957: mosquitto version 1.5.1 starting1535473957: Using default config.1535473957: Opening ipv4 listen socket on port 1883.1535473957: Opening ipv6 listen socket on port 1883.这时候mosquitto就会以默认的参数启动。如果需要带配置文件可以修改配置文件mosquitto.conf,启动时候加上参数 -c,./mosquitto -c mosquitto.conf可以看到,mosquitto监听的端口为1883.这时候我们的MQTT服务器就搭建好了。可找一个mqtt客户端来测试一下。先发布一个主题“home/garden/fountain/2”内容是“hello world”这时候在mosquitto会打印出下面的log535474247: New connection from 192.168.1.105 on port 1883.1535474247: New client connected from 192.168.1.105 as MQTT_FX_Client (c1, k60).1535474247: No will message specified.1535474247: Sending CONNACK to MQTT_FX_Client (0, 0)1535474307: Received PINGREQ from MQTT_FX_Client1535474307: Sending PINGRESP to MQTT_FX_Client1535474339: Received PUBLISH from MQTT_FX_Client (d0, q0, r0, m0, 'home/garden/fountain/2', ... (12 bytes))1535474367: Received PINGREQ from MQTT_FX_Client1535474367: Sending PINGRESP to MQTT_FX_Client订阅主题“home/garden/fountain/2”可以看到收到了自己发布的消息。用wireshark抓包可以看到抓到了一个MQTT的publish的报文。最近在着手研究使用网页控制硬件的交互过程,发现mqtt协议有很多种语言的封装,整个思路也很清晰,就是一个客户端进行发布和订阅+服务器中间代理的过程,于是开始学习使用MQTT框架搭建交互平台。
客户端使用了MQTT.js,服务器使用mosca(基于nodejs)。
QoS在MQTT中有(摘自 MQ 遥测传输 (MQTT) V3.1 协议规范 ):
MQTT.js只是支持了MQTT协议,并没有支持QoS,也就是说,只支持最低级别的“至多一次”(QoS0)。
在MQTT协议中,一个MQTT数据包由:固定头(Fixed header)、可变头(Variable header)、消息体(payload)三部分构成。
这里只了解消息体,固定头和可变头并不需要我们手动写。
payload消息体包含CONNECT、SUBSCRIBE、SUBACK、UNSUBSCRIBE四种类型的消息:
(1)Connect 与服务器建立连接。
(2)Disconnect 与服务器断开TCP/IP会话。
(3)Subscribe 订阅。
(4)UnSubscribe 取消订阅。
(5)Publish 发送消息请求,发送完成后返回应用程序线程。
二、实现(具体的API稍后呈现)
评论列表(0条)