(2)用Micropython将ESP32数据上云

本文涉及的产品
云原生大数据计算服务MaxCompute,500CU*H 100GB 3个月
简介: 用python让开发板连接物联网

之前我们尝试过直接把LED点亮并且闪烁。

今天尝试一下将LED的开关状态上云,并可以通过云来进行数据下发。

数据要上云,首先开发板要联网。

首先我们会用 Python的network 库, 在network库当中,提供STA_IF和AP_IF两种模式。其中进行连接的是使用STA_IF模式,如果使用AP_IF,则是将ESP32作为一个热点。后面的文章当中我们会用到。

importnetworkimportutimeWIFISSID="Put your ssid here"WIFIPWD="Put yuou ssid password"wlan=NoneclassConnectWIFI:
defconnect_wifi(self): 
# network.STA_IF 站点也称为客户端,连接到上游WiFi接入点# network.AP_IF 作为热点,允许其他WiFi客户端接入。热点模式允许用户将自己的设备配置为热点,这让多个设备之间的无线连接在不借助外部路由器网络的情况下成为可能。wlan=network.WLAN(network.STA_IF)  
wifi_connected=Falsewlan.active(True)                  
wlan.scan()                         
wlan.connect(WIFISSID, WIFIPWD)       # 定义好的SSID 和 密码whileTrue:
# 判断是否已经连接网络wifi_connected=wlan.isconnected()    
ifwifi_connected:                     
# 若没有连接成功,则一直连接breakelse:
# 连接成功,进行提示utime.sleep_ms(2000)
print("Wifi connet status :", wifi_connected)
ifconfig=wlan.ifconfig()       
# 打印网络情况              print(ifconfig)



当WI-FI已经连接成功后,我们的开发板已经有了通讯的能力,下一步我们将我们的开发板和阿里云物联网平台进行连接。

在连接之前需要保证:

  1. 自己拥有阿里云账户
  2. 开通了IOT服务
  3. 已经注册了对应的产品和设备。


如果还没有设置IOT的请看下面:

首先创建一个产品

image.png


设定产品的名称,品类和其他信息

image.png


完成产品创建后,进行产品物模型的定义

image.png



image.png


阿里云IOT平台提供了很多日常常用的一些标准功能,但是我们进行测试的话使用自定义功能。这样能够更好的了解每个功能里面会有什么样的属性。

image.png

image.png

完成产品添加后,需要添加设备(即添加我们目前手里使用的这个开发板)


image.png

image.png

image.png

创建完成,并看到产品的信息

image.png


这里可以记一下三元组的概念,ProductKey, DeviceName, DeviceSecret 这三个东西能用来在数据通讯时进行开发板的唯一性识别。

因为之前已经完成了连接WI-FI的代码。所以,在WI-FI连接后,我们就需要将开发板和阿里云物联网连接。 我们直接使用HAAS提供的库。 aliyunIoT


importutimeimportujsonfromaliyunIoTimportDevicefromexample.haas_ledimportHAASLediot_connected=Falsedevice=None# 物联网平台连接成功的回调函数 defon_connect( data):
print('on_connect')
globaliot_connectediot_connected=Truedefon_props(request): 
led_entity=HAASLed()
led_entity.handle_iot_data(request) 
classHaasIOT(object):
defreport_data(self, data):
globaldeviceupload_data= {'params': ujson.dumps(data)
        } 
device.postProps(upload_data) 
defconnect_iot(self):
self.test()
globaldevice, iot_connectedkey_info= {
'region': 'cn-shanghai',
'productKey': 'XXX', 
'deviceName': 'XXX',
'deviceSecret': 'XXX',
'keepaliveSec': 60        } 
device=Device()
# 设定连接到物联网平台的回调函数,如果连接物联网平台成功,则调用on_connect函数device.on(Device.ON_CONNECT, on_connect)
# 配置收到云端属性控制指令的回调函数,如果收到物联网平台发送的属性控制消息,则调用on_props函数device.on(Device.ON_PROPS, on_props)
# 启动连接阿里云物联网平台过程device.connect(key_info)
# 等待设备成功连接到物联网平台while(True):
ifiot_connected:
print('物联网平台连接成功')
breakelse:
print('sleep for 1 s')
utime.sleep(1)
print('sleep for 2s')
utime.sleep(2)


代码中的productKey, deviceName, deviceSecret分别对应到我们刚才在阿里云IOT平台上创建的设备信息。


main.py里面的调用代码


if__name__=='__main__': 
wifi_entity=ConnectWIFI()
wifi_connected=wifi_entity.connect_wifi()
ifwifi_connectedisTrue:   
hass_iot_entity=HaasIOT()
hass_iot_entity.connect_iot()


将代码烧录到开发板,我们会看到下面的信息,表示开发板已经完成WI-FI连接并和阿里云IOT平台连接成功。


Wifi connet status : False
Wifi connet status : False
('192.168.20.26', '255.255.255.0', '192.168.20.1', '11.11.2.69')
a test function
establish tcp connection with server(host='a1fuLmf5uts.iot-as-mqtt.cn-shanghai.aliyuncs.com', port=[443])
sleep for 1 s
tcp_connect: can only connect from state CLOSED
success to establish tcp, fd=54
on_connect
物联网平台连接成功


在连接IOT平台的时候,通过了阿里云提供的回调方法 Device.on 注册了 上报属性的一个方法。

device.on(Device.ON_PROPS, on_props)

通过该回调,我们可以接收到IOT平台下发给设备的数据,并进行处理。比如在本文当中,我们通过平台来控制3个LED灯开关。

image.png

在在线调试当中,可以对之前设定的3个属性进行修改。(0表示关灯,1表示开灯)

image.png

该实现是用刚才的回调函数实现的。


defon_props(request): 
led_entity=HAASLed()
led_entity.handle_iot_data(request)


在回调函数当中,物联网平台下发的数据为request, 在这里,我用了HAASLed当中的handle_iot_data方法进行处理。

物联网平台下发的数据都是以一个dict传输过来的数据,形如:

{'code': 0, 'params_len': 20, 'msg_id': 659157818, 'params': '{"led_red_switch":0}'}

我们所需要获取的数据就在 params当中。


defhandle_iot_data(self, rsp): 
print(type(rsp))
print(rsp) # {'code': 0, 'params_len': 20, 'msg_id': 659157818, 'params': '{"led_red_switch":0}'}ifrsp.get('code') ==0:
data=rsp.get('params') 
led_switch=ujson.loads(data)  # '{"led_red_switch":1}'led_red_switch=led_switch.get('led_red_switch') 
ifled_red_switchisnotNone:
self.control_led("led_red_switch", led_red_switch)
led_green_switch=led_switch.get('led_green_switch') 
ifled_green_switchisnotNone:
self.control_led("led_green_switch", led_green_switch)
led_yellow_switch=led_switch.get('led_yellow_switch') 
ifled_yellow_switchisnotNone:
self.control_led("led_yellow_switch", led_yellow_switch)
defcontrol_led(self,led, status):
r_led_gpio=GPIO()
y_led_gpio=GPIO()
g_led_gpio=GPIO()
r_led_gpio.open("r_led")
y_led_gpio.open("y_led")
g_led_gpio.open("g_led")
ifled=="led_red_switch":
r_led_gpio.write(status)
elifled=="led_green_switch":
g_led_gpio.write(status)
elifled=="led_yellow_switch":
y_led_gpio.write(status)


可以看到,在代码当中,首先将下发数据进行处理,并根据业务逻辑获取到需要的内容,并调用control_led来进行LED灯的判断。

对于从端上报数据上云,则可以使用下面的代码


defreport_data(self, data):
globaldeviceupload_data= {'params': ujson.dumps(data)
        } 
device.postProps(upload_data)


按照业务需要,将要传送的数据拼接好后。使用device.postProps进行上报即可。所有的上报或者下发数据,都可以在日志服务当中查看。


image.png


通过以上操作,成功的将ESP32 和 物联网平台完成了通信。

相关实践学习
基于MaxCompute的热门话题分析
Apsara Clouder大数据专项技能认证配套课程:基于MaxCompute的热门话题分析
目录
相关文章
|
消息中间件 物联网
MQTT常见问题之mqtt 报 MqttException:客户机未连接如何解决
MQTT(Message Queuing Telemetry Transport)是一个轻量级的、基于发布/订阅模式的消息协议,广泛用于物联网(IoT)中设备间的通信。以下是MQTT使用过程中可能遇到的一些常见问题及其答案的汇总:
ESP-01S连接OneNET上报温湿度信息
本文介绍了如何利用ESP-01S连接OneNET上报温湿度信息,其中包括如何烧录固件,如何配置OneNET平台,如何进行连接测试。最后,给出了一部分程序设计。
839 0
ESP-01S连接OneNET上报温湿度信息
EMQ
|
网络协议 物联网 Linux
2022 年值得尝试的 7 个 MQTT 客户端工具
随着物联网行业的飞速发展,MQTT协议也被越来越多的公司及开发者所使用。鉴于目前MQTT客户端工具种类繁多,本文筛选和整理了截至2022年最新、最实用的7个MQTT客户端工具,希望可以帮助MQTT开发者快速找到合适的客户端工具。
EMQ
3666 1
2022 年值得尝试的 7 个 MQTT 客户端工具
|
传感器 运维 监控
如何 3 行代码使用 arduino 接入阿里云物联网平台
阿里云物联网平台提供接入物联网场景的一整套基础设施,强大的在线配置能力,基本可以实现无代码开发接入各类应用,实现大规模的物联网应用场景。
14817 1
如何 3 行代码使用 arduino 接入阿里云物联网平台
|
消息中间件 SQL JSON
阿里云物联网平台 “物模型属性” 的分析&&易错点&&上报属性时Payload如何正确组装?
您是否在纠结设备上报了数据,平台到底有没有收到? 您是否很疑惑物模型属性怎么老是不刷新? 您是否不理解物模型属性下发总是不生效? 您是否不知道上报属性时Payload到底该怎么填? 您是否很纳闷物模型属性一会又携带有时间戳,一会又没有? 您是否怀疑能不能自定义物模型属性的时间戳?又如何取到自定义时间戳? 您是否...
8772 3
阿里云物联网平台 “物模型属性” 的分析&&易错点&&上报属性时Payload如何正确组装?
|
消息中间件 微服务
MQTT X连接阿里云微服务消息队列MQTT
MQTT X 是 EMQ 开源的一款优雅的跨平台 MQTT 5.0 桌面客户端,它支持 macOS, Linux, Windows。MQTT X 的 UI 采用了聊天界面形式,简化了页面操作逻辑,用户可以快速创建连接,允许保存多个客户端,方便用户快速测试 MQTT/MQTTS 连接,及 MQTT 消息的订阅和发布。本文演示如何使用该工具快速连接阿里云微服务消息队列MQTT,并进行消息的发布和订阅测试。
4587 0
MQTT X连接阿里云微服务消息队列MQTT
|
11月前
|
传感器 物联网 芯片
如何在物联网项目中使用 MicroPython
本指南介绍如何在物联网项目中使用MicroPython,涵盖设备选择、环境搭建、基础编程及网络通信等内容,助你快速上手MicroPython开发。
|
物联网 Python 网络性能优化
在ESP32上使用umqtt接入阿里云物联网平台
网络上已经有使用python 模拟设备接入阿里云,手里刚好有块ESP32的小板子,在上面跑过Alios Things,然后接入阿里云。但是终究感觉麻烦,有的时候只是做一个很简单的应用,跑os确实不太方便。
12186 1
|
传感器 IDE 物联网
ESP8266接入阿里云物联网平台上传温湿度数据
本文章使用NodeMCU(ESP8266)开发板和SHTC3温湿度传感器接入阿里云物联网(IoT)平台,并上传读取到的温湿度数据。
22775 6
ESP8266接入阿里云物联网平台上传温湿度数据
|
消息中间件 存储 物联网
MQTT常见问题之mqtt第4—6次调用会报错如何解决
MQTT(Message Queuing Telemetry Transport)是一个轻量级的、基于发布/订阅模式的消息协议,广泛用于物联网(IoT)中设备间的通信。以下是MQTT使用过程中可能遇到的一些常见问题及其答案的汇总: