一、前言
本文主要探讨的是怎样快速实现基于物联网技术的共享停车位的联网方案分析。
想要能够快速搭建其方案原型,可选择采用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物联网开发板,可以快速搭建相应的物联网共享停车位解决方案,此方案能够轻松解决,在一些地下停车场等信号不好的情况。