| 2用Micropython将ESP32数据上云

 | 2用Micropython将ESP32数据上云

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

import network import utimeWIFISSID = "Put your ssid here"WIFIPWD = "Put yuou ssid password"wlan = Noneclass 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的请看下面:
    首先创建一个产品

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

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

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

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

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

这里可以记一下三元组的概念,ProductKey, DeviceName, DeviceSecret 这三个东西能用来在数据通讯时进行开发板的唯一性识别
因为之前已经完成了连接WI-FI的代码。所以,在WI-FI连接后,我们就需要将开发板和阿里云物联网连接。 我们直接使用HAAS提供的库。 aliyunIoT

import utimeimport ujsonfrom aliyunIoT import Devicefrom example.haas_led import HAASLed iot_connected = Falsedevice = 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 : FalseWifi connet status : False('192.168.20.26', '255.255.255.0', '192.168.20.1', '11.11.2.69')a test functionestablish tcp connection with server(host='a1fuLmf5uts.iot-as-mqtt.cn-shanghai.aliyuncs.com', port=[443])sleep for 1 stcp_connect: can only connect from state CLOSEDsuccess to establish tcp, fd=54on_connect物联网平台连接成功

在连接IOT平台的时候,通过了阿里云提供的回调方法 Device.on 注册了 上报属性的一个方法。
device.on(Device.ON_PROPS, on_props)
通过该回调,我们可以接收到IOT平台下发给设备的数据,并进行处理。比如在本文当中,我们通过平台来控制3个LED灯开关。

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

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

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进行上报即可。所有的上报或者下发数据,都可以在日志服务当中查看。

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

免责声明:本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕。
相关文章
返回顶部