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