前のセクション「[ODYSSEY-STM32MP157C]ドライブUARTでセンサーデータを読み取る」でPMS5003STセンサーのデータを正常に読み取りました。このセクションでは、デバイスをAlibaba Cloud IoTプラットフォームに接続し、データをクラウドに報告する方法を学習します。
材料を準備する
- アリババクラウド:アリババクラウドIoTプラットフォームアカウント
- シード:ODYSSEY-STM32MP157C開発ボード
- 登山テン:PMS5003STセンサー
製品と機器を作成する
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アプリケーションのプロトタイプを実現しました。驚くばかり!休憩〜