内容正文:
目录
设备接入 5
MQTT协议与 IoT 物联网平台 6
CoAP 协议详解 17
IoT 设备上云方案详解 24
电信 NB-IoT 无缝对接阿里云 IoT 27
LoRaWAN设备接入实战 35
微信小程序 MQTT模拟器 42
IoT 设备免烧录三元组,开机即时注册 51
IoT 存量设备零改造迁移上云 57
基于函数计算实现 IoT 设备动态注册 64
Nodejs 版 mqtt 接入阿里云 IoT 68
C#设备接入 IoT 物联网平台 74
IoT 设备用 HTTPS 协议接入物联网平台 80
网关与子设备上云开发实战 89
设备用 X.509 证书接入实战(一) 97
设备用 X.509 证书接入实战(二) 102
消息处理 110
深度解读 IoT 消息洪峰怎么扛 111
亿级 IoT 设备连接底层逻辑 117
IoT 平台广播消息 Broadcast 实战 125
IoT 设备离线时,下行消息方案 129
自定义 Topic 同步调用 RRPC 实战(二) 137
系统 Topic 实现云端同步调用 RRPC(一) 145
设备上报二进制数据云端解析 153
设备接入
MQTT协议与 IoT物联网平台 < 6
MQTT协议与 IoT物联网平台
作者 | 苏堤嘉木
一、MQTT协议介绍
1. MQTT协议
MQTT(消息队列遥测传输) 是基于 TCP/IP 协议栈而构建的支持在各方之间异步
通信的消息协议。MQTT 在空间和时间上将消息发送者与接收者分离,因此可以在不可靠
的网络环境中进行扩展。虽然叫做消息队列遥测传输,但它与消息队列毫无关系,而是使用
了发布和订阅(Pub/Sub)的模型。
MQTT 是一种轻量级的、灵活的网络协议,致力于为 IoT 开发人员实现适当的平衡:
这个轻量级协议可在严重受限的设备硬件和高延迟/带宽有限的网络上实现。
它的灵活性使得为 IoT 设备和服务的多样化应用场景提供支持成为可能。
2. MQTT Client 库
MQTT Client 库在很多语言中都有实现,包括 Embedded C、C、Java、
JavaScript、Python、C++、C#、Go、iOS、Android 等。
Eclipse Paho 的 MQTT库下载地址:
https://www.eclipse.org/paho/downloads.php
7 > MQTT协议与 IoT物联网平台
3. MQTT报文
固定报头 Fixed header
控制报文类型:
MQTT协议与 IoT物联网平台 < 8
控制报文类型标志位:
剩余长度:
可变报头Variable header
某些MQTT控制报文包含一个可变报头部分。它在固定报头和负载之间。可变报头的
内容根据报文类型的不同而不同。可变报头的报文标识符(Packet Identifier)字段存在
于在多个类型的报文里。
9 > MQTT协议与 IoT物联网平台
报文标识符字节 Packet Identifier bytes:
有效载荷Payload
以下MQTT控制报文在报文的最后部分包含一个有效载荷。对于PUBLISH 来说有效
载荷就是业务消息。
MQTT协议与 IoT物联网平台 < 10
二、与阿里云 IoT平台建立连接
1. CONNECT
阿里云 IoT 物联网平台的MQTT 协议不支持will 消息,CONNECT 消息内容参数如
下:
其中 clientId,username,password 由设备三元组(productKey,deviceName,
deviceSecret)按照规则生成,具体规则如下:
11 > MQTT协议与 IoT物联网平台
官方文档:https://help.aliyun.com/document_detail/73742.html
设备端代码示例(Nodejs 版) client.js
/**
"dependencies": { "mqtt": "2.18.8" }
*/
const crypto = require('crypto');
const mqtt = require('mqtt');
//设备身份三元组+区域 const deviceConfig = {
productKey: "替换",
deviceName: "替换",
deviceSecret: "替换",
regionId: "cn-shanghai"
};
//根据三元组生成mqtt 连接参数
const options = initMqttOptions(deviceConfig);
const url = `tcp://${deviceConfig.productKey}.iot-as-mqtt.${deviceConfig.regionId}.aliyuncs.
com:1883`;
//2.建立连接
const client = mqtt.connect(url, options);
client.on('packetsend', function (packet){
console.log('send '+packet.cmd+' packet =>',packet)
})
client.on('packetreceive', function (packet){
console.log('receive '+packet.cmd+' packet =>',packet)
})
//IoT 平台mqtt 连接参数初始化
function initMqttOptions(deviceConfig) {
const params = {
productKey: deviceConfig.productKey,
deviceName: deviceConfig.deviceName,
timestamp: Date.now(),
clientId: Math.random().toString(36).substr(2),
}
MQTT协议与 IoT物联网平台 < 12
//CONNECT参数
const options = {
keepalive: 60, //60s
clean: false, //cleanSession 保持持久会话
protocolVersion: 4 //MQTT v3.1.1
}
//1.生成 clientId,username,password
options.password = signHmacSha1(params, deviceConfig.deviceSecret);
options.clientId = `${params.clientId}|securemode=3,signmethod=hmacsha1,timesta
mp=${params.timestamp}|`;
options.username = `${params.deviceName}&${params.productKey}`;
return options;
}
/*
生成基于HmacSha1 的 password
参考文档:https://help.aliyun.com/document_detail/73742.html?#h2-url-1
*/
function signHmacSha1(params, deviceSecret) {
let keys = Object.keys(params).sort();
// 按字典序排序
keys = keys.sort();
const list = [];
keys.map((key) => {
list.push(`${key}${params[key]}`);
});
const contentStr = list.join('');
return crypto.createHmac('sha1', deviceSecret)
.update(contentStr)
.digest('hex');
}
2. CONNACK
receive connack packet => Packet {
cmd: 'connack',
retain: false,
qos: 0,
dup: false,
length: 2,
topic: null,
13 > MQTT协议与 IoT物联网平台
payload: null,
sessionPresent: false,
returnCode: 0 }
3. PINGRESP
send pingreq packet => { cmd: 'pingreq' }
4. PINGRESP
receive pingresp packet => Packet {
cmd: 'pingresp',
retain: false,
qos: 0,
dup: false,
length: 0,
topic: null,
payload: null }
5. DISCONNECT
三、发布数据
1. PUBLISH
//3.属性数据上报 const topic = `/sys/${deviceConfig.productKey}/${deviceConfig.deviceNa
me}/thing/event/property/post`;
setInterval(function() {
//发布数据到 topic
client.publish(topic, getPostData(),{qos:1});
MQTT协议与 IoT物联网平台 < 14
}, 5 * 1000);
function getPostData() {
const payloadJson = {
id: Date.now(),
params: {
temperature: Math.floor((Math.random() * 20) + 10),
humidity: Math.floor((Math.random() * 20) + 60)
},
method: "thing.event.property.post"
}
console.log("===postData
topic=" + topic)
console.log(payloadJson)
return JSON.stringify(payloadJson)
}
send publish packet => { cmd: 'publish',
topic: '/sys/a1hQSwFledE/eud1jXfEgCsAiP2eId9Q/thing/event/property/post',
payload: '{"id":1543896481106,"params":{"temperature":23,"humidity":73},"method":"thing.
event.property.post"}',
qos: 1,
retain: false,
messageId: 38850,
dup: false }
2. PUBACK
receive puback packet => Packet {
cmd: 'puback',
retain: false,
qos: 0,
dup: false,
length: 2,
topic: null,
payload: null,
messageId: 38850 }
四、接收数据
1. SUBSCRIBE
15 > MQTT协议与 IoT物联网平台
//4.订阅主题,接收指令 const subTopic = `/${deviceConfig.productKey}/${deviceConfig.devi
ceName}/control`;
client.subscribe(subTopic)
client.on('message', function(topic, message) {
console.log("topic " + topic)
console.log("message " + message)
})
SUBSCRIBE消息体
send subscribe packet => { cmd: 'subscribe',
subscriptions:
[ { topic: '/a1hQSwFledE/eud1jXfEgCsAiP2eId9Q/control', qos: 0 } ],
qos: 1,
retain: false,
dup: false,
messageId: 38851 }
2. SUBACK
SUBACK 消息体:
receive suback packet => Packet {
cmd: 'suback',
retain: false,
qos: 0,
dup: false,
length: 3,
topic: null,
payload: null,
granted: [ 128 ],
messageId: 38851 }
3. UNSUBSCRIBE
send unsubscribe packet => { cmd: 'unsubscribe',
qos: 1,
messageId: 34323,
unsubscriptions: [ '/a1hQSwFledE/eud1jXfEgCsAiP2eId9Q/control' ] }
4. UNSUBACK
MQTT协议与 IoT物联网平台 < 16
receive unsuback packet => Packet {
cmd: 'unsuback',
retain: false,
qos: 0,
dup: false,
length: 2,
topic: null,
payload: null,
messageId: 34323 }
五、服务质量QoS
六、设备掉线重连
设备与阿里云 IoT 的订阅关系在云端保持,除非设备主动 unsubscribe,否则订阅关
系不清理。设备重连后,依然保持之前的订阅关系,不需要重复订阅。
七、传输层安全 TLS v1.2
设备和 IoT 平台之间的链路可以通过 TLS v1.2 加密。
如果使用 TLS加密,需要下载根证书。
CONNECT参数中 clientId 的 securemode=2
https://help.aliyun.com/document_detail/73742.html
17 > CoAP协议详解
CoAP协议详解
作者 | IoT 物联网技术
http://coap.technology
CoAP 是受限制的应用协议(Constrained Application Protocol)的缩写。在 IoT 物
联网场景,为了让小设备可以接入互联网,CoAP 协议被设计出来。CoAP 是一种应用层
协议,它运行于UDP 协议之上而不是像HTTP 那样运行于 TCP 之上。CoAP 协议非常
小巧,最小的数据包仅为 4字节。
CoAP 是一种面向网络的协议,采用了与HTTP 类似的特征,核心内容为资源抽象、
REST式交互以及可扩展的头选项等。为了克服HTTP 对于受限环境的劣势,CoAP既考
虑到数据报长度的最优化,又考虑到提供可靠通信。一方面,CoAP提供URI,REST 式
的方法如GET,POST,PUT 和 DELETE,以及可以独立定义的头选项提供的可扩展性。
另一方面,CoAP 基于轻量级的UDP 协议,并且允许 IP 多播。为了弥补UDP 传输的不
可靠性,CoAP 定义了带有重传机制的事务处理机制。并且提供资源发现机制,并带有资
源描述。
CoAP协议详解 < 18
协议特点:
基于消息模型
请求/响应模型
双向通信
轻量、低功耗
支持可靠传输
支持 IP多播
非长连接通信,支持受限设备
支持观察模式
支持异步通信
协议内容:
CoAP是一个完整的二进制应用层协议,消息格式紧凑,默认运行在UDP上。
CoAP报文:
【Ver】版本编号。
【T】报文类型,CoAP 协议定了 4 种不同形式的报文,CON 报文,NON 报文,
ACK报文和RST报文。
【TKL】CoAP 标识符长度。CoAP 协议中具有两种功能相似的标识符,一种
Message ID(报文编号),一种为 Token(标识符)。其中每个报文均包含消息编号,但
是标识符对于报文来说是非必须的。
19 > CoAP协议详解
【Code】功能码/响应码。Code 在 CoAP 请求报文和响应报文中具有不同的表现形
式,Code 占一个字节,它被分成了两部分,前 3位一部分,后 5 位一部分,为了方
便描述它被写成了 c.dd 结构。其中 0.XX 表示CoAP 请求的某种方法,而 2.XX、4.
XX 或 5.XX 则表示CoAP 响应的某种具体表现。
【Message ID】报文编号。
【Token】标识符具体内容,通过TKL 指定 Token 长度。
【Option】报文选项,通过报文选项可设定 CoAP 主机,CoAP URI,CoAP 请求
参数和负载媒体类型等等。
【1111 1111B】CoAP 报文和具体负载之间的分隔符。
请求方法:
0.01 GET:获取资源
0.02 POST:创建资源
0.03 PUT:更新资源
0.04 DELETE:删除资源
响应码:
Success 2.xx
这一类型的状态码,代表请求已成功被服务器接收、理解、并接受。
2.01 Created
2.02 Deleted
2.03 Valid
2.04 Changed
2.05 Content
Client Error 4.xx:
这类的状态码代表了客户端看起来可能发生了错误,妨碍了服务器的处理。
CoAP协议详解 < 20
4.00 Bad Request
4.01 Unauthorized
4.02 Bad Option
4.03 Forbidden
4.04 Not Found
4.05 Method Not Allowed
4.06 Not Acceptable
4.12 Precondition Failed
4.13 Request Entity Too Large
4.15 Unsupported Content-Format
Server Error 5.xx:
这类状态码代表了服务器在处理请求的过程中有错误或者异常状态发生,也有可能是服
务器的软硬件资源无法完成对请求的处理。
5.00 Internal Server Error
5.01 Not Implemented
5.02 Bad Gateway
5.03 Service Unavailable
媒体类型:
21 > CoAP协议详解
工作模式:
CoAP参考了很多HTTP 的设计思路,同时也根据受限资源限制设备的具体情况改良
了诸多的设计细节,增加了很多实用的功能。
消息类型
CON:需要被确认的请求,如果CON请求被发送,那么对方必须做出响应。
NON:不需要被确认的请求,如果NON请求被发送,那么对方不必做出回应。
ACK:应答消息,接受到CON消息的响应。
RST:复位消息,当接收者接收到的消息包含一个错误,接收者解析消息或者不再关
心发送者发送的内容,那么复位消息将会被发送。
请求/响应模型:
1.携带模式
2.分离模式
CoAP协议详解 < 22
3.非确认模式
CoAP协议的URI:
在 HTTP 的世界中,正式RESTFul 协议由于其简单性和适用性,在WEB应用中越
来越受欢迎,这样的道理同样适用于CoAP。一个CoAP 资源可以被一个URI 所描述,例
如一个设备可以测量温度,那么这个温度传感器的URI 被描述为:CoAP://machine.add
ress:5683/sensors/temperature。
23 > CoAP协议详解
CoAP的默认UDP端口号为 5683
HTTP和 CoAP对比:
HTTP 代表超文本传输协议,CoAP代表约束应用协议;
HTTP 协议的传输层采用了TCP,CoAP 协议的传输层使用UDP;
CoAP 协议是HTTP 协议的简化版;
CoAP 协议和HTTP 协议一样使用请求/响应模型,拥有相同的方法;
CoAP 开销更低,并支持多播;
CoAP 专为资源构成应用而设计,如:IoT/WSN/M2M 等...
CoAP和MQTT对比:
MQTT协议使用发布/订阅模型,CoAP协议使用请求/响应模型;
MQTT是长连接,CoAP协议是无连接;
MQTT通过中间代理传递消息的多对多协议,CoAP 协议是Server 和 Client 之间消
息传递的单对单协议;
MQTT 不支持带有类型或者其它帮助Clients 理解的标签消息,CoAP内置内容协商
和发现支持,允许设备彼此窥测以找到交换数据的方式。
IoT 设备上云方案详解 < 24
IoT 设备上云方案详解
作者 | 苏堤嘉木
随着传感器和通信技术的不断发展,物联网行业方兴未艾,业务链路涉及数据采集,通
信连接,数据存储,数据可视化,洞察,行动决策。但,在实施过程中,碎片化的设备端
通信连接难题往往就阻碍了项目落地进程。
今天,本文总结不同设备场景的连接上云方案,供大家参考。
一、资源丰富类设备
高性能硬件的发展,很多智能设备带有完整的 Linux、Android、Arduino 等操作系统,
在操作系统层面,解决了不同通信模块的差异,硬件端的应用程序只需要集成云平台的
IoTSDK,或者集成开源MQTT SDK 即可和云端建立长连接通信链路。
25 > CoAP协议详解
二、资源受限类设备
物联网场景中有很大占比设备是资源受限的,运行ROTS系统,甚至无操作系统,采
用MCU+通信模组的方式,实现设备数据远程采集。
市面上蜂窝模组(NB-IoT/2G/3G/4G)供应商较多,比如移远通信、芯讯通、合宙、有
方科技、广和通、日海智能、高新兴等,而各家的 AT 指令也各不相同,为设备端应用程
序开发带来了很大难度。
根据模组集成度不同又细分一下几种场景方案:
三、本地通信类设备
IoT 设备上云方案详解 < 26
物联网场景中还有大量设备仅具有本地局域通信能力,比如蓝牙设备,ZigBee 设备,
LoRa 设备,Modbus 设备,而不具有互联网接入协议栈支持,此时需要借助 DTU/网关
设备,代理子设备把本地协议转换成MQTT协议,从而实现数据采集上云。
四、本地系统整体上云
在工业,商业综合体等场景中,本地往往有一套成熟的系统,实现了设备数据的集中采
集,由于集团业务统一管理的诉求,需要把各地数据采集上云。
面对这种场景,可以通过自有系统集成泛化 SDK 通过 HTTP/2 协议,在不改造设备
前提下,高效的实现海量数据快速上云。
27 > 电信NB-IoT无缝对接阿里云 IoT
电信NB-IoT 无缝对接阿里云 IoT
作者 | 苏堤嘉木
众所周知,中国电信的NB-IoT 设备必须直连电信CTWing 平台,无法直接在阿里云
IoT,AWS IoT,腾讯云 IoT 管理中国电信的NB-IoT 设备。
IoT开发者苦于运营商平台久已,阿里云终于出手了!今天我们就给大家介绍如何通过
阿里云 IoT 企业物联网实例来管理中国电信的NB-IoT 设备。
一、电信 CTWing 开发
1. 创建产品
登陆电信 CTWing 控制台,创建产品:上海花城水表,选择智能水表,其他配置信
息如下图:
电信NB-IoT无缝对接阿里云 IoT < 28
产品创建成功后,查看服务定义,可以看到属性值:用水量,标识为:water_
consumption 如下图:
2. 注册设备
在产品详情-设备管理页面添加 NB-IoT 设备,这里我们输入 NB-IoT 水表设备的
IMEI,如下图:
3. 注册应用
在应用管理页面添加应用:上海花城水表管理,获取到应用的 AppKey 和
AppSecret,如下图:
29 > 电信NB-IoT无缝对接阿里云 IoT
二、阿里云 IoT平台开发
4. 开通企业实例-连接型
为了对接电信CTWing 物联网平台,我们按需开通连接型企业物联网实例,如下图:
5. 创建产品
在连接型实例中,新建产品:上海花城水表,选择智能水表,,其中数据格式选择:
透传/自定义,数据校验级别选择:弱校验,如下图:
电信NB-IoT无缝对接阿里云 IoT < 30
在产品功能定义中添加物模型的属性:用水量,标识为:water_consumption 如下图:
在产品数据解析中我们需要编写数据解析脚本,把电信CTWing 平台的数据格式转换
成阿里云 IoT 企业实例的物模型格式,如下图:
31 > 电信NB-IoT无缝对接阿里云 IoT
6. 创建云网关
在设备管理 中创建云网关,用来解析电信平台流转过来的设备数据,关联前面创建的
产品上海花城水表,用电信CTWing 平台的${deviceId}来自动注册设备,如下图:
电信NB-IoT无缝对接阿里云 IoT < 32
等待几分钟,云网关创建完成后,我们获取到网关URL,如下图:
三、电信 IoT 配置云网关
7. 配置云网关
我们回到电信CTWing 控制台,在产品详情的订阅管理中,配置阿里云 IoT 的云网关
URL,如下图:
四、联机运行
8. NB-IoT设备启动
33 > 电信NB-IoT无缝对接阿里云 IoT
我们启动手上的NB-IoT智能水表,即可在电信CTWing控制台看到水表上报的数据,
如下图:
9. 阿里云 IoT 数据
我们在企业物联网平台控制的设备详情,可以看到有一台新的在线设备,物模型数据
的运行状态可以看到实时的用水量值,如下图:
在日志服务也可以看到电信CTWing平台流转过来的NB-IoT 设备数据在阿里云 IoT
企业物联网平台物模型解析的完整过程,如下图: