init: Air780EPM 官方 LuatOS 项目代码基线
- 来源: 合宙 LuatOS 官方仓库 air780epm 模块完整代码 - 路径: luatos/air780epm/module/Air780EPM/demo 含官方 demo(含 mqtt/mqtts/socket/uart 等) - 后续: 基于 demo 开发 UART<->MQTT 数据上报功能
This commit is contained in:
@@ -0,0 +1,159 @@
|
||||
--[[
|
||||
@module prj_0_1
|
||||
@summary 常规模式(WORKMODE 0)和低功耗模式(WORKMODE 1)切换,应用项目主调度功能模块
|
||||
@version 1.0
|
||||
@date 2026.02.12
|
||||
@author 马梦阳
|
||||
@usage
|
||||
本文件为常规模式(WORKMODE 0)和低功耗模式(WORKMODE 1)切换,应用项目主调度功能模块,核心业务逻辑为:
|
||||
1、自动的在常规模式(WORKMODE 0)和低功耗模式(WORKMODE 1)之间切换,演示GPIO以及AGPIO输出电平的特性
|
||||
2、显式的在常规模式(WORKMODE 0)和低功耗模式(WORKMODE 1)之间切换,演示GPIO以及AGPIO输出电平的特性
|
||||
|
||||
|
||||
Air780EGP/EGG模组内部包含有GNSS和Gsensor,Air780EGH模组内部只包含有GNSS,不包含Gsensor;
|
||||
GPIO23作为GNSS备电电源开关和Gsensor电源开关,默认状态下为高电平;
|
||||
在低功耗模式和PSM+模式下,GNSS备电开启和Gsensor开启后,二者的功耗总和表现为30uA左右,客户应根据实际需求进行配置;
|
||||
在常规模式和低功耗模式示例代码中,并未对GPIO23进行额外配置,默认状态下为高电平,以此演示常规模式和低功耗模式下的实际功耗表现;
|
||||
|
||||
|
||||
使用Air780EXX系列每个模组的核心板,烧录运行此demo,在vbat供电3.8v状态下,分为以下两种独立的场景来介绍一下功耗情况:
|
||||
|
||||
1、插sim卡,上电开机之后,大约21秒后(包含20秒延时),成功进入低功耗状态;
|
||||
初始化阶段(常规模式,持续20秒),平均电流51mA;(此数据仅供参考,测试网络环境不同,持续时长以及平均电流都会不同,但是差异应该不是特别大才对)
|
||||
低功耗阶段(因为有网络寻呼,所以是低功耗模式+常规模式自动切换,持续40秒),平均电流2.6mA左右(1.7mA到2.7mA左右都属于正常值,和天线性能以及网络环境有关系,以自己的实际硬件+实际网络环境测试数据为准,但是差异应该不是特别大才对)
|
||||
第二次常规模式(持续20秒),平均电流31mA;(此数据仅供参考,测试网络环境不同,持续时长以及平均电流都会不同,但是差异应该不是特别大才对)
|
||||
第二次低功耗阶段(因为有网络寻呼,所以是低功耗模式+常规模式自动切换),平均电流2.2mA左右(1.7mA到2.3mA左右都属于正常值,和天线性能以及网络环境有关系,以自己的实际硬件+实际网络环境测试数据为准,但是差异应该不是特别大才对)
|
||||
|
||||
2、不插sim卡,上电开机之后,大约21秒后(包含20秒延时),成功进入低功耗状态;
|
||||
初始化阶段(常规模式,持续20秒),平均电流28mA;(此数据仅供参考,测试网络环境不同,持续时长以及平均电流都会不同,但是差异应该不是特别大才对)
|
||||
低功耗阶段(因为有网络寻呼,所以是低功耗模式+常规模式自动切换,持续40秒),平均电流133uA左右(110uA到150uA左右都属于正常值)
|
||||
第二次常规模式(持续20秒),平均电流29mA;(此数据仅供参考,测试网络环境不同,持续时长以及平均电流都会不同,但是差异应该不是特别大才对)
|
||||
第二次低功耗阶段(因为有网络寻呼,所以是低功耗模式+常规模式自动切换),平均电流35uA左右(30uA到60uA左右都属于正常值)
|
||||
|
||||
|
||||
本文件和其他功能模块的通信接口有以下2个:
|
||||
1、sys.publish("DRV_SET_LOWPOWER"):发布消息"DRV_SET_LOWPOWER",通知drv_lowpower驱动模块配置最低功耗模式为低功耗模式
|
||||
2、sys.publish("DRV_SET_NORMAL"):发布消息"DRV_SET_NORMAL",通知drv_normal驱动模块配置最低功耗模式为常规模式
|
||||
]]
|
||||
|
||||
|
||||
require "drv_lowpower"
|
||||
require "drv_normal"
|
||||
|
||||
|
||||
-- GPIO1为普通GPIO;
|
||||
-- 在常规模式下,可以正常工作
|
||||
-- 在低功耗模式下掉电,无法正常工作
|
||||
-- 此引脚对应Air780EXX系列每个模组的核心板上的丝印为22/GPIO1
|
||||
local GPIO_ID = 1
|
||||
|
||||
-- GPIO24为AGPIO;
|
||||
-- 在常规模式下可以做为输出,输入或者终端,正常使用
|
||||
-- 在低功耗模式下仅可以保持电平输出
|
||||
-- 此引脚对应Air780EXX系列每个模组的核心板上的丝印为20/GPIO24
|
||||
local AGPIO_ID = 24
|
||||
|
||||
-- 常规模式(WORKMODE 0)和低功耗模式(WORKMODE 1)切换任务
|
||||
-- 通过演示一个普通GPIO和一个AGPIO的输出电平状态
|
||||
-- 来简单理解常规模式(WORKMODE 0)和低功耗模式(WORKMODE 1)的两种功耗模式特性以及自动切换和显式切换的区别
|
||||
local function normal_lowpower_switch_task()
|
||||
log.info("normal_lowpower_switch_task enter")
|
||||
|
||||
local i
|
||||
-- 此处循环20秒,每1秒翻转1次GPIO_ID和AGPIO_ID的输出电平
|
||||
-- 因为没有主动设置过功耗模式,所以这20秒内一定是工作在常规模式,GPIO和AGPIO可以正常输出高低电平
|
||||
for i=1,20 do
|
||||
gpio.setup(GPIO_ID, i%2)
|
||||
gpio.setup(AGPIO_ID, i%2)
|
||||
sys.wait(1000)
|
||||
end
|
||||
|
||||
-- 显式配置最低功耗模式为低功耗模式
|
||||
-- 执行此行代码后,会通过异步消息"DRV_SET_LOWPOWER"通知drv_lowpower功能模块配置低功耗模式
|
||||
-- 所以执行此行代码后,并不会马上进入低功耗模式
|
||||
-- 而是等待sys.run()在分发处理到"DRV_SET_LOWPOWER"消息时,drv_lowpower功能模块才去配置低功耗模式
|
||||
-- 即使运行到了drv_lowpower功能模块,也不一定马上进入低功耗模式,只有配置过低功耗模式,并且当前内核固件和脚本没有task处于运行状态,才能进入真正进入低功耗
|
||||
sys.publish("DRV_SET_LOWPOWER")
|
||||
-- 执行此代码时,处于常规模式
|
||||
log.info("normal_lowpower_switch_task after publish DRV_SET_LOWPOWER")
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
-- 执行此代码时,处于常规模式
|
||||
log.info("normal_lowpower_switch_task auto switch during gpio business")
|
||||
|
||||
-- 此处循环20秒,每1秒翻转1次GPIO_ID输出电平
|
||||
-- 第一次循环:
|
||||
-- 执行gpio.setup(GPIO_ID, i%2)时,因为此task处于运行状态,所以系统仍然处于常规模式,所以这个时刻可以正常输出高电平
|
||||
-- 但是在执行sys.wait(1000)时,此task会处于阻塞状态,此时如果不考虑系统中其他运行的任务影响,系统就会立即自动进入到低功耗模式
|
||||
-- 虽然刚才设置了GPIO_ID输出高电平,但是此时处于低功耗模式下,此GPIO_ID掉电,所以输出的高电平立刻消失
|
||||
-- 如果使用示波器来抓波形的话,会看到一个时间非常短的高脉冲(可能是微秒级、毫秒级的时长),并不会像代码设计的一样持续1秒钟
|
||||
-- 第二次循环:
|
||||
-- 执行gpio.setup(GPIO_ID, i%2)时,因为此任务切换为运行状态,所以低功耗模式自动切换为常规模式,所以这个时刻可以正常输出低电平
|
||||
-- 但是在执行sys.wait(1000)时,此task会处于阻塞状态,此时如果不考虑系统中其他运行的任务影响,系统就会立即自动进入到低功耗模式
|
||||
-- 虽然刚才设置了GPIO_ID输出低电平,但是此时处于低功耗模式下,此GPIO_ID掉电,所以仍然是低电平,因为本来就是输出低电平,所以看不出来异常
|
||||
-- 接下来的循环过程、功耗模式的自动切换逻辑、电平逻辑和第一次循环以及第二次循环的过程完全一致,系统不断的在低功耗模式和常规模式自动切换,呈现出一个低功耗模式持续时间长、常规模式持续时间短的特点
|
||||
for i=1,20 do
|
||||
gpio.setup(GPIO_ID, i%2)
|
||||
sys.wait(1000)
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
-- 执行此代码时,处于常规模式(因为此task处于运行状态,会将系统自动切换为常规模式)
|
||||
log.info("normal_lowpower_switch_task auto switch during agpio business")
|
||||
|
||||
-- 此处循环20秒,每1秒翻转1次AGPIO_ID输出电平
|
||||
-- 和普通的GPIO相比,AGPIO的特点是,在低功耗模式下供电正常,可以保持电平输出
|
||||
-- 虽然此处循环20次,系统也会在常规模式和低功耗模式之间自动切换,但是无论哪一种模式,此AGPIO_ID都能正常工作
|
||||
-- 所以在此处,AGPIO_ID输出电平的逻辑和持续时长完全正确,1秒输出高电平,1秒输出低电平
|
||||
for i=1,20 do
|
||||
gpio.setup(AGPIO_ID, i%2)
|
||||
sys.wait(1000)
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
-- 显式配置最低功耗模式为常规模式
|
||||
-- 执行此代码时,处于常规模式(因为此task处于运行状态,会将系统自动切换为常规模式)
|
||||
-- 执行此行代码后,会通过异步消息"DRV_SET_NORMAL"通知drv_normal功能模块配置常规模式
|
||||
-- 等待sys.run()在分发处理到"DRV_SET_NORMAL"消息时,drv_normal功能模块才去配置常规模式
|
||||
sys.publish("DRV_SET_NORMAL")
|
||||
|
||||
-- 执行此代码时,处于常规模式(因为此task处于运行状态,会将系统自动切换为常规模式)
|
||||
log.info("normal_lowpower_switch_task auto switch during gpio business")
|
||||
|
||||
-- 此处循环20秒,每1秒翻转1次GPIO_ID输出电平
|
||||
-- 第一次循环:
|
||||
-- 执行gpio.setup(GPIO_ID, i%2)时,因为此task处于运行状态,所以系统仍然处于常规模式,所以这个时刻可以正常输出高电平
|
||||
-- 在执行sys.wait(1000)时,此task会处于阻塞状态,但是此时系统并不会自动进入低功耗模式,因为刚才的"DRV_SET_NORMAL"消息还在sys.run()中等待处理
|
||||
-- 所以说,虽然此时,本task处于阻塞状态,但是sys.run()中还在运行处理其他消息,具体到本demo,就是在drv_normal中处理"DRV_SET_NORMAL"消息,显式的配置最低功耗模式为常规模式
|
||||
-- 经过显式配置之后,系统就会一直处于常规模式;所以此处的sys.wait(1000)期间,就会进入到显式常规模式中,就可以一直持续1秒钟输出高电平
|
||||
-- 第二次循环:
|
||||
-- 此时已经显式的处于常规模式,所以工作完全正常
|
||||
-- 接下来的循环过程中都处于显式的常规模式中,所以工作完全正常
|
||||
for i=1,20 do
|
||||
gpio.setup(GPIO_ID, i%2)
|
||||
sys.wait(1000)
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
-- 显式配置最低功耗模式为低功耗模式
|
||||
-- 执行此行代码后,会通过异步消息"DRV_SET_LOWPOWER"通知drv_lowpower功能模块配置低功耗模式
|
||||
-- 所以执行此行代码后,并不会马上进入低功耗模式
|
||||
-- 而是等待sys.run()在分发处理到"DRV_SET_LOWPOWER"消息时,drv_lowpower功能模块才去配置低功耗模式
|
||||
-- 即使运行到了drv_lowpower功能模块,也不一定马上进入低功耗模式,只有配置过低功耗模式,并且当前内核固件和脚本没有task处于运行状态,才能进入真正进入低功耗
|
||||
sys.publish("DRV_SET_LOWPOWER")
|
||||
-- 执行此代码时,处于常规模式
|
||||
log.info("normal_lowpower_switch_task exit after publish DRV_SET_LOWPOWER")
|
||||
end
|
||||
|
||||
sys.taskInit(normal_lowpower_switch_task)
|
||||
@@ -0,0 +1,78 @@
|
||||
--[[
|
||||
@module prj_0_tcp_long
|
||||
@summary 常规模式(WORKMODE 0)下的tcp client长连接应用项目主功能模块
|
||||
@version 1.0
|
||||
@date 2026.02.12
|
||||
@author 马梦阳
|
||||
@usage
|
||||
本文件为常规模式(WORKMODE 0)下的tcp长连接应用项目主功能模块,核心业务逻辑为:
|
||||
1、初始化时配置最低功耗模式为常规模式(WORKMODE 0)
|
||||
2、启动一个tcp client长连接,连接tcp server;连接断开后,自动重连
|
||||
3、tcp client每隔一段时间发送数据到tcp server
|
||||
4、tcp client接收到tcp server下发的数据后,在日志中打印出来
|
||||
|
||||
|
||||
Air780EGP/EGG模组内部包含有GNSS和Gsensor,Air780EGH模组内部只包含有GNSS,不包含Gsensor;
|
||||
GPIO23作为GNSS备电电源开关和Gsensor电源开关,默认状态下为高电平;
|
||||
在低功耗模式和PSM+模式下,GNSS备电开启和Gsensor开启后,二者的功耗总和表现为30uA左右,客户应根据实际需求进行配置;
|
||||
在常规模式示例代码中,并未对GPIO23进行额外配置,默认状态下为高电平,以此演示常规模式下的实际功耗表现;
|
||||
|
||||
|
||||
使用Air780EXX系列每个模组的核心板,烧录运行此demo,在vbat供电3.3V状态下,运行6分钟,测试功耗数据为31.7202mA左右
|
||||
|
||||
|
||||
本文件和其他功能模块的通信接口只有1个:
|
||||
1、sys.publish("DRV_SET_NORMAL"):发布消息"DRV_SET_NORMAL",通知drv_normal驱动模块配置最低功耗模式为常规模式
|
||||
]]
|
||||
|
||||
|
||||
require "drv_normal"
|
||||
require "app_tcp_main"
|
||||
|
||||
|
||||
-- 数据发送结果回调函数;
|
||||
local function send_data_cbfunc(result)
|
||||
sys.publish("SEND_DATA_RSP", result)
|
||||
end
|
||||
|
||||
|
||||
-- tcp client长连接任务函数;
|
||||
local function tcp_long_task()
|
||||
-- 发布消息“TCP_CLIENT_RUN_REQ”,通知tcp client socket主功能应用模块(例如app_tcp_main.lua);
|
||||
-- 第二个参数用于设置连接的类型,“true”表示长连接,连接断开后会自动重连,“false”表示短连接,连接断开后不会自动重连;
|
||||
-- tcp client主功能应用模块接收到“TCP_CLIENT_RUN_REQ”消息后,根据第二个参数判断开始运行tcp client长链接任务还是短连接任务;
|
||||
sys.publish("TCP_CLIENT_RUN_REQ", true)
|
||||
|
||||
|
||||
local count = 0 -- 发送数据的次数
|
||||
local _, result -- 用于接收数据发送结果
|
||||
|
||||
|
||||
-- 发布消息“SEND_DATA_REQ”,通知tcp client socket数据发送应用功能模块(例如app_tcp_sender.lua)将数据发到服务器;
|
||||
while true do
|
||||
-- 用于在发送的数据内容中体现发送的次数
|
||||
count = count + 1
|
||||
|
||||
-- 发布消息“SEND_DATA_REQ”,通知tcp client socket数据发送应用功能模块(例如app_tcp_sender.lua)将数据发到服务器;
|
||||
-- 发送的数据内容大致为”send from tcp_long_task: heart_1“、”send from tcp_long_task: heart_2“等;
|
||||
-- 数据发送结果会通过回调函数send_data_cbfunc返回;
|
||||
sys.publish("SEND_DATA_REQ", "tcp_long_task", "heart_"..count, {func = send_data_cbfunc})
|
||||
|
||||
-- 等待数据发送结果
|
||||
_, result = sys.waitUntil("SEND_DATA_RSP")
|
||||
log.info("tcp_long_task", "send data rsp", result)
|
||||
|
||||
-- 延时5分钟之后,再次循环
|
||||
sys.wait(5*60*1000)
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
-- 发布消息“DRV_SET_NORMAL”,通知drv_normal驱动模块配置最低功耗模式为常规模式;
|
||||
-- 此行代码配置与否没有任何影响,因为LuatOS内核固件默认就是工作在常规模式;
|
||||
-- 此处配置,仅仅演示显式配置的方式;
|
||||
sys.publish("DRV_SET_NORMAL")
|
||||
|
||||
|
||||
-- 启动tcp client长连接任务
|
||||
sys.taskInit(tcp_long_task)
|
||||
@@ -0,0 +1,46 @@
|
||||
--[[
|
||||
@module prj_1
|
||||
@summary 低功耗模式(WORKMODE 1)应用项目主功能模块
|
||||
@version 1.0
|
||||
@date 2026.02.12
|
||||
@author 马梦阳
|
||||
@usage
|
||||
本文件为低功耗模式(WORKMODE 1)应用项目主功能模块,核心业务逻辑为:
|
||||
1、初始化时配置最低功耗模式为低功耗模式(WORKMODE 1)
|
||||
|
||||
|
||||
本文件和其他功能模块的通信接口只有1个:
|
||||
1、sys.publish("DRV_SET_LOWPOWER"):发布消息"DRV_SET_LOWPOWER",通知drv_lowpower驱动模块配置最低功耗模式为低功耗模式
|
||||
|
||||
|
||||
Air780EGP/EGG模组内部包含有GNSS和Gsensor,Air780EGH模组内部只包含有GNSS,不包含Gsensor;
|
||||
GPIO23作为GNSS备电电源开关和Gsensor电源开关,默认状态下为高电平;
|
||||
在低功耗模式和PSM+模式下,GNSS备电开启和Gsensor开启后,二者的功耗总和表现为30uA左右,客户应根据实际需求进行配置;
|
||||
在低功耗模式示例代码中,并未对GPIO23进行配置,默认状态下为高电平,以此演示低功耗模式下的实际功耗表现;
|
||||
|
||||
|
||||
使用Air780EXX系列每个模组的核心板,烧录运行此demo,在vbat供电3.8v状态下,分为以下三种独立的场景来介绍一下功耗情况:
|
||||
|
||||
|
||||
1、插sim卡,上电开机之后,大约7秒后,成功进入低功耗状态;
|
||||
初始化阶段(常规模式),平均电流47mA;(此数据仅供参考,测试网络环境不同,持续时长以及平均电流都会不同,但是差异应该不是特别大才对)
|
||||
低功耗阶段(因为有网络寻呼,所以是低功耗模式+常规模式自动切换),平均电流1.2mA左右(900uA到1.5mA左右都属于正常值,和天线性能以及网络环境有关系,以自己的实际硬件+实际网络环境测试数据为准,但是差异应该不是特别大才对)
|
||||
|
||||
2、插sim卡,上电开机之后,立即进入飞行模式(打开drv_lowpower.lua中的mobile.flymode(0, true)代码),大约1.2秒后,成功进入低功耗状态;
|
||||
初始化阶段(常规模式),平均电流20mA;(此数据仅供参考,测试网络环境不同,持续时长以及平均电流都会不同,但是差异应该不是特别大才对)
|
||||
低功耗阶段(低功耗模式),平均电流41uA左右(40uA到70uA左右都属于正常值)
|
||||
|
||||
3、不插sim卡,上电开机之后,大约0.91秒后,成功进入低功耗状态;
|
||||
初始化阶段(常规模式),平均电流20mA;(此数据仅供参考,测试网络环境不同,持续时长以及平均电流都会不同,但是差异应该不是特别大才对)
|
||||
低功耗阶段(低功耗模式),平均电流44uA左右(40uA到70uA左右都属于正常值)
|
||||
]]
|
||||
|
||||
|
||||
require "drv_lowpower"
|
||||
|
||||
|
||||
-- 发布消息“DRV_SET_LOWPOWER”,通知drv_lowpower驱动模块配置最低功耗模式为低功耗模式;
|
||||
-- drv_lowpower驱动模块内部已有中断唤醒引脚和功能引脚的配置说明,根据实际项目需求打开或关闭对应配置代码即可;
|
||||
-- 在执行完中断唤醒引脚和功能引脚的配置之后,调用pm.power(pm.WORK_MODE, 1)设置最低功耗模式为低功耗模式(WORKMODE 1);
|
||||
-- 设置完之后并不会里面进入休眠,而是等所有业务逻辑处理完毕之后,才会进入休眠;
|
||||
sys.publish("DRV_SET_LOWPOWER")
|
||||
@@ -0,0 +1,83 @@
|
||||
--[[
|
||||
@module prj_1_mqtt_long
|
||||
@summary 低功耗模式(WORKMODE 1)下的mqtt client长连接应用项目主功能模块
|
||||
@version 1.0
|
||||
@date 2026.02.12
|
||||
@author 马梦阳
|
||||
@usage
|
||||
本文件为低功耗模式(WORKMODE 1)下的mqtt client长连接应用项目主功能模块,核心业务逻辑为:
|
||||
1、初始化时配置最低功耗模式为低功耗模式(WORKMODE 1)
|
||||
2、启动一个mqtt client长连接,连接mqtt broker;连接断开后,自动重连
|
||||
3、mqtt client每隔一段时间发送数据到mqtt broker
|
||||
4、mqtt client接收到mqtt broker下发的数据后,在日志中打印出来
|
||||
|
||||
|
||||
Air780EGP/EGG模组内部包含有GNSS和Gsensor,Air780EGH模组内部只包含有GNSS,不包含Gsensor;
|
||||
GPIO23作为GNSS备电电源开关和Gsensor电源开关,默认状态下为高电平;
|
||||
在低功耗模式和PSM+模式下,GNSS备电开启和Gsensor开启后,二者的功耗总和表现为30uA左右,客户应根据实际需求进行配置;
|
||||
在低功耗模式示例代码中,并未对GPIO23进行配置,默认状态下为高电平,以此演示低功耗模式下的实际功耗表现;
|
||||
|
||||
|
||||
使用Air780EXX系列每个模组的核心板,烧录运行此demo,在vbat供电3.8v状态下,在以下测试场景来介绍一下功耗情况:
|
||||
|
||||
1、插sim卡,上电开机之后,大约7秒后,成功进入低功耗状态;
|
||||
初始化阶段(常规模式),平均电流38mA;(此数据仅供参考,测试网络环境不同,持续时长以及平均电流都会不同,但是差异应该不是特别大才对)
|
||||
低功耗阶段(因为有网络寻呼和mqtt交互,所以是低功耗模式+常规模式自动切换),平均电流2.7mA左右(2.4mA到3.0mA左右都属于正常值,和天线性能以及网络环境有关系,以自己的实际硬件+实际网络环境测试数据为准,但是差异应该不是特别大才对)
|
||||
|
||||
|
||||
本文件和其他功能模块的通信接口只有1个:
|
||||
1、sys.publish("DRV_SET_LOWPOWER"):发布消息"DRV_SET_LOWPOWER",通知drv_lowpower驱动模块配置最低功耗模式为低功耗模式
|
||||
]]
|
||||
|
||||
|
||||
require "drv_lowpower"
|
||||
require "app_mqtt_main"
|
||||
|
||||
|
||||
-- 数据发送结果回调函数;
|
||||
local function send_data_cbfunc(result)
|
||||
sys.publish("SEND_DATA_RSP", result)
|
||||
end
|
||||
|
||||
|
||||
-- mqtt client长连接任务函数;
|
||||
local function mqtt_long_task()
|
||||
-- 发布消息“MQTT_CLIENT_RUN_REQ”,通知mqtt client主功能应用模块(例如app_mqtt_main.lua);
|
||||
-- 第二个参数用于设置连接的类型,“true”表示长连接,连接断开后会自动重连,“false”表示短连接,连接断开后不会自动重连;
|
||||
-- mqtt client主功能应用模块接收到“MQTT_CLIENT_RUN_REQ”消息后,根据第二个参数判断开始运行mqtt client长链接任务还是短连接任务;
|
||||
sys.publish("MQTT_CLIENT_RUN_REQ", true)
|
||||
|
||||
|
||||
local count = 0 -- 发送数据的次数
|
||||
local _, result -- 用于接收数据发送结果
|
||||
|
||||
|
||||
-- 发布消息“SEND_DATA_REQ”,通知mqtt client数据发送应用功能模块(例如app_mqtt_sender.lua)将数据发到服务器;
|
||||
while true do
|
||||
-- 用于在发送的数据内容中体现发送的次数
|
||||
count = count + 1
|
||||
|
||||
-- 发布消息“SEND_DATA_REQ”,通知mqtt client数据发送应用功能模块(例如app_mqtt_sender.lua)将数据发到服务器;
|
||||
-- 发送的数据内容大致为”send from mqtt_long_task: heart_1“、”send from mqtt_long_task: heart_2“等;
|
||||
-- 数据发送结果会通过回调函数send_data_cbfunc返回;
|
||||
sys.publish("SEND_DATA_REQ", "mqtt_long_task", mobile.imei().."/up", "heart_"..count, 0, {func = send_data_cbfunc})
|
||||
|
||||
-- 等待数据发送结果
|
||||
_, result = sys.waitUntil("SEND_DATA_RSP")
|
||||
log.info("mqtt_long_task", "send data rsp", result)
|
||||
|
||||
-- 延时5分钟之后,再次循环
|
||||
sys.wait(5*60*1000)
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
-- 发布消息“DRV_SET_LOWPOWER”,通知drv_lowpower驱动模块配置最低功耗模式为低功耗模式;
|
||||
-- drv_lowpower驱动模块内部已有中断唤醒引脚和功能引脚的配置说明,根据实际项目需求打开或关闭对应配置代码即可;
|
||||
-- 在执行完中断唤醒引脚和功能引脚的配置之后,调用pm.power(pm.WORK_MODE, 1)设置最低功耗模式为低功耗模式(WORKMODE 1);
|
||||
-- 设置完之后并不会里面进入休眠,而是等所有业务逻辑处理完毕之后,才会进入休眠;
|
||||
sys.publish("DRV_SET_LOWPOWER")
|
||||
|
||||
|
||||
-- 启动mqtt client长连接任务;
|
||||
sys.taskInit(mqtt_long_task)
|
||||
@@ -0,0 +1,84 @@
|
||||
--[[
|
||||
@module prj_1_tcp_long
|
||||
@summary 低功耗模式(WORKMODE 1)下的tcp client长连接应用项目主功能模块
|
||||
@version 1.0
|
||||
@date 2026.02.12
|
||||
@author 马梦阳
|
||||
@usage
|
||||
本文件为低功耗模式(WORKMODE 1)下的tcp长连接应用项目主功能模块,核心业务逻辑为:
|
||||
1、初始化时配置最低功耗模式为低功耗模式(WORKMODE 1)
|
||||
2、启动一个tcp client长连接,连接tcp server;连接断开后,自动重连
|
||||
3、tcp client每隔一段时间发送数据到tcp server
|
||||
4、tcp client接收到tcp server下发的数据后,在日志中打印出来
|
||||
|
||||
|
||||
Air780EGP/EGG模组内部包含有GNSS和Gsensor,Air780EGH模组内部只包含有GNSS,不包含Gsensor;
|
||||
GPIO23作为GNSS备电电源开关和Gsensor电源开关,默认状态下为高电平;
|
||||
在低功耗模式和PSM+模式下,GNSS备电开启和Gsensor开启后,二者的功耗总和表现为30uA左右,客户应根据实际需求进行配置;
|
||||
在低功耗模式示例代码中,并未对GPIO23进行配置,默认状态下为高电平,以此演示低功耗模式下的实际功耗表现;
|
||||
|
||||
|
||||
使用Air780EXX系列每个模组的核心板,烧录运行此demo,在vbat供电3.8v状态下,在以下测试场景来介绍一下功耗情况:
|
||||
|
||||
|
||||
1、插sim卡,上电开机之后,大约9秒后,成功进入低功耗状态;
|
||||
初始化阶段(常规模式),平均电流33mA;(此数据仅供参考,测试网络环境不同,持续时长以及平均电流都会不同,但是差异应该不是特别大才对)
|
||||
低功耗阶段(因为有网络寻呼和tcp交互,所以是低功耗模式+常规模式自动切换),平均电流2.3mA左右(2.1mA到2.7mA左右都属于正常值,和天线性能以及网络环境有关系,以自己的实际硬件+实际网络环境测试数据为准,但是差异应该不是特别大才对)
|
||||
|
||||
|
||||
本文件和其他功能模块的通信接口只有1个:
|
||||
1、sys.publish("DRV_SET_LOWPOWER"):发布消息"DRV_SET_LOWPOWER",通知drv_lowpower驱动模块配置最低功耗模式为低功耗模式
|
||||
]]
|
||||
|
||||
|
||||
require "drv_lowpower"
|
||||
require "app_tcp_main"
|
||||
|
||||
|
||||
-- 数据发送结果回调函数;
|
||||
local function send_data_cbfunc(result)
|
||||
sys.publish("SEND_DATA_RSP", result)
|
||||
end
|
||||
|
||||
|
||||
-- tcp client长连接任务函数;
|
||||
local function tcp_long_task()
|
||||
-- 发布消息“TCP_CLIENT_RUN_REQ”,通知tcp client socket主功能应用模块(例如app_tcp_main.lua);
|
||||
-- 第二个参数用于设置连接的类型,“true”表示长连接,连接断开后会自动重连,“false”表示短连接,连接断开后不会自动重连;
|
||||
-- tcp client主功能应用模块接收到“TCP_CLIENT_RUN_REQ”消息后,根据第二个参数判断开始运行tcp client长链接任务还是短连接任务;
|
||||
sys.publish("TCP_CLIENT_RUN_REQ", true)
|
||||
|
||||
|
||||
local count = 0 -- 发送数据的次数
|
||||
local _, result -- 用于接收数据发送结果
|
||||
|
||||
|
||||
-- 发布消息“SEND_DATA_REQ”,通知tcp client socket数据发送应用功能模块(例如app_tcp_sender.lua)将数据发到服务器;
|
||||
while true do
|
||||
-- 用于在发送的数据内容中体现发送的次数
|
||||
count = count + 1
|
||||
|
||||
-- 发布消息“SEND_DATA_REQ”,通知tcp client socket数据发送应用功能模块(例如app_tcp_sender.lua)将数据发到服务器;
|
||||
-- 发送的数据内容大致为”send from tcp_long_task: heart_1“、”send from tcp_long_task: heart_2“等;
|
||||
-- 数据发送结果会通过回调函数send_data_cbfunc返回;
|
||||
sys.publish("SEND_DATA_REQ", "tcp_long_task", "heart_"..count, {func = send_data_cbfunc})
|
||||
|
||||
-- 等待数据发送结果
|
||||
_, result = sys.waitUntil("SEND_DATA_RSP")
|
||||
log.info("tcp_long_task", "send data rsp", result)
|
||||
|
||||
-- 延时5分钟之后,再次循环
|
||||
sys.wait(5*60*1000)
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
-- 发布消息“DRV_SET_LOWPOWER”,通知drv_lowpower驱动模块配置最低功耗模式为低功耗模式;
|
||||
-- drv_lowpower驱动模块内部已有中断唤醒引脚和功能引脚的配置说明,根据实际项目需求打开或关闭对应配置代码即可;
|
||||
-- 在执行完中断唤醒引脚和功能引脚的配置之后,调用pm.power(pm.WORK_MODE, 1)设置最低功耗模式为低功耗模式(WORKMODE 1);
|
||||
-- 设置完之后并不会里面进入休眠,而是等所有业务逻辑处理完毕之后,才会进入休眠;
|
||||
sys.publish("DRV_SET_LOWPOWER")
|
||||
|
||||
|
||||
-- 启动tcp client长连接任务;
|
||||
sys.taskInit(tcp_long_task)
|
||||
@@ -0,0 +1,47 @@
|
||||
--[[
|
||||
@module prj_1_uart_camera
|
||||
@summary 低功耗模式(WORKMODE 1)下的uart camera应用项目主功能模块
|
||||
@version 1.0
|
||||
@date 2026.02.12
|
||||
@author 马梦阳
|
||||
@usage
|
||||
本文件为低功耗模式(WORKMODE 1)下的uart camera应用项目主功能模块,核心业务逻辑为:
|
||||
1、引用drv_lowpower驱动模块,用于配置最低功耗模式为低功耗模式(WORKMODE 1);
|
||||
2、引用app_lpuart驱动模块,用于初始化uart,以及接收拍照指令和将拍照数据通过uart发送出去;
|
||||
3、引用app_camera驱动模块,用于初始化camera,以及控制camera拍照;
|
||||
|
||||
|
||||
Air780EGP/EGG模组内部包含有GNSS和Gsensor,Air780EGH模组内部只包含有GNSS,不包含Gsensor;
|
||||
GPIO23作为GNSS备电电源开关和Gsensor电源开关,默认状态下为高电平;
|
||||
在低功耗模式和PSM+模式下,GNSS备电开启和Gsensor开启后,二者的功耗总和表现为30uA左右,客户应根据实际需求进行配置;
|
||||
在低功耗模式示例代码中,并未对GPIO23进行配置,默认状态下为高电平,以此演示低功耗模式下的实际功耗表现;
|
||||
|
||||
|
||||
使用Air780EXX系列每个模组的整机开发板,不插sim卡,烧录运行此demo,在vbat供电3.8V状态下,进行拍照+通过uart将图像数据发送出去,测试一分钟功耗数据为861.9937uA左右
|
||||
|
||||
|
||||
本文件和其他功能模块的通信接口只有1个:
|
||||
1、sys.publish("DRV_SET_LOWPOWER"):发布消息"DRV_SET_LOWPOWER",通知drv_lowpower驱动模块配置最低功耗模式为低功耗模式
|
||||
]]
|
||||
|
||||
require "drv_lowpower"
|
||||
require "app_lpuart"
|
||||
require "app_camera"
|
||||
|
||||
|
||||
-- 硬件连接与操作说明:
|
||||
-- 1、演示代码使用的是Air780EPM开发板进行测试,需要搭配一个gc032a的摄像头和两个串口板;
|
||||
-- 2、测试时,使用两根usb转ttl串口线连接电脑和开发板,第一根线和开发板的uart1 tx相连(电脑上的串口工具配置为9600波特率),第二根线和开发板的uart1 rx相连(电脑上的串口工具配置为115200波特率);
|
||||
-- 3、第一根线对应的电脑端串口工具下发A0001指令,就可以控制开发板拍照,拍照结束后,通过第二根线发给电脑端串口工具(每次接收到数据,可以单独保存为一个文件,修改文件名后缀为jpg,就能查看图片)
|
||||
|
||||
|
||||
-- 设置SIM0进入飞行模式
|
||||
-- 可以在此处配置,也可以在drv_lowpower.lua中设置(详情请查看drv_lowpower.lua中的代码注释说明)
|
||||
mobile.flymode(0, true)
|
||||
|
||||
|
||||
-- 发布消息“DRV_SET_LOWPOWER”,通知drv_lowpower驱动模块配置最低功耗模式为低功耗模式;
|
||||
-- drv_lowpower驱动模块内部已有中断唤醒引脚和功能引脚的配置说明,根据实际项目需求打开或关闭对应配置代码即可;
|
||||
-- 在执行完中断唤醒引脚和功能引脚的配置之后,调用pm.power(pm.WORK_MODE, 1)设置最低功耗模式为低功耗模式(WORKMODE 1);‘
|
||||
-- 设置完之后并不会里面进入休眠,而是等所有业务逻辑处理完毕之后,才会进入休眠;
|
||||
sys.publish("DRV_SET_LOWPOWER")
|
||||
@@ -0,0 +1,42 @@
|
||||
--[[
|
||||
@module prj_3
|
||||
@summary PSM+模式(WORKMODE 3)应用项目主调度功能模块
|
||||
@version 1.0
|
||||
@date 2026.02.12
|
||||
@author 马梦阳
|
||||
@usage
|
||||
本文件为PSM+模式(WORKMODE 3)应用项目主调度功能模块,核心业务逻辑为:
|
||||
1、初始化时配置最低功耗模式为PSM+模式(WORKMODE 3)
|
||||
|
||||
|
||||
本文件和其他功能模块的通信接口只有1个:
|
||||
1、sys.publish("DRV_SET_PSM"):发布消息"DRV_SET_PSM",通知drv_psm驱动模块配置最低功耗模式为PSM+模式
|
||||
|
||||
|
||||
Air780EGP/EGG模组内部包含有GNSS和Gsensor,Air780EGH模组内部只包含有GNSS,不包含Gsensor;
|
||||
GPIO23作为GNSS备电电源开关和Gsensor电源开关,默认状态下为高电平;
|
||||
在低功耗模式和PSM+模式下,GNSS备电开启和Gsensor开启后,二者的功耗总和表现为30uA左右,客户应根据实际需求进行配置;
|
||||
在PSM+模式示例代码中,默认配置GPIO23为输入下拉的方式来演示PSM+模式的功耗表现;
|
||||
|
||||
|
||||
使用Air780EXX系列每个模组的核心板,烧录运行此demo,在vbat供电3.8v状态下,分为以下两种独立的场景来介绍一下功耗情况:
|
||||
|
||||
|
||||
1、插sim卡,上电开机之后,大约1.2秒后,成功进入PSM+状态;
|
||||
初始化阶段(常规模式),平均电流21mA;(此数据仅供参考,测试网络环境不同,持续时长以及平均电流都会不同,但是差异应该不是特别大才对)
|
||||
PSM+阶段(PSM+模式),平均电流3.9uA左右(2.8uA到10uA都属于正常值)
|
||||
|
||||
2、不插sim卡,上电开机之后,大约0.94秒后,成功进入PSM+状态;
|
||||
初始化阶段(常规模式),平均电流21mA;(此数据仅供参考,测试网络环境不同,持续时长以及平均电流都会不同,但是差异应该不是特别大才对)
|
||||
PSM+阶段(PSM+模式),平均电流3.2uA左右(2.8uA到10uA都属于正常值)
|
||||
]]
|
||||
|
||||
|
||||
require "drv_psm"
|
||||
|
||||
|
||||
-- 发布消息“DRV_SET_PSM”,通知drv_psm驱动模块配置最低功耗模式为PSM+模式;
|
||||
-- drv_psm驱动模块内部已有中断唤醒引脚和功能引脚的配置说明,根据实际项目需求打开或关闭对应配置代码即可;
|
||||
-- 在执行完中断唤醒引脚和功能引脚的配置之后,调用pm.power(pm.WORK_MODE, 3)设置最低功耗模式为PSM+模式;
|
||||
-- 设置完之后并不会里面进入休眠,而是等所有业务逻辑处理完毕之后,才会进入休眠;
|
||||
sys.publish("DRV_SET_PSM")
|
||||
@@ -0,0 +1,108 @@
|
||||
--[[
|
||||
@module prj_3_mqtt_short
|
||||
@summary PSM+模式下的mqtt client短连接应用项目主功能模块
|
||||
@version 1.0
|
||||
@date 2026.02.12
|
||||
@author 马梦阳
|
||||
@usage
|
||||
本文件为psm+模式下的mqtt短连接应用项目主功能模块,核心业务逻辑为:
|
||||
1、初始化时配置最低功耗模式为psm+模式
|
||||
2、启动一个mqtt client短连接,连接mqtt broker;连接断开后,不会自动重连
|
||||
3、mqtt client发送一次数据到mqtt broker,无论成功还是失败,一段时间后主动断开连接,然后进入PSM+模式
|
||||
4、mqtt client接收到mqtt broker下发的数据后,在日志中打印出来
|
||||
5、进入PSM+模式休眠一个小时唤醒后,重新执行前面的操作
|
||||
|
||||
|
||||
Air780EGP/EGG模组内部包含有GNSS和Gsensor,Air780EGH模组内部只包含有GNSS,不包含Gsensor;
|
||||
GPIO23作为GNSS备电电源开关和Gsensor电源开关,默认状态下为高电平;
|
||||
在低功耗模式和PSM+模式下,GNSS备电开启和Gsensor开启后,二者的功耗总和表现为30uA左右,客户应根据实际需求进行配置;
|
||||
在PSM+模式示例代码中,默认配置GPIO23为输入下拉的方式来演示PSM+模式的功耗表现;
|
||||
|
||||
|
||||
使用Air780EXX系列每个模组的核心板,烧录运行此demo,在vbat供电3.8v状态下,在以下测试场景来介绍一下功耗情况:
|
||||
|
||||
|
||||
1、插sim卡,上电开机之后,大约2.6秒后,成功进入PSM+状态;
|
||||
初始化阶段(常规模式),平均电流44.31mA;(此数据仅供参考,测试网络环境不同,持续时长以及平均电流都会不同,但是差异应该不是特别大才对)
|
||||
PSM+阶段(PSM+模式,关闭WiFi芯片,配置GPIO24为输入下拉),平均电流3.4uA左右(2.8uA到10uA都属于正常值)
|
||||
|
||||
|
||||
本文件和其他功能模块的通信接口只有1个:
|
||||
1、sys.publish("DRV_SET_PSM"):发布消息"DRV_SET_PSM",通知drv_psm驱动模块配置最低功耗模式为PSM+模式
|
||||
2、sys.publish("READ_SHT30_REQ"):发布消息"READ_SHT30_REQ",通知app_sht30功能模块读取温湿度数据
|
||||
]]
|
||||
|
||||
|
||||
require "drv_psm"
|
||||
require "app_sht30"
|
||||
require "app_mqtt_main"
|
||||
|
||||
|
||||
-- 数据发送结果回调函数;
|
||||
local function send_data_cbfunc(result)
|
||||
sys.publish("SEND_DATA_RSP", result)
|
||||
end
|
||||
|
||||
|
||||
-- mqtt client短连接任务函数;
|
||||
local function mqtt_short_task()
|
||||
-- 发布消息“READ_SHT30_REQ”,通知sht30_app应用功能模块(例如app_sht30.lua)读取温湿度数据;
|
||||
sys.publish("READ_SHT30_REQ")
|
||||
-- 温湿度数据通过“READ_SHT30_RSP”消息返回;此处等待读取结果,最多等待3秒钟;
|
||||
-- 如果在3秒内没有读取到结果,则继续执行后面的代码
|
||||
local no_timeout, result, temprature, humidity = sys.waitUntil("READ_SHT30_RSP", 3000)
|
||||
log.info("mqtt_short_task", "read sht30 rsp", no_timeout, result, temprature, humidity)
|
||||
|
||||
|
||||
-- 发布消息“MQTT_CLIENT_RUN_REQ”,通知mqtt client主功能应用模块(例如app_mqtt_main.lua);
|
||||
-- 第二个参数用于设置连接的类型,“true”表示长连接,连接断开后会自动重连,“false”表示短连接,连接断开后不会自动重连;
|
||||
-- mqtt client主功能应用模块接收到“MQTT_CLIENT_RUN_REQ”消息后,根据第二个参数判断开始运行mqtt client长链接任务还是短连接任务;
|
||||
sys.publish("MQTT_CLIENT_RUN_REQ", false)
|
||||
|
||||
|
||||
-- 根据读取的温湿度数据,构造payload
|
||||
local payload
|
||||
-- 如果成功读取到温湿度数据,则将数据格式化为json字符串
|
||||
if temprature and humidity then
|
||||
payload = json.encode({
|
||||
temperature = string.format("%.2f", temprature),
|
||||
humidity = string.format("%.2f", humidity)
|
||||
})
|
||||
-- 如果读取温湿度数据失败,则将payload设置为错误字符串
|
||||
else
|
||||
payload = "error!!!"
|
||||
end
|
||||
|
||||
|
||||
-- 发布消息“SEND_DATA_REQ”,通知mqtt client数据发送应用功能模块(例如app_mqtt_sender.lua)将数据发到服务器;
|
||||
-- 发送的数据内容大致为”send from mqtt_short_task: {"humidity":"43.05","temperature":"13.92"}“等;
|
||||
-- 数据发送结果会通过回调函数send_data_cbfunc返回;
|
||||
sys.publish("SEND_DATA_REQ", "mqtt_short_task", mobile.imei().."/up", payload, 0, {func = send_data_cbfunc})
|
||||
|
||||
-- 等待数据发送结果,最长等待10秒钟
|
||||
no_timeout, result = sys.waitUntil("SEND_DATA_RSP", 10000)
|
||||
log.info("mqtt_short_task", "send data rsp", no_timeout, result)
|
||||
|
||||
-- 无论发送成功还是失败,主动断开mqtt client短连接
|
||||
sys.publish("MQTT_CLIENT_CLOSE_REQ")
|
||||
-- 等待断开结果,最长等待3秒钟
|
||||
-- 为了更省电,此处也可以不等待结果,可以更快的进入PSM+模式;
|
||||
-- 代价就是broker端无法及时检测到客户端已经断开,要等broker端超时之后,才会清空当前客户端在broker上的资源
|
||||
no_timeout,result = sys.waitUntil("MQTT_CLIENT_CLOSE_RSP", 3000)
|
||||
log.info("mqtt_short_task", "mqtt close rsp", no_timeout, result)
|
||||
|
||||
|
||||
-- 配置深度休眠定时器1小时后唤醒(定时器时长有讲究,此处的时长不要小于80秒,而且为了省电,至少要几十分钟才可能有意义)
|
||||
-- 可以在此处配置,也可以在drv_psm.lua中设置(详情请查看drv_psm.lua中的代码注释说明)
|
||||
pm.dtimerStart(0, 60*60*1000)
|
||||
|
||||
|
||||
-- 发布消息“DRV_SET_PSM”,通知drv_psm驱动模块配置最低功耗模式为PSM+模式;
|
||||
-- drv_psm驱动模块内部已有中断唤醒引脚和功能引脚的配置说明,根据实际项目需求打开或关闭对应配置代码即可;
|
||||
-- 在执行完中断唤醒引脚和功能引脚的配置之后,调用pm.power(pm.WORK_MODE, 3)设置最低功耗模式为PSM+模式;
|
||||
-- 设置完之后并不会里面进入休眠,而是等所有业务逻辑处理完毕之后,才会进入休眠;
|
||||
sys.publish("DRV_SET_PSM")
|
||||
end
|
||||
|
||||
-- 启动mqtt client短连接任务
|
||||
sys.taskInit(mqtt_short_task)
|
||||
@@ -0,0 +1,82 @@
|
||||
--[[
|
||||
@module prj_3_tcp_short
|
||||
@summary PSM+模式下的tcp client短连接应用项目主功能模块
|
||||
@version 1.0
|
||||
@date 2026.02.12
|
||||
@author 马梦阳
|
||||
@usage
|
||||
本文件为psm+模式下的tcp短连接应用项目主功能模块,核心业务逻辑为:
|
||||
1、初始化时配置最低功耗模式为psm+模式
|
||||
2、启动一个tcp client短连接,连接tcp server;连接断开后,不会自动重连
|
||||
3、tcp client发送一次数据到tcp server,无论成功还是失败,一段时间后主动断开连接,然后进入PSM+模式
|
||||
4、tcp client接收到tcp server下发的数据后,在日志中打印出来
|
||||
5、进入PSM+模式休眠一个小时唤醒后,重新执行前面的操作
|
||||
|
||||
|
||||
Air780EGP/EGG模组内部包含有GNSS和Gsensor,Air780EGH模组内部只包含有GNSS,不包含Gsensor;
|
||||
GPIO23作为GNSS备电电源开关和Gsensor电源开关,默认状态下为高电平;
|
||||
在低功耗模式和PSM+模式下,GNSS备电开启和Gsensor开启后,二者的功耗总和表现为30uA左右,客户应根据实际需求进行配置;
|
||||
在PSM+模式示例代码中,默认配置GPIO23为输入下拉的方式来演示PSM+模式的功耗表现;
|
||||
|
||||
|
||||
使用Air780EXX系列每个模组的核心板,烧录运行此demo,在vbat供电3.8v状态下,在以下测试场景来介绍一下功耗情况:
|
||||
|
||||
|
||||
1、插sim卡,上电开机之后,大约2.6秒后,成功进入PSM+状态;
|
||||
初始化阶段(常规模式),平均电流47.85mA;(此数据仅供参考,测试网络环境不同,持续时长以及平均电流都会不同,但是差异应该不是特别大才对)
|
||||
PSM+阶段(PSM+模式,关闭WiFi芯片,配置GPIO24为输入下拉),平均电流2.8uA左右(2.8uA到10uA都属于正常值)
|
||||
|
||||
|
||||
本文件和其他功能模块的通信接口只有1个:
|
||||
1、sys.publish("DRV_SET_PSM"):发布消息"DRV_SET_PSM",通知drv_psm驱动模块配置最低功耗模式为PSM+模式
|
||||
]]
|
||||
|
||||
|
||||
require "drv_psm"
|
||||
require "app_tcp_main"
|
||||
|
||||
|
||||
-- 数据发送结果回调函数;
|
||||
local function send_data_cbfunc(result)
|
||||
sys.publish("SEND_DATA_RSP", result)
|
||||
end
|
||||
|
||||
|
||||
-- tcp client短连接任务函数;
|
||||
local function tcp_short_task()
|
||||
-- 发布消息“TCP_CLIENT_RUN_REQ”,通知tcp client socket主功能应用模块(例如app_tcp_main.lua);
|
||||
-- 第二个参数用于设置连接的类型,“true”表示长连接,连接断开后会自动重连,“false”表示短连接,连接断开后不会自动重连;
|
||||
-- tcp client主功能应用模块接收到“TCP_CLIENT_RUN_REQ”消息后,根据第二个参数判断开始运行tcp client长链接任务还是短连接任务;
|
||||
sys.publish("TCP_CLIENT_RUN_REQ", false)
|
||||
|
||||
-- 发布消息“SEND_DATA_REQ”,通知tcp client socket数据发送应用功能模块(例如app_tcp_sender.lua)将数据发到服务器;
|
||||
-- 发送的数据内容大致为”send from tcp_short_task: wakeup report“等;
|
||||
-- 数据发送结果会通过回调函数send_data_cbfunc返回;
|
||||
sys.publish("SEND_DATA_REQ", "tcp_short_task", "wakeup report", {func = send_data_cbfunc})
|
||||
|
||||
-- 等待数据发送结果,最长等待10秒钟;
|
||||
local no_timeout, result = sys.waitUntil("SEND_DATA_RSP", 10000)
|
||||
log.info("tcp_long_task", "send data rsp", no_timeout, result)
|
||||
|
||||
-- 无论发送成功还是失败,主动断开tcp client短连接;
|
||||
sys.publish("TCP_CLIENT_CLOSE_REQ")
|
||||
-- 等待断开结果,最长等待3秒钟;
|
||||
-- 为了更省电,此处也可以不等待结果,可以更快的进入PSM+模式;
|
||||
-- 代价就是server端无法及时检测到客户端已经断开,要等server端超时之后,才会清空当前客户端在server上的资源;
|
||||
no_timeout, result = sys.waitUntil("TCP_CLIENT_CLOSE_RSP", 3000)
|
||||
log.info("tcp_long_task", "tcp close rsp", no_timeout, result)
|
||||
|
||||
|
||||
-- 配置深度休眠定时器1小时后唤醒(定时器时长有讲究,此处的时长不要小于80秒,而且为了省电,至少要几十分钟才可能有意义)
|
||||
-- 可以在此处配置,也可以在drv_psm.lua中设置(详情请查看drv_psm.lua中的代码注释说明)
|
||||
pm.dtimerStart(0, 60*60*1000)
|
||||
|
||||
-- 发布消息“DRV_SET_PSM”,通知drv_psm驱动模块配置最低功耗模式为PSM+模式;
|
||||
-- drv_psm驱动模块内部已有中断唤醒引脚和功能引脚的配置说明,根据实际项目需求打开或关闭对应配置代码即可;
|
||||
-- 在执行完中断唤醒引脚和功能引脚的配置之后,调用pm.power(pm.WORK_MODE, 3)设置最低功耗模式为PSM+模式;
|
||||
-- 设置完之后并不会里面进入休眠,而是等所有业务逻辑处理完毕之后,才会进入休眠;
|
||||
sys.publish("DRV_SET_PSM")
|
||||
end
|
||||
|
||||
-- 启动tcp client短连接任务;
|
||||
sys.taskInit(tcp_short_task)
|
||||
Reference in New Issue
Block a user