華為云計(jì)算 云知識 基于華為云IoT在線開發(fā)MQTT協(xié)議的智慧路燈案例
基于華為云IoT在線開發(fā)MQTT協(xié)議的智慧路燈案例

場景說明

本文以“智慧路燈”為示例,通過MQTT.fx的設(shè)備模擬器替代真實(shí)的設(shè)備,帶您快速體驗(yàn)設(shè)備上報(bào)數(shù)據(jù)到華為云 物聯(lián)網(wǎng)平臺 和遠(yuǎn)程下發(fā)控制命令到設(shè)備的全過程。

假設(shè):路燈設(shè)備上報(bào)一條光照強(qiáng)度(luminance)消息;支持遠(yuǎn)程控制路燈開關(guān)狀態(tài)的命令(switch),上報(bào)數(shù)據(jù)的格式為JSON格式。

前提條件

業(yè)務(wù)流程

基于MQTT.fx體驗(yàn)平臺功能是指以在MQTT.fx模擬器為例,介紹數(shù)據(jù)上報(bào)、命令下發(fā)等業(yè)務(wù)。

  1. 創(chuàng)建產(chǎn)品。創(chuàng)建一個(gè)MQTT協(xié)議的產(chǎn)品。
  2. 開發(fā)產(chǎn)品模型。通過定義產(chǎn)品模型,在物聯(lián)網(wǎng)平臺構(gòu)建一款路燈設(shè)備,支持上報(bào)光照強(qiáng)度、下發(fā)路燈開關(guān)狀態(tài)命令。
  3. 注冊設(shè)備。注冊一個(gè)MQTT協(xié)議的設(shè)備,體驗(yàn)數(shù)據(jù)上報(bào)業(yè)務(wù)。
  4. 連接鑒權(quán)。使用MQTT.fx激活在物聯(lián)網(wǎng)平臺上注冊的設(shè)備。
  5. 數(shù)據(jù)上報(bào)。使用MQTT.fx向物聯(lián)網(wǎng)平臺上報(bào)數(shù)據(jù)。
  6. 命令下發(fā)。在管理控制臺下發(fā)命令,遠(yuǎn)程控制設(shè)備。

 

創(chuàng)建產(chǎn)品

  1. 登錄管理控制臺,單擊左側(cè)導(dǎo)航欄“產(chǎn)品”,單擊頁面右上角的“創(chuàng)建產(chǎn)品”。
  2. 根據(jù)頁面提示填寫參數(shù),然后單擊“確定”。

    基本信息

    所屬資源空間

    平臺自動(dòng)將新創(chuàng)建的產(chǎn)品歸屬在默認(rèn)資源空間下。如需歸屬在其他資源空間下,下拉選擇所屬的資源空間。如無對應(yīng)的資源空間,請先創(chuàng)建資源空間。

    產(chǎn)品名稱

    自定義。支持字母、數(shù)字、下劃線(_)、連字符(-)的字符組合。

    協(xié)議類型

    選擇MQTT。

    數(shù)據(jù)格式

    選擇JSON。

    廠商名稱

    自定義。支持中英文字符、數(shù)字、下劃線(_)、連字符(-)的字符組合。

    所屬行業(yè)

    請根據(jù)產(chǎn)品模型的所屬行業(yè)填寫。

    設(shè)備類型

    使用平臺預(yù)置的產(chǎn)品模型,會(huì)自動(dòng)關(guān)聯(lián)設(shè)備類型,不需要再輸入設(shè)備類型。

    高級配置

    產(chǎn)品ID

    定制ProductID,用于唯一標(biāo)識一個(gè)產(chǎn)品。如果攜帶此參數(shù),平臺將產(chǎn)品ID設(shè)置為該參數(shù)值;如果不攜帶此參數(shù),產(chǎn)品ID在物聯(lián)網(wǎng)平臺創(chuàng)建產(chǎn)品后由平臺分配獲得。

    產(chǎn)品描述

    產(chǎn)品描述。請根據(jù)實(shí)際情況填寫。

 

開發(fā)產(chǎn)品模型

  1. 找到創(chuàng)建產(chǎn)品章節(jié)新增的產(chǎn)品,單擊產(chǎn)品進(jìn)入產(chǎn)品界面。
  2. 在產(chǎn)品詳情“模型定義”頁面,單擊“自定義模型”,配置產(chǎn)品的服務(wù)。
  3. 新增服務(wù)類型“BasicData”
    1. 在“添加服務(wù)”頁面,填寫“服務(wù)ID”、“服務(wù)類型”“服務(wù)描述”,單擊“確定”。
      • “服務(wù)ID”:BasicData
      • “服務(wù)類型”:建議和服務(wù)ID保持一致
      • “服務(wù)描述”:上報(bào)路燈數(shù)據(jù)
    2. 在“BasicData”服務(wù)列表右側(cè)區(qū)域,單擊“添加屬性”,填寫相關(guān)信息后,單擊“確定”。
      • “屬性名稱”:luminance
      • “屬性描述”:光照強(qiáng)度
      • “數(shù)據(jù)類型”:int(整型)
      • “訪問權(quán)限”:可讀、可寫
      • “取值范圍”:0~65535
      • “步長”:0
      • “單位”:不填寫
  4. 新增服務(wù)類型“LightControl”。
    1. 在“模型定義”下單擊“添加服務(wù)”,填寫“服務(wù)ID”、“服務(wù)類型”“服務(wù)描述”,單擊“確定”。
      • “服務(wù)ID”:LightControl
      • “服務(wù)類型”:建議和服務(wù)ID保持一致
      • “服務(wù)描述”:路燈開關(guān)控制
    2. 在“LightControl”的下拉菜單下單擊“添加命令”,輸入命令名稱“Switch”。
    3. 在“新增命令”頁面,單擊“新增輸入?yún)?shù)”,填寫相關(guān)信息后,單擊“確定”。

圖1 新增參數(shù)

注冊設(shè)備

  1. 在管理控制臺頁面,選擇左側(cè)導(dǎo)航欄“設(shè)備 > 所有設(shè)備”,單擊頁面右上角的“注冊設(shè)備”。
  2. 根據(jù)頁面提示信息填寫參數(shù),然后單擊“確定”。

    參數(shù)名稱

    說明

    所屬資源空間

    確保和步驟1創(chuàng)建的產(chǎn)品歸屬在同一個(gè)資源空間。

    所屬產(chǎn)品

    選擇步驟2創(chuàng)建的產(chǎn)品。

    設(shè)備標(biāo)識碼

    即nodeID,設(shè)備唯一物理標(biāo)識。可自定義,由英文字母和數(shù)字組成。

    設(shè)備名稱

    即device_name,可自定義,如streetlight。

    設(shè)備認(rèn)證類型

    選擇“密鑰”。

    密鑰

    此處不填寫,物聯(lián)網(wǎng)平臺會(huì)自動(dòng)生成。

  3. 成功注冊設(shè)備后,平臺會(huì)自動(dòng)生成設(shè)備ID和密鑰,請妥善保管好設(shè)備ID(deviceId)和密鑰(deviceSecret),用于設(shè)備接入。

連接鑒權(quán)

使用MQTT.fx工具激活在物聯(lián)網(wǎng)平臺上注冊的設(shè)備。

  1. 下載MQTT.fx(默認(rèn)是64位操作系統(tǒng),如果是32位操作系統(tǒng),單擊此處下載MQTT.fx),安裝MQTT.fx工具。
  2. 訪問這里,填寫注冊設(shè)備后生成的設(shè)備ID(DeviceId)和密鑰(DeviceSecret),生成連接信息(ClientId、Username、Password)。

    參數(shù)

    必選/可選

    類型

    參數(shù)描述

    ClientId

    必選

    String(256)

    一機(jī)一密的設(shè)備clientId由4個(gè)部分組成:設(shè)備ID、設(shè)備身份標(biāo)識類型、密碼簽名類型、時(shí)間戳,通過下劃線“_”分隔。

    • 設(shè)備ID:指設(shè)備在平臺成功注冊后生成的唯一設(shè)備標(biāo)識,通常由設(shè)備的產(chǎn)品ID和設(shè)備的NodeId通過分隔符“_”拼裝而來。
    • 設(shè)備身份標(biāo)識類型:固定值為0,表示設(shè)備ID。
    • 密碼簽名類型:長度1字節(jié),當(dāng)前支持2種類型:
      • “0”代表HMACSHA256不校驗(yàn)時(shí)間戳。
      • “1”代表HMACSHA256校驗(yàn)時(shí)間戳。
    • 時(shí)間戳:為設(shè)備連接平臺時(shí)的UTC時(shí)間,格式為YYYYMMDDHH,如UTC 時(shí)間2018/7/24 17:56:20 則應(yīng)表示為2018072417。

    Username

    必選

    String(256)

    設(shè)備ID。

    Password

    必選

    String(256)

    加密后的設(shè)備密鑰。Password的值為使用“HMACSHA256”算法以時(shí)間戳為密鑰,對secret進(jìn)行加密后的值。

    secret為注冊設(shè)備時(shí)平臺返回的secret。

    使用生成工具生成的clientId格式,默認(rèn)不校驗(yàn)時(shí)間戳:設(shè)備ID_0_0_時(shí)間戳。
    • 當(dāng)采用“HMACSHA256”校驗(yàn)時(shí)間戳方式時(shí),會(huì)先校驗(yàn)消息時(shí)間戳與平臺時(shí)間是否一致,再判斷密碼是否正確。
    • 當(dāng)采用“HMACSHA256”不校驗(yàn)時(shí)間戳方式時(shí),鑒權(quán)消息也必須帶時(shí)間戳,但不檢驗(yàn)時(shí)間是否準(zhǔn)確,僅判斷密碼是否正確。
    connect消息鑒權(quán)失敗時(shí),平臺會(huì)返回錯(cuò)誤,并自動(dòng)斷開MQTT鏈路。
  3. 設(shè)備通過MQTT協(xié)議的connect消息進(jìn)行鑒權(quán),對于構(gòu)造clientId的各個(gè)部分信息都必須包括進(jìn)去,平臺收到connect消息時(shí),會(huì)判斷設(shè)備的鑒權(quán)類型和密碼摘要算法。
  4. 打開MQTT.fx軟件,單擊設(shè)置圖標(biāo)。

  1. 參考下表配置鑒權(quán)參數(shù),然后單擊“Apply”。

    參數(shù)名稱

    說明

    Broker Address

    填寫從設(shè)備接入服務(wù)控制臺獲取的設(shè)備對接地址,此地址為域名信息。不能通過域名接入的設(shè)備,通過在cmd命令框中執(zhí)行“ping 域名”獲取IP地址,用IP地址接入平臺。由于IP地址不固定,您需要將IP地址做成可配置項(xiàng)。

    Broker Port

    默認(rèn)為1883。

    Cliend ID

    設(shè)備cliendID,請參考2中獲取。

    User Name

    即設(shè)備ID,請參考2中獲取。

    Password

    加密后的設(shè)備密鑰,請參考2中獲取。

  2. 單擊“Connect”,設(shè)備鑒權(quán)成功后,在物聯(lián)網(wǎng)平臺可以看到設(shè)備處于在線狀態(tài).

上報(bào)數(shù)據(jù)

使用MQTT.fx工具向物聯(lián)網(wǎng)平臺上報(bào)數(shù)據(jù)。

設(shè)備若通過MQTT通道上報(bào)數(shù)據(jù),需要發(fā)給指定的topic,上報(bào)消息的topic格式為:$oc/devices/{device_id}/sys/properties/report,其中deviceId的值,對一機(jī)一密設(shè)備,使用deviceId接入時(shí)填寫為設(shè)備注冊成功后返回的deviceId值。

  1. 填寫接口地址,此處以$oc/devices/{device_id}/sys/properties/report為例,如$oc/devices/5e4e2e92ac-164aefa8fouquan1/sys/properties/report。
  2. 在工具中間的空白處填寫上報(bào)的數(shù)據(jù)。請求參數(shù)ServiceProperty定義表:請求示例{ "services": [{ "service_id": "BasicData", "properties": { "luminance": 30 } } ] }

    字段名

    必選/可選

    類型

    參數(shù)描述

    service_id

    必選

    String

    設(shè)備服務(wù)的ID。

    properties

    必選

    Object

    設(shè)備服務(wù)的屬性列表,具體字段在設(shè)備關(guān)聯(lián)的產(chǎn)品模型中定義。

    eventTime

    可選

    String

    設(shè)備采集數(shù)據(jù)UTC時(shí)間(格式:yyyyMMddTHHmmssZ),如:20161219T114920Z。

    設(shè)備上報(bào)數(shù)據(jù)不帶該參數(shù)或參數(shù)格式錯(cuò)誤時(shí),則數(shù)據(jù)上報(bào)時(shí)間以平臺時(shí)間為準(zhǔn)。

    字段名

    必選/可選

    類型

    參數(shù)描述

    services

    必選

    List

    設(shè)備服務(wù)數(shù)據(jù)列表(具體結(jié)構(gòu)參考下表ServiceProperty定義表)

  3. 單擊“Publish”,可以在物聯(lián)網(wǎng)平臺上查看設(shè)備是否成功上報(bào)數(shù)據(jù)。

命令下發(fā)

在管理控制臺下發(fā)命令,遠(yuǎn)程控制設(shè)備。

  1. 選擇“設(shè)備 > 所有設(shè)備”,找到注冊設(shè)備章節(jié)新建的設(shè)備,單擊“查看”進(jìn)入設(shè)備詳情頁面。
  2. 單擊“命令”頁簽,下發(fā)同步命令。說明:MQTT協(xié)議設(shè)備僅支持同步命令下發(fā),NB-IoT設(shè)備僅支持異步命令下發(fā)。
  3. 您可以在MQTT.fx模擬器端查看到下發(fā)的命令。說明:
    • 由于MQTT.fx模擬器不支持查看下發(fā)的命令參數(shù)。具體下發(fā)內(nèi)容,請參考平臺命令下發(fā)
    • 界面提示命令下發(fā)失敗,是因?yàn)橄掳l(fā)的同步命令需要設(shè)備側(cè)及時(shí)回響應(yīng),響應(yīng)內(nèi)容請參考平臺命令下發(fā)。

進(jìn)階體驗(yàn)

按照本頁面的指導(dǎo),使用MQTT.fx模擬MQTT設(shè)備接入物聯(lián)網(wǎng)平臺后,您應(yīng)該已經(jīng)基本了解MQTT設(shè)備調(diào)用物聯(lián)網(wǎng)平臺開放的接口與平臺交互。

若您想要進(jìn)一步體驗(yàn)設(shè)備接入服務(wù),可參考開發(fā)指南開發(fā)真實(shí)應(yīng)用和真實(shí)設(shè)備,并接入物聯(lián)網(wǎng)平臺,體驗(yàn)更多功能。