10962| 1
|
[项目分享] 【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'][0]['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 ![]() |
© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed