Air780EG
HTTP+MQTT
-- LuaTools需要PROJECT和VERSION这两个信息
PROJECT = "httpdemo"
VERSION = "1.0.0"
-- sys库是标配
_G.sys = require("sys")
--[[特别注意, 使用mqtt库需要下列语句]]
_G.sysplus = require("sysplus")
-- Air780E的AT固件默认会为开机键防抖, 导致部分用户刷机很麻烦
if rtos.bsp() == "EC618" and pm and pm.PWK_MODE then
pm.power(pm.PWK_MODE, false)
end
-- MQTT联网函数
--根据自己的服务器修改以下参数
local mqtt_host = "43.143.210.180"
local mqtt_port = 1883
local mqtt_isssl = false
local client_id = "abc"
local user_name = "gps"
local password = "abc123456"
local pub_topic = "/luatos/pub/" .. (mcu.unique_id():toHex())
local sub_topic = "/luatos/sub/" .. (mcu.unique_id():toHex())
local topic2 = "/luatos/2"
local topic3 = "/luatos/3"
local mqttc = nil
sys.taskInit(function()
-----------------------------
-- 统一联网函数, 可自行删减
----------------------------
if mobile then
-- Air780E/Air600E系列
--mobile.simid(2)
-- LED = gpio.setup(27, 0, gpio.PULLUP)
device_id = mobile.imei()
log.info("ipv6", mobile.ipv6(true))
sys.waitUntil("IP_READY", 30000)
elseif http then
sys.waitUntil("IP_READY")
else
while 1 do
sys.wait(1000)
log.info("http", "当前固件未包含http库")
end
end
log.info("已联网")
sys.publish("net_ready")
end)
function demo_http_get()
-- 最普通的Http GET请求
-- local code, headers, body = http.request("GET", "http://39.105.201.171/HZ/get.php?IMEI=123456").wait()
-- log.info("http.get", code, headers, body)
-- 临时测试接口返回:{"time":10}
local code, headers, body = http.request("GET", "http://39.105.201.171/HZ/get.php?IMEI=123456").wait()
log.info(body)
-- 按需打印
-- code 响应值, 若大于等于 100 为服务器响应, 小于的均为错误代码
-- headers是个table, 一般作为调试数据存在
-- body是字符串. 注意lua的字符串是带长度的byte[]/char*, 是可以包含不可见字符的
-- log.info("http", code, json.encode(headers or {}), #body > 512 and #body or body)
end
-- local function http_download_callback(content_len,body_len,userdata)
-- print("http_download_callback",content_len,body_len,userdata)
-- end
-- local http_userdata = "123456789"
sys.taskInit(function()
sys.wait(100)
-- 打印一下支持的加密套件, 通常来说, 固件已包含常见的99%的加密套件
-- if crypto.cipher_suites then
-- log.info("cipher", "suites", json.encode(crypto.cipher_suites()))
-- end
-------------------------------------
-------- HTTP 演示代码 --------------
-------------------------------------
sys.waitUntil("net_ready") -- 等联网
while 1 do
-- 演示GET请求
demo_http_get()
-- 表单提交
-- demo_http_post_form()
-- POST一个json字符串
-- demo_http_post_json()
-- 上传文件, mulitform形式
-- demo_http_post_file()
-- 文件下载
-- demo_http_download()
-- gzip压缩的响应, 以和风天气为例
-- demo_http_get_gzip()
sys.wait(50000)
-- 打印一下内存状态
-- log.info("sys", rtos.meminfo("sys"))
-- log.info("lua", rtos.meminfo("lua"))
-- sys.wait(600000)
end
end)
sys.taskInit(function()
-- 等待联网
local ret, device_id = sys.waitUntil("net_ready")
-- 下面的是mqtt的参数均可自行修改
client_id = "abc"
pub_topic = "/luatos/pub/" .. "abc"
sub_topic = "/luatos/sub/" .. "abc"
-- 打印一下上报(pub)和下发(sub)的topic名称
-- 上报: 设备 ---> 服务器
-- 下发: 设备 <--- 服务器
-- 可使用mqtt.x等客户端进行调试
log.info("mqtt", "pub", pub_topic)
log.info("mqtt", "sub", sub_topic)
-- 打印一下支持的加密套件, 通常来说, 固件已包含常见的99%的加密套件
-- if crypto.cipher_suites then
-- log.info("cipher", "suites", json.encode(crypto.cipher_suites()))
-- end
if mqtt == nil then
while 1 do
sys.wait(1000)
log.info("bsp", "本bsp未适配mqtt库, 请查证")
end
end
-------------------------------------
-------- MQTT 演示代码 --------------
-------------------------------------
mqttc = mqtt.create(nil, mqtt_host, mqtt_port, mqtt_isssl, ca_file)
mqttc:auth(client_id,user_name,password) -- client_id必填,其余选填
-- mqttc:keepalive(240) -- 默认值240s
mqttc:autoreconn(true, 3000) -- 自动重连机制
mqttc:on(function(mqtt_client, event, data, payload)
-- 用户自定义代码
log.info("mqtt", "event", event, mqtt_client, data, payload)
if event == "conack" then
-- 联上了
sys.publish("mqtt_conack")
mqtt_client:subscribe(sub_topic)--单主题订阅
-- mqtt_client:subscribe({[topic1]=1,[topic2]=1,[topic3]=1})--多主题订阅
elseif event == "recv" then
log.info("mqtt", "downlink", "topic", data, "payload", payload)
sys.publish("mqtt_payload", data, payload)
elseif event == "sent" then
-- log.info("mqtt", "sent", "pkgid", data)
-- elseif event == "disconnect" then
-- 非自动重连时,按需重启mqttc
-- mqtt_client:connect()
end
end)
-- mqttc自动处理重连, 除非自行关闭
mqttc:connect()
sys.waitUntil("mqtt_conack")
while true do
-- 演示等待其他task发送过来的上报信息
local ret, topic, data, qos = sys.waitUntil("mqtt_pub", 300000)
if ret then
-- 提供关闭本while循环的途径, 不需要可以注释掉
if topic == "close" then break end
mqttc:publish(topic, data, qos)
end
-- 如果没有其他task上报, 可以写个空等待
--sys.wait(60000000)
end
mqttc:close()
mqttc = nil
end)
-- 这里演示在另一个task里上报数据, 会定时上报数据,不需要就注释掉
sys.taskInit(function()
sys.wait(1000)
local data = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA123,"
local qos = 1 -- QOS0不带puback, QOS1是带puback的
while true do
sys.wait(3000)
if mqttc and mqttc:ready() then
local pkgid = mqttc:publish(pub_topic, data .. os.date(), qos)
-- local pkgid = mqttc:publish(topic2, data, qos)
-- local pkgid = mqttc:publish(topic3, data, qos)
end
end
end)
-- 用户代码已结束---------------------------------------------
-- 结尾总是这一句
sys.run()
-- sys.run()之后后面不要加任何语句!!!!!