【Maixpy】手机小爱同学控制K210灯
本帖最后由 我朝女王扔石头 于 2021-3-30 23:07 编辑【项目描述】
手机小爱同学控制K210灯的亮暗,蛮久之前就想用K210实现了,但是上网查了一下代码基本都是arduino的,好吧只能自己查资料解决了
【项目需要】
有小爱同学的手机、烧了maixpy的K210板子、物联网模块(这里我用的是ESP8285)
【项目步骤一:创建巴法云物联网平台账号】
小米的小爱可以外接的设备平台有很多,这里我就选了一个巴法云物联网平台,网址为https://cloud.bemfa.com/
运行微信登陆,登陆后还要绑定下邮箱,因为等下小米的小爱接入时要求使用邮箱登陆该平台
再次强度,如果要接入小爱,那么主题名称的结尾一定要002结尾,因为巴法云文档里面写了如下,对于本次的灯类型设备,末尾要002结尾
然后学习一下啥叫主题、订阅、发布,文档里面是这样描述的:
也就是把客户端、服务器又简化为类似微信公众号发布消息的架构
那么我们这次实现的逻辑就是K210订阅刚才创建的主题,然后小爱同学根据指令向主题发布消息,该消息会经主题中转又被K210接受到,这样一来一回依靠这个中间巴法云平台就实现了小爱控制K210的功能了
【项目步骤二:K210订阅、接受主题消息】
第一步是先将K210连接上WIFI
这里ESP8285()是我自己封装的一个类,底层是使用了network
网址是https://cn.maixpy.sipeed.com/zh/api_reference/machine/network.html
第二步是设置主题的一些信息
这里uid就是
想要订阅主题,巴法云物联网文档里面写了可以使用TCP/IP接入或者http API接入,我对比了一下觉得还是用http接入可以方便
之后就容易了,导入urequest库,该库固件里面是没有的,需要自己在导入进入
https://github.com/micropython/m ... quests/urequests.py把这个urequests.py文件写入到自己的k210上就行了
程序如下:
返回值r是response类对象,使用text方法获取字符型结果,然后用json变为python的数据类型(字典类型),
结果如下:{'code': '40220', 'topic': 'light002', 'data': [{'msg': 'off', 'time': '2021-03-28 21:20:13'}], 'status': 'getok'}
然后就套娃出我们需要的信息,就是data里面msg内容,注意data的值是一个数组,因为一次可以接受多条消息,这里我们参数设定了每次只接受一条消息有了msg信息,我们就可以根据msg内容对灯进行控制啦。
---------------------------------------------------------------------------------------------------
整个程序代码如下:
#连接小爱同学
from my_device import ESP8285
import socket
import urequests
import ujson
from my_device import LED
import time
#连接WIFI
SSID = "test"
PASW = "caiqidongdad"
wifi = ESP8285()
wifi.connect_wlan(SSID,PASW)
print('network state:', wifi.isconnected(), wifi.ifconfig())
#设定TOPIC
topic="light002"
uid="afbeda8dcb7daa4cb6bcb41446a1c316"
url='http://api.bemfa.com/api/device/v1/data/3/get/'#注意maixpy没有ussl模块,不能处理https协议
method = "GET"
url = url + "?uid={0}&topic={1}".format(uid,topic) #没有填num参数,默认接受1条信息
#初始化LED灯对象
led = LED()
while True:
try:
r = urequests.request(method=method,url=url)
msg = ujson.loads(r.text)
except:
continue
msg = msg['data']['msg']
print(msg)
if msg == 'off':
led.set_led_r(LED.OFF)
elif msg == 'on':
led.set_led_r(LED.ON)
time.sleep_ms(100)
---------------------------------------------------------------------------------------------------
测试一下能不能接受到主题中数据,可以通过点击推送消息修改主题里面的数值
【项目步骤三:将小爱同学关联上刚才创建的主题】
1.打开米家->我的->其他平台设备,在里面众多的平台中找到巴法(尼玛没有搜索就离谱,找了半天)
2.进入后点击同步设备(应该需要你邮箱登入),如果你刚才创建的主题名称末尾是002结尾的话,应该会出现一个灯(下图中的传感器不用管,这是我创建的另一个主题)
3.OK最后一步了,大喊小爱同学,开灯,小爱接受到指令后应该会出现下面的指令已发送
然后去看看我们的主题,发现主题里面数据变为了on
同理,如果你喊关灯的话,主题里面数据就变为off,
其他的一些指令如下:
到这里为止,如果你K210中对接收到的数据进行了分析处理,比如接收到on就亮灯,那么你的小爱应该可以控制K210的灯了
【项目改进】
我在运行时发现,程序有时会在r = urequests.request(method=method,url=url)r.text中运行蛮久,导致产生蛮大的延时效果,就小爱发出信号后K120半天才反应过来,很难受。
该问题是因为GET请求接收数据时,会出现不稳定的掉包啥的导致接收数据不完整或者网络不稳定,导致程序一直在等待数据全部被接收。
解决方法是增加一个最大请求时间或者改为非堵塞传输,python3中request函数是有outtime参数的,但是micpython的request函数并没有该参数,由于request是socket封装过来的,我们只需在urequest.py中对socket对象添加最大延时时间就行
修改urequest.py中的内容如下,这里我设置最大时间为1s
牛哇~我顶一顶
页:
[1]