一、前言
本文主要探討的是怎樣快速實作基于物聯網技術的共享停車位的聯網方案分析,
想要能夠快速搭建其方案原型,可選擇采用shineblink.com推出的Core開發板,該開發板作為專用的物聯網開發板,其編程簡單且功能強大,
PS:Core 僅用五、六行代碼即可實作Wifi/Ble/NB/Lora/ThreadMesh/RFID/Eth/Usb/RS485/RS232通信、以及30多種傳感器/10多種硬體外設/10多種Mcu內設功能,并且這些功能最多可以 5 種隨機組合同時運行,更多關于Core的內容可以在 shineblink.com 上了解,
二、共享車位方案設計思路
此方案采用mesh無線組網技術,Lora無線遠距離強穿透技術,NBIOT無線遠程通信技術,下面解釋為什么會用這三種無線技術,
Mesh網路:每個車位采用Mesh節點組網的方式,因為Mesh節點有成本低,數量大的優點,
Lora星型網路:Lora負責把各個Mesh網路串聯起來,因為Lora通信距離很遠,且穿墻性能優越,適合地下多層停車場的通信布局,
NBIOT通信:NBIOT通信模塊負責和遠程的云端通信,一般整個停車場用一到2個即可,

三、具體程式
一、Mesh組網代碼
--PanID和Channel決定了mesh網路的唯一性
PanID = 0x1234 --16位整型
Channel = 11 --選擇范圍(11~26)
MyRole = "Client" --一個mesh網路里可以有多個client角色
LIB_MeshConfig(MyRole,PanID,Channel) --啟動并加入mesh網路
--client自身的名字"CONTROL0"和server端所提及到的client名字要一致
ClientName = "CONTROL0" --ClientName是Client在網路中被Server所識別的唯一身份ID
LIB_GpioOutputConfig("D8","STANDARD") --LED1
LIB_GpioOutputConfig("D9","STANDARD") --LED2
LIB_GpioWrite("D8",1) --滅
LIB_GpioWrite("D9",1) --滅
--設定按鍵1(占用D0口,低電平有效)
LIB_ButtonConfig("BTN1","D10","L")
net_state = 0
?
--開始大回圈
while(GC(1) == true)
do
--網路狀態led指示
net_state = LIB_MeshClientNetStateQuery()
if net_state == 2 then --client已加入mesh網且找到了server
LIB_GpioWrite("D9",0) --LED2亮
else
LIB_GpioWrite("D9",1) --LED2滅
end
--如果BTN1按鍵短按且client已經加入mesh網并找到了server,就向Server上傳資料
key = LIB_ButtonQuery("BTN1")
if key == 1 and net_state == 2 then
data = {0xA0,0x00,0x00,0x00,0x00,0x00,0x00,0x00}
LIB_MeshClientSendData(ClientName,data)
end
--查詢是否收到來自server下發的8位元組命令,并決議
recv_flag, cmd = LIB_MeshClientRecvCommand()
if recv_flag == 1 and #cmd == 8 then
if cmd[1] == 0x10 then --這里只決議server下發的命令的第一個位元組
LIB_GpioToggle("D8") --LED1亮或滅切換
end
end
end
二、Lora代碼
--本機地址(范圍:0-65535),其他Lora節點如果需要發送訊息給本機必須知道該地址
addr = 100
--通信信道(范圍:410-441MHz),相互通信的Lora節點必須在同一信道
channel = 433
--無線速率(范圍:0.3, 1.2, 4.8, 9.6, 19.2kpbs),速率越低通信質量越高
baudrate = "9.6kpbs"
--發射功率(范圍:11, 14, 17, 20dB),該值越大通信質量越高,但功耗會增加
tx_pwr = "20dB"
?
--設定Lora模塊占用TX0、RX0、Aux接D5引腳,Md0接D6引腳
--Lora通信引數:地址=100,通信信道=433M,無線速率=9.6kbps,發射功率=20dBm
LIB_LoraConfig("UART0","D5","D6",addr,channel,baudrate,tx_pwr)
?
--開始大回圈
while(GC(1) == true)
do
--查詢是否收到資料,如果收到就應答
recv_flag,recv_addr,recv_data = LIB_LoraRecv()
if recv_flag == 1 then
--將收到的資料全部加1作為應答回傳給發送者
for i = 1, #recv_data, 1 do
recv_data[i] = recv_data[i] + 1
end
LIB_LoraSend(recv_addr, recv_data)
end
end
三、NBIOT連接云端代碼
--MQTT服務器地址(適用于ONE NET平臺)
server_addr = "183.230.40.96" --中移物聯網MQTT接入服務ip地址
server_port = 1883
?
--MQTT 連接引數(適用于ONE NET平臺)
mqtt_con_clientID = "TestDevice001"
mqtt_con_username = "353255"
mqtt_con_password = "version=2018-10-31&res=products%2F353255%2Fdevices%2FTestDevice001&et=1893427200&method=md5&sign=%2F5RJwGwytPWvVDB04K7rnw%3D%3D"
?
--MQTT topic相關引數(適用于ONE NET平臺)
mqtt_sub_topic = "$sys/353255/TestDevice001/cmd/request/+"--訂閱用
mqtt_pub_topic = "$sys/353255/TestDevice001/dp/post/json" --發布用
?
--設定m5311 NB模塊占用TX0、RX0、D5、D6引腳,MQTT模式
--KeepAlive周期180秒
LIB_NbMqttM5311Config("UART0","D5","HIGH","D6","HIGH",server_addr,server_port,mqtt_con_clientID,mqtt_con_username,mqtt_con_password,180,mqtt_sub_topic,"QOS0")
?
--配置D9為普通輸出,控制LED2
LIB_GpioOutputConfig("D9","STANDARD")
--使能系統10毫秒定時器開始作業
LIB_10msTimerConfig("ENABLE")
--設定sht3x傳感器占用SCL0和SDA0引腳,以每秒出10個資料的頻率作業,"HIGH"表示最高精度
LIB_Sht3xConfig("IIC0","10","HIGH")
?
--變數初始化
cnt_10ms = 0
cnt1_10ms = 0
pub_id = 0
temprature = 0.00
humidity = 0.00
?
--定義10ms中斷回呼函式
function LIB_10msTimerCallback()
cnt_10ms = cnt_10ms + 1
cnt1_10ms = cnt1_10ms + 1
end
?
--開始大回圈
while(GC(1) == true)
do
sht3x_flag,temp,humi = LIB_Sht3xGetResult()
--如果傳感器有新的溫濕度資料產生
if sht3x_flag == 1 then
temprature = temp
humidity = humi
end
?
--查詢是否收到服務器下發的cmd資料(已訂閱的"$sys/353255/TestDevice001/cmd/request/+")
recv_flag,topic,data = LIB_NbMqttM5311RecvSub()
if recv_flag == 1 then
--根據json路徑"$.LED"決議服務器下發的json文本,并執行LED亮滅操作
Json_Val = LIB_JsonParse(data, "$.LED")
--服務器下發的是"{"LED":0}"
if Json_Val == "0" then
LIB_GpioWrite("D9",1) --LED2滅
--服務器下發的是"{"LED":1}"
elseif Json_Val == "1" then
LIB_GpioWrite("D9",0) --LED2亮
--服務器下發的是"{"LED":2}"
elseif Json_Val == "2" then
LIB_GpioToggle("D9") --LED2亮滅切換
else
LIB_GpioWrite("D9",1) --LED2滅
end
--根據收到的topic中的cmdid應答服務器,
--將收到的topic中"request"替換成"response"后作為應答topic發給服務器
topic = string.gsub(topic,"request","response")
--應答內容可自定義,這里為"Got it!"
LIB_NbMqttM5311SendPub("QOS0", topic, "Got it!")
end
?
--每5秒發送溫濕度度資料給server
if cnt_10ms >= 500 then
cnt_10ms = 0
pub_id = pub_id + 1
json_str = string.format("{\"id\":%d, \"dp\":{\"temperatrue\":[{\"v\": %.2f,}], \"humidity\":[{\"v\":%.2f,}]}}", pub_id, temprature, humidity)
--注意json_str的總長度不要超過150位元組
LIB_NbMqttM5311SendPub("QOS0", mqtt_pub_topic, json_str) --publish
end
--每12秒列印一次NBIOT模組資訊(包含sim卡)
--注意:這里只是為了演示如何獲取模組資訊,實際應用中您可以根據您的需求查詢即可,不需要一直查詢
if cnt1_10ms >= 1200 then --12000ms
cnt1_10ms = 0
State,IMEI,IMSI,ICCID,RSSI = LIB_NbStatusQuery()
print(string.format("module state: %s", State))
print(string.format("module IMEI: %s", IMEI))
print(string.format("module IMSI: %s", IMSI))
print(string.format("module ICCID: %s", ICCID))
print(string.format("module RSSI: %d dBM", RSSI))
end
end
**以上程式為官網部分例程,需要進行相應的改動,
四、結語
通過ShineBllink Core物聯網開發板,可以快速搭建相應的物聯網共享停車位解決方案,此方案能夠輕松解決,在一些地下停車場等信號不好的情況,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/230632.html
標籤:其他
