打印

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

[复制链接]
5019|32
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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)
这个固件是目前的最新版,我今天刚构建生成的,基于nodeMCU3.0版本,所以你之前学习过nodeMCU的话,可能部分函数已经变了。需要重新学习。
烧录工具 ESP8266Flasher.zip (2.59 MB) ,通过该烧录工具烧录入我提供的固件。如果不会烧录可网上查找资料,或者查看我以前写的测评**。链接:https://www.21ic.com/evm/evaluate/expansion/201608/683416.htm
在搞定固件后,就需要编写Lua脚本和上传Lua脚本文件了,这里还需要用到一个上传工具,是基于JAVA的,所以你要有一个JRE环境,请先安装JRE。
ESPlorer.zip (3.46 MB)
nodeMCU3.0默认的通信串口波特率是115200第三方云平台,我选择的是贝壳物联网,注册贝壳物联账号,登录后创建设备
请记住你创建的设备ID和APIKEY,这是用于标识你的设备的,你的设备与云平台的服务器交换命令就是靠的这两组密码。
然后你可以编辑或者修改该设备的信息

请注意,这里一定要选择对,不然对接后将会乱套。
你想作为灯,这里就要先选择灯,作为插板就选插板,,,,
做好了这一切就该对接天猫精灵了,打开天猫精灵软件,点击右下角:我家->添加设备,然后搜索“贝壳物联”,然后会提示你绑定贝壳物联到天猫,你只需要在这里按照提示输入你的贝壳物联的账号和密码就行了。绑定成功。.
接下来编辑代码。
我分为两部分实现,第一部分连接家里的WIFI,第二部分与贝壳物联网云平台通信,请记住我的代码是按照nodeMCU3.0版本修改的,跟贝壳物联提供的参考代码还是有点不同的。后面我会继续优化代码,并提供如何自己搭建私有云平台。
第一个文件名字   init.lua
--init.lua
print("set up wifi mode")
wifi.setmode(wifi.STATION)
cfg = {}
cfg.ssid = "你的WIFI名字"
cfg.pwd = "你的WIFI密码"
wifi.sta.config(cfg)
wifi.sta.connect()
print("IP unavaiable, Waiting...")
mytmr=tmr.create()
mytmr:start()
mytmr:alarm(1000, 1,
function()
        if wifi.sta.getip() ~= nil
        then
                mytmr:stop()
                print("Config done, IP is "..wifi.sta.getip())
                dofile("kaiguan.lua")
        end
end)


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


_G.cjson = sjson
--modify DEVICEID INPUTID APIKEY
DEVICEID = "******"
APIKEY = "************"

host = host or "www.bigiot.net"
port = port or 8181
LED = 3
isConnect = false
gpio.mode(LED,gpio.OUTPUT)
gpio.write(LED, gpio.HIGH)

local function run()
  local cu = net.createConnection(net.TCP)
  cu:on("receive", function(cu, c)
    print(c)
    isConnect = true
    r = cjson.decode(c)
    if r.M == "say" then
      if r.C == "play" then   
        gpio.write(LED, gpio.LOW)  
        ok, played = pcall(cjson.encode, {M="say",ID=r.ID,C="LED turn on!"})
        cu:send( played.."\n" )
      end
      if r.C == "stop" then   
        gpio.write(LED, gpio.HIGH)
        ok, stoped = pcall(cjson.encode, {M="say",ID=r.ID,C="LED turn off!"})
        cu:send( stoped.."\n" )
      end
    end
  end)
  
  cu:on('disconnection',function(scu)
    cu = nil
    isConnect = false
    --停止心跳包发送定时器,5秒后重试
        
    mytmr:stop()
    mytmr:alarm(5000, tmr.ALARM_SEMI, run)
  end)
  
  cu:connect(port, host)
  ok, s = pcall(cjson.encode, {M="checkin",ID=DEVICEID,K=APIKEY})
  if ok then
    print(s)
  else
    print("failed to encode!")
  end
  if isConnect then
    cu:send(s.."\n")
  end
  mytmr:alarm(60000, tmr.ALARM_AUTO, function()
    if isConnect then
      cu:send(s.."\n")
    end
  end)
end
run()

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


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








使用特权

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

相关帖子

沙发
gaoyang9992006|  楼主 | 2020-3-1 20:40 | 只看该作者
本帖最后由 gaoyang9992006 于 2020-3-1 21:38 编辑



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



使用特权

评论回复
板凳
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。

使用特权

评论回复
5
gaoyang9992006|  楼主 | 2020-3-2 10:45 | 只看该作者
如果绑定天猫精灵后,在贝壳物联管理页面修改了设备的属性,需要在天猫精灵解除绑定后,重新绑定,才能使用新的属性进行语音控制,例如,你第一次绑定前设定的是个插座,那么你可以对天猫精灵说:天猫精灵,帮我打开插座。这之后如果你修改成了灯,你的 天猫精灵里面的属性仍然是灯,想让修改生效需要先解除绑定后,重新绑定贝壳物联账号就行了。

使用特权

评论回复
6
tlled| | 2020-3-2 11:15 | 只看该作者
强大      

使用特权

评论回复
7
zwtx821| | 2020-3-2 16:45 | 只看该作者
不错!

使用特权

评论回复
8
木子不二| | 2020-3-2 17:00 | 只看该作者
教授 威武

使用特权

评论回复
9
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接入了,之后等待约一分钟,即可与第三方云服务器实现沟通,完整在线动作。即可与天猫精灵对话。
该接入方式的代码如下
--init.lua
enduser_setup.start(
  function()
    print("Connected to WiFi as:" .. wifi.sta.getip())
        dofile("kaiguan.lua")
  end,
  function(err, str)
    print("enduser_setup: Err #" .. err .. ": " .. str)
  end,
  print -- Lua print function can serve as the debug callback
)


--kaiguan.lua

print("Start BeiKeKaiGuan File. ")

--use sjson
_G.cjson = sjson
--modify DEVICEID INPUTID APIKEY
DEVICEID = "*****"
APIKEY = "*********"

host = host or "www.bigiot.net"
port = port or 8181
LED = 3
isConnect = false
gpio.mode(LED,gpio.OUTPUT)
gpio.write(LED, gpio.HIGH)

local function run()
  local cu = net.createConnection(net.TCP)
  cu:on("receive", function(cu, c)
    print(c)
    isConnect = true
    r = cjson.decode(c)
    if r.M == "say" then
      if r.C == "play" then   
        gpio.write(LED, gpio.LOW)  
        ok, played = pcall(cjson.encode, {M="say",ID=r.ID,C="LED turn on!"})
        cu:send( played.."\n" )
      end
      if r.C == "stop" then   
        gpio.write(LED, gpio.HIGH)
        ok, stoped = pcall(cjson.encode, {M="say",ID=r.ID,C="LED turn off!"})
        cu:send( stoped.."\n" )
      end
    end
  end)
  
  cu:on('disconnection',function(scu)
    cu = nil
    isConnect = false
    --停止心跳包发送定时器,5秒后重试
        mytmr=tmr.create()
        mytmr:start()        
--  mytmr:stop()
    mytmr:alarm(5000, tmr.ALARM_SEMI, run)
  end)
  
  cu:connect(port, host)
  ok, s = pcall(cjson.encode, {M="checkin",ID=DEVICEID,K=APIKEY})
  if ok then
    print(s)
  else
    print("failed to encode!")
  end
  if isConnect then
    cu:send(s.."\n")
  end
        mytmr=tmr.create()
        mytmr:start()
  mytmr:alarm(60000, tmr.ALARM_AUTO, function()
    if isConnect then
      cu:send(s.."\n")
    end
  end)
end
run()
手机登录8266生成的AP后,进入192.168.4.1配置完WIFI账号密码后,即可完成网络接入。如上图所示,提示分配的IP地址。

使用特权

评论回复
10
mks666| | 2020-3-3 10:28 | 只看该作者
可以可以

使用特权

评论回复
11
zhdm| | 2020-3-3 17:03 | 只看该作者
谢谢分享!

使用特权

评论回复
12
汽车电子| | 2020-3-3 22:29 | 只看该作者
用来学习不错。实际根本无需这么复杂,用手机APP就可以了,同一局域网的都能控制。远程控制才需要服务器。

使用特权

评论回复
13
sxdddz| | 2020-3-3 23:05 | 只看该作者
谢谢大佬

使用特权

评论回复
14
gaoyang9992006|  楼主 | 2020-3-4 15:31 | 只看该作者
汽车电子 发表于 2020-3-3 22:29
用来学习不错。实际根本无需这么复杂,用手机APP就可以了,同一局域网的都能控制。远程控制才需要服务器。 ...

手机APP控制的三年前就在论坛发过了,这个是为了接入天猫精灵控制。

使用特权

评论回复
15
liyuloveyou1| | 2020-3-6 14:37 | 只看该作者
学习学习

使用特权

评论回复
16
feng5200| | 2020-3-7 11:36 | 只看该作者
学习学习。。。。。。

使用特权

评论回复
17
xuanhuanzi| | 2020-3-9 16:32 | 只看该作者
神一样的操作。

使用特权

评论回复
18
melody361| | 2020-6-23 11:19 | 只看该作者
大佬怎么弄成2812的改变颜色的灯?

使用特权

评论回复
19
gaoyang9992006|  楼主 | 2020-6-23 12:03 | 只看该作者
melody361 发表于 2020-6-23 11:19
大佬怎么弄成2812的改变颜色的灯?

2812是什么?不懂啊,我说的是8266,如果你控制灯的颜色也可以,有相关口令设置参数,你单片机接到参数修改相关输出就行。

使用特权

评论回复
20
cyh924417122| | 2020-8-14 17:13 | 只看该作者
mark,一直没连上

使用特权

评论回复
发新帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:西安公路研究院南京院
简介:主要工作从事监控网络与通信网络设计,以及从事基于嵌入式的通信与控制设备研发。擅长单片机嵌入式系统物联网设备开发,音频功放电路开发。

1896

主题

15631

帖子

198

粉丝