一、前言
最近在和学生准备一场比赛,其中一个功能需要手机语音助手来控制掌控板开关灯,那么如何实现Siri和掌控板之间的通讯呢?看了铁熊的一篇文章:【掌控板教程 | 学会掌控板 + Siri 语音控制,只要半小时!】看了教程后直接被劝退!这让初中生实现起来也不切实际啊,有没有更加便捷的方法呢?
百度了一下,最终在一篇文章:【“玩板”+siri+快捷指令+XCC3200(MQTT)来控制】中找到了方法,那就是通过苹果系统中的快捷指令来实现。好了,废话不多说,就让我们开始本次的教程吧。
二、准备阶段
2.1 注册onenet账号
首先打开onenet物联网平台,点击右上角的注册按钮,来到注册界面,开启注册。(我这里已经注册过了,就不再一一描述了)
注册完毕后,我们登录我们的账号,点击右上角的控制台按钮。
选择切换至旧版。(因为数据与旧版不互通,管理产品历史请返回旧版开发者中心)
进入旧版后,选择多协议接入。
在MQTT旧版下,选择添加产品。
新建我們的产品(名称、行业、类别......等)
添加产品成功后,开始给我们的产品添加设备。
选择添加设备按钮
填写好设备相关信息(设备名、鉴权信息等这些信息不唯一。)后点击添加。
这时候出现一个刚我们刚才新建的设备。(可以看到这个设备是处于离线状态。)然后我们点击详细进行apikey值的配置
选择添加APIKey(這個只隨便填寫)
这个时候我们需要记一下【设备ID,APIKey的值】以及该产品的产品ID值,后面会用到。
2.2 创建快捷指令
打开快捷指令APP,点击上方的加号,开始添加我们的快捷指令。
点击网页组件。
选择获取URL网页内容
填写我们需要请求的网页地址及相关信息。
1 “获取URL内容”:http:api.hecoluds.com/cmds?device_id=xxxxxxxxxx
填写的是设备ID
2 “方式”:POST 请求方式
3 头部:“api-key” ,“xxxxxxxxxxxxxxxx”在MQTT服务器上信息APIKey
4 请求体JSON:这里的内容(选择数字,如果选择文本,后面的程序也要做文本判断)就是掌控板里面接收到判断输出的信息,比如"speed,1" 功能打开灯。"speed,0" 功能关闭灯
配置好后,给我们的指令命名【开灯】
这样就创建好了一个快捷指令,复制这个指令把它重新命名【关灯】,json中的值由原来的1变成0即可。
三、程序编写
打开mpython,添加onenet扩展,然后进行程序的编写。
这里的设备ID、产品ID、产品APikey都是我们之前需要记得。
from mpython import *
import network
my_wifi = wifi()
my_wifi.connectWiFi('Erised', 'yiruosi88')
import ntptime
from umqtt.simple import MQTTClient
from machine import Timer
import machine
import ubinascii
def OneNET_recv(_msg):pass
_OneNET_msg_list = []
def OneNET_callback(_topic, _msg):
global _OneNET_msg_list
try: _msg = _msg.decode('utf-8', 'ignore')
except: print(_msg);return
OneNET_recv(_msg)
if _msg in _OneNET_msg_list:
eval('OneNET_recv_' + bytes.decode(ubinascii.hexlify(_msg)) + '()')
tim14 = Timer(14)
_iot_count = 0
def timer14_tick(_):
global _iot, _iot_count
_iot_count = _iot_count + 1
if _iot_count == 1000: _iot.ping(); _iot_count = 0
try: _iot.check_msg()
except: machine.reset()
_iot = None
def OneNET_setup():
global _iot
_iot = MQTTClient('408137', '183.230.40.39', 6002, '692155207', 'CoOilgoe0bL3oACmQqFj8VZPgB8=', keepalive=300)
_iot.set_callback(OneNET_callback)
if 1 == _iot.connect(): print('Successfully connected to MQTT server.')
tim14.init(period=200, mode=Timer.PERIODIC, callback=timer14_tick)
import json
def pubdata(_dic):
print(_dic)
_list = []
for _key in list(_dic.keys()):
_d = {'id':_key,'datapoints':[{'value':_dic[_key]}]}
_list.append(_d)
_data = {'datastreams': _list}
j_d = json.dumps(_data)
j_l = len(j_d)
arr = bytearray(j_l + 3)
arr[0] = 1
arr[1] = int(j_l / 256)
arr[2] = j_l % 256
arr[3:] = j_d.encode('ascii')
return arr
import ujson
import time
def OneNET_recv(_msg):
global x, j, i, p_state, y_state, w1, t_state, w2, h_sate, w3, o_state, tempoure, my_dict, temp
my_dict = ujson.loads(_msg)
temp = my_dict.get('speed')
print(temp)
if temp == 0:
rgb.fill( (0, 0, 0) )
rgb.write()
time.sleep_ms(1)
elif temp == 1:
rgb.fill((int(255), int(0), int(0)))
rgb.write()
time.sleep_ms(1)
ntptime.settime(8, "time.windows.com")
OneNET_setup()
_iot.publish('$dp', pubdata({'speed':1}))
while True:
pass
四、功能演示