当前手工维护, 待项目完善后, 使用工具自动生成
场景: 每隔5分钟唤醒一次/按键唤醒, 读取gpio状态, 写uart数据, 联网发送数据到服务器, 再次进入低功耗模式
功能所需:
-- 底层相关
sys.run(mode) -- rtos核心机制启动,总是main.lua最后一句
sys.restart(reson) -- 重启
sys.reson() -- 系统的原因(按键开机/定时器唤醒/中断唤醒...)
-- 功耗管理
pm.mode(pm.IDLE) -- 进入指定功耗模式
-- 定时器
timer.start(timer_type, timeout, callback, arg1, ...) -- 启动一个定时器
timer.stop(id) -- 停止一个定时器
-- 流程控制相关
task.wait(timeout) -- 当前协程让出调度权
task.waitUtil(topic, timeout) -- 等待topic发布,或超时
task.publish(topic, arg1, ...) -- 发布topic消息
task.subscribe(topic, func) -- 订阅topic消息
task.start(func, arg1, ...) -- 启动一个协程
-- 低功耗相关
lpmem.write(pos, data) -- 写数据到不掉电内存
lpmen.read(pos, len) -- 从不掉电内读数据
-- GPIO相关
pmu.ldo(zone, mode) -- 设置电压域
gpio.setup(pin, mode, pullup,func) -- 设置GPIO脚的功能
gpio.set(pin, value) -- 设置输出电平
gpio.get(pin, value) -- 获取输入电平
gpio.odr(pin) -- 获取输出电平
-- UART相关
uart.setup(id, bandrate, bit, nor, stop_bit) -- 配置uart
uart.write(id, data) -- 发送数据到UART
uart.read(id, maxLen) -- 读取数据
uart.close(id) -- 关闭uart
uart.on(event, callback) -- uart的事件回调
uart.tnow(id, pin,nor) -- 485控制管脚
-- socket相关
socket.ready() -- 判断是否已经附着到网络
socket.new(mode, cert) -- 新建一个socket, mode可以是tcp/udp等
socket:select(msg_id) -- 等待消息
socket:connect(host, port, timeout) -- 建立连接
socket:send(data, callback) -- 发送数据
socket:recv(timeout, callback) -- 接收数据
socket:read(maxLen) -- 从缓冲区读取数据
socket:write(data) -- 将数据写入缓冲区
socket:close() -- 关闭连接
socket:on(event, callback) -- 各种回调
-- lwm2m 相关
lwm2m.xxx -- 与socket类似
-- coap相关
coap.xxx -- 与socket类似
-- 系统信息
device.imei() -- 设备IMEI
device.sn(val) -- 设备SN, 填入参数就设置sn, 不填就返回sn
device.version() -- 设备版本号
device.muid() -- 设备识别号
-- SIM卡相关
sim.iccid() -- SIM的ICCID
sim.imsi() -- 设备IMSI
-- 网络状态相关
modem.cellInfo() -- 基站信息
modem.csq() -- 信号强度
modem.stat() -- 网络状态
-- 定时发送GPIO1的状态到服务器
local TG = 1
gpio.setup(TG, gpio.INPUT, gpio.PULLUP)
uart.setup(1)
task.taskInit(function()
task.waitUtil("IP_READY", 60000) -- 等待联网,最多60秒
-- 读取设备信息
local imei = device.imei()
local iccid = sim.iccid()
local stat = gpio.get(TG)
local str = imei .. "," .. iccid .. "," .. stat
-- 写入uart
uart.write(1, str .. "\r")
-- 发送到服务器
local u = socket.create("udp", "udplab.openluat.com", 123456)
-- u:connect(30000)
u:send(imei .. "," .. iccid .. "," .. stat)
u:close()
-- 启动定时器, 5分钟后唤醒
timer.start(timer.hw, 5*60*1000)
-- 进入低功耗模式
pm.mode(pm.PM2)
end)
sys.run() -- TODO 反正都写这句,那就干脆去掉?
-- 以下demo代码基于如下场景:
--1. GPIO1为RETIO(深睡眠仍然可以唤醒的io),高电平工作在SLEEP1模式,低电平工作在IDLE模式
--2. 串口1透传udp://udplab.openluat.com:8888
pm.mode(pm.IDLE) -- 功耗管理工作在idle模式
-- gpio1 功耗模式管理
gpio.setup(1, gpio.INPUT, gpio.PULLUP, function(value)
pm.mode(value == 1 and pm.PM1 or pm.IDLE)
end)
uart.setup(1, ...)
uart.on(1, 'recv', function(len)
sys.publish('SEND_REQ', uart.read(1, len))
end)
task.init(function()
while true do
if not socket.ready() then
task.wait('IP_READY')
end
local c = socket.new('udp')
if c:connect('udplab.openluat.com', 8888) then
local loop = true
while loop do
local r, d = c:recv('SEND_REQ')
if r == 'data' then
uart.write(1, d)
elseif r == 'msg' then
for _, v in ipairs(d) do
if not c:send(v) then
loop = false
log.warn('demo', 'socket send error', socket.errorno())
break
end
end
elseif r == 'error' then
loop = false
log.warn('demo', 'socket recv error', socket.errorno())
end
end
else
log.warn('demo', 'socket conn error', socket.errorno())
end
c:close()
end
end)