<项目> 一款定位器+web端地图
前言
这是自己做的第一个定位器,只走通了整个流程,细节和稳定性还待完善,但那都是后话了。(等后面有空了画一个专门的定位板)硬件用的合宙公司的Air800开发板,程序用的合宙的脚本语言lua。上层软件端用的开源的物联网平台Thingsboard。
Drawn By:67373UPUP
软件部分
thingsboard配置
1.1添加设备
添加成功后记住以下token,后面硬件程序方面要用。
1.2使用mqttfx模拟硬件发数据
{"longitude":113.535912,"latitude":34.817169}
模拟数据如上,Thingsboard接受的数据是json格式,所以需要封装为json包发送出去。发送成功后在Thingsboard的最新遥测里面看看有没有数据,如果有那就表示成功了。如下图所示。
1.3添加仪表板
添加仪表板后,再添加新的部件。部件包选择Maps,地图选择Tencent。接下来如下图所示添加别名和设备类型。
设备时间序列将longitude和latitude添加上去。如下图所示。
最后保存即可。
硬件部分
硬件采用的是Air800开发板
嵌入式部分
require "mqtt"
require "gpsv2"
module(..., package.seeall)
-- 这里请填写修改为自己的IP和端口
local host, port = "47.98.183.97", 1883
--[[
TCP协议发送数据时,数据发送出去之后,必须等到服务器返回TCP ACK包,才认为数据发送成功,在网络较差的情况下,这种ACK确认就会导致发送过程很慢。
从而导致用户程序后续的AT处理逻辑一直处于等待状态。例如执行AT+CIPSEND动作发送一包数据后,接下来要执行AT+QTTS播放TTS,但是CIPSEND一直等了1分钟才返回SEND OK,
这时AT+QTTS就会一直等待1分钟,可能不是程序中想看到的。
此时就可以设置为快发模式,AT+CIPSEND可以立即返回一个结果,此结果表示“数据是否被缓冲区所保存”,从而不影响后续其他AT指令的及时执行
AT版本可以通过AT+CIPQSEND指令、Luat版本可以通过socket.setSendMode接口设置发送模式为快发或者慢发
快发模式下,在core中有一个1460*7=10220字节的缓冲区,要发送的数据首先存储到此缓冲区,然后在core中自动循环发送。
如果此缓冲区已满,则AT+CIPSEND会直接返回ERROR,socket:send接口也会直接返回失败
同时满足如下几种条件,适合使用快发模式:
1. 发送的数据量小,并且发送频率低,数据发送速度远远不会超过core中的10220字节大小;
没有精确地判断标准,可以简单的按照3分钟不超过10220字节来判断;曾经有一个不适合快发模式的例子如下:
用户使用Luat版本的http上传一个几十K的文件,设置了快发模式,导致一直发送失败,因为循环的向core中的缓冲区插入数据,
插入数据的速度远远超过发送数据到服务器的速度,所以很快就导致缓冲区慢,再插入数据时,就直接返回失败
2. 对每次发送的数据,不需要确认发送结果
3. 数据发送功能不能影响其他功能的及时响应
]]
--socket.setSendMode(1)
-- 测试MQTT的任务代码
sys.taskInit(function()
local longitude , latitude , lng , ltu = 0 , 0 , 0 , 0
while not socket.isReady() do sys.wait(1000) end
local mqttc = mqtt.client("chenyifaer", 300, "chenyifaer", "password")
while not mqttc:connect(host, port) do sys.wait(2000) end
--mqttc:publish("v1/devices/me/telemetry", "test" .. os.time())
log.info("GPS is ready\r\n")
gpsv2.open(2, 115200, 2, 5)
log.info("GPS is enable\r\n")
while true do
log.info("testGps lng,lat:", gpsv2.getIntLocation())
longitude , latitude = gpsv2.getIntLocation()
lng = (string.format("%.7f",longitude/(10^7)))
ltu = (string.format("%.7f",latitude/(10^7)))
--mqttc:publish("v1/devices/me/telemetry", string.format("%.7f",longitude/(10^7)) .. string.format("%.7f",latitude/(10^7)))
mqttc:publish("v1/devices/me/telemetry", string.format("{\"longitude\":%s,\"latitude\":%s}",lng,ltu))
--mqttc:publish("v1/devices/me/telemetry",lng..ltu)
sys.wait(10000)
end
end)
平台效果展示
注意事项
1,经纬度是带小数点的,因此固件需要刷支持float浮点运算的版本。
2,thingsboard平台识别设备是用username,因此硬件连接mqtt的user要和thingsboard平台的token一样。如下所示。chenyifaer就是平台的token也是也是mqtt的username。
local mqttc = mqtt.client("chenyifaer", 300, "chenyifaer", "password")
3,硬件连接thingsboard是不能发送非json以外格式的数据,不然mqtt连接会被平台踢掉。例如我做这个项目的时候连上mqtt发送一条非json格式的测试包。一直会被平台踢掉,后来把这条命令注释掉就行了。就是下面这条。
--mqttc:publish("v1/devices/me/telemetry", "test" .. os.time())
4,thingsboard默认的mqtt的topic是:v1/devices/me/telemetry
参考资料
工程资料:https://gitee.com/linggan17/location.git