-[[
--NodeMCU連接貝殼物聯(lián)程序,作者Why,整理時間2017.09.07
--作品說明:NodeMCU連接到貝殼,并可以接受其控制(主要是開關(guān)預(yù)警功能)。
--打開預(yù)警功能后,如果有人體進入熱釋電紅外傳感器的探測范圍會自動向平臺發(fā)送預(yù)警信息。
--關(guān)閉預(yù)警后則不會觸發(fā)。
--為了方便解釋和查看,整理時添加了很多注釋和空行等,使用時建議刪除
--]]
--設(shè)定與貝殼物聯(lián)相關(guān)的信息,設(shè)備ID、APIKEY、INPUTID、貝殼服務(wù)器信息(ip、port)
DEVICEID = 設(shè)備id
APIKEY = API秘鑰
INPUTID = U+用戶ID在個人信息
host = "121.42.180.30" 貝殼物聯(lián)連接IP
port = 8181 貝殼物聯(lián)連接端口
--設(shè)定相關(guān)設(shè)備對應(yīng)IO口
Alert = 0--蜂鳴器和強光燈以及NodeMCU板載指示燈
Pir = 1--熱釋電紅外傳感器
LED = 4--NodeMCU板載Wifi指示燈,此處作為預(yù)警功能是否開啟的指示燈
--設(shè)置相關(guān)IO口模式和初始電平
gpio.mode(Alert, gpio.OUTPUT)
gpio.write(Alert, gpio.HIGH)
gpio.mode(Pir, gpio.OUTPUT)
gpio.write(Pir, gpio.LOW)
gpio.mode(LED, gpio.OUTPUT)
gpio.write(LED, gpio.HIGH)
--創(chuàng)建一個TCP連接
cu = net.createConnection(net.TCP)
--按IP和端口連接到貝殼
cu:connect(port, host)
--構(gòu)造認證消息并發(fā)送
ok, s = pcall(cjson.encode, {M="checkin",ID=DEVICEID,K=APIKEY})
cu:send(s.."\n")
--使用鬧鐘函數(shù)每30秒鐘發(fā)送一次認證消息保持設(shè)備在線
tmr.alarm(1, 30000, 1, function()
cu:send(s.."\n")
end)
--TCP連接接收到消息的回調(diào)函數(shù)及處理
cu:on("receive", function(cu, c)--參數(shù)為發(fā)送者連接和發(fā)送內(nèi)容,課直接利用此連接回復(fù)消息
r = cjson.decode(c)--解析收到的消息,消息結(jié)構(gòu)和內(nèi)容由貝殼統(tǒng)一構(gòu)造
if r.M == "say" then--判斷消息類型
--判斷消息內(nèi)容
if r.C == "play" then--打開預(yù)警功能
gpio.write(LED, gpio.LOW)--點亮預(yù)警指示燈
ok, played = pcall(cjson.encode, {M="say",ID="U000",C="turn on"})--構(gòu)造回復(fù)信息
cu:send( played.."\n" )--發(fā)送回復(fù)信息
gpio.mode(Pir,gpio.INT)--設(shè)置熱釋電紅外傳感器連接的IO口為中斷模式
gpio.trig(Pir, "both", function(level)--為中斷設(shè)置回調(diào)函數(shù)
if level == gpio.HIGH then--觸發(fā)報警
gpio.write(Alert, gpio.LOW)--啟動本地聲光報警
ok, warning = pcall (cjson.encode, { M = "say", ID = "D0000", C = "warning" })--構(gòu)造預(yù)警信息
cu:send (warning .. "\n")----發(fā)送預(yù)警信息
elseif level == gpio.LOW then--沒有報警信息
gpio.write (Alert, gpio.HIGH)--關(guān)閉本地聲光報警
end
end)
elseif r.C == "stop" then--關(guān)閉預(yù)警功能
gpio.write (LED, gpio.HIGH)--熄滅預(yù)警指示燈
gpio.write (Alert, gpio.HIGH)--關(guān)閉本地聲光報警
gpio.mode (Pir, gpio.OUTPUT)--設(shè)置熱釋電紅外傳感器連接的IO口為輸出模式,即關(guān)閉其中斷功能
ok, stoped = pcall (cjson.encode, { M = "say", ID = "U000", C = "turn off" })--構(gòu)造回復(fù)信息
cu:send (stoped .. "\n")--發(fā)送回復(fù)信息
end
end
end)
--TCP連接被斷開的回調(diào)函數(shù)及處理
cu:on('disconnection',function()
--Do something here what you want to do
end)