5.1 阿里云物联网平台介绍
物联网体系架构
感知层:通过传感器设备来识别和收集信息
网络层:安全的把这些信息进行传输
应用层:结合具体的应用需求,通过对这些数据进行计算、处理、挖掘,来实现智能化的物联网应用
平台层:枢纽位置,向下接入感知层,汇集感知的数据。向上面向应用开发的基础性平台,是构建物联网应用的基础
云平台端的主要作用:帮助开发者搭建数据通道、方便终端
物联网平台的内容
IoT Hub:帮助设备连接到阿里云的loT服务,并提供设备和云端之间进行安全通信的数据通道。
设备管理:生命周期、固件升级、在线调试、实时监控等等
数据分析:
- 流数据分析:用于设置数据处理任务。
- 空间可视化:将设备数据实时在二维地图或三维模型上展示出来
规则引擎:负责数据流转,即用户可以通过SQL语句来实现规则的配置,从而方便地对数据进行处理、过滤和转发的操作
安全认证&权限策略模块:提供多重的防护机制来保障设备和云端的安全
设备端SDK
- 异构网络设备的接入:如2G/3G/4G以及正在落地的5G
- NB-loT网络接入
- Lora网络接入
产品与设备
使用物联网平台的第一步是在云端先创建产品和然后创建对应设备
产品:设备的集合,通常指一组具有相同功能的设备。物联网平台为每个产品颁发全局唯一ProductKey。每个产品下可以有成千上万的设备
设备:归属于某个产品下的具体设备。物联网平台为设备颁发产品内唯一的证书DeviceName。设备可以直接连接物联网平台,也可以作为子设备通过网关连接物联网平台
网关与设备
网关:能够直接连接物联网平台的设备,且具有子设备管理功能,能够代理子设备连接云端
子设备:本质上也是设备。子设备不能直接连接物联网平台,只能通过网关连接
设备:能够直接能够直接连接物联网平台
三元组
与产品、设备相关的还有一个特别重要的名词是三元组。它是指ProductKey、DevicesName和DeviceSecret
在创建好产品,并且在产品下面添加了一个新设备后,这个设备都会拥有一个在云端唯一的三元组信息
用于鉴权,需要妥善保管好
5.2 物模型介绍
物模型介绍
传统IoT开发和基于物模型的IoT开发
什么是“物模型”
物模型指将物理空间中的实体数字化,并在云端构建该实体的数据模型
物模型本质上是属于功能定义,它是从属性、服务和事件三个维度,分别描述了该实体是什么、能做什么,可以对外提供哪些信息
物模型三个维度的说明
属性(Property)
一般用于描述设备运行时的状态,如环境监测设备所读取的当前环境温度等。属性支持GET和SET请求方式。应用系统可发起对属性的读取和设置请求
服务(Service)
设备可被外部调用的能力或方法,可设置输入参数和输出参数。相比于属性,服务可通过一条指令实现更复杂的业务逻辑,如执行某项特定的任务
事件(Event)
设备运行时的事件。事件一般包含需要被外部感知和处理的通知信息,可包含多个输出参数。如某项任务完成的信息,或者设备发生故障或告警时的温度等,事件可以被订阅和推送
小屋的功能定义
属性:室内温度、可燃气体传感器读数、光敏传感器读数、土壤湿度、二氧化碳浓度、有机气体浓度,空调制冷开闭,风扇开合,窗帘开合,灯光开关,水泵开关
服务:清除报警。当危险状态已经解除,而设备端仍处于可燃气泄漏报警状态时,用户可以调用该服务清除报警状态
事件:可燃气体报警。当可燃气体传感器采样到的数值高于设定阈值时,设备向平台上报报警信息
平台端定义功能
“物模型”用ISON格式数据表述
“物模型”是用JSON格式的数据来表述的,称之为TSL(即Thing Specification Language),用于描述产品“是什么、能做什么、可以对外提供哪些服务”
一般情况下,物模型表现为设备的“功能”,包括至少一个“属性”(Property)或"服务”(Service)或“事件”(Event)
JSON格式
是一种轻量级的数据交换格式
JSON格式的字符串可以在网络或者程序之间轻松地传递,并在需要的时候将它还原为各编程语言所支持的数据格式
JSON易于阅读和编写,同时也易于机器解析和生成,能有效地提升网络传输效率
JSON:“{}”花括号表示对象J,“[]”中括号表示数组,""双引号内是属性或值;“:”冒号表示后者是前者的值
JSON格式解释
在这个示例中,表示的是只有一个名为people的变量,值是包含两个条目的数组,每个条目是一个人“名和姓”的记录
JSON字段说明文档
阿里云提供的物模型JSON字段说明:https://www.alibabacloud.com/help/zh/doc-detail/88250.htm
“物模型”的好处
“物模型”的好处在于将很多重复工作标准化、模式化,并最终形成ICA联盟标准
明确了产品的“物模型”,就可同步开发各个端同步开发:设备端只需要考虑端侧应用的实现,云端可以马上利用虚拟设备,并同步开发应用端软件
5.3 MQTT协议介绍
MQTT协议原理
协议实现方式
在MQTT协议框架图中,我们可以看到有三种角色:代理服务器、发布者客户端以及订阅者客户端。我们需要注意的是发布者客户端也可以是订阅者客户端,甚至可以订阅自己发布的消息
以智慧小屋为例
我们想要在在手机端APP获取到智慧小屋的温度信息
在智慧小屋端通过温度传感器获取到温度信息,通过WIFI上传一个智慧小屋主题为“温度”的数据
云端收到这条信息,将其放置到智慧小屋设备的“温度”主题中
由于手机APP订阅了智慧小屋“温度”主题,在有智慧小屋新的温度消息传递过来,云端推送了该主题的数据给手机
发布者和订阅者的解耦(decouple)
MQTT采用代理的发布/订阅模式实现了发布者和订阅者的解耦(decouple)
空间上解耦:传送消息不需要知道对方的IP地址和端口,只需要和服务器通信即可,发布者和订阅者都一样
时间上的解耦:发布者和订阅者不需要同时在线,由于消息是暂存在服务器的,发布消息的时候,订阅者在不在线是不会影响发布者发布消息的。但是消息的传输必须通过Topic(主题)来进行,也就是发布者和订阅者都必须是同一个主题
MQTT协议中三种身份
MQTT协议中有三种身份:发布者(Publish)、代理(Broker)(服务器)订阅者(Subscribe)
消息的发布者和订阅者都是客户端,消息代理是服务器,消息发布者可以同时是订阅者
MQTT中传输的消息分为:主题(Topic)和负载(payload)两部分:Topic:可以理解为消息的类型,订阅者订阅(Subscribe)后,就会收到该主题的消息内容(payload)
MQTT客户端的作用
一个使用MQTT协议的应用程序或者设备,它总是建立到服务器的网络连接
客户端可以:
- 发布其他客户端可能会订阅的信息
- 订阅其它客户端发布的消息
- 退订或删除应用程序的消息
- 断开与服务器连接
MQTT服务器的作用
MQTT服务器可以称为“消息代理”(Broker),可以是一个应用程序或一台设备。它是位于消息发布者和订阅者之间,它可以:
- 接收来自客户端发起的网络连接
- 接收客户端发布的认证和授权信息
- 处理来自客户端的订阅服务和退订服务请求
- 将消息下发到订阅者
MQTT协议中的订阅、会话、主题
订阅(Subscription)
- 订阅包含主题筛选器(Topic Filter)和最大服务质量(QoS)。订阅会与一个会话(Session)关联。一个会话可以包含多个订阅。每一个会话中的每个订阅都有一个不同的主题筛选器
会话(Session)
- 每个客户端与服务器建立连接后就是一个会话,客户端和服务器之间有状态交互。会话存在于一个网络之间,也可能在客户端和服务器之间跨越多个连续的网络连接
主题名(Topic Name)
- 连接到一个应用程序消息的标签,该标签与服务器的订阅相匹配。服务器会将消息发送给订阅所匹配标签的每个客户端
主题筛选器(Topic Filter)
- 个对主题名通配符筛选器,在订阅表达式中使用,表示订阅所匹配到的多个主题,告诉服务器对哪些主题感兴趣,服务器将你感兴趣的主题进行过滤,推送给你需要的消息
负载(Payload)
- 消息订阅者所具体接收的内容
Topic类与Topic
Topic类是针对产品的概念,在设备产品功能定义完成后,生成的是Topic类列表
Topic是针对设备的概念,添加设备后,设备产品的是Topic列表,是继承了Topic类的实体
MQTT协议中的方法
MQTT协议中定义了一些方法(也被称为动作),来于表示对确定资源所进行操作。这个资源可以代表预先存在的数据或动态生成数据,这取决于服务器的实现
Connect:等待与服务器建立连接
Disconnect:等待MQTT客户端完成所做的工作,并与服务器断开TCP/IP会话
Subscribe:等待完成订阅
UnSubscribe:等待服务器取消客户端的一个或多个topics订阅Publish:MQTT客户端发送消息请求,发送完成后返回应用程序线程
网络传输与应用消息
MQTT会构建底层网络传输:它将建立客户端到服务器的连接,提供两者之间的一个有序的、无损的、基于字节流的双向传输
当应用数据通过MQTT网络发送时,MQTT会把与之相关的服务质量(Qos)和主题名(Topic)相关连
传输消息三种服务质量(QoS)
QoS0,最多发一次(《=1),意味着消息发出去了,就不再管了。消息可能被接收,也可能丢失。这种传递方式最简单、传递可靠性最弱
QoS0协议流程图,非规范示例
QoS1,至少收到一次,发布方将保留数据,没有收到服务器响应收到信息的话,间隔一段时间重发,直至服务器响应
QoS 1协议流程图,非规范示例
Qos2,确保消息被接收,并不会被重复接收。阿里云平台目前不支QoS2,目前阿里云支持MQTT标准协议接入,兼容3.1.1和3.1版本协议
QoS 2协议流程图,非规范示例
5.4 设备基于MQTT接入云的认证方式
物联网平台支持两种通信模式,PUB/SUB以及RRPC,这两种形式均基于MQTT实现,用户可以根据业务需求灵活选择
PUB/SUB
在Topic的基础上,物联网平台基于Pub/Sub机制进行消息的路由转发,让备端可以发布或订阅消息,实现通信。IoT平台维护所有Topic的发布订阅用户列表,当发布者将消息发布到Topic后,IoT平台会检查该Topic的所有订阅用户,然后将消息转发给所有订阅了该Topic的设备,这些设备就会收到该Topic内的消息内容。在这个流程中,我们可以看到是一个异步的流程
RRPC
一个同步的通信模式RRPC(Revert Remote Procedure Call),它是物联网平台基于开源MQTT协议封装的。采用这种通信模式,服务端下发指令给设备时需要同步得到设备端的响应
MQTT的报文结构
MQTT协议中定义了一些方法(也被称为动作),这些方法主要包括Connect、Connack.Disconnect、Subscribe、UnSubscribe、Publish等等
任何一个MQTT的数据包都由三个部分组成:固定头、可变头和负载。所有的MQTT数据包都包含有固定头,长度是两个字节
二字节的固定头
CONNECT连接
CleanSession(用于会话保持)
- 为“1"时,关闭会话重用机制。每次CONNECT都是新的Session
- 为"0”时开启会话重用机制,网络断开重连后,恢复之前的Session信息
- 当终端设备离线时,不管CleanSession的值是什么,不可能接收任何QoS-0,1,2消息
- 当CleanSession的值为1,当终端设备离线再上线时,离线期间发来QoS-0,1,2的消息一律接收不到。当CleanSession的值为0,当终端设备离线再上线时,离线期间发来QoS-1,2的消息仍然可以接收到
WillTopic等(遗嘱信息)
- 当客户端与服务器建立连接之后,在工作的过程中,可能会因为各种原因发生与服务器断开连接的情形
KeepAlive(保活时间、心跳间隔)
- 服务器通过KeepAlive这个保活时间(心跳间隔)来判定的客户端异常断开了
- 如果客户端在一段时间内既要保持连接,又没有数据消息需要发送,那么需要在保活时间内,主动发送心跳包给服务器,用于维护连接。断开连接时,如果有遗嘱信息,服务器按照约定发布相关消息给订阅者
CONNCT报文结构
客户端向服务器发布消息
- 服务器向其他的订阅了消息的客户端发消息,包含的内容有唯一的Packet ID Topic.QoS、表明是否是重复信息的DUP标记和RetainFlag(保留消息)
保留消息标记
- 如设置了保留消息的,在没有新的消息来临前,服务器会将最近发生的一条消息在客户端上线的时候就推送给它。(阿里云暂不支持)
PUBISH和PUBACK
消息的订阅:Subscribe,SUBACK数据包
SUBSCRIBE
客户端可以向服务器订阅某个主题也可以取消订阅
消息订阅取消:unsubscribe和unsuback
MQTT连接入物联网
阿里云物联网云端提供了两种连接方式:MQTT客户端直连和使用HTTPS认证再连接。
(详情可以参考:https://help.aliyun.com/document-detail/73742.html?spm-a2c4g.11186623.6.657.6e293f86N32RJS)
MQTT客户端域名直连方式更加适合于资源受限的设备使用,需要注意MQTT Connect时
- Connect指令中的KeepAlive不能小于30秒,否则会拒绝连接。建议值为[60秒,300秒]之间
- 如果同一个设备三元组,同时用于多个连接,可能导致客户端互相上下线
METT客户端域名直连方式
MQTT采用的是明码传输,安全的级别很低,密码很容易被截取。为了提高安全级别,如果使用TLS,需要下载根证书(http://aliyun-iot.oss-cn-hangzhou.aliyuncs.com/cert_pub/root.crt)
使用MQTT客户端连接服务器,自主接入可以使用开源MQTT客户端参考(https://github.com/mqtt/mqtt.github.io/wiki/libraries),MQTT的了解可以参考[http://matt.org]相关文档
MQTT连接使用说明
连接域名
- 华东2节点:SI{ProductKey}.ot-as-mqtt.cn-shanghai.aliyuncs.com:1883
- 其中的$I{productKey}请替换为你自己产品的ProductKey
可变报头(Variable header)
- Connect指令中需包含Keep Alive(保活时间)。保活心跳时间取值范围为30至1200秒。如果心跳时间不在此区间内,物联网平台会拒绝连接。建议取值300秒以上。如果网络不稳定,将心跳时间设置高一些
mgtt的Connect报文参数包括:mqttClientld.mgttUsername和mgttPassword。在设备端代码通过MQTT Connect阿里云物联网控制台时使用该参数即可。mqttPassword通过hmacsha1计算得到
HTTPS认证连接模式
使用HTTPS认证再连接模式见阿里云的网站,前面提供了链接。上面所阐述的两种设备认证方式各有其优缺点,MQTT客户端域名直连方式更加适合于资源受限的设备使用。在本次的项目例程当中,采用的就是MQTT客户端域名直连的方式