完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
一、前言
本文主要探讨的是怎样快速实现基于物联网技术的共享停车位的联网方案分析。想要能够快速搭建其方案原型,可选择采用shineblink.com推出的Core开发板,该开发板作为专用的物联网开发板,其编程简单且功能强大。 PS:Core 仅用五、六行代码即可实现Wifi/Ble/NB/Lora/ThreadMesh/RFID/Eth/U***/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 = recv_data + 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物联网开发板,可以快速搭建相应的物联网共享停车位解决方案,此方案能够轻松解决,在一些地下停车场等信号不好的情况。 |
|
|
|
只有小组成员才能发言,加入小组>>
3135 浏览 9 评论
2831 浏览 16 评论
3341 浏览 1 评论
8718 浏览 16 评论
3935 浏览 18 评论
9550浏览 3评论
889浏览 3评论
462浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
459浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2181浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-8-21 16:55 , Processed in 1.877171 second(s), Total 80, Slave 61 queries .
Powered by 电子发烧友网
© 2015 www.ws-dc.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号