文档首页 > > 最佳实践> 设备接入>

在线开发MQTT协议的智慧路灯

在线开发MQTT协议的智慧路灯

分享
更新时间:2021/05/18 GMT+08:00

场景说明

本文以“智慧路灯”为示例,通过MQTT.fx的设备模拟器替代真实的设备,带您快速体验设备上报数据到物联网平台和远程下发控制命令到设备的全过程。

假设:

路灯设备上报一条光照强度(luminance)消息;支持远程控制路灯开关状态的命令(switch),上报数据的格式为JSON格式。

前提条件

  • 已注册华为云官方帐号。未注册可单击注册页面完成注册。
  • 已完成实名制认证。未完成可在华为云上单击实名认证完成认证,否则无法使用设备接入功能。
  • 已开通设备接入服务。未开通则访问设备接入服务,单击“立即使用”后开通该服务。

业务流程

基于MQTT.fx体验平台功能是指以在MQTT.fx模拟器为例,介绍数据上报、命令下发等业务。

具体步骤如下:

步骤1:创建产品。创建一个MQTT协议的产品。

步骤2:开发产品模型。通过定义产品模型,在物联网平台构建一款路灯设备,支持上报光照强度、下发路灯开关状态命令。

步骤3:注册设备。注册一个MQTT协议的设备,体验数据上报业务。

步骤4:连接鉴权。使用MQTT.fx激活在物联网平台上注册的设备。

步骤5:数据上报。使用MQTT.fx向物联网平台上报数据。

创建产品

产品是设备的合集,您可以将相同能力或特征的设备归属在同一个产品下。

  1. 登录管理控制台,单击左侧导航栏“产品”,单击页面右上角的“创建产品”
  2. 根据页面提示填写参数,然后单击“立即创建”。

    基本信息

    所属资源空间

    平台自动将新创建的产品归属在默认资源空间下。如需归属在其他资源空间下,下拉选择所属的资源空间。如无对应的资源空间,请先创建资源空间

    产品名称

    自定义,如Streetlight。支持字母、数字、下划线(_)、连字符(-)的字符组合。

    协议类型

    选择MQTT。

    数据格式

    选择JSON。

    厂商名称

    自定义,如Huawei。支持中英文字符、数字、下划线(_)、连字符(-)的字符组合。

    模型定义

    选择模型

    此处不勾选,自定义产品模型。

    所属行业

    请根据产品模型的所属行业填写。

    设备类型

    Streetlight

开发产品模型

  1. 找到创建产品章节新增的产品,单击产品进入产品界面。
  2. 在产品详情“模型定义”页面,单击“自定义模型”,配置产品的服务。
  3. 新增服务类型“BasicData”

    1. 在“新增服务”页面,填写“服务ID”“服务类型”“服务描述”,单击“确定”。
      • “服务ID”:BasicData
      • “服务类型”:建议和服务ID保持一致
      • “服务描述”:上报路灯数据
    2. 在“BasicData”的下拉菜单下单击“添加属性”,填写相关信息后,单击“确定”。
      • “属性名称”:luminance
      • “必选”:勾选
      • “数据类型”:int(整型)
      • “访问权限”:可读、可写
      • “取值范围”:0~65535
      • “步长”:0
      • “单位”:不填写

  4. 新增服务类型“LightControl”

    1. 在“模型定义”下单击“添加服务”,填写“服务ID”“服务类型”“服务描述”,单击“确定”。
      • “服务ID”:LightControl
      • “服务类型”:建议和服务ID保持一致
      • “服务描述”:路灯开关控制
    2. 在“LightControl”的下拉菜单下单击“添加命令”,输入命令名称“Switch”。
    3. 在“新增命令”页面,单击“新增输入参数”,填写相关信息后,单击“确定”。
      图1 新增输入参数value

注册设备

  1. 在管理控制台页面,选择左侧导航栏“设备 > 所有设备”,单击页面右上角的“注册设备”
  2. 根据页面提示信息填写参数,然后单击“确定”

    参数名称

    说明

    所属资源空间

    确保和步骤1创建的产品归属在同一个资源空间。

    所属产品

    选择步骤2创建的产品。

    设备标识码

    即nodeID,设备唯一物理标识。可自定义,由英文字母和数字组成。

    设备名称

    即device_name,可自定义,如streetlight。

    设备认证类型

    选择“密钥”

    密钥

    此处不填写,物联网平台会自动生成。

    成功注册设备后,平台会自动生成设备ID和密钥,请妥善保管好设备ID(deviceId)和密钥(deviceSecret),用于设备接入。

连接鉴权

使用MQTT.fx工具激活在物联网平台上注册的设备。

  1. 下载MQTT.fx(默认是64位操作系统,如果是32位操作系统,单击此处下载MQTT.fx),安装MQTT.fx工具。
  2. 访问这里,填写注册设备后生成的设备ID(DeviceId)和密钥(DeviceSecret),生成连接信息(ClientId、Username、Password)。

    参数

    必选/可选

    类型

    参数描述

    ClientId

    必选

    String(256)

    一机一密的设备clientId由4个部分组成:设备ID、设备身份标识类型、密码签名类型、时间戳,通过下划线“_”分隔。

    • 设备ID:指设备在平台成功注册后生成的唯一设备标识,通常由设备的产品ID和设备的NodeId通过分隔符“_”拼装而来。
    • 设备身份标识类型:固定值为0,表示设备ID。
    • 密码签名类型:长度1字节,当前支持2种类型:
      • “0”代表HMACSHA256不校验时间戳。
      • “1”代表HMACSHA256校验时间戳。
    • 时间戳:为设备连接平台时的UTC时间,格式为YYYYMMDDHH,如UTC 时间2018/7/24 17:56:20 则应表示为2018072417。

    Username

    必选

    String(256)

    设备ID。

    Password

    必选

    String(256)

    加密后的设备密钥。Password的值为使用“HMACSHA256”算法以时间戳为密钥,对secret进行加密后的值。

    secret为注册设备时平台返回的secret。

    设备通过MQTT协议的connect消息进行鉴权,对于构造clientId的各个部分信息都必须包括进去,平台收到connect消息时,会判断设备的鉴权类型和密码摘要算法。

    使用生成工具生成的clientId格式,默认不校验时间戳:设备ID_0_0_时间戳。

    • 当采用“HMACSHA256”校验时间戳方式时,会先校验消息时间戳与平台时间是否一致,再判断密码是否正确。
    • 当采用“HMACSHA256”不校验时间戳方式时,鉴权消息也必须带时间戳,但不检验时间是否准确,仅判断密码是否正确。

    connect消息鉴权失败时,平台会返回错误,并自动断开MQTT链路。

  3. 打开MQTT.fx软件,单击设置图标。

  4. 参考下表配置鉴权参数,然后单击“Apply”。

    参数名称

    说明

    Broker Address

    填写从设备接入服务控制台获取的设备对接地址,此地址为域名信息。不能通过域名接入的设备,通过在cmd命令框中执行“ping 域名”获取IP地址,用IP地址接入平台。由于IP地址不固定,您需要将IP地址做成可配置项。

    Broker Port

    默认为1883。

    Cliend ID

    设备cliendID,请参考2中获取。

    User Name

    即设备ID,请参考2中获取。

    Password

    加密后的设备密钥,请参考2中获取。

  5. 单击“Connect”,设备鉴权成功后,在物联网平台可以看到设备处于在线状态。

上报数据

使用MQTT.fx工具向物联网平台上报数据。

设备若通过MQTT通道上报数据,需要发给指定的topic,上报消息的topic格式为:“$oc/devices/{device_id}/sys/properties/report”,其中“deviceId”的值,对一机一密设备,使用deviceId接入时填写为设备注册成功后返回的“deviceId”值。

  1. 填写接口地址,此处以“$oc/devices/{device_id}/sys/properties/report”为例,如“$oc/devices/5e4e2e92ac-164aefa8fouquan1/sys/properties/report”

  2. 在工具中间的空白处填写上报的数据。

    请求参数

    字段名

    必选/可选

    类型

    参数描述

    services

    必选

    List<ServiceProperty>

    设备服务数据列表(具体结构参考下表ServiceProperty定义表)

    ServiceProperty定义表:

    字段名

    必选/可选

    类型

    参数描述

    service_id

    必选

    String

    设备服务的ID。

    properties

    必选

    Object

    设备服务的属性列表,具体字段在设备关联的产品模型中定义。

    eventTime

    可选

    String

    设备采集数据UTC时间(格式:yyyyMMddTHHmmssZ),如:20161219T114920Z。

    设备上报数据不带该参数或参数格式错误时,则数据上报时间以平台时间为准。

    请求示例

    {
        "services": [{
                "service_id": "BasicData",
                "properties": {
                    "luminance": 30
            }
          }
       ]
    }

  3. 单击“Publish”,可以在物联网平台上查看设备是否成功上报数据。

命令下发

在管理控制台下发命令,远程控制设备。

  1. 选择设备 > 所有设备,找到注册设备章节新建的设备,单击“查看”进入设备详情页面。
  2. 单击“命令”页签,下发同步命令。

    MQTT协议设备仅支持同步命令下发,NB-IoT设备仅支持异步命令下发。

  3. 您可以在MQTT.fx模拟器端查看到下发的命令。

    • 由于MQTT.fx模拟器不支持查看下发的命令参数。具体下发内容,请参考平台命令下发
    • 界面提示命令下发失败,是因为下发的同步命令需要设备侧及时回响应,响应内容请参考平台命令下发

进阶体验

按照本页面的指导,使用MQTT.fx模拟MQTT设备接入物联网平台后,您应该已经基本了解MQTT设备调用物联网平台开放的接口与平台交互。

若您想要进一步体验设备接入服务,可参考开发指南开发真实应用和真实设备,并接入物联网平台,体验更多功能。

分享:

    相关文档

    相关产品