NodeMCU與貝殼物聯通信實現遠程控制

GitHub地址:
https://github.com/It-Why/NodeMCU/blob/master/%E8%BF%9E%E6%8E%A5%E7%89%A9%E8%81%94%E7%BD%91%E5%B9%B3%E5%8F%B0/beike.lua

--[[
--NodeMCU連接貝殼物聯程序,作者Why,整理時間2017.09.07
--作品說明:NodeMCU連接到貝殼,並可以接受其控制(主要是開關預警功能)。
--打開預警功能後,如果有人體進入熱釋電紅外傳感器的探測範圍會自動向平臺發送預警信息。
--關閉預警後則不會觸發。
--爲了方便解釋和查看,整理時添加了很多註釋和空行等,使用時建議刪除
--]]

--設定與貝殼物聯相關的信息,設備ID、APIKEY、INPUTID、貝殼服務器信息(ip、port)
DEVICEID = "000"
APIKEY = "000000000"
INPUTID = "000"
host = "121.42.180.30"
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)
發佈了49 篇原創文章 · 獲贊 62 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章