之前我们尝试过直接把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的请看下面:

    首先创建一个产品



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

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

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

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

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

这里可以记一下三元组的概念,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灯开关。

在在线调试当中,可以对之前设定的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 和 物联网平台完成了通信。

(2)用Micropython将ESP32数据上云的更多相关文章

  1. Linux本地数据上传到阿里云OSS

    这篇文章主要是介绍如何将服务器本地的数据上传到阿里云OSS的指定bucket中,最重要的参考文档是数据迁移单机部署.我第一次上传数据到OSS上时,步骤要比前面的链接中介绍的要麻烦,ossimport工 ...

  2. 关于数据上传阿里云MaxCompute调研

    1.背景 当前的数据存储基于mysql库表存储形式,目前已经无法满足愈加增大的数据存储需求,新项目基于Maxcompute数据仓库架构,需要将统计日志上传Maxcompute,本文对Maxcomput ...

  3. DTCC 2020 | 阿里云李飞飞:云原生分布式数据库与数据仓库系统点亮数据上云之路

    简介: 数据库将面临怎样的变革?云原生数据库与数据仓库有哪些独特优势?在日前的 DTCC 2020大会上,阿里巴巴集团副总裁.阿里云数据库产品事业部总裁.ACM杰出科学家李飞飞就<云原生分布式数 ...

  4. 奥威软件Speed-BI荣获2016年度中国大数据最佳云平台奖

    (原文转自:http://www.powerbi.com.cn/page110?article_id=210) 2016年12月16日,“科技原力觉醒,引领创新巅峰”—2016创新影响力年会暨国家产业 ...

  5. 传统业务上云:跨AZ容灾架构解析

    本文由  网易云发布. 数字化转型浪潮之下,采用云计算服务提升业务敏捷性.降低运维成本,成为了传统企业的优选方案.网易云资深解决方案架构师张亮通过某物流企业客户的实际案例,分享了传统业务系统在云上的架 ...

  6. MaxCompute在高德大数据上的应用

    2019年1月18日,由阿里巴巴 MaxCompute开发者社区和阿里云栖社区联合主办的“阿里云栖开发者沙龙大数据技术专场”走近北京联合大学,本次技术沙龙上,高德数据技术专家苗翌辰为大家分享了高德如何 ...

  7. 上云利器,K8S应用编排设计器之快到极致

    前言在前面的文章中,我们已经提到,华为云有一个上云利器:应用编排设计器.作为华为云应用编排服务与用户沟通的桥梁,设计器坚持用户体验至上的理念,以图形化方式,在鼠标点击之间,助力企业快速上云.优质的交互 ...

  8. 从DevOps到Cloud Native,应用上云姿势全解锁

    本文由  网易云发布. 作者:林帆 序文 伴随着IaaS.PaaS等云端基础设施技术的成熟,“应用上云”成为许多企业软件部门的心头大事.通过把传统软件系统搬到云上,一方面可以让业务方获得更多的资源灵活 ...

  9. 企业上云这四大要点,你 get 了吗?

    本文由 Platform9(一家专注于云计算.专有云.混合云.OpenStack 以及容器技术的北美初创公司)技术产品营销经理 Akshai Parthasarathy 撰写,描述了企业在向云基础设施 ...

随机推荐

  1. atexit模块介绍

    atexit 模块介绍 python atexit 模块定义了一个 register 函数,用于在 python 解释器中注册一个退出函数,这个函数在解释器正常终止时自动执行,一般用来做一些资源清理的 ...

  2. AcWing03. 完全背包问题

    有\(N\)种物品和一个容量是\(V\)的背包,每种物品都有无限件可用. 第\(i\)种物品的体积是\(v_i\),价值是\(w_i\). 求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量, ...

  3. JAVA把InputStream 转 字节数组(byte[])

    import org.apache.commons.io.IOUtils; byte[] bytes = IOUtils.toByteArray(inputStream); 如果没有这个包 就加下依赖 ...

  4. JAVA类初始化和实例初始化

    一.类初始化过程 1.一个类要创建实例需要先创建和加载 (1) main方法所在的类需要先加载和实例化 2.一个子类要初始化,需要先初始化父类 3.一个类初始化就是执行<clinit>方法 ...

  5. Spring Tool Suite(STS)基本安装配置

    下载jar包:https://spring.io/tools 下载完成后 打开所在文件夹 执行命令行 jar -jar  下载的jar包文件名 然后会自动解压 双击打开软件 配置主面板窗口 配置好之后 ...

  6. software engineer's resume(帮助你写程序员简历)

    关键词 参考 简历模板 参考 下面开始是正文(关键词原文) 介绍 本项目由海外兔 (https://osjobs.net) 维护,海外兔团队由一线互联网面试官组成,提供海内外公司一对一入职套餐以及算法 ...

  7. C语言补漏-逗号运算符与逗号表达式

    1. 新名词? 今天看到一个新名词: 逗号表达式. C语言就有.额,怎么当时学习C没见过,一头雾水. 对我来说是新名词,其实它早就存在了,只是我还不知道. 2. 逗号表达式 C语言提供了逗号运算符-- ...

  8. 【九度OJ】题目1015:还是A+B 解题报告

    [九度OJ]题目1015:还是A+B 解题报告 标签(空格分隔): 九度OJ http://ac.jobdu.com/problem.php?pid=1015 题目描述: 读入两个小于10000的正整 ...

  9. 【LeetCode】380. Insert Delete GetRandom O(1) 解题报告(Python)

    [LeetCode]380. Insert Delete GetRandom O(1) 解题报告(Python) 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxu ...

  10. 【LeetCode】812. Largest Triangle Area 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 三重循环 组合函数 日期 题目地址:https:// ...