一款定位器+web端地图

<项目> 一款定位器+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

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值