在线开发MQTT协议的智慧路灯
场景说明
本文以“智慧路灯”为示例,通过MQTT.fx的设备模拟器替代真实的设备,带您快速体验设备上报数据到物联网平台和远程下发控制命令到设备的全过程。
假设:
路灯设备上报一条光照强度(luminance)消息;支持远程控制路灯开关状态的命令(switch),上报数据的格式为JSON格式。
前提条件
业务流程
基于MQTT.fx体验平台功能是指以在MQTT.fx模拟器为例,介绍数据上报、命令下发等业务。
创建产品。创建一个MQTT协议的产品。
开发产品模型。通过定义产品模型,在物联网平台构建一款路灯设备,支持上报光照强度、下发路灯开关状态命令。
注册设备。注册一个MQTT协议的设备,体验数据上报业务。
连接鉴权。使用MQTT.fx激活在物联网平台上注册的设备。
数据上报。使用MQTT.fx向物联网平台上报数据。
命令下发。在管理控制台下发命令,远程控制设备。
创建产品
产品是设备的合集,您可以将相同能力或特征的设备归属在同一个产品下。
登录管理控制台,单击左侧导航栏“产品”,单击页面右上角的“创建产品”。
根据页面提示填写参数,然后单击“立即创建”。
基本信息
所属资源空间
平台自动将新创建的产品归属在默认资源空间下。如需归属在其他资源空间下,下拉选择所属的资源空间。如无对应的资源空间,请先创建资源空间。
产品名称
自定义。支持字母、数字、下划线(_)、连字符(-)的字符组合。
协议类型
选择MQTT。
数据格式
选择JSON。
厂商名称
自定义。支持中英文字符、数字、下划线(_)、连字符(-)的字符组合。
所属行业
请根据产品模型的所属行业填写。
设备类型
使用平台预置的产品模型,会自动关联设备类型,不需要再输入设备类型。
高级配置
产品ID
定制ProductID,用于唯一标识一个产品。如果携带此参数,平台将产品ID设置为该参数值;如果不携带此参数,产品ID在物联网平台创建产品后由平台分配获得。
产品描述
产品描述。请根据实际情况填写。
开发产品模型
找到创建产品章节新增的产品,单击产品进入产品界面。
在产品详情“模型定义”页面,单击“自定义模型”,配置产品的服务。
新增服务类型“BasicData”。
“属性名称”:luminance
“必选”:勾选
“数据类型”:int(整型)
“访问权限”:可读、可写
“取值范围”:0~65535
“步长”:0
“单位”:不填写
“服务ID”:BasicData
“服务类型”:建议和服务ID保持一致
“服务描述”:上报路灯数据
在“新增服务”页面,填写“服务ID”、“服务类型”和“服务描述”,单击“确定”。
在“BasicData”的下拉菜单下单击“添加属性”,填写相关信息后,单击“确定”。
新增服务类型“LightControl”。
“服务ID”:LightControl
“服务类型”:建议和服务ID保持一致
“服务描述”:路灯开关控制
在“模型定义”下单击“添加服务”,填写“服务ID”、“服务类型”和“服务描述”,单击“确定”。
在“LightControl”的下拉菜单下单击“添加命令”,输入命令名称“Switch”。
在“新增命令”页面,单击“新增输入参数”,填写相关信息后,单击“确定”。
图1 新增输入参数value
注册设备
在管理控制台页面,选择左侧导航栏“设备 > 所有设备”,单击页面右上角的“注册设备”。
根据页面提示信息填写参数,然后单击“确定”。
参数名称
说明
所属资源空间
确保和步骤1创建的产品归属在同一个资源空间。
所属产品
选择步骤2创建的产品。
设备标识码
即nodeID,设备唯一物理标识。可自定义,由英文字母和数字组成。
设备名称
即device_name,可自定义,如streetlight。
设备认证类型
选择“密钥”。
密钥
此处不填写,物联网平台会自动生成。
成功注册设备后,平台会自动生成设备ID和密钥,请妥善保管好设备ID(deviceId)和密钥(deviceSecret),用于设备接入。
连接鉴权
使用MQTT.fx工具激活在物联网平台上注册的设备。
访问这里,填写注册设备后生成的设备ID(DeviceId)和密钥(DeviceSecret),生成连接信息(ClientId、Username、Password)。
参数
必选/可选
类型
参数描述
ClientId
必选
String(256)
一机一密的设备clientId由4个部分组成:设备ID、设备身份标识类型、密码签名类型、时间戳,通过下划线“_”分隔。
Username
必选
String(256)
设备ID。
Password
必选
String(256)
加密后的设备密钥。Password的值为使用“HMACSHA256”算法以时间戳为密钥,对secret进行加密后的值。
secret为注册设备时平台返回的secret。
设备通过MQTT协议的connect消息进行鉴权,对于构造clientId的各个部分信息都必须包括进去,平台收到connect消息时,会判断设备的鉴权类型和密码摘要算法。
使用生成工具生成的clientId格式,默认不校验时间戳:设备ID_0_0_时间戳。
connect消息鉴权失败时,平台会返回错误,并自动断开MQTT链路。
当采用“HMACSHA256”校验时间戳方式时,会先校验消息时间戳与平台时间是否一致,再判断密码是否正确。
当采用“HMACSHA256”不校验时间戳方式时,鉴权消息也必须带时间戳,但不检验时间是否准确,仅判断密码是否正确。
“0”代表HMACSHA256不校验时间戳。
“1”代表HMACSHA256校验时间戳。
设备ID:指设备在平台成功注册后生成的唯一设备标识,通常由设备的产品ID和设备的NodeId通过分隔符“_”拼装而来。
设备身份标识类型:固定值为0,表示设备ID。
密码签名类型:长度1字节,当前支持2种类型:
时间戳:为设备连接平台时的UTC时间,格式为YYYYMMDDHH,如UTC 时间2018/7/24 17:56:20 则应表示为2018072417。
打开MQTT.fx软件,单击设置图标。
参考下表配置鉴权参数,然后单击“Apply”。
参数名称
说明
Broker Address
填写从设备接入服务控制台获取的设备对接地址,此地址为域名信息。不能通过域名接入的设备,通过在cmd命令框中执行“ping 域名”获取IP地址,用IP地址接入平台。由于IP地址不固定,您需要将IP地址做成可配置项。
Broker Port
默认为1883。
Cliend ID
设备cliendID,请参考2中获取。
User Name
即设备ID,请参考2中获取。
Password
加密后的设备密钥,请参考2中获取。
单击“Connect”,设备鉴权成功后,在物联网平台可以看到设备处于在线状态。
上报数据
使用MQTT.fx工具向物联网平台上报数据。
设备若通过MQTT通道上报数据,需要发给指定的topic,上报消息的topic格式为:“$oc/devices/{device_id}/sys/properties/report”,其中“deviceId”的值,对一机一密设备,使用deviceId接入时填写为设备注册成功后返回的“deviceId”值。
填写接口地址,此处以“$oc/devices/{device_id}/sys/properties/report”为例,如“$oc/devices/5e4e2e92ac-164aefa8fouquan1/sys/properties/report”。
在工具中间的空白处填写上报的数据。
请求参数
字段名
必选/可选
类型
参数描述
services
必选
List<ServiceProperty>
设备服务数据列表(具体结构参考下表ServiceProperty定义表)
ServiceProperty定义表:
字段名
必选/可选
类型
参数描述
service_id
必选
String
设备服务的ID。
properties
必选
Object
设备服务的属性列表,具体字段在设备关联的产品模型中定义。
eventTime
可选
String
设备采集数据UTC时间(格式:yyyyMMddTHHmmssZ),如:20161219T114920Z。
设备上报数据不带该参数或参数格式错误时,则数据上报时间以平台时间为准。
请求示例
{ 'services': [{ 'service_id': 'BasicData', 'properties': { 'luminance': 30 } } ] }单击“Publish”,可以在物联网平台上查看设备是否成功上报数据。
命令下发
在管理控制台下发命令,远程控制设备。
进阶体验
按照本页面的指导,使用MQTT.fx模拟MQTT设备接入物联网平台后,您应该已经基本了解MQTT设备调用物联网平台开放的接口与平台交互。
若您想要进一步体验设备接入服务,可参考开发指南开发真实应用和真实设备,并接入物联网平台,体验更多功能。