Air800GPS信息上传Mqtt服务器

Air800GPS信息上传Mqtt服务器

Air800这个模块还是比较熟悉的了,上一次是用它获取了gps信息并上传到了阿里云,这次我自己安装了一个mqttt的服务器,参见EMQ X安装
Air800是上海合宙推出的一款集合GPRS(2G网络)通信和GPS位置获取的一款模块,能够很方便的制作出各种基于定位和2G数据传输的一些应用。具体的说明可以参考Air800S模块
本篇就讲一下,这两个核心功能,如何使用GPRS联网,并将获取的GPS信息通过Mqtt发送到云端。

一、下载必要的文件

合宙公司的各种模块都可以使用lua这个编程语言进行二次开发,极大的降低了二次开发的难度,假设你已经安装好了luatools这个工具,目前常用的是“LuaTool-V2”。必要的文件包括两部分:core文件和lua脚本demo文件,这些东西都可以在老版的合宙官网中Air800 M4模块区中找到。
image.png

二、创建vscode项目

这里我们使用到了两个功能:mqtt和gps,所以使用vscode打开这两个文件夹
image.png
image.png
这里我们使用gps Demo中的v2版本,mqtt Demo中的sendInterruptRecv版本,之后创建一个新的文件夹,在其中创建main.lua和gpsmqtt.lua这两个文件,截图中其他文件可以不用管。
image.png

三、修改代码

复制gps Demo v2版本中的main.lua内容到新建的main.lua中

--必须在这个位置定义PROJECT和VERSION变量
--PROJECT:ascii string类型,可以随便定义,只要不使用,就行
--VERSION:ascii string类型,如果使用Luat物联云平台固件升级的功能,必须按照"X.X.X"定义,X表示1位数字;否则可随便定义
PROJECT = "GPSV2"
VERSION = "2.0.0"
PRODUCT_KEY = "dfhsdhsdgjsgdhsgh"

--加载日志功能模块,并且设置日志输出等级
--如果关闭调用log模块接口输出的日志,等级设置为log.LOG_SILENT即可
require "log"
LOG_LEVEL = log.LOGLEVEL_TRACE
--[[
如果使用UART输出日志,打开这行注释的代码"--log.openTrace(true,1,115200)"即可,根据自己的需求修改此接口的参数
如果要彻底关闭脚本中的输出日志(包括调用log模块接口和Lua标准print接口输出的日志),执行log.openTrace(false,第二个参数跟调用openTrace接口打开日志的第二个参数相同),例如:
1、没有调用过sys.opntrace配置日志输出端口或者最后一次是调用log.openTrace(true,nil,921600)配置日志输出端口,此时要关闭输出日志,直接调用log.openTrace(false)即可
2、最后一次是调用log.openTrace(true,1,115200)配置日志输出端口,此时要关闭输出日志,直接调用log.openTrace(false,1)即可
]]
--log.openTrace(true,1,115200)

require "sys"

require "net"
--每1分钟查询一次GSM信号强度
--每1分钟查询一次基站信息
net.startQueryAll(60000, 60000)

--加载控制台调试功能模块(此处代码配置的是uart1,波特率115200)
--此功能模块不是必须的,根据项目需求决定是否加载
--使用时注意:控制台使用的uart不要和其他功能使用的uart冲突
--使用说明参考demo/console下的《console功能使用说明.docx》
--require "console"
--console.setup(1, 115200)

--加载硬件看门狗功能模块
--根据自己的硬件配置决定:1、是否加载此功能模块;2、配置Luat模块复位单片机引脚和互相喂狗引脚
--合宙官方出售的Air201开发板上有硬件看门狗,所以使用官方Air201开发板时,必须加载此功能模块
---[[
require "wdt"
wdt.setup(pio.P0_30, pio.P0_31)
--]]

--加载网络指示灯功能模块
--根据自己的项目需求和硬件配置决定:1、是否加载此功能模块;2、配置指示灯引脚
--合宙官方出售的Air800和Air801开发板上的指示灯引脚为pio.P0_28,其他开发板上的指示灯引脚为pio.P1_1
--require "netLed"
--netLed.setup(true,pio.P1_1)
--网络指示灯功能模块中,默认配置了各种工作状态下指示灯的闪烁规律,参考netLed.lua中ledBlinkTime配置的默认值
--如果默认值满足不了需求,此处调用netLed.updateBlinkTime去配置闪烁时长

--加载错误日志管理功能模块【强烈建议打开此功能】
--如下2行代码,只是简单的演示如何使用errDump功能,详情参考errDump的api
require "errDump"
errDump.request("udp://ota.airm2m.com:9072")

--加载远程升级功能模块【强烈建议打开此功能】
--如下3行代码,只是简单的演示如何使用update功能,详情参考update的api以及demo/update
--PRODUCT_KEY = "v32xEAKsGTIEQxtqgwCldp5aPlcnPs3K"
--require "update"
--update.request()

--加载GPS功能测试模块
require "testGps"

--启动系统框架
sys.init(0, 0)
sys.run()

  1. 复制testGps.lua和testMqtt.lua两个文件到新建的gpsmqtt.lua文件中,然后改改
module(...,package.seeall)

require "mqtt"
require "gpsv2"

--改成你的mqtt服务器
local host, port = "xxxx", 1883

-- 代码复制过来以后,这里应该有两个taskInit
-- 这里插一句,合宙基于luat搞了个luatOS,给力
-- 这里这个task就是gps的task
sys.taskInit(function(...)
    -- 在这里打开gps
    gpsv2.open(2, 115200, 2, 5)
    while true do
      -- 这句的意思是判断下gps是否定位成功,但是我是室内测试的,gps信息获取不到的
      --所以注释掉了,BTW,本来就是我加的
      -- if gpsv2.isFix() then
      			-- 获取整型的经纬度信息,即使gps定位是失败的,也是可以获取到的,还有agps呀
            local lat, lng = gpsv2.getIntLocation()
            local alti = gpsv2.getAltitude()
      			-- data是当时搞阿里云时拼的字符串,这次直接复制过来了
      			-- 说起来,luat现在可以搞json了,不需要用这种方法拼字符串了
            local data = "{\"params\":{\"GeoLocation\":{\"CoordinateSystem\":1,\"Latitude\":"
                        ..lat
                        ..",\"Longitude\":"
                        ..lng
                        ..",\"Altitude\":"
                        ..alti.."}}}"
            log.info("testGps isFix:", gpsv2.isFix())
            log.info("testGps lng,lat:", gpsv2.getIntLocation())
            log.info("testGps message:", gpsv2.getAltitude(), gpsv2.getSpeed(),
                gpsv2.getAzimuth(), gpsv2.getUsedSateCnt(), gpsv2.getViewedSateCnt())
        		-- 这里牛逼了,在luat内部我理解是实现了一个消息池
      			-- 可以将消息直接发送到这里,下边mqtt读取时,不仅可以在mqtt服务器获取消息,
      			-- 还可以读取这里的消息
            sys.publish("pub_msg", data)
        -- end
      	-- 延时3s,也就是3s输出一次gps定位信息
        sys.wait(3000)
    end
end)



-- 测试MQTT的任务代码
sys.taskInit(function()
    -- 创建mqtt客户端
    local mqttc = mqtt.client(misc.getImei(), 300, "user", "password")    
    while true do
      	-- 如果socket没准备好就等着,如果服务器没链接上就等着
        while not socket.isReady() do sys.wait(1000) end
        while not mqttc:connect(host, port) do sys.wait(2000) end
      	-- 订阅一个主题试试
        mqttc:subscribe(string.format("/device/%s/req", misc.getImei()))
        while true do
        		-- 如果r为True则收到了服务器下发的消息,也就是正常的mqtt流程
            local r, data, param = mqttc:receive(5000, "pub_msg")
            if r then
                log.info("这是收到了服务器下发的消息:", data.payload or "nil")
          	-- 如果r为False,也就是没有收到消息,但是如果data的值是“pub_msg”
            -- 这里需要注意了,这个pub_msg可不是瞎写的,而是从上而下都是这个关键词
            -- 如果data 是pub_msg,那么就说明是消息池中的内容,此时param是上边
          	-- sys.publish的内容
            elseif data == "pub_msg" then
                log.info("这是收到了订阅的消息和参数显示:", data, param)
          			-- 将收到的消息发布到指定的主题,也就是发送到了mqtt的服务器上去了
                mqttc:publish(string.format("/device/%s/resp", "air800"), param)
            -- 超时,没啥好说的
            elseif data == "timeout" then
                log.info("这是等待超时主动上报数据的显示!")
                mqttc:publish(string.format("/device/%s/report","air800"), "test publish " .. os.time())
            else
                break
            end
        end
    end
    mqttc:disconnect()
end)
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值