本帖最后由 Mr.Bluyee 于 2017-6-10 10:52 编辑
先上效果图:
yeelink_lib.lua代码如下
- --==============================================================
- -- Yeelink API Version 1.1
- -- Written by Mr.Bluyee
- --==============================================================
- --==========================ModulePart============================
- yeelink_lib = {}
- --=========================LocalArgs===============================
- local yeelink_connect_value=0
- local yeelink_received_data=0
- local yeelink_value_table= {}
- local cl = net.createConnection(net.TCP, 0)
- local yeelink_host = "api.yeelink.net"
- --==============================================================
- function yeelink_lib.getdata(_device, _sensor, _apikey)
- cl:send("GET /v1.1/device/".._device.."/sensor/".._sensor.."/datapoint HTTP/1.1rn")
- cl:send("U-ApiKey:".._apikey.."rn")
- cl:send("Host: "..yeelink_host.."rnrn")
-
- end
- --==============================================================
- function yeelink_lib.postdata(_device, _sensor, _apikey, _datapoint)
- datapoint = tostring(_datapoint)
- local a=[[{"value":]]
- local b=[[}]]
- local st=a..datapoint..b
- cl:send("POST /v1.1/device/".._device.."/sensor/".._sensor.."/datapoints HTTP/1.1rn")
- cl:send("U-ApiKey:".._apikey.."rn")
- cl:send("Host: "..yeelink_host.."rn")
- cl:send("Content-Length: "..string.len(st).."rnrn")
- cl:send(st.."rn")
- end
- --==============================================================
- function yeelink_convertdata(c)
- i=string.find(c,"{")
- if (i ~= nil) then
- j=string.find(c,"}")
- s=string.sub(c,i,j)
- k=string.find(s,""")
- if (k ~= nil) then
- t = sjson.decode(s)
- else
- t = nil
- end
- else
- t = nil
- end
- return t
-
- end
- --==============================================================
- function yeelink_lib.init()
- if wifi.sta.getip() == nil then
- print("Please Connect WIFI First")
- else
- tmr.alARM(0, 2000, tmr.ALARM_SEMI, function()
- cl:connect(80, yeelink_host)
- end)
- end
-
- cl:on("receive", function(sck, c)
- yeelink_value_table=yeelink_convertdata(c)
- yeelink_received_data = yeelink_received_data + 1
- if (yeelink_received_data == 100) then
- yeelink_received_data = 0
- end
- end)
-
- cl:on("disconnection", function(sck, c)
- yeelink_connect_value=0
- print("disconnection!")
- tmr.start(0)
- end)
-
- cl:on("connection", function()
- yeelink_connect_value=1
- print("connection!")
- end)
-
- end
- --==============================================================
- function yeelink_lib.get_valuetable()
- return yeelink_value_table
- end
- --==============================================================
- function yeelink_lib.get_recived_state()
- return yeelink_received_data
- end
- --==============================================================
- function yeelink_lib.get_connect_state()
- return yeelink_connect_value
- end
- --==============================================================
- return yeelink_lib
复制代码
yeelink_example.lua代码如下
--==============================================================
复制代码
实现效果是每两秒GET一次数据,每20秒POST一次数据。
使用前提是wifi已经连入网络。
附上wifi配置代码:
- wifi.sta.sethostname("Node-MCU")
- print("hostname: "..wifi.sta.gethostname())
- wifi.eventmon.register(wifi.eventmon.STA_GOT_IP, function(T)
- print("ntSTA - GOT IP".."ntStation IP: "..T.IP.."ntSubnet mask: "..T.netmask.."ntGateway IP: "..T.gateway)
- end)
- wifi.eventmon.register(wifi.eventmon.STA_CONNECTED, function(T)
- print("ntSTA - CONNECTED".."ntSSID: "..T.SSID.."ntBSSID: "..T.BSSID.."ntChannel: "..T.channel)
- cl = net.createConnection(net.TCP, 0)
- cl:connect(80, yeelink_host)
- end)
-
- --connect to Access Point (DO save config to flash)
- station_cfg={}
- station_cfg.ssid="无线名称"
- station_cfg.pwd="无线密码"
- station_cfg.save=true
- wifi.sta.config(station_cfg)
复制代码
接下来的步骤:
1.先新建一个lua文件,名字为yeelink_lib.lua
2.将上面yeelink_lib.lua的代码复制进去,保存到ESP里,要确保该库文件已经存入。
附查看ESP里文件代码:
- l = file.list()
- for name, size in pairs(l) do
- print("name: " ..name..", size: "..size)
- end
复制代码
3.再新建一个lua文件,这时候名字随意,将上述yeelink_example.lua的代码复制进去,添加自己的yeelink参数,保存,开始执行。
4.要终止执行的话,右下方依次发送:
这时不再向yeelink发送请求,但是连接还是保持着的,库代码里设定就是与服务器连接断开后继续连接。
5.注意发送请求的时间间隔,发送POST请求时,最小间隔时间为10S,发送GET请求时,测试2S间隔也是可以的,再往下就没有测试。
6.库函数只包含基本的开关型和数值型的请求函数。
1
|
|
|
|
本帖最后由 Mr.Bluyee 于 2017-6-10 11:27 编辑
yeelink_exampe.lua代码如下
- --==============================================================
- -- Yeelink API Version 1.1
- -- Written by Mr.Bluyee
- --==============================================================
- yeelink_apikey="你自己的API_KEY"
- yeelink_device_id="你自己的device_id"
- yeelink_sensor1_id="你自己的sensor_id"
- yeelink_sensor2_id="你自己的sensor_id"
- yeelink_old_recieve_state=0
- count=0
- yeelink = require("yeelink_lib")
- yeelink.init()
- --==============================================================
- tmr.alarm(1, 2000, tmr.ALARM_AUTO, function()
- if (yeelink.get_connect_state() == 1) then
- yeelink.getdata(yeelink_device_id,yeelink_sensor1_id,yeelink_apikey)
- end
- end)
- --==============================================================
- tmr.alarm(2, 20000, tmr.ALARM_AUTO, function()
- if (yeelink.get_connect_state() == 1) then
- yeelink.postdata(yeelink_device_id,yeelink_sensor2_id,yeelink_apikey,count)
- print(count)
- count = count + 1
- if (count == 11) then
- count=0
- end
- end
- end)
- --==============================================================
- tmr.alarm(3, 100, tmr.ALARM_AUTO, function()
- if (yeelink.get_recived_state() ~= yeelink_old_recieve_state) then
- t=yeelink.get_valuetable()
- if(t ~= nil) then
- for k, v in pairs(t) do
- print(k.." : "..v)
- end
- end
- end
- yeelink_old_recieve_state=yeelink.get_recived_state()
- end)
- --==============================================================
复制代码
|
|
|
|
|
终止执行,右下方依次发送
- tmr.stop(1)
- tmr.stop(2)
- tmr.stop(3)
复制代码
|
|
|
|
|
附上本人使用的nodemcu固件,是在线编译好后发送到邮箱的,我选择的模块有:
adc
bit
coap
crypto
enduser_setup file
gpio
http
mqtt
net
node
pcm
pwm
rtcfifo
rtcmem
rtctime
sjson
sntp
tmr
uart
websocket
wifi
ws2812
压缩包里有两个,一个是integer,另一个是float,烧写一个就行了,
float就是支持浮点数
|
|
|
|
|