X-MagicBox-820的luatOS之路连载系列4
上次说到定位成功后,显示的数据准确性问题。专门查询了下我所在地区的经纬度信息。
MagicBox的显示数据是这样的:

网络上查到的经纬度数据是这样的:

可以看出定位精度还可以,毕竟我这个查询的数据没有具体到所在的小区。其他的卫星数据暂时不计较。接下来是要将经纬度信息通过MQTT发布到服务器,供其他客户端来订阅。
首先要提一点就是MQTT协议虽然是所谓的发布/订阅模式的轻量级通信协议,但依然是建立在TCP/IP之上的。使用它的意义在于低开销,低带宽占用。对于老王这个经纬度数据来说再合适不过了。网络上的一张图很好的说明了它的拓扑:

明白了以上内容,那么我们将MagicBox820作为一个客户端,发布消息到服务器,PC上的处理软件作为另一个客户端从服务器订阅820发布的主题,就实现了一条通路。这就是一个小的物联网实例。

通常情况下需要搭建一个MQTT服务器(Broker),或是租用一些商业的平台,当然也是有开源的软件可以选择的。老王这里偷了个懒,先用通信猫的小工具调试。
忍不住再夸一下LuatOS的API,也得益于Lua语言的便捷,MQTT发布主题的代码可以简单到下面这样:
sys.taskInit(function() while true do while not socket.isReady() do sys.wait(1000) end local mqttc = mqtt.client(misc.getImei(), 300, "", "") while not mqttc:connect(host, port) do sys.wait(2000) end while true do --mqttc:publish("/820msg", "test publish" .. os.time()) mqttc:publish("/820msg", "test publish") sys.wait(10000) end end end)
结合工具测试代码运行正常:

通信没有问题了,自然是将MQTT的消息负载替换为经纬数据了。在该任务所在的文件中,引入中科微GPS模块,重新定义本文件中使用GPS变量,代码如下:
require "agpsZkw" local mqtt_gps = require"gpsZkw" module(..., package.seeall) -- 这里请填写修改为自己的IP和端口 --local host, port = "lbsmqtt.airm2m.com", 1884 local host, port = "mq.tongxinmao.com", 18830 -- 测试MQTT的任务代码 sys.taskInit(function() while true do while not socket.isReady() do sys.wait(1000) end local mqttc = mqtt.client(misc.getImei(), 300, "", "") while not mqttc:connect(host, port) do sys.wait(2000) end while true do --mqttc:publish("/820msg", "test publish") mqttc:publish("/820msg", mqtt_gps.getLocation().lngType..mqtt_gps.getLocation().lng..","..mqtt_gps.getLocation().latType..mqtt_gps.getLocation().lat) sys.wait(10000) end end end)
代码是每10秒钟发布一条消息到服务器,通信猫小工具以客户端身份订阅同一服务器的820主题。因为测试,老王又需要拿着Box板卡伸手到窗外去搜星,高处不胜寒,冷风也特别猖狂。不过看到结果符合预期,心里还是美滋滋的。

老王顺手也把屏幕显示给改了下

给自己安排下,接下来将经纬度信息展示到地图上。同时在这个过程使用Qt的WebEngineView模块。

浙公网安备 33010602011771号