入门
MQTT 基础知识
MQTT是一种轻量级的发布-订阅消息协议,可能使其最适合各种物联网设备。您可以在此处找到有关 MQTT 的更多信息。
睿珀物联网平台服务器节点充当 MQTT 代理,支持 QoS 级别 0(最多一次)和 1(至少一次)和一组可配置主题。
客户端库设置
您可以在 Web 上找到大量的 MQTT 客户端软件。本文中的示例将基于 mqttx。
MQTT 连接
我们将在本文中使用访问令牌设备凭据,稍后将它们称为$ACCESS_TOKEN。应用程序需要使用包含$ACCESS_TOKEN的用户名发送 MQTT CONNECT 消息。
连接序列期间可能的返回码及其原因:
- 0x00 已连接- 成功连接到 物联网平台 MQTT 服务器。
- 0x04 连接被拒绝,用户名或密码错误- 用户名为空。
- 0x05 连接被拒绝,未授权- 用户名包含无效的$ACCESS_TOKEN。
另一种身份验证选项是使用X.509 证书或基本 MQTT 凭据- 客户端 ID、用户名和密码的组合。
键值格式
默认情况下,物联网平台 支持 JSON 中的键值内容。键始终是字符串,而值可以是字符串、布尔值、双精度、长整型或 JSON。例如:
{
"stringKey":"value1",
"booleanKey":true,
"doubleKey":42,
"longKey":73,
"jsonKey":{
"someNumber":42,
"someArray":[1,2,3],
"someNestedObject":{
"key":"value"
}
}
}
但是,也可以通过Protocol Buffers发送数据。有关详细信息,请参阅设备配置文件文章中的MQTT 传输类型配置部分。
也可以使用自定义二进制格式或一些序列化框架。有关详细信息,请参阅协议自定义。
MQTT 传输类型
MQTT 传输类型启用高级 MQTT 传输设置。现在,您可以为分别对应于遥测上传 API和属性更新 API的时间序列数据和属性更新指定自定义 MQTT 主题过滤器 。
遥测上传 API
为了将遥测数据发布到 物联网平台服务器节点,请将 PUBLISH 消息发送到以下主题:
v1/devices/me/telemetry |
---|
支持的最简单的数据格式是:
{"key1":"value1", "key2":"value2"}
要么
[{"key1":"value1"}, {"key2":"value2"}]
请注意,在这种情况下,服务器端时间戳将分配给上传的数据!
如果您的设备能够获取客户端时间戳,您可以使用以下格式:
[
{
"ts":1451649600512,
"values":{
"key1":"value1",
"key2":"value2"
}
},
{
"ts":1451649600512,
"values":{
"key1":"value1",
"key2":"value2"
}
}
]
属性API
物联网平台属性API能够使设备具备如下功能:
- 将客户端设备属性上传到服务端
- 从服务端请求客户端和共享属性
- 从服务端订阅共享属性
- 通过服务端发布客户端属性
通过服务端发布客户端属性
通过服务端发布客户端属性必须PUBLISH消息到下面主题:
支持的数据格式:v1/devices/me/attributes
示例:{
"attribute1": "value1",
"attribute2": true,
"attribute3": 42.0,
"attribute4": 73,
"attribute5": {
"someNumber": 42,
"someArray": [1,2,3],
"someNestedObject": {"key": "value"}
}
}
物联网平台可以通过设备详情的客户端属性查看:
通过服务端获取属性值
通过服务端获取客户端属性或共享属性必须PUBLISH消息到下面主题:
v1/devices/me/attributes/request/$request_id |
---|
其中$request_id表示整数的请求标识符。
在发送带有请求的PUBLISH消息之前客户端需要订阅下面主题:
v1/devices/me/attributes/response/+ |
---|
示例:
步骤一:设置订阅主题
步骤二:发布获取属性值主题
$request_id设置为1,保证整数的不重复性。
注意事项:需要设置一个空JSON格式数据
步骤三:订阅主题收到客户端属性
通过服务端订阅属性
通过服务端订阅共享属性必须SUBSCRIBE消息到下面主题:
v1/devices/me/attributes
如果服务端组件(例如REST API或规则链)更改了共享属性时客户端就会收到对应属性值:
{
"key1": "value1"
}
示例:
步骤一:订阅共享属性主题
步骤二:平台更改共享属性
平台可点击新增功能更改属性值
订阅主题接收到响应
RPC API(远程指令下发)
服务端RPC
客户端订阅服务端RPC命令必须SUBSCRIBE消息发送下面主题:
v1/devices/me/rpc/request/+ |
---|
订阅后客户端会收到一条命令作为对相应主题的PUBLISH命令:
v1/devices/me/rpc/request/+ |
---|
$request_id表示请求的整型标识符。
客户端PUBLISH下面主题进行响应:
v1/devices/me/rpc/request/+ |
---|
示例:
步骤一:客户端订阅服务端RPC命令
步骤二:通过平台API进行远程指令下发
通过账户/密码登录获取访问token
示例地址:
【POST】http://iot.relaper.com/api/auth/login
示例数据:
{
"username": "edgex@qq.com",
"password": "123456"
}
远程控制下发
注意事项:远程控制下发是双向的,当客户端响应成功,接口才会提示成功,否则提示为超时未响应。
示例地址:【POST】http://iot.relaper.com/api/plugins/rpc/twoway/**{{deviceId}}**
Header设置:增加token凭证
key:X-Authorization
value(Bearer后携带1个空格):”Bearer “ + 登录获取的token
示例token:
Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiI5MjQzOTI1NjZAcXEuY29tIiwic2NvcGVzIjpbIlRFTkFOVF9BRE1JTiJdLCJ1c2VySWQiOiIxZWExMDgxMC05MDJkLTExZWItOWRiMS0zNzM4NzFmMDFjN2IiLCJmaXJzdE5hbWUiOiLkuo7lvLoiLCJsYXN0TmFtZSI6IueOiyIsImVuYWJsZWQiOnRydWUsImlzUHVibGljIjpmYWxzZSwidGVuYW50SWQiOiIwZGE0NDZkMC05MDJkLTExZWItOWRiMS0zNzM4NzFmMDFjN2IiLCJjdXN0b21lcklkIjoiMTM4MTQwMDAtMWRkMi0xMWIyLTgwODAtODA4MDgwODA4MDgwIiwiaXNzIjoidGhpbmdzYm9hcmQuaW8iLCJpYXQiOjE2NDAxMzQ3ODgsImV4cCI6MTY0MDE0Mzc4OH0.jA0sc0Elpkjft9KHK6RE2AZmiK-d9UuMiJmJY-owRnIAi1zDWvq7Jg-2iYbLpgmmW6xIKYjBIuSioQIh9mHByA
示例数据:
{
"method": "SET",
"service": "",
"uri": "",
"params": {
"LED":"false"
}
}
请求地址{{deviceId}}通过物联网平台获取:
点击设备详情,复制设备ID获取
步骤三:客户端PUBLISH主题进行响应
订阅收到对应远程指令
客户端响应
认领设备
为了启动认领设备,向以下主题发送 PUBLISH 消息:
v1/devices/me/claim |
---|
支持的数据格式为:
{"secretKey":"value", "durationMs":60000}
请注意,上述字段是可选的。如果未指定secretKey,则使用空字符串作为默认值。如果没有指定durationMs ,则使用系统参数device.claim.duration(在文件/etc/relaperiot/conf/relaperiot.yml 中)。
设备配置
为了启动设备配置,请将 Provisioning 请求发送到以下主题:
/provision |
---|
此外,您应该将username或clientId设置为provision。
支持的数据格式为:
{"deviceName":"DEVICE_NAME", "provisionDeviceKey":"u7piawkboq8v32dmcmpp","provisionDeviceSecret":"jpmwdn8ptlswmf4m29bw"}