1、背景说明
最近正好做一些云相关的工作,主要是mqtt连云的一些东西,正好看到了阿里云这个平台,用了一下感觉平台很强大,资料也很丰富,特此记录一下,说不定以后会一直使用呢。
入口如下,直接在搜索框输入就能看到:
这里需要登陆一下,直接进去即可
这里我用的只是物联网的部分,直接在里面找到相应的分块即可
如下所示即可找我需要的分块
这里分为公共实例和企业实例,如果只是体验一下的话使用公共实例即可,没有必要上来就用企业实例,毕竟企业实例需要交费
点击就进入最常见的这个页面了,如下所示:
2、MQTT协议总结记录
关于MQTT的具体内容这就就不做说明了,之前的文章其实也写过,这里主要还是说一下新的一些理解上的东西。
因为我了解这个云之前就发现它是需要通过MQTT协议来实现的,所以前期看了一些关于MQTT协议的资料文档,这里顺便也对前期看的一些文档做个总结吧,主要就是一个控制报文,控制报文的格式如下:
在下面就是剩余数据长度了,官方定义为:剩余长度(Remaining Length)表示当前报文剩余部分的字节数,包括可变报头和负载的数据。剩余长度不包括用于编码剩余长度字段本身的字节数。
剩余长度字段使用一个变长度编码方案,对小于128的值它使用单字节编码。更大的值按下面 的方式处理。低7位有效位用于编码数据,最高有效位用于指示是否有更多的字节。因此每个字节可以编码128个数值和一个延续位(continuation bit)。剩余长度字段最大4个字节。(也就是说剩余长度最大是byte2,byte3,byte4,byte5)
这里需要注意的就是最大字段为:256MB大小的控制报文,第一个最大到128就要到开始第二个字节了,所以这个数值在报文中的表示 是:0xFF,0xFF,0xFF,0x7F。
控制报文的组成为:固定报头+可变报头+有效负载
可变报头不是所有都有的,根据官方说明,他的类型为:
需要这种标识符的控制报文如下:(注:这个只在质量等级大于0的时候才有需要,其他时候是不需要的)
下面就是有效载荷了,也可以称为数据部分,一般为json格式的数据,这一块加在报文的最后,当然也不是所有报文都需要有效载荷的,需求如下所示:
下面来进行一些详细一点的每个部分的说明,首先是连接部分:
CONNECT – 连接服务端
固定报头部分:主要是该有的加上一个长度
可变报头,下面是协议名的部分
byte7是指协议级别
byte8是指连接标志位
这里标志位对应的含义分别为:
- 清理会话
- 遗嘱标志
- 遗嘱质量
- 遗嘱保留
- 密码标志
- 用户名标志
byte9和byte10是保持连接
整体的一个可变头的效果如下:
CONNACK – 确认连接请求
3、一些加密方法记录
这里主要是阿里云在传输过程中用的一些加密方法吧,因为我做的项目里面应该也要用到,一并把我的一些过程记录下来。
4、阿里云机制
阿里云提供了较详细的文档方便查阅使用方法,位置就在产品的最下一栏,如下所示:
点击进入就可以看到一些SDK的选择,这里主要是LInux相关的SDK,如下所示:
一般可以进入SDK定制来查看,这里的功能很多,比如设备OS就是设备选择,一般选择Linux或者其他方案,通信方式也可以选择,如果选择单板就是向树莓派这样的,或者采用MCU+WIFI模组的方案也是可以的,右侧还标明了预估的资源消耗,根据这个可以更方便我们进行选型。
这里选择好之后直接生成即可,一般没有特殊需求,物模型这里选一下就足够了
之后就是点击就会下载内容了
5、使用MQTTFX连接记录
官方说明如下:https://help.aliyun.com/document_detail/140507.html
这里使用的为 mqttfx1.7.1,现在官网把这个好像下架了,不过可以去网上找一些之前的,主要是现在的那版好像是收费的,所以就先还是用这个比较老的版本了。
首先还是建立连接,建立连接也挺方便的,设备页面提供了连接需要的参数,如下所示:
mqtt连接页面选项如下所示:这里有一个服务器地址,可以写域名也可以直接用ip地址,域名和ip地址的转换只需要ping一下就能出来,如下所示:
使用ping来ping一下:
最后就可以填写了,这里我试了直接填写ip地址也是没有影响的
这里要选一下加密,选择如下:
之后点击连接即可
这个mqttfx的页面主要是注意三块内容,发布订阅还有日志,其他地方我也没用到,也不是很清楚了
进入在线运维可以给设备下发命令
我们提前订阅好这个topic就能收到服务器发给我们的消息了,订阅的相关参数如下,这里只需要将里面的设备名称替换为我们自己的设备名称即可
这里我订阅了三个,分别是设置参数,请求参数,还有请求答复这三个主题
下面先在云端设置一下参数:
收到消息如下:
查看一下具体的内容如下:
{
"method": "thing.service.property.set",
"id": "1644637829",
"params": {
"StreamVideoQuality": 1,
"MotionDetectSensitivity": 1,
"ImageFlipState": 1,
"SubStreamVideoQuality": 1,
"test111": 2,
"AlarmSwitch": 1,
"AlarmFrequencyLevel": 1
},
"version": "1.0.0"
}
下面继续来看下发布消息,因为前面我们已经订阅好了,这里就不需要在去订阅了,直接去发布页面发布消息即可,填写我们要发布的主题还有内容,如下所示:
转到另一个页面就可以看到我们的发布的消息得到了订阅这边的返回数据
这边有收到返回消息的回复
具体内容如下所示:
{
"code" : 200,
"data" : { },
"id" : "1662469292",
"message" : "success",
"method" : "thing.event.property.post",
"version" : "1.0"
}
可以看到正确收到了数据的返回(这里面需要注意的就是这个里面有个时间戳是需要修改的,发送的时间戳一定要比当前的时间戳大,这样就行了)
上面的部分其实已经实现了事件还有属性的上下发(Properties和events),同时我们可以新增物模型来查看信息,新增的过程如下:
点击编辑草稿可以看到新增我们们自己的物模型
选择对应的物模型类型进行新增
例如我在这里新增了一个属性,一个服务,如下所示
点击物模型stl可以直接导出当前的所有物模型消息,打开是一个大的json格式的内容:
但是仅仅看这个看的不是很清楚,因为数据量比较大,还是用专门的json工具来查看一下具体的数据内容吧,这里我用的json工具链接是这个:https://www.json.cn/
把所有部分进行压缩,数据如下:
可以看到他其实还就是一个根据我们的物模型来实现的,物模型里面有什么这个就是什么样的。
但是他这里还有一些机制,就是这个不是单纯的物模型数据,这里面还加入了一些回应还有报错的机制,比如打开一个属性来查看一下:
其中有一些约束如下所示:
通过上面的过程就基本认清这个物模型的组成了,下面还可以进行一个服务的设置,主要是进行服务的一个设置,看看是如何实现的,需要进人一个设备调试的服务调用的页面:
这里先选择到指定需要调用的功能
之后在物模型中查找这个模块的规则,就可以看到我这里需要调用的标识符还有标识符的相关约束,如下图所示:
因此针对标识符可以设定一个调用的服务内容:
{
"Scheme":0,
"EncryptKey":"222222",
"EncryptType":23,
"PreTime":50,
"PushUrl":"111111",
"StreamType":1
}
同时在mqttfx那一端进行订阅这个topic,如下所示:
发送消息,可以查看消息是否发送成功(如果发送不成功,有可能是因为本身的json格式不正确,需要自行检查一下格式,包括我们本身的这个数据有没有超范围什么的)
在设备端也可以接收到我们订阅的这个topic,可以看到内容是完全一致的
至此,就完成了这个设备端和云端所有类型的数据交互。
6、SDK使用记录
这里首先需要下载SDK,如下所示:
这里包含了所有的文档,我觉得有两个地方是可以参考的,如下所示,快速接入是方便我们快速体验一下,具体的还是看设备接入的文档吧
先看一下快速接入的入口发布的内容,在设备接入这里生成一个SDK,如下所示:(SDK有好多种类型的,这里选择LINUX c版本的)
这里按照官方说明生成即可
将SDK导入我们LINUX系统下:
之后修改参数编译即可,修改如下:(这里的信息直接使用平台上导出的信息即可)
连接过程如下所示,可以看到首先是建立TCP连接,之后是TLS加密验证,之后在建立MQTT连接,建立连接之后设备端订阅相应的主题
这里如果需要发布主题,这里还是关注下这个topic列表
下面订阅和上报,下图展示的分别是订阅和上报的参数设置
下面来测试一下,可以看到设备属性上报是OK的!
其他相关的上报也比较简单了,基本上和使用MQTTFX是一样的操作,订阅,然后查看消息就行了,这里看一下接收云端回传数据的操作,这里SDK是使用回调函数来实现的,回调函数可以直接在源码上通过注释来获取
下面来看一下属性指令回复的回调函数,让云端下发一条指令
可以看到触发回调函数,回调函数中只是执行了一下打印内容的函数,其他相关的回调也是一样的
有一说一,我感觉他这个SDK写的很复杂,可能是我太菜了,很难分析源码!
7、云端SDK使用
首先是需要两个库,这两个库的安装需要python3.6版本及以上才行,然后首先需要我们更新一个pip
sudo pip3 install aliyun-python-sdk-core
sudo pip3 install aliyun-python-sdk-iot
其中更新pip的命令如下:
官方文档给的链接如下所示:https://help.aliyun.com/document_detail/42700.htm?spm=a2c4g.11186623.0.0.7c023a5eGVRkN6#reference-qdh-ywb-zdb
可以使用官方文档进行一些连接测试: