之前我们尝试过直接把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. CF1070K Video Posts 题解

    Content 有 \(n\) 个数 \(a_1,a_2,a_3,...,a_n\),要求分成 \(k\) 段,每一段的数的总和相等.输出这些段的长度,或者不可能满足要求. 数据范围:\(1\leqs ...

  2. CF1481B New Colony 题解

    Content \(n\) 座山排成一行,其中第 \(i\) 座山的高度为 \(h_i\). 有 \(k\) 个巨石依次从第一座山开始滚落.当某个巨石在第 \(i\) 座山时: 如果 \(i=n\), ...

  3. HTTP状态码一览表

    常见Http状态码大全 2018年03月16日 11:36:31 阅读数:153 一些常见的状态码为: 200 - 服务器成功返回网页404 - 请求的网页不存在503 - 服务不可用详细分解: 1x ...

  4. birt分组时,如何让居中

    birt分组时,如何让居中,如下图,选择cell格,然后调整属性为all,如下图所示,

  5. C printf 字符串格式化

    %a 浮点数.十六进制数字和p-记数法(C99) %A 浮点数.十六进制数字和p-记法(C99) %c 一个字符 %d 有符号十进制整数 %e 浮点数.e-记数法 %E 浮点数.E-记数法 %f 浮点 ...

  6. 记录一次乱码问题修复经历!排查修复Poi-tl使用HttpServletResponse导出Word乱码问题

    问题 Poi-tl中HttpServletResponse导出Word乱码问题: 文件名使用中文,中文名乱码 导出的文件下载后乱码 原因 文件名中文乱码: 没有设置文件名的编码规则 文件下载乱码: 在 ...

  7. C# 使用阿里云发送短信

    最近有个项目,短信服务使用的是阿里云的,由于时间问题,没有手动去构造sign去发送,而是直接使用阿里云的SDK发送,所以这里算是做个笔记,或许以后还能用得到 首先,我们需要安装阿里云的SDK,推荐使用 ...

  8. JZOJ 3296 Luogu P3296 [SDOI2013]刺客信条

    前言 做法来自:@pzrpzr ,写一下!Orz pzr! 题目大意 \(n\) 个点的无根树,每个点有两个 \(0/1\) 权值,合适地安排节点在同构树中的顺序,使得前后对应的权值不同节点个数最小, ...

  9. 分享一个自研开发的QA自动化审计工具-Sonar检查

    评价一个系统或软件的质量高低,我始终认为除了需求和设计外,代码质量很重要,一个高质量的系统或软件,并不是被测试出来的,更多的是要靠设计和开发出来的.目前也有很多自动化的测试工具,更多的是从功能和性能角 ...

  10. Spring @Component 注解的使用

    使用说明 这个注解用于声明当前的类是一个组件类,Spring 会通过类路径扫描来自动侦测和自动装配这些组件,创建一个个 bean 后,注册到 Spring 容器中. 带 @Component 注解的类 ...