lua 二次开发合宙4G模块
Posted PHP开源社区
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了lua 二次开发合宙4G模块相关的知识,希望对你有一定的参考价值。
二次开发使用的合宙4G模块版本:720H 和 720D
LuatTool 输出日志
log.info()
二次开发:dtu.openluat.com 后台-分組管理-參數配置-任务
①往串口发送数据:sys.publish('NET_RECV_WAIT'..uid, uid, data)
uid:串口1或者串口2
data: lua字符串
②往网络通道发送数据:sys.publish('NET_SENT_RDY_'..uid, data) # UART_RECV_ID 已被替换为 NET_SENT_RDY_
uid:通道1~12(查看dtu.openluat.com 后台-分組管理-參數配置-网络通道参数)
data: lua字符串
数据接收和发送控制:dtu.openluat.com 后台-分組管理-參數配置-数据流模板-接收数据流模板
接收数据流模板:控制GPIO口输出电平数据流模板
- 校验:根据协议校验指令内容。命令字+crc16数据校验
- 设置:根据命令内容,计算控制GPIO时间,设置GPIO输出电平的持续时间
- 准备工作:
- 线程中指执行一次设置。
- 返回:GPIO口没有返回再设置完之后返回数据。如果校验不通过则无需返回
----------------------------- 测试版------------------------
```
function
local str = ...
log.info('接收到服务器的数据:', str)
-- 循环定时输出电平
function ledPwm(c, bl, bd, gap, gi, pinFun)
-- 每组重复c次后停止
for i = 1, c do
pinFun(1)
-- 输出电平一次持续时间
sys.wait(bl)
pinFun(0)
-- 停止输出电平一次持续时间
sys.wait(bd)
-- 一个循环等待时间
sys.wait(gap)
end
-- 每组间隔
sys.wait(gi)
end
-- 指定时长输出电平
function fixPwm(timeMs, pinFun)
pinFun(1)
sys.wait(timeMs)
pinFun(0)
end
-- 创建一个任务线程,在模块最末行调用该函数并注册模块中的任务函数
-- 调用的函数必须先声明后调用。否则报错
sys.taskInit(function()
log.info('taskInit------------------------------------------')
-- 初始化一个 GPIO。比如:网络指示灯:64;RI:56;DTR:77
local pinFun = pins.setup(77, 0)
pinFun(0)
-- 创建循环定时输出电平任务
-- while true do
-- log.info('taskInit-while-----------------------------')
-- ledPwm(5, 100, 100, 500, 3000, pinFun)
-- end
-- 指定时长输出电平
fixPwm(5000, pinFun)
end)
-- 是否自动发送
local autoSend = true
if autoSend then
local uid = 1
local sendPackData = pack.pack('>b6', 0x40, 0x02, 0x01, 0x00, 0xB7, 0x0D)
log.info('自动发送的字符串:', sendPackData)
sys.publish('NET_SENT_RDY_'..uid, sendPackData)
end
return str
end
```
----------------------------- 测试版-end------------------------
----------------------------- 正式版------------------------
```
function
local str = ...
log.info('接收到服务器的数据02:', str)
log.info('接收到服务器的数据长度02:', string.len(str))
-- 下面一句不能添加,否则报错
-- log.info('接收ASCII码,返回对应的控制字符', string.char(str))
log.info('接收控制字符,返回ASCII码', string.byte(str))
local nextpos, cmdid, cmdlen, devnum, ohours, omiu, rm, sig = pack.unpack(str, '>b7')
log.info('接收数据之后解析结果:', nextpos, cmdid, cmdlen, devnum, ohours, omiu, rm, sig)
controlTime = ohours * 3600 + omiu * 60
cryptData = cmdid..cmdlen..devnum..ohours..omiu..rm
cryptCrc16 = crypto.crc16("CCITT-FALSE", cryptData)
if cryptCrc16 != sig then
return
end
local nextpos, cmdid, cmdlen, cmdcnt = pack.unpack(str, '>b3')
log.info('接收数据之后解析结果-cmdcnt:', nextpos, cmdid, cmdlen, cmdcnt)
-- 指定时长输出电平
function fixPwm(timeMs, pinFun)
pinFun(1)
sys.wait(timeMs)
pinFun(0)
end
-- 创建一个任务线程,在模块最末行调用该函数并注册模块中的任务函数
-- 调用的函数必须先声明后调用。否则报错
sys.taskInit(function()
log.info('taskInit------------------------------------------')
-- 初始化一个 GPIO。比如:网络指示灯:64;RI:56;DTR:77
local pinFun = pins.setup(77, 0)
pinFun(0)
-- 指定时长输出电平
fixPwm(controlTime, pinFun)
end)
-- 是否自动发送
local autoSend = true
if autoSend then
local uid = 1
local sendPackData = pack.pack('>b6', 0x40, 0x02, 0x01, 0x00, 0xB7, 0x0D)
log.info('自动发送的字符串:', sendPackData)
sys.publish('NET_SENT_RDY_'..uid, sendPackData)
end
return str
end
```
----------------------------- 正式版-end------------------------
任务
dtu.openluat.com 后台-分組管理-參數配置-任务
通电之后GPIO停止输出电平-任务
以下方案已测试,并未成功,需要修改源码进行二次开发即可!,修改源码后打包成新的固件,以便后续使用
方案1:
function
sys.taskInit(function()
log.info('gpioOutput-taskInit------------------------------------------')
-- 初始化一个 GPIO。比如:网络指示灯:64;RI:56;DTR:77
local pinFun = pins.setup(77, 0)
pinFun(0)
end)
end
方案2:
function
log.info('gpioOutpt------------------------------------------')
sys.wait(10000)
-- 初始化一个 GPIO。比如:网络指示灯:64;RI:56;DTR:77
local pinFun = pins.setup(77, 0)
pinFun(0)
end
方案3:
function
log.info('gpioOutput-01------------------------------------------')
sys.timerStart(function()
log.info('gpioOutput-01------------------------------------------')
-- 初始化一个 GPIO。比如:网络指示灯:64;RI:56;DTR:77
local pinFun = pins.setup(77, 0)
pinFun(0)
end, 20000)
end
岁月峥嵘
不忘初心
平庸懒惰
不求上进
以上是关于lua 二次开发合宙4G模块的主要内容,如果未能解决你的问题,请参考以下文章
合宙新一代物联网开源操作系统LuatOS,开启行业嵌入式开发新生态!