[ODYSSEY-STM32MP157C] Informar datos a la plataforma Alibaba Cloud IoT

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

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.

Inserte la descripción de la imagen aquí

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.

Inserte la descripción de la imagen aquí

En la página "Administración de dispositivos" -> "Dispositivo", haga clic en "Agregar dispositivo" para agregar un dispositivo de prueba al producto.

Inserte la descripción de la imagen aquí

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".

Inserte la descripción de la imagen aquí

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.

Inserte la descripción de la imagen aquí

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 ~


Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/luckydarcy/article/details/108902096
Recomendado
Clasificación