diff --git a/docs/Advanced_development/en/QuecPythonCloud/HuaweiCloud.md b/docs/Advanced_development/en/QuecPythonCloud/HuaweiCloud.md index 746a290b61199b97f23e5d67ab5182467fa70a03..9ad6809b8ad604adb450663967fb914367f2ac9d 100644 --- a/docs/Advanced_development/en/QuecPythonCloud/HuaweiCloud.md +++ b/docs/Advanced_development/en/QuecPythonCloud/HuaweiCloud.md @@ -2,9 +2,10 @@ **Revision history** -| **Version** | **Date** | Author | **Description** | -| ----------- | ---------- | ------ | --------------- | -| 1.0 | 2021-09-29 | Chic | Initial version | +| **Version** | **Date** | Author | **Description** | +| ----------- | ---------- | ------ | ------------------- | +| 1.0 | 2021-09-29 | Chic | Initial version | +| 1.1 | 2022-02-16 | Chic | equipment debugging | @@ -22,17 +23,21 @@ Open up Huawei Cloud via the link: [www.huaweicloud.com](http://www.huaweicloud. Click [Product]---[IoT]---[IoTDA] -![](media/184cc27df7aaf8e51ff5fba33b354abe.png) +![HuaweiCloud_01](media/HuaweiCloud_01.png) ### Create product Click [Product] ---[Create product] -![media_HuaweiCloud_002](media/437eefd54847b5780adc6b9c2c496544.png) +![HuaweiCloud_02](media/HuaweiCloud_02.png) In terms of protocol type, please select the MQTT. -![](media/58e05991a4eddf591effea2642579f4a.png) +![HuaweiCloud_03](media/HuaweiCloud_03.png) + +Product [Model Definition] + +![HuaweiCloud_04](media/HuaweiCloud_04.png) ### Add device @@ -40,11 +45,11 @@ Click [device] ---[All devices] > [https://console.huaweicloud.com/iotdm/?region=cn-north-4\#/dm-portal/device/all-device](https://console.huaweicloud.com/iotdm/?region=cn-north-4#/dm-portal/device/all-device) -![Media_Huawei_005](media/ee306a4acca2ec6a25d90a026d6cff22.png) +![HuaweiCloud_05](media/HuaweiCloud_05.png) The auto generated [Device ID] and [Device private key] will be used to generate connection info of next step after the device is registered. -![](media/178b3243bd5399776eaac723d81ce845.png) + ### Generate connection info @@ -52,7 +57,7 @@ Access to this address and fill in the generated device ID and Device Secret to -![](media/f51db8dc51ba6ae73375cbfe7f8b0063.png) +![HuaweiCloud_06](media/HuaweiCloud_06.png) ``` CLIENT_ID = b'5fbbb784b4ec2202e982e643_868540050954037_0_0_2021011909' @@ -68,9 +73,9 @@ PASSWORD =b'8001a12405743199b3396943a2ed397286117a9ebab4f5dfda8dd6fafe341d94' -![media_HuaweiCloud_003](media/image-20210929163551641.png) +![HuaweiCloud_07](media/HuaweiCloud_07.png) -![media_HuaweiCloud_005](media/image-20210929163737178.png) +![HuaweiCloud_08](media/HuaweiCloud_08.png) ![IMG_256](media/ad674210c976e30f24d800bede396808.png)Note: @@ -89,13 +94,13 @@ As for the clientId format generated via tool, the time stamp won't be verified Fill in port address, take “\$oc/devices/{device_id}/sys/properties/report” as an example,such as “\$oc/devices/5e4e2e92ac-164aefa8fouquan1/sys/properties/report”. -![media_HuaweiCloud_006](media/bf41a9ad7dcf2bc0718496712c30dd72.png) +![HuaweiCloud_09](media/HuaweiCloud_09.png) \$oc/devices/{device_id}/sys/properties/report \$oc/devices/5fbbb784b4ec2202e982e643_868540050954037/sys/properties/report -![media_Huawei_007](media/c919d92250a8d791e7b604d40a08d13d.png) +![HuaweiCloud_10](media/HuaweiCloud_10.png) ### Deliver data @@ -113,17 +118,21 @@ HTTP-Transmission Protocol -**Debug API** +### Issued an order - +$oc/devices/{device_id}/sys/commands/request_id={request_id} -![media_HuaweiCloud_008](media/6928f54528bf7a8c7f9ad115db1520e4.png) +\- Device side subscribing to topic with {request_id} parameter can use wildcard #. For example, topic $OC /devices/{device_id}/sys/commands/request_id={request_id} You can use $oc/devices / {device_id} / sys/commands / # -Topic: \$oc/devices/{device_id}/sys/messages/down +![HuaweiCloud_11](media/HuaweiCloud_11.png) -\$oc/devices/5fbbb784b4ec2202e982e643_1234567890123456789/sys/messages/down +![HuaweiCloud_12](media/HuaweiCloud_12.png)![HuaweiCloud_13](media/HuaweiCloud_13.png) -![media_HuaweiCloud_009](media/8b01f010e317cfd3129333709d60a514.png) +$oc/devices/{device_id}/sys/commands/request_id={request_id} + +$oc/devices/5fbbb784b4ec2202e982e643_869537055157730/sys/commands/# + +![HuaweiCloud_14](media/HuaweiCloud_14.png) ## SW design @@ -132,109 +141,87 @@ After getting ClientId, Username and Password on HuaweiCloud, it is approachable Case code ```python +import checkNet from umqtt import MQTTClient +import modem +from machine import UART +import sim +import hmac +from hashlib import sha256 -CLIENT_ID = b'5fbbb784b4ec2202e982e643_868540050954037_0_0_2021011909' - -SERVER = b'a15fbbd7ce.iot-mqtts.cn-north-4.myhuaweicloud.com' - -PORT = 1883 -USER = b'5fbbb784b4ec2202e982e643_868540050954037' +IMEI = modem.getDevImei() +E_SN = modem.getDevSN() +ESIM = sim.getImsi() -PASSWORD = b'8001a12405743199b3396943a2ed397286117a9ebab4f5dfda8dd6fafe341d94' +DeviceName = IMEI +DeviceSecret = 'ac4263b86eaf6442997a' +DeviceID = "5fbbb784b4ec2202e982e643" -DEVICE_ID = '5fbbb784b4ec2202e982e643_868540050954037' +CLIENT_ID = DeviceID + "_" + DeviceName + "_0_0_2022010507" +SERVER = "a15fbbd7ce.iot-mqtts.cn-north-4.myhuaweicloud.com" +PORT = 1883 +USER = DeviceID + "_" + DeviceName +PASSWORD = hmac.new( + "2022010507".encode('utf-8'), + DeviceSecret.encode('utf-8'), + digestmod=sha256).hexdigest() +DEVICE_ID = DeviceID + "_" + DeviceName state = 0 -def sub_cb(topic, msg): - - global state - - print( - "Subscribe Recv: Topic={},Msg={}".format( - - topic.decode(), - - msg.decode())) +def sub_cb(topic, msg): + global state + print( + "Subscribe Recv: Topic={},Msg={}".format( + topic.decode(), + msg.decode())) + state = 1 - state = 1 def MQTT_Init(): - # Create one mqtt case - - c = MQTTClient( - - client_id=CLIENT_ID, - - server=SERVER, - - port=PORT, - - user=USER, - - password=PASSWORD, + c = MQTTClient( + client_id=CLIENT_ID, + server=SERVER, + port=PORT, + user=USER, + password=PASSWORD, + keepalive=30) + + c.set_callback(sub_cb) + try: + c.connect() + c.subscribe('$oc/devices/{}/sys/commands/#'.format(DEVICE_ID)) + + msg = b'''{ + "services": [{ + "service_id": "WaterMeterControl", + "properties": { + "state": "T:15c, H: 85% " + } + } + ] + }''' + c.publish('$oc/devices/{}/sys/properties/report'.format(DEVICE_ID), msg) + except BaseException: + print('except') + print('Waiting command') + while True: + c.wait_msg() + if state == 1: + break + + c.disconnect() - keepalive=30) # It is a must to make keepalive as 30; otherwise, the connection will be a failure. - - # Set message callback - - c.set_callback(sub_cb) - - # Create connection - - c.connect() - - # Subscribe topic - - c.subscribe('$oc/devices/{}/sys/messages/down'.format(DEVICE_ID)) - - msg = b'''{ - - "services": [{ - - "service_id": "WaterMeterControl", - - "properties": { - - "state": "T:15c, H: 85% " - - }, - - "event_time": "20151212T121212Z" - - } - - ] - - }''' - - # Publish message - - c.publish('$oc/devices/{}/sys/properties/report'.format(DEVICE_ID), msg) - - while True: - - c.wait_msg() - - if state == 1: - - break - - # Disconnect - - c.disconnect() def main(): + MQTT_Init() - MQTT_Init() if __name__ == "__main__": - - main() + main() ``` Following that, we can download and verify. Since there is no need to compile python code, you can download and run **.py** into module via QPYcom. @@ -243,15 +230,15 @@ Following that, we can download and verify. Since there is no need to compile py Download and run **.py** file on module -![](media/4f4a5ee0d3c9728fc3a5e1a0044c02d4.png) +![HuaweiCloud_15](media/HuaweiCloud_15.png) Run the script manually -![media_HuaweiCloud_010](media/2dd7f1fa61d4861ddf3d5118b4d18a31.png) +![HuaweiCloud_16](media/HuaweiCloud_16.png) After sending data, the result is vivid: -![media_HuaweiCloud_011](media/38b2f5b0b684ffdd198d772baef2c946.png) +![HuaweiCloud_17](media/HuaweiCloud_17.png) ## The matched code diff --git a/docs/Advanced_development/en/QuecPythonCloud/code/HuaweiCloud_hmac.py b/docs/Advanced_development/en/QuecPythonCloud/code/HuaweiCloud_hmac.py new file mode 100644 index 0000000000000000000000000000000000000000..2fee2bb2f70f65c22819c9af8b3cffaa96ee044f --- /dev/null +++ b/docs/Advanced_development/en/QuecPythonCloud/code/HuaweiCloud_hmac.py @@ -0,0 +1,81 @@ +import checkNet +from umqtt import MQTTClient +import modem +from machine import UART +import sim +import hmac +from hashlib import sha256 + + +IMEI = modem.getDevImei() +E_SN = modem.getDevSN() +ESIM = sim.getImsi() + +DeviceName = IMEI +DeviceSecret = 'ac4263b86eaf6442997a' +DeviceID = "5fbbb784b4ec2202e982e643" + +CLIENT_ID = DeviceID + "_" + DeviceName + "_0_0_2022010507" +SERVER = "a15fbbd7ce.iot-mqtts.cn-north-4.myhuaweicloud.com" +PORT = 1883 +USER = DeviceID + "_" + DeviceName +PASSWORD = hmac.new( + "2022010507".encode('utf-8'), + DeviceSecret.encode('utf-8'), + digestmod=sha256).hexdigest() +DEVICE_ID = DeviceID + "_" + DeviceName + +state = 0 + + +def sub_cb(topic, msg): + global state + print( + "Subscribe Recv: Topic={},Msg={}".format( + topic.decode(), + msg.decode())) + state = 1 + + +def MQTT_Init(): + + c = MQTTClient( + client_id=CLIENT_ID, + server=SERVER, + port=PORT, + user=USER, + password=PASSWORD, + keepalive=30) + + c.set_callback(sub_cb) + try: + c.connect() + c.subscribe('$oc/devices/{}/sys/commands/#'.format(DEVICE_ID)) + + msg = b'''{ + "services": [{ + "service_id": "WaterMeterControl", + "properties": { + "state": "T:15c, H: 85% " + } + } + ] + }''' + c.publish('$oc/devices/{}/sys/properties/report'.format(DEVICE_ID), msg) + except BaseException: + print('except') + print('Waiting command') + while True: + c.wait_msg() + if state == 1: + break + + c.disconnect() + + +def main(): + MQTT_Init() + + +if __name__ == "__main__": + main() diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/HuaweiCloud_01.png b/docs/Advanced_development/en/QuecPythonCloud/media/HuaweiCloud_01.png new file mode 100644 index 0000000000000000000000000000000000000000..63c2a2dbc7f6c8fba3ab6d0a0149fb59c6492eca Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/HuaweiCloud_01.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/HuaweiCloud_02.png b/docs/Advanced_development/en/QuecPythonCloud/media/HuaweiCloud_02.png new file mode 100644 index 0000000000000000000000000000000000000000..335f27e180a8147d038233b92128a650c7db21a7 Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/HuaweiCloud_02.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/HuaweiCloud_03.png b/docs/Advanced_development/en/QuecPythonCloud/media/HuaweiCloud_03.png new file mode 100644 index 0000000000000000000000000000000000000000..c4dddeb027132d1fdfecab10ffad2fe15b6db0a2 Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/HuaweiCloud_03.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/HuaweiCloud_04.png b/docs/Advanced_development/en/QuecPythonCloud/media/HuaweiCloud_04.png new file mode 100644 index 0000000000000000000000000000000000000000..53cc5402c8421305c192a6e65d7e2814a95c480d Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/HuaweiCloud_04.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/HuaweiCloud_05.png b/docs/Advanced_development/en/QuecPythonCloud/media/HuaweiCloud_05.png new file mode 100644 index 0000000000000000000000000000000000000000..4643baf03c8f6ee7767699e420b8285dfc9c724f Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/HuaweiCloud_05.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/HuaweiCloud_06.png b/docs/Advanced_development/en/QuecPythonCloud/media/HuaweiCloud_06.png new file mode 100644 index 0000000000000000000000000000000000000000..d996e69fa1cc45705eb84c2951b487b70df40998 Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/HuaweiCloud_06.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/HuaweiCloud_07.png b/docs/Advanced_development/en/QuecPythonCloud/media/HuaweiCloud_07.png new file mode 100644 index 0000000000000000000000000000000000000000..72a9a71612d2462a60b0c2d92f14627192ca455d Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/HuaweiCloud_07.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/HuaweiCloud_08.png b/docs/Advanced_development/en/QuecPythonCloud/media/HuaweiCloud_08.png new file mode 100644 index 0000000000000000000000000000000000000000..9e054b3210cbf54960dde1d7b9402cfaf18ffa01 Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/HuaweiCloud_08.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/HuaweiCloud_09.png b/docs/Advanced_development/en/QuecPythonCloud/media/HuaweiCloud_09.png new file mode 100644 index 0000000000000000000000000000000000000000..8e43d49d2972223ab89947e4771de0800cdc8e63 Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/HuaweiCloud_09.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/HuaweiCloud_10.png b/docs/Advanced_development/en/QuecPythonCloud/media/HuaweiCloud_10.png new file mode 100644 index 0000000000000000000000000000000000000000..d33a36014aa3e3820106adf1a83aab477b8ba775 Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/HuaweiCloud_10.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/HuaweiCloud_11.png b/docs/Advanced_development/en/QuecPythonCloud/media/HuaweiCloud_11.png new file mode 100644 index 0000000000000000000000000000000000000000..53cc5402c8421305c192a6e65d7e2814a95c480d Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/HuaweiCloud_11.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/HuaweiCloud_12.png b/docs/Advanced_development/en/QuecPythonCloud/media/HuaweiCloud_12.png new file mode 100644 index 0000000000000000000000000000000000000000..6eb6d6f20c81e14c09698f40a73e34eb58528b3a Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/HuaweiCloud_12.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/HuaweiCloud_13.png b/docs/Advanced_development/en/QuecPythonCloud/media/HuaweiCloud_13.png new file mode 100644 index 0000000000000000000000000000000000000000..a4df1128615c715c6fdf443a38ef9d33a3de7d60 Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/HuaweiCloud_13.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/HuaweiCloud_14.png b/docs/Advanced_development/en/QuecPythonCloud/media/HuaweiCloud_14.png new file mode 100644 index 0000000000000000000000000000000000000000..d0dd7e798bb5132dd5dafd78aa014db808aed362 Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/HuaweiCloud_14.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/HuaweiCloud_15.png b/docs/Advanced_development/en/QuecPythonCloud/media/HuaweiCloud_15.png new file mode 100644 index 0000000000000000000000000000000000000000..48cb3fe63c79e314118c8d8db15ca0e77700b8c5 Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/HuaweiCloud_15.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/HuaweiCloud_16.png b/docs/Advanced_development/en/QuecPythonCloud/media/HuaweiCloud_16.png new file mode 100644 index 0000000000000000000000000000000000000000..bf8def4a3d432185a1a5dafe01e9fd91c50d3e15 Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/HuaweiCloud_16.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/HuaweiCloud_17.png b/docs/Advanced_development/en/QuecPythonCloud/media/HuaweiCloud_17.png new file mode 100644 index 0000000000000000000000000000000000000000..ecbc29528db15a89ffa9cef007e1834e892426cc Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/HuaweiCloud_17.png differ diff --git a/docs/Advanced_development/zh/QuecPythonCloud/HuaweiCloud.md b/docs/Advanced_development/zh/QuecPythonCloud/HuaweiCloud.md index 1894bb649e64cce56f5637db46be4064aadc3a2a..d48b67028148ea8091bc04c2df1ef425d045234e 100644 --- a/docs/Advanced_development/zh/QuecPythonCloud/HuaweiCloud.md +++ b/docs/Advanced_development/zh/QuecPythonCloud/HuaweiCloud.md @@ -5,6 +5,7 @@ | **版本** | **日期** | **作者** | **变更表述** | | -------- | ---------- | -------- | ------------ | | 1.0 | 2021-09-29 | Chic | 初始版本 | +| 1.1 | 2022-02-16 | Chic | 改进设备调试 | @@ -22,17 +23,21 @@ 在首页点击【产品】---【IoT物联网】---【设备接入IoTDA】 -![](media/184cc27df7aaf8e51ff5fba33b354abe.png) +![184cc27df7aaf8e51ff5fba33b354abe](media/184cc27df7aaf8e51ff5fba33b354abe.png) ### 创建产品 点击【产品】---【创建产品】 -![](media/437eefd54847b5780adc6b9c2c496544.png) +![437eefd54847b5780adc6b9c2c496544](media/437eefd54847b5780adc6b9c2c496544.png) 产品的“协议类型”选择MQTT -![](media/58e05991a4eddf591effea2642579f4a.png) +![58e05991a4eddf591effea2642579f4a](media/58e05991a4eddf591effea2642579f4a.png) + +产品【模型定义】 + +![image-20220216154517352](media\image-20220216154517352.png) ### 添加设备 @@ -40,11 +45,11 @@ > [https://console.huaweicloud.com/iotdm/?region=cn-north-4\#/dm-portal/device/all-device](https://console.huaweicloud.com/iotdm/?region=cn-north-4#/dm-portal/device/all-device) -![](media/ee306a4acca2ec6a25d90a026d6cff22.png) +![ee306a4acca2ec6a25d90a026d6cff22](media/ee306a4acca2ec6a25d90a026d6cff22.png) -注册设备后自动生成的【设备ID】和【设备密钥】,用于下一步骤生成连接平台的信息。 +注册设备后自动生成的【设备ID】和【设备密钥】,记下来用于下一步骤生成连接平台的信息。 -![](media/178b3243bd5399776eaac723d81ce845.png) +![178b3243bd5399776eaac723d81ce845](media/178b3243bd5399776eaac723d81ce845.png) ### 生成连接信息 @@ -52,7 +57,7 @@ -![](media/f51db8dc51ba6ae73375cbfe7f8b0063.png) +![f51db8dc51ba6ae73375cbfe7f8b0063](media/f51db8dc51ba6ae73375cbfe7f8b0063.png) ``` CLIENT_ID = b'5fbbb784b4ec2202e982e643_868540050954037_0_0_2021011909' @@ -70,7 +75,7 @@ PASSWORD =b'8001a12405743199b3396943a2ed397286117a9ebab4f5dfda8dd6fafe341d94' ![image-20210929163737178](media\image-20210929163737178.png) -![IMG_256](media/ad674210c976e30f24d800bede396808.png)说明: +![ad674210c976e30f24d800bede396808](media/ad674210c976e30f24d800bede396808.png)说明: 针对不支持用域名接入的设备,通过在cmd命令框中执行“ping 域名”获取IP地址,用IP地址接入平台。由于IP地址不固定,您需要将IP地址做成可配置项。 @@ -89,13 +94,13 @@ a15fbbd7ce.iot-mqtts.cn-north-4.myhuaweicloud.com 填写接口地址,此处以“\$oc/devices/{device_id}/sys/properties/report”为例,如“\$oc/devices/5e4e2e92ac-164aefa8fouquan1/sys/properties/report”。 -![](media/bf41a9ad7dcf2bc0718496712c30dd72.png) +![bf41a9ad7dcf2bc0718496712c30dd72](media/bf41a9ad7dcf2bc0718496712c30dd72.png) \$oc/devices/{device_id}/sys/properties/report \$oc/devices/5fbbb784b4ec2202e982e643_868540050954037/sys/properties/report -![](media/c919d92250a8d791e7b604d40a08d13d.png) +![image-20220216153531106](media\image-20220216153531106.png) ### 下发数据 @@ -117,124 +122,121 @@ API调试页面: -![](media/6928f54528bf7a8c7f9ad115db1520e4.png) +![6928f54528bf7a8c7f9ad115db1520e4](media/6928f54528bf7a8c7f9ad115db1520e4.png) Topic: \$oc/devices/{device_id}/sys/messages/down \$oc/devices/5fbbb784b4ec2202e982e643_1234567890123456789/sys/messages/down -![](media/8b01f010e317cfd3129333709d60a514.png) +![8b01f010e317cfd3129333709d60a514](media/8b01f010e317cfd3129333709d60a514.png) -## 软件设计 +### 下发命令 -在HuaweiCloud平台取得ClientId、Username、Password之后,即可通过QuecPython的umqtt连接云平台,连接云平台的地址和端口固定不变,接下来就可以编写代码实验了。 +$oc/devices/{device_id}/sys/commands/request_id={request_id} -示例代码: +- 设备侧订阅带{request_id}参数的topic时,可以使用通配#。如设备侧订阅命令下发请求的topic $oc/devices/{device_id}/sys/commands/request_id={request_id}时,可以用$oc/devices/{device_id}/sys/commands/# -```python -from umqtt import MQTTClient +![image-20220216154517352](media\image-20220216154517352.png) -CLIENT_ID = b'5fbbb784b4ec2202e982e643_868540050954037_0_0_2021011909' - -SERVER = b'a15fbbd7ce.iot-mqtts.cn-north-4.myhuaweicloud.com' +![image-20220216154203735](media\image-20220216154203735.png) -PORT = 1883 - -USER = b'5fbbb784b4ec2202e982e643_868540050954037' +![image-20220216154010392](media\image-20220216154010392.png) -PASSWORD = b'8001a12405743199b3396943a2ed397286117a9ebab4f5dfda8dd6fafe341d94' +$oc/devices/{device_id}/sys/commands/request_id={request_id} -DEVICE_ID = '5fbbb784b4ec2202e982e643_868540050954037' - -state = 0 - -def sub_cb(topic, msg): - - global state - - print( - - "Subscribe Recv: Topic={},Msg={}".format( - - topic.decode(), - - msg.decode())) - - state = 1 - -def MQTT_Init(): +$oc/devices/5fbbb784b4ec2202e982e643_869537055157730/sys/commands/# - # 创建一个mqtt实例 +![image-20220216154918490](media\image-20220216154918490.png) - c = MQTTClient( - - client_id=CLIENT_ID, - - server=SERVER, - - port=PORT, - - user=USER, - - password=PASSWORD, - - keepalive=30) # 必须要 keepalive=30 ,否则连接不上 - - # 设置消息回调 - - c.set_callback(sub_cb) - - # 建立连接 - - c.connect() - - # 订阅主题 - - c.subscribe('$oc/devices/{}/sys/messages/down'.format(DEVICE_ID)) - - msg = b'''{ - - "services": [{ - - "service_id": "WaterMeterControl", +## 软件设计 - "properties": { +在HuaweiCloud平台取得ClientId、Username、Password之后,即可通过QuecPython的umqtt连接云平台,连接云平台的地址和端口固定不变,接下来就可以编写代码实验了。 - "state": "T:15c, H: 85% " +示例代码: - }, +```python +import checkNet +from umqtt import MQTTClient +import modem +from machine import UART +import sim +import hmac +from hashlib import sha256 - "event_time": "20151212T121212Z" - } +IMEI = modem.getDevImei() +E_SN = modem.getDevSN() +ESIM = sim.getImsi() - ] +DeviceName = IMEI +DeviceSecret = 'ac4263b86eaf6442997a' +DeviceID = "5fbbb784b4ec2202e982e643" - }''' +CLIENT_ID = DeviceID + "_" + DeviceName + "_0_0_2022010507" +SERVER = "a15fbbd7ce.iot-mqtts.cn-north-4.myhuaweicloud.com" +PORT = 1883 +USER = DeviceID + "_" + DeviceName +PASSWORD = hmac.new( + "2022010507".encode('utf-8'), + DeviceSecret.encode('utf-8'), + digestmod=sha256).hexdigest() +DEVICE_ID = DeviceID + "_" + DeviceName - # 发布消息 +state = 0 - c.publish('$oc/devices/{}/sys/properties/report'.format(DEVICE_ID), msg) - while True: - - c.wait_msg() +def sub_cb(topic, msg): + global state + print( + "Subscribe Recv: Topic={},Msg={}".format( + topic.decode(), + msg.decode())) + state = 1 - if state == 1: - break +def MQTT_Init(): - # 关闭连接 + c = MQTTClient( + client_id=CLIENT_ID, + server=SERVER, + port=PORT, + user=USER, + password=PASSWORD, + keepalive=30) + + c.set_callback(sub_cb) + try: + c.connect() + c.subscribe('$oc/devices/{}/sys/commands/#'.format(DEVICE_ID)) + + msg = b'''{ + "services": [{ + "service_id": "WaterMeterControl", + "properties": { + "state": "T:15c, H: 85% " + } + } + ] + }''' + c.publish('$oc/devices/{}/sys/properties/report'.format(DEVICE_ID), msg) + except BaseException: + print('except') + print('Waiting command') + while True: + c.wait_msg() + if state == 1: + break + + c.disconnect() - c.disconnect() def main(): + MQTT_Init() - MQTT_Init() if __name__ == "__main__": + main() - main() ``` 接下来就可以下载验证了,python代码不需要编译,直接通过QPYcom工具把.py文件下载到模块中运行。 @@ -243,15 +245,15 @@ if __name__ == "__main__": 下载.py文件到模组运行: -![](media/4f4a5ee0d3c9728fc3a5e1a0044c02d4.png) +![image-20220216161638266](media\image-20220216161638266.png) 下载之后,手动让脚本运行起来。 -![](media/2dd7f1fa61d4861ddf3d5118b4d18a31.png) +![image-20220216161801912](media\image-20220216161801912.png) 发送数据后,看到实验结果: -![](media/38b2f5b0b684ffdd198d772baef2c946.png) +![image-20220216161915875](media\image-20220216161915875.png) ## 配套代码 diff --git a/docs/Advanced_development/zh/QuecPythonCloud/code/HuaweiCloud_hmac.py b/docs/Advanced_development/zh/QuecPythonCloud/code/HuaweiCloud_hmac.py new file mode 100644 index 0000000000000000000000000000000000000000..2fee2bb2f70f65c22819c9af8b3cffaa96ee044f --- /dev/null +++ b/docs/Advanced_development/zh/QuecPythonCloud/code/HuaweiCloud_hmac.py @@ -0,0 +1,81 @@ +import checkNet +from umqtt import MQTTClient +import modem +from machine import UART +import sim +import hmac +from hashlib import sha256 + + +IMEI = modem.getDevImei() +E_SN = modem.getDevSN() +ESIM = sim.getImsi() + +DeviceName = IMEI +DeviceSecret = 'ac4263b86eaf6442997a' +DeviceID = "5fbbb784b4ec2202e982e643" + +CLIENT_ID = DeviceID + "_" + DeviceName + "_0_0_2022010507" +SERVER = "a15fbbd7ce.iot-mqtts.cn-north-4.myhuaweicloud.com" +PORT = 1883 +USER = DeviceID + "_" + DeviceName +PASSWORD = hmac.new( + "2022010507".encode('utf-8'), + DeviceSecret.encode('utf-8'), + digestmod=sha256).hexdigest() +DEVICE_ID = DeviceID + "_" + DeviceName + +state = 0 + + +def sub_cb(topic, msg): + global state + print( + "Subscribe Recv: Topic={},Msg={}".format( + topic.decode(), + msg.decode())) + state = 1 + + +def MQTT_Init(): + + c = MQTTClient( + client_id=CLIENT_ID, + server=SERVER, + port=PORT, + user=USER, + password=PASSWORD, + keepalive=30) + + c.set_callback(sub_cb) + try: + c.connect() + c.subscribe('$oc/devices/{}/sys/commands/#'.format(DEVICE_ID)) + + msg = b'''{ + "services": [{ + "service_id": "WaterMeterControl", + "properties": { + "state": "T:15c, H: 85% " + } + } + ] + }''' + c.publish('$oc/devices/{}/sys/properties/report'.format(DEVICE_ID), msg) + except BaseException: + print('except') + print('Waiting command') + while True: + c.wait_msg() + if state == 1: + break + + c.disconnect() + + +def main(): + MQTT_Init() + + +if __name__ == "__main__": + main() diff --git a/docs/Advanced_development/zh/QuecPythonCloud/media/image-20220216153531106.png b/docs/Advanced_development/zh/QuecPythonCloud/media/image-20220216153531106.png new file mode 100644 index 0000000000000000000000000000000000000000..e1791a501541aaea933e6e95453ae062788c5b08 Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonCloud/media/image-20220216153531106.png differ diff --git a/docs/Advanced_development/zh/QuecPythonCloud/media/image-20220216154010392.png b/docs/Advanced_development/zh/QuecPythonCloud/media/image-20220216154010392.png new file mode 100644 index 0000000000000000000000000000000000000000..7191c5a0eae88a817c5ca081e6ee876a92498058 Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonCloud/media/image-20220216154010392.png differ diff --git a/docs/Advanced_development/zh/QuecPythonCloud/media/image-20220216154203735.png b/docs/Advanced_development/zh/QuecPythonCloud/media/image-20220216154203735.png new file mode 100644 index 0000000000000000000000000000000000000000..f3321f2c42bfedb25099e7e844fc8c291bc81cf4 Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonCloud/media/image-20220216154203735.png differ diff --git a/docs/Advanced_development/zh/QuecPythonCloud/media/image-20220216154517352.png b/docs/Advanced_development/zh/QuecPythonCloud/media/image-20220216154517352.png new file mode 100644 index 0000000000000000000000000000000000000000..01a227cbe82cf134ab4f81bd92da838a8bb9c112 Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonCloud/media/image-20220216154517352.png differ diff --git a/docs/Advanced_development/zh/QuecPythonCloud/media/image-20220216154918490.png b/docs/Advanced_development/zh/QuecPythonCloud/media/image-20220216154918490.png new file mode 100644 index 0000000000000000000000000000000000000000..d0dd7e798bb5132dd5dafd78aa014db808aed362 Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonCloud/media/image-20220216154918490.png differ diff --git a/docs/Advanced_development/zh/QuecPythonCloud/media/image-20220216161638266.png b/docs/Advanced_development/zh/QuecPythonCloud/media/image-20220216161638266.png new file mode 100644 index 0000000000000000000000000000000000000000..9db5dc3e42cd55b4695113e5855b01d5fb7a0b3c Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonCloud/media/image-20220216161638266.png differ diff --git a/docs/Advanced_development/zh/QuecPythonCloud/media/image-20220216161801912.png b/docs/Advanced_development/zh/QuecPythonCloud/media/image-20220216161801912.png new file mode 100644 index 0000000000000000000000000000000000000000..7010a833dcc92b0f7c97536a123c9c0625677ad2 Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonCloud/media/image-20220216161801912.png differ diff --git a/docs/Advanced_development/zh/QuecPythonCloud/media/image-20220216161915875.png b/docs/Advanced_development/zh/QuecPythonCloud/media/image-20220216161915875.png new file mode 100644 index 0000000000000000000000000000000000000000..6951edbd76729b57d914f7f1fd977cfbe5dee741 Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonCloud/media/image-20220216161915875.png differ