定位代码

-- 已验证没问题 定位+呼吸灯+mqtt发送
-- LuaTools需要PROJECT和VERSION这两个信息
PROJECT = "wx_lbs"
VERSION = "1.0.0"
--PRODUCT_KEY = "rj6JZFc50f2nsAXq2CFXc1J9dxbQHgKJ" 这个在这没啥用
-- sys库是标配
_G.sys = require("sys")
--[[特别注意, 使用mqtt库需要下列语句]]
_G.sysplus = require("sysplus")
local lbsLoc = require("lbsLoc")
-- 自动低功耗, 轻休眠模式
-- Air780E支持uart唤醒和网络数据下发唤醒, 但需要断开USB,或者pm.power(pm.USB, false) 但这样也看不到日志了
-- pm.request(pm.LIGHT)

--根据自己的服务器修改以下参数
local mqtt_host = "122.114.225.56"
local mqtt_port = 1883
local mqtt_isssl = false
local client_id = mobile.imei()
local user_name = "admin"
local password = "123456"

local pub_topic = "client_send"
local sub_topic = "service_send"

-- Air780E的AT固件默认会为开机键防抖, 导致部分用户刷机很麻烦
if rtos.bsp() == "EC618" and pm and pm.PWK_MODE then
    pm.power(pm.PWK_MODE, false)
end

-- 设置gpio27为输出模式,初始状态为低电平,返回的led1为控制gpio的函数
led2 = gpio.setup(27,0,gpio.PULLUP)
-- 记录上次的led状态
local last = false
-- 一秒改变一次led2的状态
sys.timerLoopStart(function()
    led2(last and 0 or 1)-- 根据上次状态决定是否亮灯
    log.info("led2",last)
    last = not last--更改状态标志
end,1000)


-- 功能:获取基站对应的经纬度后的回调函数
-- 参数:-- result:number类型,0表示成功,1表示网络环境尚未就绪,2表示连接服务器失败,3表示发送数据失败,4表示接收服务器应答超时,5表示服务器返回查询失败;为0时,后面的5个参数才有意义
        -- lat:string类型,纬度,整数部分3位,小数部分7位,例如031.2425864
        -- lng:string类型,经度,整数部分3位,小数部分7位,例如121.4736522
        -- addr:目前无意义
        -- time:string类型或者nil,服务器返回的时间,6个字节,年月日时分秒,需要转为十六进制读取
            -- 第一个字节:年减去2000,例如2017年,则为0x11
            -- 第二个字节:月,例如7月则为0x07,12月则为0x0C
            -- 第三个字节:日,例如11日则为0x0B
            -- 第四个字节:时,例如18时则为0x12
            -- 第五个字节:分,例如59分则为0x3B
            -- 第六个字节:秒,例如48秒则为0x30
        -- locType:numble类型或者nil,定位类型,0表示基站定位成功,255表示WIFI定位成功
local function getLocCb(result, lat, lng, addr, time, locType)
            log.info("LbsLoc.getLocCb", result, lat, lng)
            -- 获取经纬度成功
            if result == 0 then
                log.info("服务器返回的时间", time:toHex())
                log.info("定位类型,基站定位成功返回0", locType)
            end
            -- 广播给其他需要定位数据的task
            sys.publish("lbsloc_result", result, lat, lng)
end

sys.taskInit(function()


    --log.info("mqtt", "pub", pub_topic)
    --log.info("mqtt", "sub", sub_topic)

    local mqttc = mqtt.create(nil, mqtt_host, mqtt_port, mqtt_isssl, nil)

    mqttc:auth(client_id, user_name, password)
    mqttc:autoreconn(true, 3000)

    mqttc:on(function(mqtt_client, event, data, payload)
        if event == "conack" then
            sys.publish("mqtt_conack")
            mqtt_client:subscribe(sub_topic)
        elseif event == "recv" then
            log.info("mqtt", "received", "topic", data, "payload", payload)
        elseif event == "sent" then
            log.info("mqtt", "sent", "pkgid", data)
        end
    end)

    mqttc:connect()
    sys.waitUntil("mqtt_conack")

    while true do

        local r,result,lat,lng =sys.waitUntil('lbsloc_result', 40000)
        local data = json.encode({action = "lbs",lat=lat,lng=lng,result=result})
        local pkgid = mqttc:publish(pub_topic, data, 1)
        log.info("mqtt", "published", pkgid, pub_topic, data)
    end

    mqttc:disconnect()
    mqttc:close()
    mqttc = nil
end)

sys.taskInit(function()
    sys.waitUntil("IP_READY", 30000)
    while 1 do
        mobile.reqCellInfo(15)
        sys.waitUntil("CELL_INFO_UPDATE", 3000)
        lbsLoc.request(getLocCb)
        sys.wait(30000)
    end
end)


sys.run()