
心想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 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
十六进制解释
数据长度:0x74
协议数据长度 0x00 0x04
协议类型: 0x4d 0x51 0x54 0x54
协议数据: 0x04 0xC0
keepAlive数据:0078
ClientID长度:0033
ClientID: 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
数据长度:0x1D
TopicName数据长度:0009
TopicName数据内容:2f7379732f706f7374
主体json数据: 0x7b 0x70 0x61 0x72 0x61 0x6d 0x73 0x3a 0x7b 0x74 0x65 0x6d 0x70 0x3a 0x31 0x30 0x7d 0x7d复制代码以上就是连接阿里云的数据包格式及发布数据的格式,由于时间问题没有做订阅的数据包分析,下一次更新订阅的内容。在mosquitto里面有个client目录,里面就是使用libmosquitto实现的客户端程序,封装成mosquitto_sub和mosquitto_pub命令行。
所以新建一个跟client同一级,自己的client,添加对应的文件
Makefile的内容
mainc的内容
myclienth的内容
外层的mosquitto/src/Makefile里面添加myclient文件的编译
编译测试一切正常,接下去添加mqtt的内容
mqtt client里面最主要的就是几个回调函数,先调用lib_init,正常后,就这只各个callback,然后在callback里面做逻辑。
各回调函数的内容
逻辑应该也比较直观,当connect成功后,在回调函数里面订阅test1主题的内容,然后发布test2主题的内容。
收到内容就在 myclient_message_callback 回调里面打印处理。
正常情况我们都会让客户端的连接做一些账号密码的设置,避免别人攻击。
将allow_anonymous改成不允许匿名登陆,并制定pwfile。
vim /etc/mosquittoConf/mosquittoconf
在ubuntu上面使用mosquitto_passwd生成密码
就会在pwfile文件下生成账号和加密的密码root/admin
这是后登陆的时候就需要-u root -P admin进行登陆
mosquitto提供了mosquitto_passwd命令来生成账号密码等,不过这个方式不喜欢,因为没办法定制化自己想要的账号密码加密方式,所以做了一些小改动。
在myclient里面加我们想要的加密方式,然后在mosquitto broker的源码里面添加对应的解密方式即可。
如下,账号为client_name,然后通过rsa和base64生成密码,myclient的试下调用 mosquitto_username_pw_set 函数。
然后在mosquitto broker里面添加解密,位于mosquitto/src/securityc文件的 mosquitto_unpwd_check 函数里面。
另一个加密方式就是SSL认证,给客户端提供相应的证书,和配置协议(mqtt or websockets)一样,在配置文件监听的端口下面可以添加ssl的配置选项,每个port都可以单独配置ssl的证书内同容。
如下:从端口7885连接进来的设备需要下面的证书要求
设备的认证有单向认证和双向认证两种:
单向认证,只需要提供ca证书
双向认证,需要ca,pem,key三个
按步骤一步一步执行,生成证书(里面也可以指定各参数,有效时间):
按上面的步骤可以生成如下文件
在服务器端需要放三个文件
如果是单向认证,客户端只需要一个文件
如果是双向认证,客户端只需要三个文件
查看证书的有效时间
前言
EMQ是带有SSL功能的,需要进行简单的配置,才能使用。下面就简单说一下如何实现自签证书。
利用OpenSSL签发证书
配置到EMQX的emqxconf
如果启用单向认证的话,客户端不需要证书都可以连接。这里的listenersslexternalfail_if_no_peer_cert = true 注释掉就启用单向认证。启用双向认证。那么客户端就必须导入CA和client的证书才可以连接。
重新启动EMQX
工具测试
我这里使用EMQ官方出品的MQTTX工具
参考: >第一步:
参考此库官方说明:>
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)