hockel 发表于 2021-3-13 08:11:18

【万物物联】Siri+快捷指令+onenet控制掌控板

本帖最后由 hockel 于 2021-4-1 19:51 编辑

# 【万物物联】Siri+快捷指令+onenet控制掌控板


##一、前言
最近在和学生准备一场比赛,其中一个功能需要手机语音助手来控制掌控板开关灯,那么如何实现Siri和掌控板之间的通讯呢?看了铁熊的一篇文章:[【掌控板教程 | 学会掌控板 + Siri 语音控制,只要半小时!】](https://blog.csdn.net/ironpandaaa/article/details/99681121?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522161554556816780274195320%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=161554556816780274195320&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~baidu_landing_v2~default-1-99681121.pc_search_result_no_baidu_js&utm_term=siri%20%E6%8E%8C%E6%8E%A7%E6%9D%BF)看了教程后直接被劝退!这让初中生实现起来也不切实际啊,有没有更加便捷的方法呢?
百度了一下,最终在一篇文章:[【“玩板”+siri+快捷指令+XCC3200(MQTT)来控制】](http://bbs.eeworld.com.cn/thread-1111142-1-1.html)中找到了方法,那就是通过苹果系统中的快捷指令来实现。好了,废话不多说,就让我们开始本次的教程吧。
## 二、准备阶段
### 2.1 注册onenet账号
首先打开(https://open.iot.10086.cn/),点击右上角的**注册按钮**,来到注册界面,开启注册。(我这里已经注册过了,就不再一一描述了)

注册完毕后,我们登录我们的账号,点击右上角的**控制台**按钮。

选择切换至旧版。(因为数据与旧版不互通,管理产品历史请返回旧版开发者中心)

进入旧版后,选择多协议接入。

在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"功能关闭灯

![](https://img-blog.csdnimg.cn/20210312193427469.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3RvbnljYXJzb24=,size_16,color_FFFFFF,t_70)
配置好后,给我们的指令命名【开灯】
![](https://img-blog.csdnimg.cn/20210312193732489.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3RvbnljYXJzb24=,size_16,color_FFFFFF,t_70)
这样就创建好了一个快捷指令,复制这个指令把它重新命名【关灯】,json中的值由原来的1变成0即可。
![](https://img-blog.csdnimg.cn/20210312193934932.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3RvbnljYXJzb24=,size_16,color_FFFFFF,t_70)
## 三、程序编写
打开mpython,添加onenet扩展,然后进行程序的编写。
这里的**设备ID、产品ID、产品APikey**都是我们之前需要记得。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210312194909360.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3RvbnljYXJzb24=,size_16,color_FFFFFF,t_70)


```python
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}]}
      _list.append(_d)
    _data = {'datastreams': _list}
    j_d = json.dumps(_data)
    j_l = len(j_d)
    arr = bytearray(j_l + 3)
    arr = 1
    arr = int(j_l / 256)
    arr = j_l % 256
    arr = 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


```

## 四、功能演示

https://v.youku.com/v_show/id_XNTExOTk5NTIyOA==.html

## 五、总结
通过本次教程我们就可以简单的实现siri控制掌控板啦,当然也可以是其他连网设备。期待读者等多的项目创新,更多教程请浏览我的个人博客:(http://www.hockel.club/)!




rzyzzxw 发表于 2021-3-15 14:32:05

特别赞啦

星辰大海666 发表于 2021-3-17 09:07:28

这个图形化编程软件叫啥

hockel 发表于 2021-3-17 09:57:58

星辰大海666 发表于 2021-3-17 09:07
这个图形化编程软件叫啥

mpython,mind+也可以实现!

快乐小老弟 发表于 2021-3-29 10:46:49

本帖最后由 快乐小老弟 于 2021-3-29 10:54 编辑

我手机发出的指令,设备收不到
可以加好友请教下么{:5_116:}


hockel 发表于 2021-3-29 14:24:32

快乐小老弟 发表于 2021-3-29 10:46
我手机发出的指令,设备收不到
可以加好友请教下么

可以先把接收的数据打印出来,然后再一步一步调试。

快乐小老弟 发表于 2021-3-30 08:30:01

hockel 发表于 2021-3-29 14:24
可以先把接收的数据打印出来,然后再一步一步调试。

大佬能否进一步指教下{:5_121:}

hockel 发表于 2021-3-30 09:31:58

快乐小老弟 发表于 2021-3-30 08:30
大佬能否进一步指教下

VX:hockel007

tiger_zc 发表于 2021-4-1 20:01:43

在楼主的帮助指导下,我的程序成功调通{:5_120:}

周奕帆 发表于 2021-6-19 22:03:25

星辰大海666 发表于 2021-3-17 09:07
这个图形化编程软件叫啥

这个图形化编程软件叫mpython
页: [1]
查看完整版本: 【万物物联】Siri+快捷指令+onenet控制掌控板