教你玩转天猫精灵:把设备接入天猫精灵

[复制链接]
11904|32
 楼主| gaoyang9992006 发表于 2020-3-1 20:15 | 显示全部楼层 |阅读模式
IO, ST, pi, TI, se
本帖最后由 gaoyang9992006 于 2020-3-2 10:56 编辑

自从一年半前购买了天猫精灵,就一直在用,最近在想,能否把自己家的灯改造改造就接入了呢,到时候来一句:“天猫精灵,帮我打开卧室的灯”。然后灯就亮了。
然后就开始查资料,接下来不废话,教大家如何实现接入天猫精灵。
1,准备硬件:ESP8266板子一块,天猫精灵一台,安装天猫精灵客户端软件的手机一台。
2,给ESP8266烧录nodeMCU固件,这里我提供一份我在云平台构建好的固件
nodemcu-master-19-modules-2020-03-01-07-15-54-float.zip (332.73 KB, 下载次数: 40)
这个固件是目前的最新版,我今天刚构建生成的,基于nodeMCU3.0版本,所以你之前学习过nodeMCU的话,可能部分函数已经变了。需要重新学习。
烧录工具 ESP8266Flasher.zip (2.59 MB, 下载次数: 18) ,通过该烧录工具烧录入我提供的固件。如果不会烧录可网上查找资料,或者查看我以前写的测评**。链接:https://www.21ic.com/evm/evaluate/expansion/201608/683416.htm
在搞定固件后,就需要编写Lua脚本和上传Lua脚本文件了,这里还需要用到一个上传工具,是基于JAVA的,所以你要有一个JRE环境,请先安装JRE。
ESPlorer.zip (3.46 MB, 下载次数: 19)
nodeMCU3.0默认的通信串口波特率是115200第三方云平台,我选择的是贝壳物联网,注册贝壳物联账号,登录后创建设备 000.png
请记住你创建的设备ID和APIKEY,这是用于标识你的设备的,你的设备与云平台的服务器交换命令就是靠的这两组密码。
然后你可以编辑或者修改该设备的信息
001.png
请注意,这里一定要选择对,不然对接后将会乱套。
你想作为灯,这里就要先选择灯,作为插板就选插板,,,,
做好了这一切就该对接天猫精灵了,打开天猫精灵软件,点击右下角:我家->添加设备,然后搜索“贝壳物联”,然后会提示你绑定贝壳物联到天猫,你只需要在这里按照提示输入你的贝壳物联的账号和密码就行了。绑定成功。. 微信图片_20200301205353.jpg
接下来编辑代码。
我分为两部分实现,第一部分连接家里的WIFI,第二部分与贝壳物联网云平台通信,请记住我的代码是按照nodeMCU3.0版本修改的,跟贝壳物联提供的参考代码还是有点不同的。后面我会继续优化代码,并提供如何自己搭建私有云平台。
第一个文件名字   init.lua
  1. --init.lua
  2. print("set up wifi mode")
  3. wifi.setmode(wifi.STATION)
  4. cfg = {}
  5. cfg.ssid = "你的WIFI名字"
  6. cfg.pwd = "你的WIFI密码"
  7. wifi.sta.config(cfg)
  8. wifi.sta.connect()
  9. print("IP unavaiable, Waiting...")
  10. mytmr=tmr.create()
  11. mytmr:start()
  12. mytmr:alarm(1000, 1,
  13. function()
  14.         if wifi.sta.getip() ~= nil
  15.         then
  16.                 mytmr:stop()
  17.                 print("Config done, IP is "..wifi.sta.getip())
  18.                 dofile("kaiguan.lua")
  19.         end
  20. end)


第二个文件名字  kaiguan.lua
  1. --use sjson
  2. print("Start BeiKeKaiGuan File. ")


  3. _G.cjson = sjson
  4. --modify DEVICEID INPUTID APIKEY
  5. DEVICEID = "******"
  6. APIKEY = "************"

  7. host = host or "www.bigiot.net"
  8. port = port or 8181
  9. LED = 3
  10. isConnect = false
  11. gpio.mode(LED,gpio.OUTPUT)
  12. gpio.write(LED, gpio.HIGH)

  13. local function run()
  14.   local cu = net.createConnection(net.TCP)
  15.   cu:on("receive", function(cu, c)
  16.     print(c)
  17.     isConnect = true
  18.     r = cjson.decode(c)
  19.     if r.M == "say" then
  20.       if r.C == "play" then   
  21.         gpio.write(LED, gpio.LOW)  
  22.         ok, played = pcall(cjson.encode, {M="say",ID=r.ID,C="LED turn on!"})
  23.         cu:send( played.."\n" )
  24.       end
  25.       if r.C == "stop" then   
  26.         gpio.write(LED, gpio.HIGH)
  27.         ok, stoped = pcall(cjson.encode, {M="say",ID=r.ID,C="LED turn off!"})
  28.         cu:send( stoped.."\n" )
  29.       end
  30.     end
  31.   end)
  32.   
  33.   cu:on('disconnection',function(scu)
  34.     cu = nil
  35.     isConnect = false
  36.     --停止心跳包发送定时器,5秒后重试
  37.         
  38.     mytmr:stop()
  39.     mytmr:alarm(5000, tmr.ALARM_SEMI, run)
  40.   end)
  41.   
  42.   cu:connect(port, host)
  43.   ok, s = pcall(cjson.encode, {M="checkin",ID=DEVICEID,K=APIKEY})
  44.   if ok then
  45.     print(s)
  46.   else
  47.     print("failed to encode!")
  48.   end
  49.   if isConnect then
  50.     cu:send(s.."\n")
  51.   end
  52.   mytmr:alarm(60000, tmr.ALARM_AUTO, function()
  53.     if isConnect then
  54.       cu:send(s.."\n")
  55.     end
  56.   end)
  57. end
  58. run()

然后上传代码到你的8266,运行后,很快你就可以通过天猫精灵控制你的灯了,例子中我的灯接在了nodeMCU的3号端口。对应编码如下所示

3333.png
左边的编码是nodeMCU的编码,右边的编码是ESP8266定义的编码。
完整代码下载,回复后可见。
游客,如果您要查看本帖隐藏内容请回复








评论

@gaoyang9992006 :大神能指点一下吗?  发表于 2022-3-16 21:50
@gaoyang9992006 :用指令实现这个可以,但是像你说的通过解析天猫精灵的语音来控制灯,贝壳物联上就不知道怎么实现了。  发表于 2022-3-16 14:29
@gaoyang9992006 :那你例子当中的贝壳物联有这样的插件功能吗?  发表于 2022-3-16 14:12
@sunboy25 :那还是作为一盏灯,只是根据你的语音收到了不同的指令后你解析指令执行点不同的灯就行了。  发表于 2022-3-16 10:21
我想问一下大神,如果我要用1个模块控制1盏以上灯时,贝壳物联网该怎样设置?  发表于 2022-3-16 09:09

评分

参与人数 1威望 +20 收起 理由
21ic小喇叭 + 20 nb

查看全部评分

 楼主| gaoyang9992006 发表于 2020-3-1 20:40 | 显示全部楼层
本帖最后由 gaoyang9992006 于 2020-3-1 21:38 编辑

444.png
5555.png
这就是串口打印的消息。开机登录消息如下所示:
121222.png


xyz549040622 发表于 2020-3-1 21:35 | 显示全部楼层
高大师威武,啥Lua的不懂。
 楼主| gaoyang9992006 发表于 2020-3-2 10:28 | 显示全部楼层
xyz549040622 发表于 2020-3-1 21:35
高大师威武,啥Lua的不懂。

一种脚本语言。运行速度超级快,仅次于C语言,由C语言开发。可以很容易移植到单片机上。
Lua 是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。

Lua 是巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de Janeiro)里的一个研究小组于 1993 年开发的,该小组成员有:Roberto Ierusalimschy、Waldemar Celes 和 Luiz Henrique de Figueiredo。
 楼主| gaoyang9992006 发表于 2020-3-2 10:45 | 显示全部楼层
如果绑定天猫精灵后,在贝壳物联管理页面修改了设备的属性,需要在天猫精灵解除绑定后,重新绑定,才能使用新的属性进行语音控制,例如,你第一次绑定前设定的是个插座,那么你可以对天猫精灵说:天猫精灵,帮我打开插座。这之后如果你修改成了灯,你的 天猫精灵里面的属性仍然是灯,想让修改生效需要先解除绑定后,重新绑定贝壳物联账号就行了。
tlled 发表于 2020-3-2 11:15 | 显示全部楼层
强大      
zwtx821 发表于 2020-3-2 16:45 | 显示全部楼层
不错!
木子不二 发表于 2020-3-2 17:00 | 显示全部楼层
教授 威武
 楼主| gaoyang9992006 发表于 2020-3-2 21:44 | 显示全部楼层
本帖最后由 gaoyang9992006 于 2020-3-2 21:54 编辑

更新版本,之前是通过文件写入的WIFI账号和密码,实际上可以通过手机配置。
方法是通过启用enduser setup Module aka Captive Portal aka WiFi Manager的方式,先让模块设置为AP模式并启用一个配置设置,生成一个AP,手机连接该AP,然后访问IP:192.168.4.1即可进入界面,然后输入你的WIFI账号和密码,或者搜索WIFI列表。
然后就可以自动完成WIFI接入了,之后等待约一分钟,即可与第三方云服务器实现沟通,完整在线动作。即可与天猫精灵对话。
该接入方式的代码如下
  1. --init.lua
  2. enduser_setup.start(
  3.   function()
  4.     print("Connected to WiFi as:" .. wifi.sta.getip())
  5.         dofile("kaiguan.lua")
  6.   end,
  7.   function(err, str)
  8.     print("enduser_setup: Err #" .. err .. ": " .. str)
  9.   end,
  10.   print -- Lua print function can serve as the debug callback
  11. )


  1. --kaiguan.lua

  2. print("Start BeiKeKaiGuan File. ")

  3. --use sjson
  4. _G.cjson = sjson
  5. --modify DEVICEID INPUTID APIKEY
  6. DEVICEID = "*****"
  7. APIKEY = "*********"

  8. host = host or "www.bigiot.net"
  9. port = port or 8181
  10. LED = 3
  11. isConnect = false
  12. gpio.mode(LED,gpio.OUTPUT)
  13. gpio.write(LED, gpio.HIGH)

  14. local function run()
  15.   local cu = net.createConnection(net.TCP)
  16.   cu:on("receive", function(cu, c)
  17.     print(c)
  18.     isConnect = true
  19.     r = cjson.decode(c)
  20.     if r.M == "say" then
  21.       if r.C == "play" then   
  22.         gpio.write(LED, gpio.LOW)  
  23.         ok, played = pcall(cjson.encode, {M="say",ID=r.ID,C="LED turn on!"})
  24.         cu:send( played.."\n" )
  25.       end
  26.       if r.C == "stop" then   
  27.         gpio.write(LED, gpio.HIGH)
  28.         ok, stoped = pcall(cjson.encode, {M="say",ID=r.ID,C="LED turn off!"})
  29.         cu:send( stoped.."\n" )
  30.       end
  31.     end
  32.   end)
  33.   
  34.   cu:on('disconnection',function(scu)
  35.     cu = nil
  36.     isConnect = false
  37.     --停止心跳包发送定时器,5秒后重试
  38.         mytmr=tmr.create()
  39.         mytmr:start()        
  40. --  mytmr:stop()
  41.     mytmr:alarm(5000, tmr.ALARM_SEMI, run)
  42.   end)
  43.   
  44.   cu:connect(port, host)
  45.   ok, s = pcall(cjson.encode, {M="checkin",ID=DEVICEID,K=APIKEY})
  46.   if ok then
  47.     print(s)
  48.   else
  49.     print("failed to encode!")
  50.   end
  51.   if isConnect then
  52.     cu:send(s.."\n")
  53.   end
  54.         mytmr=tmr.create()
  55.         mytmr:start()
  56.   mytmr:alarm(60000, tmr.ALARM_AUTO, function()
  57.     if isConnect then
  58.       cu:send(s.."\n")
  59.     end
  60.   end)
  61. end
  62. run()
1111111.png 手机登录8266生成的AP后,进入192.168.4.1配置完WIFI账号密码后,即可完成网络接入。如上图所示,提示分配的IP地址。
mks666 发表于 2020-3-3 10:28 | 显示全部楼层
可以可以
zhdm 发表于 2020-3-3 17:03 | 显示全部楼层
谢谢分享!
汽车电子 发表于 2020-3-3 22:29 | 显示全部楼层
用来学习不错。实际根本无需这么复杂,用手机APP就可以了,同一局域网的都能控制。远程控制才需要服务器。
sxdddz 发表于 2020-3-3 23:05 | 显示全部楼层
谢谢大佬
 楼主| gaoyang9992006 发表于 2020-3-4 15:31 | 显示全部楼层
汽车电子 发表于 2020-3-3 22:29
用来学习不错。实际根本无需这么复杂,用手机APP就可以了,同一局域网的都能控制。远程控制才需要服务器。 ...

手机APP控制的三年前就在论坛发过了,这个是为了接入天猫精灵控制。
liyuloveyou1 发表于 2020-3-6 14:37 | 显示全部楼层
学习学习
feng5200 发表于 2020-3-7 11:36 | 显示全部楼层
学习学习。。。。。。
xuanhuanzi 发表于 2020-3-9 16:32 | 显示全部楼层
神一样的操作。
melody361 发表于 2020-6-23 11:19 | 显示全部楼层
大佬怎么弄成2812的改变颜色的灯?
 楼主| gaoyang9992006 发表于 2020-6-23 12:03 | 显示全部楼层
melody361 发表于 2020-6-23 11:19
大佬怎么弄成2812的改变颜色的灯?

2812是什么?不懂啊,我说的是8266,如果你控制灯的颜色也可以,有相关口令设置参数,你单片机接到参数修改相关输出就行。
cyh924417122 发表于 2020-8-14 17:13 | 显示全部楼层
mark,一直没连上
个人签名:如果你觉得我的分享或者答复还可以,请给我点赞,谢谢。

2052

主题

16400

帖子

222

粉丝
快速回复 在线客服 返回列表 返回顶部