[ODYSSEY-STM32MP157C]データをAlibabaCloudIoTプラットフォームに報告する

前のセクション「[ODYSSEY-STM32MP157C]ドライブUARTでセンサーデータを読み取る」PMS5003STセンサーのデータを正常に読み取りました。このセクションでは、デバイスをAlibaba Cloud IoTプラットフォームに接続し、データをクラウドに報告する方法を学習します。

材料を準備する

製品と機器を作成する

Alibaba Cloud IoTプラットフォームログインし、「コンソール」と入力し、「デバイス管理」->「製品」ページを選択して、製品を作成します。

ここに写真の説明を挿入

カスタム関数を追加します。ここに、PM1.0、PM2.5、PM10、ホルムアルデヒド濃度、温度、湿度の合計6つの属性を追加しました。具体的な識別子、データタイプ、スコープは次のとおりです。

ここに写真の説明を挿入

[デバイス管理]-> [デバイス]ページで、[デバイスの追加]をクリックして、テストデバイスを製品に追加します。

ここに写真の説明を挿入

デバイスが正常に作成されると、デバイスのトリプレット情報(ProductKey、DeviceName、DeviceSecret)が取得されます。これは、デバイスがAlibaba CloudIoTプラットフォームに接続するための資格情報です。保存しておくと、後で使用します。

接続テスト

同様に、Pythonを使用してこのタスクを完了します。まず、paho-mqttライブラリをインストールします。

pip3 install paho-mqtt

Python3インタラクティブ環境に入り、関連するソフトウェアライブラリをインポートします

import paho.mqtt.client as mqtt
import time
import hashlib
import hmac
import random
import json

以前に作成したデバイストリプル情報をオプションオブジェクトに入力します(独自のトリプルに置き換えることを忘れないでください)。

options = {
    
    
    'productKey':'a16CxOWWTpI',
    'deviceName':'D001',
    'deviceSecret':'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
    'regionId':'cn-shanghai'
}

HOST変数とPORT変数を作成します。

HOST = options['productKey'] + '.iot-as-mqtt.'+options['regionId']+'.aliyuncs.com'
PORT = 1883

Alibaba Cloud IoTプラットフォームに接続するには、クライアントID、ユーザー名、パスワードなどのパラメーターを作成する必要があるため、hmacsha1関数を追加します。

def hmacsha1(key, msg):
    return hmac.new(key.encode(), msg.encode(), hashlib.sha1).hexdigest()

クライアントビルド機能を追加します。

def getAliyunIoTClient():
	timestamp = str(int(time.time()))
	CLIENT_ID = "paho.py|securemode=3,signmethod=hmacsha1,timestamp="+timestamp+"|"
	CONTENT_STR_FORMAT = "clientIdpaho.pydeviceName"+options['deviceName']+"productKey"+options['productKey']+"timestamp"+timestamp
	# set username/password.
	USER_NAME = options['deviceName']+"&"+options['productKey']
	PWD = hmacsha1(options['deviceSecret'],CONTENT_STR_FORMAT)
	client = mqtt.Client(client_id=CLIENT_ID, clean_session=False)
	client.username_pw_set(USER_NAME, PWD)
	return client

了解しました。クライアントオブジェクトを作成して、Alibaba Cloud IoTプラットフォームに接続してみてください〜

>>> client = getAliyunIoTClient()
>>> client.connect(HOST, PORT, 300)
0

アリババクラウドIoTプラットフォームのコンソールに切り替えて更新し、D001デバイスが「オフライン」から「オンライン」に変わるかどうかを確認します。

ここに写真の説明を挿入

レポートデータ

接続が成功したということは、ODYSSEY-STM32MP157C開発ボードがこの製品のデバイスになったことを意味します。センサーデータの収集とレポートのタスクを完了するために、新しいupload_pms5003st.pyファイルを作成します。

前のセクションのshow_pms5003st.pyと、Alibaba Cloud IoTプラットフォームに接続するためのコードを統合すると、全体的なフレームワークは次のようになります。

import paho.mqtt.client as mqtt
import time
import hashlib
import hmac
import random
import json
import sys
import glob
import serial

options = {
    
    
    'productKey':'',
    'deviceName':'',
    'deviceSecret':'',
    'regionId':'cn-shanghai'
}

HOST = options['productKey'] + '.iot-as-mqtt.'+options['regionId']+'.aliyuncs.com'
PORT = 1883
PUB_TOPIC = "/sys/" + options['productKey'] + "/" + options['deviceName'] + "/thing/event/property/post"

dev_name = '/dev/ttySTM2'
baudrate = 9600

CMD_READ = bytearray([0x42, 0x4d, 0xe2, 0x00, 0x00, 0x01, 0x71])
CMD_PASS = bytearray([0x42, 0x4d, 0xe1, 0x00, 0x00, 0x01, 0x70])
CMD_ACTI = bytearray([0x42, 0x4d, 0xe1, 0x00, 0x01, 0x01, 0x71])
CMD_STAN = bytearray([0x42, 0x4d, 0xe4, 0x00, 0x00, 0x01, 0x73])
CMD_NORM = bytearray([0x42, 0x4d, 0xe4, 0x00, 0x01, 0x01, 0x74])

# The callback for when the client receives a CONNACK response from the server.
def on_connect(client, userdata, flags, rc):
    print("Connected with result code "+str(rc))
    # client.subscribe("the/topic")

# The callback for when a PUBLISH message is received from the server.
def on_message(client, userdata, msg):
    print(msg.topic+" "+str(msg.payload))

def hmacsha1(key, msg):
    return hmac.new(key.encode(), msg.encode(), hashlib.sha1).hexdigest()

def getAliyunIoTClient():
    # 忽略
    
def pms_value(hByte, lByte):
    return (hByte << 8 | lByte)

def loop(serial):
    while True:
        # 忽略
    time.sleep(5)

def main():
    print("Run ODYSSEY-uart demo")
    s = serial.Serial(dev_name, baudrate)

    try:
        s.write(CMD_PASS)
    except Exception as err:
        print(err)
    finally:
        time.sleep(1)

    loop(s)
    s.close()

if __name__ == '__main__':
    client = getAliyunIoTClient()
    client.on_connect = on_connect
    client.on_message = on_message
    client.connect(HOST, 1883, 300)
    main()
    client.loop_forever()

報告されたデータはループ関数で処理されます。センサーデータが取得されると、対応する6つの属性値がJSON形式のデータにカプセル化され、メッセージを公開できます。

            payload_json = {
    
    
                'id': int(time.time()),
                'params': {
    
    
                    'PM1_0' : PM1_0_atm,
                    'PM2_5' : PM2_5_atm,
                    'PM10_0': PM10_0_atm,
                    'HCHO'  : hcho/1000,
                    'TEMP'  : temp,
                    'HUMI'  : humi
                },
                'method': "thing.event.property.post"
            }
            print('upload data to iot server: ' + str(payload_json))
            client.publish(PUB_TOPIC, payload=str(payload_json), qos=1)

完全なコードについては、https://github.com/luhuadong/ODYSSEY-STM32MP157Cを参照してください

実行するpython3 upload_pms5003st.pyと、データが報告されるたびに、JSONメッセージが出力されます。

upload data to iot server: {
    
    'id': 1601621228, 'params': {
    
    'PM1_0': 24, 'PM2_5': 39, 'PM10_0': 45, 'HCHO': 0.0, 'TEMP': 27.6, 'HUMI': 52.1}, 'method': 'thing.event.property.post'}

アリババクラウドIoTプラットフォームページで、デバイスのオブジェクトモデルデータを開くと、定期的に報告されるデータを確認できます。

ここに写真の説明を挿入

さて、この時点で、シリアルポートからセンサーデータを取得し、そのデータをクラウドに報告するプロジェクトを完了し、Internet ofThingsアプリケーションのプロトタイプを実現しました。驚くばかり!休憩〜


ここに写真の説明を挿入

おすすめ

転載: blog.csdn.net/luckydarcy/article/details/108902096