大概用到:插板、esp-01s继电器模块、usb转串口ttl模块、https服务器、小度音箱。

大概原理:

https服务器上提供开关状态查询接口,esp-01s烧录编写的固件,使得可以连接wifi后轮询这个接口,并根据接口返回的状态打开或关闭继电器。在小度技能平台创建开关技能,在https服务器上提供oauth2.0接口和遵循dueros智能家具协议的开关控制接口。这样,通过小度的真机测试模式,让小度“打开开关”,小度会调到https服务器打开开关接口,修改开关状态,间接控制开关开合。

大概过程:

(1)插板改造,把esp-01s继电器模块的常开端串到插板的一根线上。

(2)esp-01s可以使用nodemcu固件,直接lua开发,简化过程。

关于nodemcu固件,可以去https://nodemcu-build.com/在线编译,通过填邮箱、选择需要的模块、点击开始构建后,过会会收到包含固件下载地址的邮件。这里之前编译过,当时选了模块有(adc,enduser_setup,file,gpio,http,mqtt,net,node,tmr,uart,wifi,tls),选了的模块,在lua脚本中,可以使用相关api,api文档地址https://nodemcu.readthedocs.io/en/master/。

关于固件烧录,esp-01s供电为3.3v,usb转ttl供电为5v,这里烧录时做了个转接板来连接,用asm1117 3.3v稳压器得到的3.3v(usb转ttl带了3.3v供电,但没用,部分资料显示可能会烧坏,没试),RST与GND上接了微动开关做重启,GPIO0与GND接了拨动开关用来切换下载模式。连接好后,打开NodeMCU-PyFlasher-4.0-x64.exe,选择串口和固件,115200,Quad I/O,点击刷写,等待完成。不正常的话多试几次,连线建议用短线。

(3)写入lua程序。

换用ESPlorer,选择串口,115200,打开串口,按前面转接板上的微动开关重启,刷的固件会初始化文件系统。软件右边显示命令行,左面写命令或脚本。左边写print("hello")并选择发送,会发送到命令行,执行后命令行显示结果hello。

这时候可以编写需要的init.lua脚本,通过upload上传,写入esp-01s,再按微动开关重启,nodemcu自动加载init.lua脚本执行,连接wifi,请求接口。

到这里,可以通过修改接口返回值,测试能看控制开关。

-- //init.lua
print('hello')-- wifi连接
wifi.setmode(wifi.STATION)
station_cfg={}
station_cfg.ssid="changeme"
station_cfg.pwd="changeme"
station_cfg.auto=true
station_cfg.save=true
wifi.sta.config(station_cfg)
print(wifi.sta.getip())
-- //wifi.sta.disconnect()-- ap模式,手机连接此wifi,到192.168.4.1配置wifi
enduser_setup.start(function()print("enduser conn wifi as:" .. wifi.sta.getip())end,function(err, str)print("enduser conn wifi err #" .. err .. ": " .. str)end
)-- //print(uart.setup(0, 9600, 8, 0, 1, 1 ))-- gpio0控制继电器,对应nodemc的pin 3,gpio2控制板载led,对应4
pin1 = 3
pin2 = 4
gpio.mode(pin1,gpio.OUTPUT)
gpio.mode(pin2,gpio.OUTPUT)
gpio.write(pin1,gpio.HIGH)
gpio.write(pin2,gpio.HIGH)myurl = "https://test.xxxxxxx.com/test/led.php"mytimer = tmr.create()
mytimer:alarm(5000, tmr.ALARM_AUTO, function()ip = wifi.sta.getip()if (ip == nil) thenprint('wifi not connect...')returnelseprint(wifi.sta.getip())endprint('http req led.php....')http.get(myurl, nil, function(code, data)if (code < 0) thenprint("HTTP request failed...")elseprint("HTTP request succ...", code, data)if (data == "00") thengpio.write(pin1,gpio.LOW)gpio.write(pin2,gpio.LOW)elseif (data =="01") thengpio.write(pin1,gpio.LOW)gpio.write(pin2,gpio.HIGH)elseif (data =="10") thengpio.write(pin1,gpio.HIGH)gpio.write(pin2,gpio.LOW)elseif (data =="11") thengpio.write(pin1,gpio.HIGH)gpio.write(pin2,gpio.HIGH)elseprint('led nop...')endendend)collectgarbage()
end)-- //mytimer.stop()
<?php# led.phpfunction getRedis($host = '127.0.0.1', $port = 6379, $db = 0) {$redis = new Redis();$redis->connect($host, $port);$redis->select($db);return $redis;}function getLed() {$redis = getRedis('127.0.0.1', 6379, 0);$led = $redis->get("led");$redis->close();return $led;}function setLed($led) {$redis = getRedis('127.0.0.1', 6379, 0);$redis->set("led", $led);$redis->close();}$m = $_SERVER['REQUEST_METHOD'];$t = isset($_REQUEST['t']) ? $_REQUEST['t'] : '';if ($m == 'GET') {if (empty($t)) {$led = getLed();if (!empty($led)) {echo $led;} else {echo 'none';}exit;}}if ($m == 'GET' && $t == 'ui') {} else {echo 'nop';exit;}$led = isset($_REQUEST['led']) ? $_REQUEST['led'] : '';$sw = isset($_REQUEST['sw']) ? $_REQUEST['sw'] : '';$msg = '';if (!empty($led)) {setLed($led);$msg = 'set led = ' . $led . "\n";} else if (!empty($sw)) {if ($sw === 'on') {setLed('01');$msg = "开关打开\n";} else {setLed('11');$msg = "开关关闭\n";}} else {$led = getLed();$msg = 'now led = ' . $led . "\n";}?><!DOCTYPE html>
<html lang="zh-cmn">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
<title>LED</title>
<style></style>
</head>
<body>
<pre><?php echo $msg; ?>
</pre><hr><a href='?t=ui&led=00'>[set 00]</a><a href='?t=ui&led=01'>[set 01]</a><a href='?t=ui&led=10'>[set 10]</a><a href='?t=ui&led=11'>[set 11]</a><a href='?t=ui'>[get now]</a><br>开关:<a href='?t=ui&sw=on'>[开]</a> <a href='?t=ui&sw=off'>[关]</a></body>
</html>

(4)在小度技能平台,创建我的开关,配置服务里配置各url地址和值。

授权信息配置部分配置oauth2.0权限,设备云信息配置开关接口,如:

授权地址:https://test.xxxxxx.com/oauth2.0/authorize.php

Client_Id:191223d5e1bcb5f9e51bca66113ce3a1

Token地址:https://test.xxxxxx.com/oauth2.0/token.php

ClientSecret:191223d5e1bcb5f9e51bca66113ce3a2

WebService:https://test.xxxxxx.com/iot/dueros.php

这里oauth2.0只简单实现功能,dueros.php按协议实现简单功能。

-- authorize.php -----------------------------------
<?php$response_type = vvget("response_type", "");
$client_id = vvget("client_id", "");
$redirect_uri = vvget("redirect_uri", "");
$scope = vvget("scope", "default");
$state = vvget("state", "");// 校验各个值非空
if (empty($response_type)) {$message = "'值不能为空'";Header("content-type: text/plain;charset=UTF-8");echo $message;return;
}// 检测client_id被注册,检测与redirect_uri匹配,检测没禁用
if ('191223d5e1bcb5f9e51bca66113ce3a1' !== $client_id) {$message = "client_id不存在";Header("HTTP/1.1 400 Bad Request");Header("content-type: text/plain;charset=UTF-8");echo $message;return;
}
if ('https://xiaodu.baidu.com/saiya/auth/xxxxxxxxxxxxxxxxxx' !== $redirect_uri) {$message = "'redirect_uri不正确'";Header("HTTP/1.1 400 Bad Request");Header("content-type: text/plain;charset=UTF-8");echo $message;return;
}// 检测当前是否有用户登录,没登录去登录// 检测登录的用户是否授权,授权是否一致// 也授权了,那跳转回去
if ($response_type === 'code') {$code = '191223d5e1bcb5f9e51bca66113ce3a3';$url = $redirect_uri;if (strpos($redirect_uri, '?') > 0) {$url .= "&";} else {$url .= "?";}$url .= "code=" . $code . "&state=" . $state;header('Location: ' . $url);return;
} else if ($response_type === 'token') {$access_token = '191223d5e1bcb5f9e51bca66113ce3a4';$expires_in = 60 * 60 * 2;$url = $redirect_uri;$url .= "#access_token=" . $access_token . "&state=" . $state . "&token_type=access_token&expires_in=" . $expires_in;header('Location: ' . $url);return;
} else {Header("HTTP/1.1 400 Bad Request");Header("content-type: text/plain;charset=UTF-8");$message = "不支持的response_type";echo $message;return;
}-- token.php -----------------------------------<?php$client_id = vvget("client_id", "");
$client_secret = vvget("client_secret", "");
$redirect_uri = vvget("redirect_uri", "");
$grant_type = vvget("grant_type", "");
$code = vvget("code", "");
$refresh_token = vvget("refresh_token", "");// 校验各个值非空// 检测client_id被注册,检测没禁用,校验client_secret正确
if ('191223d5e1bcb5f9e51bca66113ce3a1' !== $client_id) {Header("HTTP/1.1 400 Bad Request");Header("content-type: text/plain;charset=UTF-8");$message = "'client_id不存在'";echo $message;return;
}
if ('191223d5e1bcb5f9e51bca66113ce3a2' !== $client_secret) {Header("HTTP/1.1 400 Bad Request");Header("content-type: text/plain;charset=UTF-8");$message = "'client_secret不正确'";echo $message;return;
}// 检测与redirect_uri匹配
if ("authorization_code" === $grant_type) {// 校验redirect_uri一致if ('https://xiaodu.baidu.com/saiya/auth/xxxxxxxxxxxxxx' !== $redirect_uri) {Header("HTTP/1.1 400 Bad Request");Header("content-type: text/plain;charset=UTF-8");$message = "'redirect_uri不正确'";return;}
}// token
if ("authorization_code" === $grant_type) {Header("HTTP/1.1 200 OK");Header("content-type: application/json;charset=UTF-8");echo json_encode(array("access_token" => '191223d5e1bcb5f9e51bca66113ce3a4',"token_type" => 'access_token',"expires_in" => 60 * 60 *2,"refresh_token" => '191223d5e1bcb5f9e51bca66113ce3a5',"scpoe" => ''));return;
} else if ("refresh_token" === $grant_type) {Header("HTTP/1.1 200 OK");Header("content-type: application/json;charset=UTF-8");echo json_encode(array("access_token" => '191223d5e1bcb5f9e51bca66113ce3a4',"token_type" => 'access_token',"expires_in" => 60 * 60 *2,"refresh_token" => '191223d5e1bcb5f9e51bca66113ce3a5',"scpoe" => ''));return;
} else {Header("HTTP/1.1 400 Bad Request");Header("content-type: text/plain;charset=UTF-8");echo '不支持的grant_type';return;
}
-- dueros.php ----------------------------------
<?php$body = @file_get_contents('php://input');$debug = isset($_GET["debug"]) ? $_GET["debug"] : 'false';$json = json_decode($body, true);$header = $json['header'];$payload = $json['payload'];$namespace = $header['namespace'];$name = $header['name'];$messageId = $header['messageId'];$accessToken = $payload['accessToken'];if ($accessToken !== '191223d5e1bcb5f9e51bca66113ce3a4') {//Header("content-type: application/json;charset=UTF-8");Header("content-type: text/plain;charset=UTF-8");echo "错误的accessToken";return;}// --------------------function getRedis($host = '127.0.0.1', $port = 6379, $db = 0) {$redis = new Redis();$redis->connect($host, $port);$redis->select($db);return $redis;}function getLed() {$redis = getRedis('127.0.0.1', 6379, 0);$led = $redis->get("led");$redis->close();return $led;}function setLed($led) {$redis = getRedis('127.0.0.1', 6379, 0);$redis->set("led", $led);$redis->close();}// https://www.xxxxxxxxxxxx.com/iot/dueros.php// --------------------$path = $namespace . '/' . $name;if ('DuerOS.ConnectedHome.Discovery/DiscoverAppliancesRequest' === $path) {//echo "discovery";$ret = array('header' => array("namespace" => "DuerOS.ConnectedHome.Discovery","name" => "DiscoverAppliancesResponse","messageId" => $messageId,"payloadVersion" => "1"),'payload' => array("discoveredAppliances" => array(array("applianceTypes" => "SWITCH","applianceId" => "20191222220215","friendlyDescription" => "我的开关开关。。","friendlyName" => "我的开关","isReachable" => true,"manufacturerName" => "zhanglc","modelName" => "my sw","version" => "0.0。1","actions" => array("turnOn", "turnOff"),"attributes" => array("name" => "powerState","value" => "ON","scale" => "","timestampOfSample" => time(),"uncertaintyInMilliseconds" => 0)))));echo json_encode($ret);return;}if ('DuerOS.ConnectedHome.Control/TurnOnRequest' === $path) {setLed('00');//echo "turn on";$ret = array('header' => array("namespace" => "DuerOS.ConnectedHome.Control","name" => "TurnOnConfirmation","messageId" => $messageId,"payloadVersion" => "1"),'payload' => array("attributes" => array("name" => "powerState","value" => "ON","scale" => "","timestampOfSample" => time(),"uncertaintyInMilliseconds" => 0)));echo json_encode($ret);return;}if ('DuerOS.ConnectedHome.Control/TurnOffRequest' === $path) {setLed('10');//echo "turn off";$ret = array('header' => array("namespace" => "DuerOS.ConnectedHome.Control","name" => "TurnOffConfirmation","messageId" => $messageId,"payloadVersion" => "1"),'payload' => array("attributes" => array("name" => "powerState","value" => "ON","scale" => "","timestampOfSample" => time(),"uncertaintyInMilliseconds" => 0)));echo json_encode($ret);return;}//Header("content-type: application/json;charset=UTF-8");Header("content-type: text/plain;charset=UTF-8");echo "不支持的请求: ".$path;return;

(5)真机测试,开启技能调试模式,手机小度app上看设备,应该是会显示出此设备(原先直接向小度发语言提示没找到设备),向小度发语言“打开开关”,开关被打开。

小度音箱+esp8266做语音控制开关相关推荐

  1. 小度C1可以改语言吗,小度音箱怎么更改唤醒词

    小度音箱行业版2.3.6安卓版 类型:生活服务大小:13.6M语言:中文 评分:5.0 标签: 立即下载 小度音箱是通过语音进行唤醒的,唤醒词是默认的,用户说唤醒词来唤醒小度音箱,有小伙伴想更改唤醒词 ...

  2. 简单三步,教你如何用小度音箱语音控制智汀设备?

    前言 在我们日常生活中,常常听到最多的就就是语音控制设备了,比如,用唤醒词"小度小度"唤醒小度音箱,这时可以看到音箱亮起蓝色的Logo光圈,然后再说"打开/关闭+设备名称 ...

  3. 小度智能音箱维修点_小度音箱客服电话

    您可以在小度商城下方的按钮中周到小度在线客户点击即可跳转到聊天页面,有什么问题就可以与客户沟通,他们会第一时间为您解答问题的.他们的人工客服电话是400-808-1111 周一至周日 09:00-22 ...

  4. 使用小度音箱+Blinker控制ESP01S Relay继电器模块

    一. 使用ESP01S模块,PIN脚定义如下: 管脚功能如下: ESP01S模块原理图: ESP01S模块比ESP01模块做了以下优化: LED灯的管脚发生变化,由ESP01的TXD0变成ESP01s ...

  5. 小度智能音响拆解 芯片_不拆不快:小度音箱拆解测评

    不拆不快:小度音箱拆解测评 2018-11-15 11:38:37 16点赞 4收藏 2评论 其实刚收到测评申请通过信息的时候,内心是拒绝的,百度财大气粗的提供了100个小度音箱,也就意味着未来一段时 ...

  6. 依图做语音了!识别精度创中文语音识别新高点

    新智元报道 编辑:闻菲 [新智元导读]依图强势进军智能语音,联合微软发布语音开放云平台,携手华为发布软硬件一体化的智能语音联合解决方案.依图语音识别算法在全球最大开源中文数据库AISHELL-2上词错 ...

  7. 蔡康永般“好好说话”?百度发起猛攻 推249元小度音箱

    ▼ 点击上方蓝字 关注网易智能 为你解读AI领域大公司大事件,新观点新应用 [网易智能讯 6月11日消息]今天下午,百度在北京召开小度新品硬件发布会,正式推出小度AI品牌的第二款硬件"小度智 ...

  8. “物联网开发实战”学习笔记-(四)智能音箱制作和语音控制

    "物联网开发实战"学习笔记-(四)智能音箱制作和语音控制 这次来造一个属于自己的智能音箱,这里详细介绍了智能音箱的语音控制的实现. 智能音箱的技术架构 智能音箱主要涉及拾音.前端信 ...

  9. dueros模拟测试没有请求后台_小度音箱对接之DuerOS开放平台功能分析

    由于项目需要,需要对接DuerOS,使用小度音箱控制设备.近期会对DuerOS技能平台进行一些研究,尤其是智能控制相关功能.特此记录. 文章目录 DuerOS开放平台简介 技能分类 自定义技能 小技能 ...

最新文章

  1. java.sql.SQLException: java.lang.StackOverflowError
  2. Create Custom Instruments
  3. java 连接 sftp失败,与apache vfs的SFTP连接失败,但使用WinSCP成功
  4. 浅淡HTML5移动Web开发
  5. VBS常用函数及功能
  6. vld不输出泄漏信息_UV固化设备不单单只有灯管!还有哪些辅动部件?
  7. opa847方波放大电路_比例阀伺服放大器设计(一)
  8. nginx: too many open files
  9. Maxim推出上/下变频SiGe混频器MAX2042
  10. LAMP源码安装配置实战
  11. C++ getline在VC6.0的一个bug(处理方法)(转)
  12. 脱口秀在尝试处理一件难事
  13. python turtle菜鸟教程_Python 基础教程
  14. 网关报错:Load balancer does not have available server for client: xxx
  15. word打开doc文件提示运行时错误‘4605‘
  16. Java中使用图片验证码 --菜鸟小回
  17. 最近邻搜索|Nearest neighbor search
  18. h5开启摄像头拍照+腾讯云接口人脸验证
  19. 奥塔在线:Centos7下NTP服务的详细部署说明
  20. 常网小站 骗子网站 大家小心别上当

热门文章

  1. 网吧做直播,制做网页播放器代码全集
  2. unity之NPC人物名称显示
  3. 陈宝林《最优化理论与算法》超详细学习笔记 (四)————第四章 对偶理论
  4. devicePixelRatio
  5. noi-8173-密码翻译
  6. PHP中PSR-[0-4]规范
  7. 比起渣,女人更不接受锉男?!
  8. 如何在面试中推销自己?
  9. OutputCache缓存各参数的说明
  10. 如何强制网页只能微信打开?