1. 程式人生 > 其它 >教程四:使用物聯網平臺控制硬體端

教程四:使用物聯網平臺控制硬體端

物美智慧》系列文章目錄

教程一:阿里雲使用docker快速部署服務端
教程二:本地配置服務端開發環境
教程三:硬體端-Arduino和ESP8266開發板入門
教程四:使用物聯網平臺控制硬體端
教程五:物聯網平臺使用手冊
教程六:官方SDK程式碼功能補充
教程七:APP的使用與場景聯動功能
diy:自制作四種智慧小電器

前言

上一章已經簡單介紹了Arduino和Esp8266開發板的基本使用方法,本篇將由淺入深,為大家介紹如何使用物美智慧平臺去控制硬體端

注:官方程式碼文件與平臺可檢視下面gitee連結
https://gitee.com/kerwincui/wumei-smart.git

硬體端程式碼地址

https://gitee.com/kerwincui/wumei-smart/tree/master/sdk/arduino/Arduino-ESP8266

一、裝置接入分兩個步驟,裝置認證和裝置互動

1.裝置認證

  • 加密認證(推薦)
  • 簡單認證
  • EMQX支援的其他認證方式

2.裝置互動

  • 釋出物模型、裝置資訊、時鐘同步相關Mqtt主題
  • 訂閱物模型、裝置升級、時鐘同步相關Mqtt主題

二、程式碼燒錄

1.將第一步拉取的sdk程式碼從Arduino中開啟

2.修改Helper.cpp檔案配置自己的wifi密碼,在服務端新建產品後,產品詳情中獲取產品編號、Mqtt賬號、Mqtt密碼和產品祕鑰,配置到下面的程式碼中去。
3.編譯、燒錄。成功後檢視wifi是否正常連線。開啟串列埠除錯資訊,檢視開發板是否正常相應
4.補充程式碼
在我們連線好開發板,並且串列埠資訊正常列印資料時,我們會發現雖然我們點選了服務端按鈕,但是開發板並沒有做出相應動作,這是因為sdk程式碼中,獲取到相應操作後,只打印了資訊,並沒有做出相應動作,如下:

如果想要開發板做出相應響應資訊,可在每個條件下補充相應的程式碼。

三、裝置認證

1. 加密認證

系統推薦使用的認證方式,支援裝置禁用功能。產品詳情中獲取產品編號、Mqtt賬號、Mqtt密碼和產品祕鑰,密碼通過產品祕鑰進行AES加密,傳遞到後端。後端通過產品祕鑰解密進行認證。連線Mqtt訊息伺服器需要提供唯一的客戶端ID、使用者名稱和密碼,具體格式如下:

# 客戶端ID
clientId = deviceNumber & productId 

# 使用者名稱
userName = wumei-smart

# 密碼
password = mqtt密碼 & userId & 過期時間

  • 客戶端ID等於裝置編號 + 產品編號,用 & 符號連線,中間無空格;
  • 使用者名稱直接輸入Mqtt賬號
  • 密碼等於Mqtt密碼 + 使用者ID + 密碼過期時間,然後進行AES加密。使用者ID就是登陸使用者的ID,Admin賬號是1。為了安全,密碼過期時間應該在24小時以內,採用時間戳格式,精確到毫秒。

賬號配置資訊示例:

clientId = "D6329VL54419L1Y0&2"
userName = "wumei-smart"
password = "/W2A/4MK+9cEGBhyBDgr2K5c62DAjAK4m0b5pvwxX6FFMzI3h1pUmaDY3BH1P2mI"

2、獲取當前時間

獲取當前時間,可以呼叫系統的NTP時間介面,介面請求時傳送裝置當前執行毫秒數,返回裝置傳送時間、服務端接收時間、服務端傳送時間。然後獲取裝置當前執行毫秒數,作為裝置接收間。最後用公式計算出裝置當前的時間,時間必須以毫米為單位。

# deviceSendTime值為裝置當前執行的毫秒數
http://localhost:8080/iot/tool/ntp?deviceSendTime=35768

# 計算時間
裝置當前時間 = (服務端接收時間 + 服務端傳送時間 + 裝置接收時間 - 裝置傳送時間) / 2

3、 AES加密說明

採用AES的CBC加密模式,偏移量固定為 wumei-smart-open 16位,輸出為Base64。

加密模式:  CBC
填    充:  pkcs5padding
數 據 塊:  128位
偏 移 量:  wumei-smart-open
輸    出:  base64

密    碼:  對應系統的產品祕鑰
加密內容:  mqtt密碼 & userId & expireTime

四、裝置互動

{productId} 代表產品ID, {deviceNum} 代表裝置編號。通過web端獲取產品ID和裝置編號,如果使用自動新增裝置,裝置編號可以自定義或者使用裝置MAC地址,裝置認證成功後會在後端自動新增一個對應的裝置實體。
1.訂閱主題

2.釋出主題

3.資料格式(裝置和系統互動使用JSON格式)

# 描述:裝置上電後釋出裝置資訊
# rssi             裝置強度(訊號極好[-55— 0],訊號好[-70— -55],訊號一般[-85— -70],訊號差[-100— -85])
# status           裝置狀態,固定為3,表示線上
# userId           使用者的ID
# firmwareVersion  韌體版本
{
     "rssi": -20,
     "firmwareVersion": 1.10,
     "status": 3,
     "userId": 1
}
# 描述:訂閱到裝置升級訊息後,根據版本號,Http請求下載韌體並升級

{
    "version": 1.1
}
# 描述:訂閱到實時監測訊息,根據數量和間隔釋出實時監測資料
# count      數量
# interval   間隔,毫秒為單位

{
    "count": 60,
    "interval": 1000
}
# 描述:根據訂閱到的實時監測訊息,釋出指定數量和間隔的監測資料
# id       識別符號,實時監測是物模型中的屬性,產品詳情中檢視識別符號,對應id值
# value    裝置採集的值,只能是整數或者小數
# remark   備註可選,可為空或者使用裝置當前時間

[{
    "id": "temperature",
    "value": "27.43",
    "remark": ""
}, {
    "id": "humidity",
    "value": "32.18",
    "remark": ""
}]
# 描述:可選,釋出時鐘同步訊息,服務端訂閱到後下發時鐘同步訊息
# deviceSendTime 裝置傳送時間

{
    "deviceSendTime": "1592361428000"
}

# 描述:可選,訂閱到時鐘同步訊息,計算當前時間 = (服務端接收時間 + 服務端傳送時間 + 裝置接收時間 - 裝置傳送時間) / 2
# deviceSendTime  裝置傳送時間
# serverRecvTime  服務端接收時間
# serverSendTime  服務端傳送時間

{
    "deviceSendTime": "1592361428000",
    "serverSendTime": "1592366463548",
    "serverRecvTime": "1592366463548"
}

# 描述:屬性、功能、事件都屬於物模型,Json定義是一樣的。`value` 的值如果是布林型別,值為"0"或者"1",代表開啟/關閉;列舉型別對應列舉項的鍵值(例如 "1",代表中速檔位);陣列型別是以英文逗號分隔的字串。
# id      識別符號,產品詳情中檢視物模型,對應物模型的識別符號
# value   對應值,檢視物模型中定義
# remark  可選,備註資訊,可在裝置日誌資訊中檢視到

[{
    "id": "gear",
    "value": "1",
    "remark": "備註資訊"
} {
    "id": "switch",
    "value": "0",
    "remark": "備註資訊"
}]

# 描述:屬性、功能、事件都屬於物模型,Json定義是一樣的,訂閱的訊息沒有 `remark` 備註資訊。屬性和功能的線上模式和普通模式,用於區分不同種類訊息,但是裝置的處理都是一樣的。例如都訂閱到訊息開啟開關,裝置的處理都是把開關開啟。   
# id     識別符號,產品詳情中檢視物模型,對應物模型的識別符號
# value  對應值,檢視物模型中定義,同上

[{
    "id": "gear",
    "value": "1"
} {
    "id": "switch",
    "value": "0"
}]

(想要了解更多可檢視物美智慧官網:http://wumei.live/