Hemos leído con éxito los datos del sensor PMS5003ST en la sección anterior "[ODYSSEY-STM32MP157C] Conduce UART para leer los datos del sensor" . En esta sección, aprenderemos cómo conectar el dispositivo a la plataforma Alibaba Cloud IoT y reportar los datos a la nube.
Preparar materiales
- Alibaba Cloud: cuenta de la plataforma Alibaba Cloud IoT
- Ver: placa de desarrollo ODYSSEY-STM32MP157C
- Teng de escalada: sensor PMS5003ST
Crea productos y equipos
Inicie sesión en la plataforma Alibaba Cloud IoT , ingrese a la "Consola", seleccione la página "Administración de dispositivos" -> "Producto" y cree un producto.
Agregué una función personalizada, agregué un total de 6 atributos aquí, a saber, PM1.0, PM2.5, PM10, concentración de formaldehído, temperatura, humedad. El identificador, el tipo de datos y el alcance específicos son los siguientes.
En la página "Administración de dispositivos" -> "Dispositivo", haga clic en "Agregar dispositivo" para agregar un dispositivo de prueba al producto.
Una vez que el dispositivo se haya creado correctamente, obtendremos la información del triplete del dispositivo (ProductKey, DeviceName, DeviceSecret), que es la credencial para que el dispositivo se conecte a la plataforma Alibaba Cloud IoT. Guárdalo y lo usaremos más tarde.
Prueba de conexión
De manera similar, usamos Python para completar esta tarea. Primero instale la biblioteca paho-mqtt:
pip3 install paho-mqtt
Ingrese al entorno interactivo Python3 e importe las bibliotecas de software relacionadas
import paho.mqtt.client as mqtt
import time
import hashlib
import hmac
import random
import json
Complete la información de triples del dispositivo creado anteriormente en el objeto de opciones (recuerde reemplazar con sus propios triples):
options = {
'productKey':'a16CxOWWTpI',
'deviceName':'D001',
'deviceSecret':'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
'regionId':'cn-shanghai'
}
Cree variables HOST y PORT:
HOST = options['productKey'] + '.iot-as-mqtt.'+options['regionId']+'.aliyuncs.com'
PORT = 1883
Debido a que la conexión a la plataforma Alibaba Cloud IoT requiere parámetros de construcción como ID de cliente, nombre de usuario y contraseña, agregue una función hmacsha1:
def hmacsha1(key, msg):
return hmac.new(key.encode(), msg.encode(), hashlib.sha1).hexdigest()
Agregue la función de compilación del cliente:
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
Muy bien, entonces puede crear un objeto de cliente e intentar conectarse a la plataforma Alibaba Cloud IoT ~
>>> client = getAliyunIoTClient()
>>> client.connect(HOST, PORT, 300)
0
Cambie a la consola de la plataforma Alibaba Cloud IoT, actualícela y vea si el dispositivo D001 cambia de "sin conexión" a "en línea".
Informe de datos
Una conexión exitosa significa que nuestra placa de desarrollo ODYSSEY-STM32MP157C se ha convertido en un dispositivo para este producto. Para completar la recopilación de datos del sensor y las tareas de generación de informes, creamos un nuevo archivo upload_pms5003st.py.
Al integrar show_pms5003st.py de la sección anterior y el código para conectarse a la plataforma Alibaba Cloud IoT, el marco general es el siguiente:
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()
Los datos reportados se procesan en la función de bucle.Cuando se obtienen los datos del sensor, los 6 valores de atributo correspondientes se encapsulan en datos en formato JSON y luego se puede publicar el mensaje.
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)
Para obtener el código completo, consulte https://github.com/luhuadong/ODYSSEY-STM32MP157C .
Ejecutar python3 upload_pms5003st.py
, cada vez que se reporten los datos, se imprimirá un mensaje 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'}
En la página de la plataforma Alibaba Cloud IoT, abra los datos del modelo de objetos del dispositivo y podrá ver los datos reportados periódicamente.
Bueno, en este punto, hemos completado el proyecto de obtener datos del sensor del puerto serie y luego reportar los datos a la nube, y realizamos un prototipo de la aplicación Internet of Things. ¡Increíble! Tómate un descanso ~