(2)用Micropython将ESP32数据上云

之前我们尝试过直接把LED点亮并且闪烁。
今天尝试一下将LED的开关状态上云,并可以通过云来进行数据下发。
数据要上云,首先开发板要联网。
首先我们会用 Python的network 库, 在network库当中,提供STA_IF和AP_IF两种模式。其中进行连接的是使用STA_IF模式,如果使用AP_IF,则是将ESP32作为一个热点。后面的文章当中我们会用到。

import network 
import utime
WIFISSID = "Put your ssid here"
WIFIPWD = "Put yuou ssid password"
wlan = None
class ConnectWIFI:
    def connect_wifi(self): 
        # network.STA_IF 站点也称为客户端,连接到上游WiFi接入点
        # network.AP_IF 作为热点,允许其他WiFi客户端接入。热点模式允许用户将自己的设备配置为热点,这让多个设备之间的无线连接在不借助外部路由器网络的情况下成为可能。
        wlan = network.WLAN(network.STA_IF)  
        wifi_connected = False
        wlan.active(True)                  
        wlan.scan()                         
        wlan.connect(WIFISSID, WIFIPWD)       # 定义好的SSID 和 密码
        while True:
            # 判断是否已经连接网络
            wifi_connected = wlan.isconnected()    
            if wifi_connected:                     
                # 若没有连接成功,则一直连接
                break
            else:
                # 连接成功,进行提示
                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

import utime
import ujson
from aliyunIoT import Device
from example.haas_led import HAASLed
 
iot_connected = False
device = None
# 物联网平台连接成功的回调函数 
def on_connect( data):
    print('on_connect')
    global iot_connected
    iot_connected = True
  
def on_props(request): 
    led_entity = HAASLed()
    led_entity.handle_iot_data(request) 
     
    
class HaasIOT(object):
  
    def report_data(self, data):
        global device 
        upload_data = {'params': ujson.dumps(data)
        } 
        device.postProps(upload_data) 
        
      
    def connect_iot(self):
        self.test()
        global device, iot_connected
        key_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):
            if iot_connected:
                print('物联网平台连接成功')
                break
            else:
                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()
    if wifi_connected is True:   
        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

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


def on_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当中。

def handle_iot_data(self, rsp): 
        print(type(rsp))
        print(rsp) # {'code': 0, 'params_len': 20, 'msg_id': 659157818, 'params': '{"led_red_switch":0}'}
        if rsp.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') 
            if led_red_switch is not None:
                self.control_led("led_red_switch", led_red_switch)
            led_green_switch = led_switch.get('led_green_switch') 
            if led_green_switch is not None:
                self.control_led("led_green_switch", led_green_switch)
            led_yellow_switch = led_switch.get('led_yellow_switch') 
            if led_yellow_switch is not None:
                self.control_led("led_yellow_switch", led_yellow_switch)
            
 def control_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")
        if led == "led_red_switch":
            r_led_gpio.write(status)
        elif led == "led_green_switch":
            g_led_gpio.write(status)
        elif led == "led_yellow_switch":
            y_led_gpio.write(status)

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

def report_data(self, data):
        global device 
        upload_data = {'params': ujson.dumps(data)
        } 
        device.postProps(upload_data)

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

image.png

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,001评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,210评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,874评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,001评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,022评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,005评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,929评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,742评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,193评论 1 309
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,427评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,583评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,305评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,911评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,564评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,731评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,581评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,478评论 2 352

推荐阅读更多精彩内容