一、低功耗模式概述

1.1 背景说明

  1. 低功耗是合宙产品的重要特性之一;
  2. Air780EXX 系列产品有三种功耗模式(常规模式、低功耗模式、PSM+ 模式),每种功耗模式都有各自的特点;
  3. Air780EXX 系列产品优异的低功耗表现,依托于硬件设计的加持,以及软件协议算法的帮助;
  4. 在不同的应用场景下,根据实际项目需求选择合适的合宙 Air780EXX 系列产品功耗模式,以及三种功耗模式之间的相互转换;
  5. 除实验室测试数据外,合宙更关注于实网环境下的功耗表现,呈现给用户的效果更多以实网在线表现为准;

1.2 三种功耗模式说明

Air780EXX 系列产品有常规模式、低功耗模式、PSM+ 模式三种功耗模式,每种功耗模式都有各自的特点,详细说明见下方表格:

1.3 三种功耗模式简捷定义

Air780EXX 系列产品有常规模式、低功耗模式、PSM+ 模式三种功耗模式,简捷定义如下:

  • 常规模式:

    • 4G 网络处于可用状态,可随时响应服务器命令,外设功能全部可用,比如,所有 GPIO 电平都可以被控制;
  • 低功耗模式:

    • 4G 网络处于可用状态,可随时响应服务器命令,外设功能部分可用,比如,仅有 AGPIO 可以保持电平;
  • PSM+ 模式:

    • 4G 网络均处于不可用状态,无法响应服务器命令,外设功能部分可用,比如,仅有 AGPIO 可以保持电平;

各种场景下应该如何选择对应的功耗模式,请看下方描述:

1、如果不需要低功耗,希望模块一直保持正常状态的,可以使用第一种“常规模式”,该模式下,CPU 正常工作,所有外设均可启动

2、电池供电,和服务器之间是长连接,又希望低功耗的,可以使用第二种“低功耗模式”,该模式下,CPU 自动降频,RAM 保持供电,定时器(sys.timerStart/sys.wait/sys.timerLoopStart)/网络事件/IO 中断均可自动唤醒,普通 GPIO 掉电,外设驱动掉电,AON_GPIO 保持电平唤醒后程序继续运行

3、电池供电,和服务器之间不需要保持长连接,仅仅需要间隔几小时甚至几天才发一次数据给服务器,希望电池待机时间更久一些,可以使用第三种“PSM+ 模式”,该模式下,CPU 自动降频,RAM 掉电,保留 RAM 也掉电,普通 GPIO 掉电,外设驱动掉电,AON_GPIO 保持休眠前的电平,dtimer 定时器(深度休眠时使用的定时器,与普通 sys.timer 定时器不同)可唤醒,wakeup 脚可唤醒,唤醒后程序从头运行,休眠前的运行时数据全丢(部分重要数据可以使用 fskv 库存在 flash 中,实现掉电不丢失)

1.4 GPIO 在功耗模式下的影响

合宙 Air780EXX 系列产品 GPIO 类包含普通 GPIO、AGPIO、WAKEUP、AGPIOWU 四类 GPIO;

这四类 GPIO 在三种功耗模式下的功能表现并不一致,客户在进行硬件设计时请务必根据产品定义慎重选择,避免改版;

接下来将根据上述四类 GPIO 在三种功耗模式下的功能表现进行简单说明:

普通 GPIO:

普通 GPIO 是处于 VDD_EXT 电压域下的管脚。

在常规模式下,VDD_EXT 电平会保持输出状态,处于 VDD_EXT 电压域下的 GPIO 可以自由被控制;

在低功耗模式下,由于 VDD_EXT 电平会处于间歇性输出状态,因此处于 VDD_EXT 电压域下的 GPIO 也会处于间歇性输出状态;

在 PSM+ 模式下,VDD_EXT 电平会处于掉电状态,处于 VDD_EXT 电压域下的 GPIO 无法被控制,此时处于高阻状态;

如果客户实际项目中,在低功耗模式/PSM+ 模式下需要让普通 GPIO 处于某一个电平状态,可以通过上拉/下拉的方式进行实现,上拉到 Vref 实现保持高电平,下拉到 GND 实现保持低电平;

AGPIO:

AGPIO 是处于 LDO_AON 电压域下的管脚,LDO_AON 电平固定输出 3.3V,无法更改;

在常规模式、低功耗模式和 PSM+ 模式下可以固定输出原有的高/低电平;

当配置为中断输入功能时,只能作为普通 GPIO 中断使用,无法在低功耗模式和 PSM+ 模式下实现中断唤醒功能;

WAKEUP:

WAKEUP 是处于 LDO_1.8V 电压域下的管脚,LDO_1.8V 电平固定输出 1.8V,无法更改;

在常规模式、低功耗模式和 PSM+ 模式下只能作为中断输入功能使用,也可在休眠时实现中断唤醒功能,但是不可以作为输出功能使用;

除 WAKEUP 管脚之外,PWRKEY 和 CHG_DET 管脚也可以用作中断输入唤醒功能,因此通常将 PWRKEY 和 CHG_DET 与 WAKEUP 一起介绍,只不过 PWRKEY 管脚是处于 VBAT 电压域下,CHG_DET 管脚与 WAKEUP 管脚是属于 LDO_1.8V 电压域下;

AGPIOWU:

AGPIOWU 既可以作为 AGPIO 管脚,还可以作为 WAKEUP 管脚使用;

AGPIOWU 作为 AGPIO 管脚使用时,其电压域属于 LDO_AON,在常规模式、低功耗模式和 PSM+ 模式下可以固定输出原有的高/低电平,配置为中断输入时只能作为普通 GPIO 中断使用,无法在低功耗模式和 PSM+ 模式下实现中断唤醒功能;

AGPIOWU 作为 WAKEUP 管脚使用时,其电压域属于 LDO_1.8V,在常规模式、低功耗模式和 PSM+ 模式下只能作为中断输入功能,也可在休眠时实现中断唤醒,但是不可以作为输出功能使用;

二、演示功能概述

2.1 演示说明

本文将为大家讲解 Air780EXX 系列模组在常规模式、低功耗模式、PSM+ 模式下的功耗表现;

并通过下列九个项目示例进行分别演示和说明:

1、prj_0_tcp_long:常规模式下的 tcp 长连接项目(每 5 分钟发送一次数据到 tcp server);

2、prj_3:PSM+ 模式 3 简单项目;

3、prj_1:低功耗模式 1 简单项目;

4、prj_0_1:常规模式 0 和低功耗模式 1 切换项目;

5、prj_1_tcp_long:低功耗模式下的 tcp 长连接项目(每 5 分钟发送一次数据到 tcp server);

6、prj_3_tcp_short:PSM+ 模式下的 tcp 短连接项目(每次开机,发送一次数据到 tcp server,无论成功还是失败,然后进入 PSM+ 模式,1 小时后唤醒);

7、prj_1_mqtt_long:低功耗模式下的 mqtt 长连接项目(每 5 分钟发送一次数据到 mqtt server);

8、prj_3_mqtt_short:PSM+ 模式下的 mqtt 短连接项目(每次开机,读取一次温湿度数据,然后发送到 mqtt server,无论成功还是失败,然后进入 PSM+ 模式,1 小时后唤醒);

9、prj_1_uart_camera:低功耗模式 + 飞行模式下的上位机通过串口控制拍照以及照片回传项目(uart1 9600 波特率接收上位机拍照指令,拍照后,通过 115200 波特率将照片回传给上位机);

2.2 Air780EXX 系列模组说明

在接下来的演示之前,先对 Air780EXX 系列模组进行简单的介绍:

1、Air780EXX 系列模组目前对外出售的支持二次开发的型号有 Air780EPM、Air780EHM、Air780EHV、Air780EGP、Air780EGG、Air780EGH、Air780EHU、Air780EHN 八种型号;

2、Air780EPM、Air780EHM 型号模组没有引出 CHG_DET 引脚,无法配置 CHG_DET(WAKEUP6)功能;

3、Air780EHV 型号模组内部包含有 Audio Codec 芯片 ES8311,模组内部将 WAKEUP3 引脚用作 GPIO20 功能,用于控制 ES8311 的供电使能开关,除此之外不可作为其他功能;

4、Air780EGG、Air780EGP 型号模组内部包含 Gsensor 芯片,模组内部将 WAKEUP2 引脚用作 Gsensor 中断信号脚,除此之外不可作为其他功能使用;

5、Air780EGG、Air780EGP、Air780EGH 型号模组内部包含 GNSS 定位芯片,模组内部将 WAKEUP4 引脚用作 GPIO21 功能,用于控制 GNSS 定位芯片的供电使能开关,除此之外不可作为其他功能;

6、Air780EGG、Air780EGP 型号模组内部包含 GNSS 和 Gsensor 芯片,模组的 GPIO23 管脚是 GNSS 备电电源使能引脚,也是 Gsensor 芯片的电源使能引脚。默认状态下,GPIO23 固定输出为高电平,在低功耗模式和 PSM+ 模式下,GNSS 备电电源和 Gsensor 电源开启之后,两者的功耗总和表现为 30uA 左右;

本文主要以 Air780EPM/EHM 这两款型号模组进行介绍,使用 Air780EPM 型号模组进行演示操作。

Air780EPM 与 Air780EHM 这两款模组的差异可通过这个链接进行查阅。

三、准备硬件环境

特别说明: 第三章列举的是全部项目一共需要准备的硬件环境,本文共需要演示九个项目,每个项目需要准备的硬件环境略有不同,用户可根据自己要测试的项目准备对应的硬件环境,每个项目需要准备哪些硬件环境,可通过第八章每个项目小节下的“硬件准备”中查阅。

3.1 Air780EPM 核心板

下列图片为 Air780EPM 型号模组的核心板,Air780EPM 和 Air780EHM 型号模组的底板都是相同的,只是底板上贴的模组型号不同,每个型号模组支持的功能也有区别,用户应根据自己的实际需求使用对应的核心板;
在这里插入图片描述

3.2 Air780EXX 系列开发板

Air780EPM V1.2 开发板、Air780EPM V1.3 开发板、Air780EHM V1.4 开发板;用于 prj_1_uart_camera 项目演示;

本文演示使用的是 Air780EPM V1.3 开发板;
在这里插入图片描述

3.3 AirSHT30_1000 温湿度传感器配件板

用于 prj_3_mqtt_short 项目演示;

3.4 AirCAMERA _1040 摄像头模组

用于 prj_1_uart_camera 项目演示;

3.5 支持两个 UART 端口及以上的串口板

本文演示使用的串口板如下,4 路 TTL,5V/3.3V/2.5V/1.8V/1.2V,TYPEC 口,不含线

用于 prj_1_uart_camera 项目演示;

3.6 物联网卡/手机卡

需要自行联系卡商采购;

3.7 Air9000P 合宙功耗分析仪

用于外部供电

3.8 硬件接线说明

Air9000P 与 Air780EPM 核心板接线说明:

1、将 Air9000P 的 ‘+’ 、 ‘-’ 极分别连接到核心板的 VBAT、GND 排针上,在测试低功耗模式、PSM+ 模式时需要使用外部供电对模组进行供电;

2、将核心板 USB 母座旁边的拨码开关拨到 OFF 档,用于断开 USB 供电;

3、电脑打开“功耗分析仪”上位机软件(下载及使用说明请看 Air9000P 使用说明),连接 Air9000P;

Air9000P 与 Air780EPM V1.3 开发板接线说明:

1、将 Air9000P 的 ‘+’ 、 ‘-’ 极分别连接到开发板的 4V、GND 排针上,在测试低功耗模式、PSM+ 模式时需要使用外部供电对模组进行供电;

2、将开发板 USB 母座旁边的拨码开关拨到 OFF 档,用于断开 USB 供电;

3、电脑打开“功耗分析仪”上位机软件,连接 Air9000P;

AirSHT30_1000 与 Air780EPM 核心板接线说明:

两个 UART 端口及以上的串口板与 Air780EPM V1.3 开发板接线说明:

1、使用两根 USB 转 TTL 串口线连接电脑和开发板,第一根线和开发板的 UART1 TX 相连(电脑上的串口工具配置为 9600 波特率),第二根线和开发板的 UART RX 相连(电脑上的串口工具配置为 115200 波特率);

2、第一根线对应的电脑端串口工具下发 A0001 指令,就可以控制开发板拍照,拍照结束后,通过第二根线发给电脑端串口工具(每次接收到数据,可以单独保存为一个文件,修改文件名后缀为 jpg 格式,就能查看图片)

四、演示软件环境

1、烧录工具:Luatools 下载调试工具

2、串口工具:SSCOM 下载和使用说明

3、TCP 测试工具:TCP web 测试工具; 详细使用说明参考:合宙 TCP/UDP web 测试工具使用说明

4、MQTT 测试工具:MQTTX 工具

3、本demo开发测试时使用的固件为Air780EPM V2028 版本固件,本demo对固件版本没有什么特殊要求,所以你如果要测试本demo时,可以直接使用最新版本的内核固件Air780EPM固件Air780EHM固件;如果发现最新版本的内核固件测试有问题,可以使用我们开发本demo时使用的内核固件版本来对比测试。

4、脚本文件:

5、lib 脚本文件:使用 Luatools 烧录时,勾选 添加默认 lib 选项,使用默认 lib 脚本文件;

准备好软件环境之后,接下来根据 Air780EPM/EHM 核心板使用手册Air780EPM&Air780EHM_V1.3 整机(V1.3&带外壳)开发板使用说明中的烧录说明,将本篇文章中演示使用的项目文件烧录到 Air780EPM 核心板/开发板中。

五、软硬件相关资料

5.1 硬件设计相关资料

1、Air780EPM/EHM 模组硬件设计原理图参考这个资料

2、Air780EPM/EHM 模组管脚详细说明参考这个资料

5.2 软件相关资料

1、本文演示代码中与休眠相关的接口说明参考这个资料

2、本文演示代码中与管脚配置相关的接口说明参考这个资料

六、程序结构说明

6.1 目录结构

lowpower_new/
├── main.lua
├── readme.md
├── app/
│   ├── AirSHT30_1000.lua
│   ├── app_camera.lua
│   ├── app_lpuart.lua
│   ├── app_mqtt_main.lua
│   ├── app_mqtt_receiver.lua
│   ├── app_mqtt_sender.lua
│   ├── app_sht30.lua
│   ├── app_tcp_main.lua
│   ├── app_tcp_receiver.lua
│   └── app_tcp_sender.lua
├── drv/
│   ├── drv_lowpower.lua
│   ├── drv_normal.lua
│   └── drv_psm.lua
└── prj/
    ├── prj_0_1.lua
    ├── prj_0_tcp_long.lua
    ├── prj_1.lua
    ├── prj_1_mqtt_long.lua
    ├── prj_1_tcp_long.lua
    ├── prj_1_uart_camera.lua
    ├── prj_3.lua
    ├── prj_3_mqtt_short.lua
    └── prj_3_tcp_short.lua

6.2 文件说明

根目录文件

  • main.lua :项目主入口文件,负责初始化系统、加载配置文件和启动应用。
  • readme.md :项目说明文档,包含项目介绍、使用方法等信息。

app/ 目录

  • AirSHT30_1000.lua :SHT30 温湿度传感器驱动实现,提供传感器数据采集功能。
  • app_camera.lua :拍照功能应用模块,实现图像采集和处理。
  • app_lpuart.lua :低功耗 UART 通信模块,实现串口通信的低功耗优化。
  • app_mqtt_main.lua :MQTT 通信主模块,负责 MQTT 客户端的初始化和事件处理。
  • app_mqtt_receiver.lua :MQTT 消息接收模块,处理 MQTT 消息的接收和解析。
  • app_mqtt_sender.lua :MQTT 消息发送模块,管理 MQTT 消息的发送队列。
  • app_sht30.lua :SHT30 传感器应用逻辑,处理传感器数据的读取和处理。
  • app_tcp_main.lua :TCP 通信主模块,负责 TCP 连接的建立和管理。
  • app_tcp_receiver.lua :TCP 数据接收模块,处理 TCP 数据的接收和解析。
  • app_tcp_sender.lua :TCP 数据发送模块,管理 TCP 数据的发送队列。

drv/ 目录

  • drv_lowpower.lua :低功耗模式驱动配置功能模块。
  • drv_normal.lua :正常工作模式驱动配置功能模块。
  • drv_psm.lua :PSM+ 模式驱动配置功能模块。

prj/ 目录

  • prj_0_1.lua :常规模式与低功耗模式切换,应用项目主调度功能模块。
  • prj_0_tcp_long.lua :常规模式下 TCP 长连接应用项目主调度功能模块。
  • prj_1.lua :低功耗模式应用项目主调度功能模块。
  • prj_1_mqtt_long.lua :低功耗模式下 MQTT 长连接应用项目主调度功能模块。
  • prj_1_tcp_long.lua :低功耗模式下 TCP 长连接应用项目主调度功能模块。
  • prj_1_uart_camera.lua :低功耗模式下 UART CAMERA 应用项目主调度功能模块。
  • prj_3.lua :PSM+ 模式应用项目主调度功能模块。
  • prj_3_mqtt_short.lua :PSM+ 模式下 MQTT 短连接应用项目主调度功能模块。
  • prj_3_tcp_short.lua :PSM+ 模式下 TCP 短连接应用项目主调度功能模块。

七、核心模块详解

7.1 主入口模块(main.lua)

功能:项目的主入口点,负责初始化系统、加载配置和启动应用。

核心功能:

  • 定义项目名称和版本号
  • 加载指定的应用项目(通过注释/取消注释进行选择)
  • 可选配置错误日志记录功能
  • 可选配置内存监控功能
  • 启动系统运行

使用方式:通过取消注释选择要运行的项目,例如:

-- 常规模式下的tcp长连接项目(每5分钟发送一次数据到tcp server)
require "prj_0_tcp_long"

-- PSM+模式3简单项目
-- require "prj_3"

7.2 驱动模块(drv/)

驱动模块提供了三种功耗模式的配置实现:

drv_normal.lua - 常规模式驱动

功能:配置模组的常规工作模式。

核心功能:

  • 配置是否需要退出飞行模式(默认注释)
  • 管理 GPIO23 引脚(用于 Air780EXX 部分型号模组 GNSS 备电电源使能开关和 Gsensor 电源开关)
  • 设置最低功耗模式为常规模式

使用方式:通过在其他项目文件发布“DRV_SET_NORMAL”消息实现触发模式切换,切换至常规模式,例如:

-- 显式配置最低功耗模式为常规模式
-- 执行此代码时,处于常规模式(因为此task处于运行状态,会将系统自动切换为常规模式)
-- 执行此行代码后,会通过异步消息"DRV_SET_NORMAL"通知drv_normal功能模块配置常规模式
-- 等待sys.run()在分发处理到"DRV_SET_NORMAL"消息时,drv_normal功能模块才去配置常规模式
sys.publish("DRV_SET_NORMAL")

drv_lowpower.lua - 低功耗模式驱动

功能:配置模组的低功耗模式。

核心功能:

  • 中断唤醒配置:支持多种唤醒方式

    • PWR_KEY 引脚中断

    • CHG_DET (WAKEUP6) 引脚中断

    • WAKEUP0-5 引脚中断

    • VBUS (WAKEUP1) 引脚中断

    • UART1_RXD 数据接收中断(9600 波特率)

    • 功能项配置:

    • 飞行模式(默认关闭,可手动关闭 4G 网络能力,降低功耗)

    • USB 功能(自动关闭)

    • GNSS 备电电源开关及 Gsensor 电源开关(通过 GPIO23 控制,默认输出高电平)

    • 通用 AGPIO(GPIO24、GPIO25、GPIO26、GPIO27、GPIO28)

    • 通用 WAKEUP(WAKEUP0)

    • VBUS(WAKEUP1)

    • AGPIOWU(GPIO20/WAKEUP3、GPIO21/WAKEUP4、GPIO22/WAKEUP5)(根据模组型号配置)

    • PWR_KEY

    • CHG_DET(WAKEUP6)

    • 设置最低功耗模式为低功耗模式

使用方式:通过在其他项目文件发布“DRV_SET_LOWPOWER”消息实现触发模式切换,切换至低功耗模式,例如:

-- 显式配置最低功耗模式为低功耗模式
-- 执行此行代码后,会通过异步消息"DRV_SET_LOWPOWER"通知drv_lowpower功能模块配置低功耗模式
-- 所以执行此行代码后,并不会马上进入低功耗模式
-- 而是等待sys.run()在分发处理到"DRV_SET_LOWPOWER"消息时,drv_lowpower功能模块才去配置低功耗模式
-- 即使运行到了drv_lowpower功能模块,也不一定马上进入低功耗模式,只有配置过低功耗模式,并且当前内核固件和脚本没有task处于运行状态,才能进入真正进入低功耗
sys.publish("DRV_SET_LOWPOWER")

drv_psm.lua - PSM+ 模式驱动

功能:配置模组的 PSM+ 模式。

核心功能:

  • 中断唤醒配置:支持多种唤醒方式

    • 深度休眠定时器

    • PWR_KEY 引脚中断

    • CHG_DET (WAKEUP6) 引脚中断

    • WAKEUP0-5 引脚中断(根据模组型号配置)

    • VBUS (WAKEUP1) 引脚中断

    • UART1_RXD 数据接收中断(任意波特率)

    • 功能项配置:

    • 飞行模式(自动开启)

    • USB 功能(自动关闭)

    • GNSS 备电电源开关及 Gsensor 电源开关(通过 GPIO23 控制,默认输出高电平,脚本中配置为默认关闭)

    • 通用 AGPIO(GPIO24、GPIO25、GPIO26、GPIO27、GPIO28)

    • 通用 WAKEUP(WAKEUP0)

    • VBUS(WAKEUP1)

    • AGPIOWU(GPIO20/WAKEUP3、GPIO21/WAKEUP4、GPIO22/WAKEUP5)(根据模组型号配置)

    • PWR_KEY

    • CHG_DET(WAKEUP6)

    • 设置最低功耗模式为 PSM+ 模式

使用方式:通过在其他项目文件发布“DRV_SET_PSM”消息实现触发模式切换,切换至 PSM+ 模式,例如:

-- 发布消息“DRV_SET_PSM”,通知drv_psm驱动模块配置最低功耗模式为PSM+模式;
-- drv_psm驱动模块内部已有中断唤醒引脚和功能引脚的配置说明,根据实际项目需求打开或关闭对应配置代码即可;
-- 在执行完中断唤醒引脚和功能引脚的配置之后,调用pm.power(pm.WORK_MODE, 3)设置最低功耗模式为PSM+模式;
-- 设置完之后并不会里面进入休眠,而是等所有业务逻辑处理完毕之后,才会进入休眠;
sys.publish("DRV_SET_PSM")

7.3 应用模块(app/)

应用模块包含各种功能实现,按不同通信方式和传感器类型分类:

app_mqtt_main.lua - MQTT 客户端主模块

核心功能:

  • 创建和管理 MQTT 客户端连接
  • 处理连接、订阅、取消订阅、异常等事件
  • 协调数据发送和接收模块

关键实现:

  • mqtt_client_event_cbfunc:MQTT 客户端事件回调函数,处理各种 MQTT 事件
  • mqtt_client_main_task_func:MQTT 主任务函数,管理连接生命周期
  • 支持长连接和短连接模式
  • 实现自动重连机制

使用方式:

  • 通过在其他项目文件发布“MQTT_CLIENT_RUN_REQ”消息实现启动 MQTT 客户端,携带一个参数用于表示用短连接还是长连接(长连接为 true,表示断开连接后会自动重连;短连接为 false,表示断开连接后,不会自动重连),例如:
-- 发布消息“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)


-- 发布消息“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)
  • 通过在其他项目文件发布“MQTT_CLIENT_CLOSE_REQ”消息实现关闭 MQTT 客户端,例如:
-- 发布“MQTT_CLIENT_CLOSE_REQ”消息,主动断开 MQTT 客户端连接;
sys.publish("MQTT_CLIENT_CLOSE_REQ")

app_mqtt_sender.lua - MQTT 数据发送模块

核心功能:

  • 管理 MQTT 数据发送队列
  • 处理数据发送请求
  • 执行发送结果回调

关键实现:

  • send_data_req_proc_func:处理数据发送请求,将数据加入发送队列
  • publish_item:发送队列中的数据项
  • mqtt_client_sender_task_func:发送任务函数,处理发送事件

数据结构:

--[[
数据发送队列,数据结构为:
{
    [1] = {topic="topic1", payload="payload1", qos=0, cb={func=callback_function1, para=callback_para1}},
    [2] = {topic="topic2", payload="payload2", qos=1, cb={func=callback_function2, para=callback_para2}},
    [3] = {topic="topic3", payload="payload3", qos=2, cb={func=callback_function3, para=callback_para3}},
}

topic的内容为publish的主题,string类型,必须存在;
payload的内容为publish的负载数据,string类型,必须存在;
qos的内容为publish的质量等级,number类型,取值范围0,1,2,可选,如果用户没有指定,默认为0;
cb.func的内容为数据发送结果的用户回调函数,可以不存在;
cb.para的内容为数据发送结果的用户回调函数的回调参数,可以不存在;
]]

使用方式:

  • 通过在其他项目文件中发布“SEND_DATA_REQ”消息实现数据发送,携带关键参数,例如:
-- 发布消息“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})

app_mqtt_receiver.lua - MQTT 数据接收模块

核心功能 :

  • 处理接收到的 MQTT publish 数据
  • 将数据转发给其他应用模块

关键实现 :

  • mqtt_receiver.proc:处理接收到的 publish 数据
  • 将数据通过“RECV_DATA_FROM_SERVER”消息发布给其他模块

使用方式:

  • 通过在其他项目文件中订阅“RECV_DATA_FROM_SERVER”消息实现数据接收,携带回调函数,例如:
local function recv_data_from_server_proc(prefix, topic, payload)
    -- 用户处理代码;
end

-- 订阅"RECV_DATA_FROM_SERVER"消息的处理函数 recv_data_from_server_proc
-- 收到"RECV_DATA_FROM_SERVER"消息后,会执行函数 recv_data_from_server_proc
sys.subscribe("RECV_DATA_FROM_SERVER", recv_data_from_server_proc)

app_tcp_main.lua - TCP 客户端主模块

核心功能:

  • 创建和管理 TCP 客户端连接
  • 处理连接、连接异常和重连等事件
  • 协调数据发送和接收模块

关键实现:

  • tcp_client_main_task_func:TCP 主任务函数,管理连接生命周期
  • 支持长连接和短连接模式
  • 实现自动重连机制

使用方式:

  • 通过在其他项目文件发布“TCP_CLIENT_RUN_REQ”消息实现启动 TCP 客户端,携带一个参数用于表示用短连接还是长连接(长连接为 true,表示断开连接后会自动重连;短连接为 false,表示断开连接后,不会自动重连),例如:
-- 发布消息“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)


-- 发布消息“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)
  • 通过在其他项目文件发布“TCP_CLIENT_CLOSE_REQ”消息实现关闭 TCP 客户端,例如:
-- 发布“TCP_CLIENT_CLOSE_REQ”消息,主动断开 TCP 客户端连接;
sys.publish("TCP_CLIENT_CLOSE_REQ")

app_tcp_sender.lua - TCP 数据发送模块

核心功能:

  • 管理 TCP 数据发送队列
  • 处理数据发送请求
  • 执行发送结果回调

关键实现:

  • send_data_req_proc_func:处理数据发送请求,将数据加入发送队列
  • tcp_client_sender.proc:数据发送应用逻辑处理函数
  • tcp_client_sender.exception_proc:数据发送应用逻辑异常处理函数

数据结构:

--[[
数据发送队列,数据结构为:
{
    [1] = {data="data1", cb={func=callback_function1, para=callback_para1}},
    [2] = {data="data2", cb={func=callback_function2, para=callback_para2}},
}

data的内容为真正要发送的数据,必须存在;
func的内容为数据发送结果的用户回调函数,可以不存在
para的内容为数据发送结果的用户回调函数的回调参数,可以不存在;
]]

使用方式:

  • 通过在其他项目文件中发布“SEND_DATA_REQ”消息实现数据发送,携带关键参数,例如:
-- 发布消息“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})

app_tcp_receiver.lua - TCP 数据接收模块

核心功能 :

  • 处理接收到的 TCP 数据
  • 将数据转发给其他应用模块

关键实现 :

  • tcp_client_receiver.proc:处理接收到的数据
  • 将数据通过“RECV_DATA_FROM_SERVER”消息发布给其他模块

使用方式:

  • 通过在其他项目文件中订阅“RECV_DATA_FROM_SERVER”消息实现数据接收,携带回调函数,例如:
local function recv_data_from_server_proc(prefix, data)
    -- 用户处理代码;
end

-- 订阅"RECV_DATA_FROM_SERVER"消息的处理函数 recv_data_from_server_proc
-- 收到"RECV_DATA_FROM_SERVER"消息后,会执行函数 recv_data_from_server_proc
sys.subscribe("RECV_DATA_FROM_SERVER", recv_data_from_server_proc)

AirSHT30_1000.lua - SHT30 温湿度传感器驱动

核心功能 :

  • 提供 SHT30 传感器的底层驱动
  • 实现传感器初始化、数据读取等功能

关键实现:

  • AirSHT30_1000.open:配置打开 AirSHT30_1000 的函数
  • AirSHT30_1000.read:读取温湿度数据函数
  • AirSHT30_1000.close:配置关闭 AirSHT30_1000 的函数

使用方式:

  • 加载 AirSHT30_1000 驱动文件
  • 调用 AirSHT30_1000.open 函数打开 AirSHT30_1000
  • 调用 AirSHT30_1000.read 函数读取温湿度数据
-- 加载AirSHT30_1000驱动文件
local air_sht30 = require "AirSHT30_1000"

-- 打开sht30硬件
air_sht30.open(1)

-- 读取温湿度数据
local temprature, humidity = air_sht30.read()

-- 读取结果
if temprature then
    -- 打印输出结果(保留2位小数)
    log.info("read_sht30_req", "temprature", string.format("%.2f ℃", temprature))
    log.info("read_sht30_req", "humidity", string.format("%.2f %%RH", humidity))        
else
    log.error("read_sht30_task_func", "read error")
end

-- 关闭sht30硬件
air_sht30.close()

app_sht30.lua - SHT30 温湿度传感器应用

核心功能 :

  • 读取 SHT30 温湿度传感器数据
  • 处理传感器初始化和读取逻辑

使用方式 :

  • 通过在其他项目文件中发布“READ_SHT30_REQ”消息触发温湿度读取,例如:
-- 发布消息“READ_SHT30_REQ”,通知sht30_app应用功能模块(例如app_sht30.lua)读取温湿度数据;
sys.publish("READ_SHT30_REQ")
  • 通过订阅“READ_SHT30_RSP”消息等待读取结果,例如:
-- 如果在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)

app_camera.lua - 摄像头拍照控制模块

核心功能:

  • 控制摄像头拍照
  • 图像采集和处理

使用方式:

  • 通过在其他项目文件中发布“CAMERA_TAKE_PHOTO_REQ”消息控制拍照,例如:
-- 发布"CAMERA_TAKE_PHOTO_REQ"消息,实现拍照
sys.publish("CAMERA_TAKE_PHOTO_REQ")
  • 通过在其他项目文件中订阅“CAMERA_TAKE_PHOTO_RSP”消息获取图像数据,例如:
-- 拍照结果响应消息
local function camera_take_photo_rsp(result, data)
    if result then
        log.info("camera_take_photo_rsp", result, type(data), data:used())
        -- 用户代码
    else
        log.info("camera_take_photo_rsp", result)
        -- 用户代码
    end
end

-- 订阅拍照结果响应消息
sys.subscribe("CAMERA_TAKE_PHOTO_RSP", camera_take_photo_rsp)

app_lpuart.lua - 低功耗 UART 通信

核心功能:

  • 实现低功耗模式下的 UART 通信
  • 处理串口数据收发

使用方式:

  • 本演示代码固定与 app_camera.lua 搭配
  • 收到串口工具发来的 A0001 指令后发布“CAMERA_TAKE_PHOTO_REQ”消息通过 app_camera.lua 执行拍照
  • app_camera.lua 执行完拍照后会发布“CAMERA_TAKE_PHOTO_RSP”消息,同时携带操作结果和数据
  • 本模块需要提前订阅“CAMERA_TAKE_PHOTO_RSP”消息,在收到消息后,根据操作结果和数据执行后续操作

7.4 项目配置模块(prj/)

prj_0_tcp_long.lua - 常规模式下的 TCP 长连接项目

核心功能:

  • 保持 TCP 长连接,连接断开后自动重连
  • 每 5 分钟发送一次数据到 TCP 服务器
  • 持续运行在常规模式

prj_0_1.lua - 常规模式与低功耗模式切换项目

核心功能:

  • 自动的在常规模式和低功耗模式之间切换,演示 GPIO 与 AGPIO 输出电平的特性
  • 显式的在常规模式和低功耗模式之间切换,演示 GPIO 与 AGPIO 输出电平的特性

prj_1.lua - 低功耗模式简单项目

核心功能:

  • 配置低功耗模式
  • 演示低功耗模式下的基本操作

prj_1_tcp_long.lua - 低功耗模式下的 TCP 长连接项目

核心功能:

  • 保持 TCP 长连接,连接断开后自动重连
  • 每 5 分钟发送一次数据到 TCP 服务器
  • 空闲时进入低功耗模式

prj_1_mqtt_long.lua - 低功耗模式下的 MQTT 长连接项目

核心功能:

  • 保持 MQTT 长连接,连接断开后自动重连
  • 每 5 分钟发送一次数据到 MQTT 服务器
  • 空闲时进入低功耗模式

prj_1_uart_camera.lua - 低功耗模式下的串口控制拍照项目

核心功能:

  • 低功耗模式下运行
  • 通过 UART1 接收上位机拍照指令
  • 拍照后通过串口将图像数据回传给上位机

prj_3.lua - PSM+ 模式简单项目

核心功能:

  • 配置 PSM+ 模式
  • 演示 PSM+ 模式下的基本操作

prj_3_tcp_short.lua - PSM+ 模式下的 TCP 短连接项目

核心功能:

  • 每次开机发送一次数据到 TCP 服务器
  • 无论成功还是失败,然后进入 PSM+ 模式
  • 配置深度休眠定时器,1 小时后唤醒,重复操作

prj_3_mqtt_short.lua - PSM+ 模式下的 MQTT 短连接项目

核心功能:

  • 每次开机读取一次温湿度数据
  • 发送数据到 MQTT 服务器
  • 无论成功还是失败,然后进入 PSM+ 模式
  • 配置深度休眠定时器,1 小时后唤醒,重复操作

八、项目演示及功耗说明

8.1 常规模式下的 TCP 长连接项目

8.1.1 硬件准备

硬件环境如接线说明请看第三章,此处仅作简单说明;

本项目需要准备的硬件有:两根数据线、物联网卡、Air780EPM 核心板、两根公对母杜邦线。

根据第三章说明进行连接,连接好之后的结果图如下:

特别注意:使用外部供电时,一定一定一定要把拨码开关拨到 OFF 档位。

8.1.2 软件准备

本小节所需要用到的脚本文件、内核固件、工具均在第四章可以获取。

在 main.lua 代码文件取消 require “prj_0_tcp_long” 的注释,其他项目注释掉。

打开合宙 TCP web 测试工具,根据箭头指示鼠标左键点击“打开 TCP”按钮。 详细使用说明参考:合宙 TCP/UDP web 测试工具使用说明

打开 TCP 之后的效果图如下:

打开 app\app_tcp_main.lua 代码文件,在下图中箭头所指位置更换 IP 地址和端口,添加上图 TCP web 工具中显示的 IP 地址和端口号。

打开 Luatools 烧录工具,根据下图中的指示说明创建一个新项目。

再根据下图中的指示导入内核固件和脚本文件,先不用进行烧录操作。

根据 Luatools 烧录工具 中的烧录说明学习一下如何烧录,再根据 Air9000P 功耗分析仪使用手册学习一下如何使用。然后打开 Air9000P,配置输出 3.8V 2A 给 Air780EPM 核心板供电,最后在 Luatools 工具上开始烧录。

特别注意:TCP web 工具在“打开 TCP”之后如果长时间未连接会自动关闭,在开始烧录时需要检查一下 TCP web 工具是否已经关闭,如果已经关闭,需要重新打开,此时端口号会发生变化,需要重新在代码中修改端口号。

烧录完成且 TCP 连接成功后,模组会先向 TCP 服务器发送第一条消息,此后每 5 分钟循环发送一次消息。

8.1.3 功耗表现

1、如果你用的是 Air9000 或者 Air9000P 功耗分析仪,可通过对应的上位机查看功耗表现。

2、演示使用的是 Air780EPM 模组,模组内部不包含 GNSS、Gsensor、Audio Codec 芯片。

3、使用内含 GNSS、Gsensor 芯片的模组测试时,GNSS、Gsensor 功耗总和约占 30uA 左右。

4、使用内含 Audio Codec 芯片的模组测试时,Audio Codec 功耗约占 45uA 左右。

本项目测试环境:Air780EPM 核心板,3.8V 供电,插物联网卡,运行 6 分钟,总平均电流为 7.4493mA。

下图紫色区域为模组在常规模式待机状态下的运行区间,平均电流为 6.5736mA。图中每一个电流小尖峰,均为模组与基站按照 3GPP 协议强制要求完成的底层网络保活交互。这类交互是协议规定的必要动作,无法省略;若省去该类交互,模组将无法维持网络连接,会出现掉网、无法正常通信的问题。

下图紫色区域为模组向 TCP 服务器发送单次数据时的运行区间平均电流为 13.8212mA。该区间的运行时长,主要会受到 TCP 服务器响应速度、蜂窝网络信号质量与信令交互时长、数据收发量、业务交互流程影响。

下图为模组从上电开机到测试结束的完整运行区间,平均电流为 7.4493mA

功耗数据资料下载,通过下图在上位机对应位置打开查看:

常规模式下的 TCP 长连接项目.iotpl

8.2 常规模式与低功耗模式切换项目

8.2.1 硬件准备

硬件环境如接线说明请看第三章,此处仅作简单说明;

本项目需要准备的硬件有:两根数据线、物联网卡、Air780EPM 核心板、两根公对母杜邦线。

根据第三章说明进行连接,连接好之后的结果图如下:

特别注意:使用外部供电时,一定一定一定要把拨码开关拨到 OFF 档位。

8.2.2 软件准备

本小节所需要用到的脚本文件、内核固件、工具均在第四章可以获取。

在 main.lua 代码文件取消 require “prj_0_1” 的注释,其他项目注释掉。

打开 Luatools 烧录工具,根据下图中的指示说明创建一个新项目。

再根据下图中的指示导入内核固件和脚本文件,先不用进行烧录操作。

根据 Luatools 烧录工具 中的烧录说明学习一下如何烧录,再根据 Air9000P 功耗分析仪使用手册学习一下如何使用。然后打开 Air9000P,配置输出 3.8V 2A 给 Air780EPM 核心板供电,最后在 Luatools 工具上开始烧录。

8.2.3 功耗表现

1、如果你用的是 Air9000 或者 Air9000P 功耗分析仪,可通过对应的上位机查看功耗表现。

2、演示使用的是 Air780EPM 模组,模组内部不包含 GNSS、Gsensor、Audio Codec 芯片。

3、使用内含 GNSS、Gsensor 芯片的模组测试时,GNSS、Gsensor 功耗总和约 30uA。

4、使用内含 Audio Codec 芯片的模组测试时,Audio Codec 功耗约占 45uA 左右。

本项目测试环境一:Air780EPM 核心板,3.8V 供电,插物联网卡,运行 5 分钟,总平均电流为 2.9706mA,各部分平均电流见下表:

下图紫色区域为模块从冷启动上电开机、完成初始化入网与全流程常规工作运行,到切换进入低功耗模式之前的运行区间,平均电流为 15.5026mA

下图紫色区域为模组处于低功耗模式、未切换至常规模式的运行区间,平均电流为 3.6554mA。该阶段功耗略高于无业务操作的纯低功耗模式待机功耗,核心原因是此阶段代码通过 for 循环每秒执行一次 GPIO 电平配置操作,产生了额外的硬件触发与内核调度开销,因此出现小幅功耗抬升。

下图紫色区域为模组从低功耗模式切回常规模式的运行区间,平均电流为 6.5100mA,显著低于开机初始常规模式的功耗。核心原因是:首次常规模式为模组冷启动,需完成全量硬件初始化、完整蜂窝网络注册,射频与基带负载高;而本次切换时,模组已保留完整的硬件初始化状态、蜂窝网络注册上下文与系统运行环境,无需重复冷启动全流程操作,仅需恢复射频链路与业务通路,因此功耗大幅降低。

下图紫色区域为模组从第二次切换到低功耗模式到测试结束的运行区间,平均电流为 1.0962mA。该区间的功耗波动对应一类规律性的周期性运行动作:

1、短周期的小幅功耗抬升:为模组在低功耗模式下,与基站按照 3GPP 协议强制要求完成的底层网络保活交互,这类交互是协议规定的必要动作,无法省略,省略后会导致模组无法维持网络连接,出现掉网、无法正常网络通信的问题。

下图为模组从上电开机到测试结束的完整运行区间,平均电流为 2.9706mA

功耗数据资料下载,通过下图在上位机对应位置打开查看:

常规模式与低功耗模式切换项目_test1.iotpl

本项目测试环境二:Air780EPM 核心板,3.8V 供电,不插物联网卡,运行 5 分钟,总平均电流为 1.1815mA,各部分平均电流见下表:

下图紫色区域为模组从冷启动上电开机、完成初始化配置,到切换进入低功耗模式之前的运行区间,平均电流为 6.6964mA

下图紫色区域为模组处于低功耗模式、未切换至常规模式的运行区间,平均电流为 169.0649uA。该阶段功耗略高于无业务操作的纯低功耗模式,核心原因是此阶段代码通过 for 循环每秒执行一次 GPIO 电平配置操作,产生了额外的硬件触发与内核调度开销,因此出现小幅功耗抬升。

下图紫色区域为模组从低功耗模式切回常规模式的运行区间,平均电流为 4.9150mA,显著低于开机初始常规模式的功耗。核心原因是:首次常规模式为模组冷启动,需完成全量初始化配置;而本次切换时,模组已保留完整的初始化状态、系统运行环境,无需重复冷启动全流程操作,因此功耗大幅降低。

下图紫色区域为模组从第二次切换到低功耗模式到测试结束的运行区间,平均电流为 67.5286uA

下图为模组从上电开机到测试结束的完整运行区间,平均电流为 1.1815mA

功耗数据资料下载,通过下图在上位机对应位置打开查看:

常规模式与低功耗模式切换项目_test2.iotpl

8.3 低功耗模式简单项目

8.3.1 硬件准备

硬件环境如接线说明请看第三章,此处仅作简单说明;

本项目需要准备的硬件有:两根数据线、物联网卡、Air780EPM 核心板、两根公对母杜邦线。

根据第三章说明进行连接,连接好之后的结果图如下:

特别注意:使用外部供电时,一定一定一定要把拨码开关拨到 OFF 档位。

8.3.2 软件准备

本小节所需要用到的脚本文件、内核固件、工具均在第四章可以获取。

在 main.lua 代码文件取消 require “prj_1” 的注释,其他项目注释掉。

本项目共测试三个环境(见 8.3.3 节),其中有一个测试环境需要在脚本中配置进入飞行模式,如下图所示,需要在 drv\drv_lowpower.lua 代码文件中对应位置去掉注释,其他两个测试环境不需要配置进入飞行模式,需要注意。

打开 Luatools 烧录工具,根据下图中的指示说明创建一个新项目。

再根据下图中的指示导入内核固件和脚本文件,先不用进行烧录操作。

根据 Luatools 烧录工具 中的烧录说明学习一下如何烧录,再根据 Air9000P 功耗分析仪使用手册学习一下如何使用。然后打开 Air9000P,配置输出 3.8V 2A 给 Air780EPM 核心板供电,最后在 Luatools 工具上开始烧录。

8.3.3 功耗表现

1、如果你用的是 Air9000 或者 Air9000P 功耗分析仪,可通过对应的上位机查看功耗表现。

2、演示使用的是 Air780EPM 模组,模组内部不包含 GNSS、Gsensor、Audio Codec 芯片。

3、使用内含 GNSS、Gsensor 芯片的模组测试时,GNSS、Gsensor 功耗总和约 30uA。

4、使用内含 Audio Codec 芯片的模组测试时,Audio Codec 功耗约占 45uA 左右。

本项目测试环境一:Air780EPM 核心板,3.8V 供电,插物联网卡,运行 5 分钟,总平均电流为 1.4245mA。

下图紫色区域为模组在低功耗模式下待机的运行区间,平均电流为 1.0488mA。该区间的功耗波动对应一类规律性的周期性运行动作:

1、短周期的小幅功耗抬升:为模组在低功耗模式下,与基站按照 3GPP 协议强制要求完成的底层网络保活交互,这类交互是协议规定的必要动作,无法省略,省略后会导致模组无法维持网络连接,出现掉网、无法正常网络通信的问题。

下图为模组从上电开机到测试结束的完整运行区间,平均电流为 1.4245mA

功耗数据资料下载,通过下图在上位机对应位置打开查看:

低功耗模式简单项目_test1.iotpl

本项目测试环境二:Air780EPM 核心板,3.8V 供电,插物联网卡,软件配置进入飞行模式,运行 5 分钟,总平均电流为 120.1332uA。

下图紫色区域为模组在低功耗模式下待机的运行区间,平均电流为 41.3490uA

下图为模组从上电开机到测试结束的完整运行区间,平均电流为 120.1332uA

功耗数据资料下载,通过下图在上位机对应位置打开查看:

低功耗模式简单项目_test2.iotpl

本项目测试环境三:Air780EPM 核心板,3.8V 供电,不插物联网卡,运行 5 分钟,总平均电流为 111.5262uA。

下图紫色区域为模组在低功耗模式下待机的运行区间,平均电流为 44.1876uA

下图为模组从上电开机到测试结束的完整运行区间,平均电流为 111.5262uA

功耗数据资料下载,通过下图在上位机对应位置打开查看:

低功耗模式简单项目_test3.iotpl

8.4 低功耗模式下的 TCP 长连接项目

8.4.1 硬件准备

硬件环境如接线说明请看第三章,此处仅作简单说明;

本项目需要准备的硬件有:两根数据线、物联网卡、Air780EPM 核心板、两根公对母杜邦线。

根据第三章说明进行连接,连接好之后的结果图如下:

特别注意:使用外部供电时,一定一定一定要把拨码开关拨到 OFF 档位。

8.4.2 软件准备

本小节所需要用到的脚本文件、内核固件、工具均在第四章可以获取。

在 main.lua 代码文件取消 require “prj_1_tcp_long” 的注释,其他项目注释掉。

打开合宙 TCP web 测试工具,根据箭头指示鼠标左键点击“打开 TCP”按钮。 详细使用说明参考:合宙 TCP/UDP web 测试工具使用说明

打开 TCP 之后的效果图如下:

打开 app\app_tcp_main.lua 代码文件,在下图中箭头所指位置更换 IP 地址和端口,添加上图 TCP web 工具中显示的 IP 地址和端口号。

打开 Luatools 烧录工具,根据下图中的指示说明创建一个新项目。

再根据下图中的指示导入内核固件和脚本文件,先不用进行烧录操作。

根据 Luatools 烧录工具 中的烧录说明学习一下如何烧录,再根据 Air9000P 功耗分析仪使用手册学习一下如何使用。然后打开 Air9000P,配置输出 3.8V 2A 给 Air780EPM 核心板供电,最后在 Luatools 工具上开始烧录。

特别注意:TCP web 工具在“打开 TCP”之后如果长时间未连接会自动关闭,在开始烧录时需要检查一下 TCP web 工具是否已经关闭,如果已经关闭,需要重新打开,此时端口号会发生变化,需要重新在代码中修改端口号。

烧录完成且 TCP 连接成功后,模组会先向 TCP 服务器发送第一条消息,此后每 5 分钟循环发送一次消息。

8.4.3 功耗表现

1、如果你用的是 Air9000 或者 Air9000P 功耗分析仪,可通过对应的上位机查看功耗表现。

2、演示使用的是 Air780EPM 模组,模组内部不包含 GNSS、Gsensor、Audio Codec 芯片。

3、使用内含 GNSS、Gsensor 芯片的模组测试时,GNSS、Gsensor 功耗总和约 30uA。

4、使用内含 Audio Codec 芯片的模组测试时,Audio Codec 功耗约占 45uA 左右。

本项目测试环境:Air780EPM 核心板,3.8V 供电,插物联网卡,运行 6 分钟,总平均电流为 1.7344mA,各部分平均电流见下表:

下图紫色区域为模组从进入低功耗模式到向 TCP 服务器发送数据之前处于待机状态时的运行区间,平均电流为 1.1185mA。该区间的功耗波动对应一类规律性的周期性运行动作:

1、短周期的小幅功耗抬升:为模组在低功耗模式下,与基站按照 3GPP 协议强制要求完成的底层网络保活交互,这类交互是协议规定的必要动作,无法省略,省略后会导致模组无法维持网络连接,出现掉网、无法正常网络通信的问题。

下图为模组从低功耗模式唤醒后向 TCP 服务器发送一次数据到重新进入休眠时所持续的运行区间,平均电流为 17.3294mA。该区间的运行时长,主要会受到 TCP 服务器响应速度、蜂窝网络信号质量与信令交互时长、数据收发量、模组休眠触发策略、业务交互流程影响。

下图为模组从上电开机到测试结束的完整运行区间,平均电流为 1.7344mA

功耗数据资料下载,通过下图在上位机对应位置打开查看:

低功耗模式下的 TCP 长连接项目.iotpl

8.5 低功耗模式下的 MQTT 长连接项目

8.5.1 硬件准备

硬件环境如接线说明请看第三章,此处仅作简单说明;

本项目需要准备的硬件有:两根数据线、物联网卡、Air780EPM 核心板、两根公对母杜邦线。

根据第三章说明进行连接,连接好之后的结果图如下:

特别注意:使用外部供电时,一定一定一定要把拨码开关拨到 OFF 档位。

8.5.2 软件准备

本小节所需要用到的脚本文件、内核固件、工具均在第四章可以获取。

在 main.lua 代码文件取消 require “prj_1_mqtt_long” 的注释,其他项目注释掉。

在 app\app_mqtt_main.lua 代码文件中找到 MQTT 服务器地址和端口(可自由配置)

打开 MQTTX 工具,根据下图所示,创建 MQTT 客户端。

在 prj\prj_1_mqtt_long.lua 代码文件中找到模组发送 MQTT 消息时的发布主题,如下图所示,发布主题是由 设备 IMEI 号、/up 两部分组成,如果设备 IMEI 号是 123,那么完整的发布主题就是 123/up。

如下图所示,根据指示添加订阅主题。

打开 Luatools 烧录工具,根据下图中的指示说明创建一个新项目。

再根据下图中的指示导入内核固件和脚本文件,先不用进行烧录操作。

根据 Luatools 烧录工具 中的烧录说明学习一下如何烧录,再根据 Air9000P 功耗分析仪使用手册学习一下如何使用。然后打开 Air9000P,配置输出 3.8V 2A 给 Air780EPM 核心板供电,最后在 Luatools 工具上开始烧录。

模组烧录成功开机后,建立 MQTT 客户端,建立成功后会先向 MQTT 服务器发送第一条消息,订阅对应主题的其他 MQTT 客户端可以收到这条消息,此后每 5 分钟循环发送一次消息。

8.5.3 功耗表现

1、如果你用的是 Air9000 或者 Air9000P 功耗分析仪,可通过对应的上位机查看功耗表现。

2、演示使用的是 Air780EPM 模组,模组内部不包含 GNSS、Gsensor、Audio Codec 芯片。

3、使用内含 GNSS、Gsensor 芯片的模组测试时,GNSS、Gsensor 功耗总和约 30uA。

4、使用内含 Audio Codec 芯片的模组测试时,Audio Codec 功耗约占 45uA 左右。

本项目测试环境:Air780EPM 核心板,3.8V 供电,插物联网卡,运行 6 分钟,总平均电流为 1.7925mA,各部分平均电流见下表:

下图紫色区域为模组从进入低功耗模式到向 MQTT 服务器发送数据之前处于待机状态时的运行区间,平均电流为 1.0391mA。该区间的功耗波动对应一类规律性的周期性运行动作:

1、短周期的小幅功耗抬升:为模组在低功耗模式下,与基站按照 3GPP 协议强制要求完成的底层网络保活交互,这类交互是协议规定的必要动作,无法省略,省略后会导致模组无法维持网络连接,出现掉网、无法正常网络通信的问题。

下图紫色区域为模组进入低功耗模式后从唤醒向 MQTT 服务器发送心跳包到再次进入休眠时的运行区间,平均电流为 17.1927mA。本测试环境中并未对发送心跳包的时间间隔进行设置,那么在 LuatOS 中,默认心跳时间间隔为 240 秒,不过实际的心跳发送时间间隔 = 设置的心跳时间间隔 x 0.75,这是系统防止因网络问题导致心跳包未在设定时间到达服务器时所执行的策略,从而确保连接的稳定性,因此实际发送时间间隔为 240 x 0.75 = 180 秒。

下图紫色区域为模组从进入低功耗模式后从唤醒向 MQTT 服务器发送一次数据到再次进入休眠时的运行区间,平均电流为 14.7951mA

下图为模组从上电开机到测试结束时的完整运行区间,平均电流为 1.7925mA

功耗数据资料下载,通过下图在上位机对应位置打开查看:

低功耗模式下的 MQTT 长连接项目.iotpl

8.6 低功耗模式下的串口控制拍照项目

8.6.1 硬件准备

硬件环境如接线说明请看第三章,此处仅作简单说明;

本项目需要准备的硬件有:两根数据线、一个支持双 UART 端口的串口板或者两个串口板、Air780EPM 开发板、AirCAMERA _1040 摄像头模组、两根公对母杜邦线、三根母对母杜邦线。

根据第三章说明进行连接,连接好之后的结果图如下:

特别注意:使用外部供电时,一定一定一定要把拨码开关拨到“外部供电”档位。

8.6.2 软件准备

本小节所需要用到的脚本文件、内核固件、工具均在第四章可以获取。

在 main.lua 代码文件取消 require “prj_1_uart_camera” 的注释,其他项目注释掉。

打开 Luatools 烧录工具,根据下图中的指示说明创建一个新项目。

再根据下图中的指示导入内核固件和脚本文件,先不用进行烧录操作。

根据 Luatools 烧录工具 中的烧录说明学习一下如何烧录,再根据 Air9000P 功耗分析仪使用手册学习一下如何使用。然后打开 Air9000P,配置输出 3.8V 2A 给 Air780EPM 开发板供电,最后在 Luatools 工具上开始烧录。

打开两个 SSCOM 工具,如下图所示进行配置。

在接收图像数据的 SSCOM 工具上,按照下图指示操作。

向模组发送 A0001 指令控制开始拍照。

找到接收图像数据的文件路径,待接收完数据后将文件后缀改成 jpg 格式即可查看拍到的图像。

改好之后鼠标右键打开此文件即可看到图像。

8.6.3 功耗表现

1、如果你用的是 Air9000 或者 Air9000P 功耗分析仪,可通过对应的上位机查看功耗表现。

2、演示使用的是 Air780EPM 模组,模组内部不包含 GNSS、Gsensor、Audio Codec 芯片。

3、使用内含 GNSS、Gsensor 芯片的模组测试时,GNSS、Gsensor 功耗总和约 30uA。

4、使用内含 Audio Codec 芯片的模组测试时,Audio Codec 功耗约占 45uA 左右。

本项目测试环境:Air780EPM 开发板,3.8V 供电,不插物联网卡,运行 5 分钟,总平均电流为 250.5125uA,各部分功耗表现见下表:

下图紫色区域为模组在低功耗模式下待机休眠时的运行区间,平均电流为 76.1548uA

下图紫色区域为模组收到拍照指令后从休眠中唤醒并执行拍照操作到拍照结束时的运行区间,平均电流为 9.4711mA

下图紫色区域为模组从拍照结束开始串口传输图像数据到传输结束进入休眠时的运行区间,平均电流为 4.9742mA。运行时间长短取决于串口传输速率和图像数据大小,速率越慢,时间越长,图像数据越大,时间也越长。

下图为模组从开机到测试结束的运行区间,平均电流为 250.5125uA

功耗数据资料下载,通过下图在上位机对应位置打开查看:

低功耗模式下的串口控制拍照项目.iotpl

8.7 PSM+ 模式简单项目

8.7.1 硬件准备

硬件环境如接线说明请看第三章,此处仅作简单说明;

本项目需要准备的硬件有:两根数据线、物联网卡、Air780EPM 核心板、两根公对母杜邦线。

根据第三章说明进行连接,连接好之后的结果图如下:

特别注意:使用外部供电时,一定一定一定要把拨码开关拨到 OFF 档位。

8.7.2 软件准备

本小节所需要用到的脚本文件、内核固件、工具均在第四章可以获取。

在 main.lua 代码文件取消 require “prj_3” 的注释,其他项目注释掉。

打开 Luatools 烧录工具,根据下图中的指示说明创建一个新项目。

再根据下图中的指示导入内核固件和脚本文件,先不用进行烧录操作。

根据 Luatools 烧录工具 中的烧录说明学习一下如何烧录,再根据 Air9000P 功耗分析仪使用手册学习一下如何使用。然后打开 Air9000P,配置输出 3.8V 2A 给 Air780EPM 核心板供电,最后在 Luatools 工具上开始烧录。

8.7.3 功耗表现

1、如果你用的是 Air9000 或者 Air9000P 功耗分析仪,可通过对应的上位机查看功耗表现。

2、演示使用的是 Air780EPM 模组,模组内部不包含 GNSS、Gsensor、Audio Codec 芯片。

3、使用内含 GNSS、Gsensor 芯片的模组测试时,GNSS、Gsensor 功耗总和约 30uA。

4、使用内含 Audio Codec 芯片的模组测试时,Audio Codec 功耗约占 45uA 左右。

本项目测试环境一:Air780EPM 核心板,3.8V 供电,插物联网卡,运行 5 分钟,总平均电流为 72.3514uA。

下图紫色区域为模组在 PSM+ 模式下待机的运行区间,平均电流为 2.6499uA

下图为模组从开机到测试结束的运行区间,平均电流为 72.3514uA

功耗数据资料下载,通过下图在上位机对应位置打开查看:

PSM+ 模式简单项目_test1.iotpl

本项目测试环境二:Air780EPM 核心板,3.8V 供电,不插物联网卡,运行 5 分钟,总平均电流为 69.9432uA。

下图紫色区域为模组在 PSM+ 模式下待机的运行区间,平均电流为 2.6594uA

下图为模组从开机到测试结束的运行区间,平均电流为 69.9432uA

功耗数据资料下载,通过下图在上位机对应位置打开查看:

PSM+ 模式简单项目_test2.iotpl

8.8 PSM+ 模式下的 TCP 短连接项目

8.8.1 硬件准备

硬件环境如接线说明请看第三章,此处仅作简单说明;

本项目需要准备的硬件有:两根数据线、物联网卡、Air780EPM 核心板、两根公对母杜邦线。

根据第三章说明进行连接,连接好之后的结果图如下:

特别注意:使用外部供电时,一定一定一定要把拨码开关拨到 OFF 档位。

8.8.2 软件准备

本小节所需要用到的脚本文件、内核固件、工具均在第四章可以获取。

在 main.lua 代码文件取消 require “prj_3_tcp_short” 的注释,其他项目注释掉。

打开合宙 TCP web 测试工具,根据箭头指示鼠标左键点击“打开 TCP”按钮。 详细使用说明参考:合宙 TCP/UDP web 测试工具使用说明

打开 TCP 之后的效果图如下:

打开 app\app_tcp_main.lua 代码文件,在下图中箭头所指位置更换 IP 地址和端口,添加上图 TCP web 工具中显示的 IP 地址和端口号。

打开 Luatools 烧录工具,根据下图中的指示说明创建一个新项目。

再根据下图中的指示导入内核固件和脚本文件,先不用进行烧录操作。

根据 Luatools 烧录工具 中的烧录说明学习一下如何烧录,再根据 Air9000P 功耗分析仪使用手册学习一下如何使用。然后打开 Air9000P,配置输出 3.8V 2A 给 Air780EPM 核心板供电,最后在 Luatools 工具上开始烧录。

特别注意:TCP web 工具在“打开 TCP”之后如果长时间未连接会自动关闭,在开始烧录时需要检查一下 TCP web 工具是否已经关闭,如果已经关闭,需要重新打开,此时端口号会发生变化,需要重新在代码中修改端口号。

烧录完成且 TCP 连接成功后,模组会立即向 TCP 服务器发送一条消息,无论发送成功还是失败,然后断开 TCP 连接,进入 PSM+ 模式,1 个小时后唤醒,重新执行刚才的操作。

8.8.3 功耗表现

1、如果你用的是 Air9000 或者 Air9000P 功耗分析仪,可通过对应的上位机查看功耗表现。

2、演示使用的是 Air780EPM 模组,模组内部不包含 GNSS、Gsensor、Audio Codec 芯片。

3、使用内含 GNSS、Gsensor 芯片的模组测试时,GNSS、Gsensor 功耗总和约 30uA。

4、使用内含 Audio Codec 芯片的模组测试时,Audio Codec 功耗约占 45uA 左右。

本项目测试环境:Air780EPM 核心板,3.8V 供电,插物联网卡,运行 5 分钟,总平均电流为 283.1520uA,各部分功耗表现见下表:

下图紫色区域为模组从上电开机连接 TCP 服务器并发送一条消息后到进入 PSM+ 模式休眠之前的运行区间,平均电流为 25.9587mA

下图紫色区域为模组在 PSM+ 模式下休眠待机时的运行区间,平均电流为 3.5034uA

下图为模组从上电开机到测试结束时的运行区间,平均电流为 283.1520uA

功耗数据资料下载,通过下图在上位机对应位置打开查看:

PSM+ 模式下的 TCP 短连接项目.iotpl

8.9 PSM+ 模式下的 MQTT 短连接项目

8.9.1 硬件准备

硬件环境如接线说明请看第三章,此处仅作简单说明;

本项目需要准备的硬件有:两根数据线、物联网卡、AirSHT30_1000 温湿度传感器配件板、Air780EPM 核心板、两根公对母杜邦线、四根母对母杜邦线。

根据第三章说明进行连接,连接好之后的结果图如下:

特别注意:使用外部供电时,一定一定一定要把拨码开关拨到 OFF 档位。

8.9.2 软件准备

本小节所需要用到的脚本文件、内核固件、工具均在第四章可以获取。

在 main.lua 代码文件取消 require “prj_3_mqtt_short” 的注释,其他项目注释掉。

在 app\app_mqtt_main.lua 代码文件中找到 MQTT 服务器地址和端口(可自由配置)

打开 MQTTX 工具,根据下图所示,创建 MQTT 客户端。

在 prj\prj_1_mqtt_long.lua 代码文件中找到模组发送 MQTT 消息时的发布主题,如下图所示,发布主题是由 设备 IMEI 号、/up 两部分组成,如果设备 IMEI 号是 123,那么完整的发布主题就是 123/up。

如下图所示,根据指示添加订阅主题。

打开 Luatools 烧录工具,根据下图中的指示说明创建一个新项目。

再根据下图中的指示导入内核固件和脚本文件,先不用进行烧录操作。

根据 Luatools 烧录工具 中的烧录说明学习一下如何烧录,再根据 Air9000P 功耗分析仪使用手册学习一下如何使用。然后打开 Air9000P,配置输出 3.8V 2A 给 Air780EPM 核心板供电,最后在 Luatools 工具上开始烧录。

模组烧录成功开机后,建立 MQTT 客户端,同时调用读取温湿度数据的接口,MQTT 客户端建立成功后会向 MQTT 服务器发送第一条消息,消息中包含温湿度数值,订阅对应主题的其他 MQTT 客户端可以收到这条消息,无论发送成功还是失败,然后断开 MQTT 连接,进入 PSM+ 模式,1 个小时后唤醒,重新执行刚才的操作。

8.9.3 功耗表现

1、如果你用的是 Air9000 或者 Air9000P 功耗分析仪,可通过对应的上位机查看功耗表现。

2、演示使用的是 Air780EPM 模组,模组内部不包含 GNSS、Gsensor、Audio Codec 芯片。

3、使用内含 GNSS、Gsensor 芯片的模组测试时,GNSS、Gsensor 功耗总和约 30uA。

4、使用内含 Audio Codec 芯片的模组测试时,Audio Codec 功耗约占 45uA 左右。

本项目测试环境:Air780EPM 核心板,3.8V 供电,插物联网卡,运行 5 分钟,总平均电流为 226.8339uA,各部分平均电流见下表:

下图紫色区域为模组从上电开机连接 MQTT 服务器并发送一条温湿度数据消息后到进入 PSM+ 模式休眠之前的运行区间,平均电流为 26.0358mA

下图紫色区域为模组在 PSM+ 模式下休眠待机时的运行区间,平均电流为 2.5938uA

下图为模组从上电开机到测试结束时的运行区间,平均电流为 226.8339uA

功耗数据资料下载,通过下图在上位机对应位置打开查看:

PSM+ 模式下的 MQTT 短连接项目.iotpl

九、常见问题

9.1 低功耗模式和 PSM+ 模式下唤醒的方式都有哪些?

9.1.1 低功耗模式可唤醒方式

进入低功耗模式以后,WAKEUP 和 AGPIO 可以保持电平、输入和中断功能,但是有一点非常重要,所有的 GPIO 都将不可控制!!!所以所有的 IO 管脚必须要在进入低功耗模式之前配置好,然后再进入低功耗模式。

进入低功耗模式后,代码是继续工作的,如果有需要控制 IO 或者通过 IO 传输数据的任务时,就需要通过唤醒的方式,让模组进入常规模式,执行完工作后再进入低功耗模式,我们提供了以下的唤醒方式:

**pm.power(pm.WORK_MODE, 0)代码主动唤醒:**因为低功耗模式下代码还是继续在跑的,所以可以在代码中通过 sys.wait(ms) 或者 sys.waitUntil() 阻塞任务,直到定时超时或者有任务消息推送时执行 pm.power(pm.WORK_MODE,0) 让模块回到常规模式,执行完任务后再通过 pm.power(pm.WORK_MODE, 1) 回到低功耗模式待机即可。

**定时器中断唤醒:**在代码中可以配置 timerStart 或者 timerLoopStart 定时器,在配置的 function 中执行所需要完成的定时任务,任务逻辑必须按照先回到常规模式 - 执行任务完成 - 回到低功耗模式这个顺序,确保模块在执行任务时所有 GPIO 可控制,避免造成异常。

**WAKEUP 中断唤醒:**在低功耗模式下,普通的 GPIO 为了降低功耗,都是进入高阻态的,仅 WAKEUP 可以保持电平输入和中断功能,所以只需要在进入低功耗模式以前,将需要中断唤醒的管脚配置为中断模式,即可在管脚出发中断时执行对应的 function,然后再通过回到常规模式 -> 执行任务完成 -> 回到低功耗模式这个顺序完成对应的任务即可。780EPM/EHM 的 WAKEUP IO:

9.1.2 PSM+ 模式可唤醒方式

进入 PSM+ 模式后,代码停跑,我们提供了以下三种唤醒方式,用于在 PSM+ 模式下主动唤醒执行业务:

**DtimerStart:**DtimerStart 为底层定时器,在模组进入 PSM+ 时,代码停跑,底层定时器仍可继续工作,在进入 PSM+ 前配置好底层定时器后等待定时器到了就可以主控唤醒模块,模块唤醒后通过识别开机原因就可以执行对应定时器 ID 所配置的任务,具体的 DEMO 可以参考 PM 库的核心实例;

**UART:**进入 PSM+ 模式后,uart1 rx 上收到数据可以唤醒模块,任意波特率;

**Power-key:**开机键在开机前处于下降沿触发开机状态,开机后处于中断输入状态,可以配置为双向触发中断用于唤醒低功耗;

**WAKEUP IO:**Air780EXX 系列一般都有 WAKEUP 唤醒脚,在进入 PSM+ 后 WAKEUP 唤醒脚仍可以保持电平,可以在进入 PSM+ 前将对应 WAKEUP 脚配置为输入/中断模式,当外部设备拉高/拉低 WAKEUP 脚即可唤醒模块,模块唤醒后软件会自动重启,通过识别开机原因执行对应 WAKEUP 唤醒脚配置的任务;780EPM/EHM 的 WAKEUP IO 为:

9.2 注释里说 UDP 比 TCP 更省电,有数据支撑吗,具体省多少?

由左右两幅图可得,TCP 要比 UDP 高 10% 左右,如果数传周期拉长到 10 分钟、一个小时、甚至一天,则差的会更多。

9.3 低功耗模式下与保活平台通讯,为什么每次信息发送结束后不会马上进入休眠

在低功耗模式下,模块与平台之间建立了通讯并以预设的周期向平台发送心跳保活数据,当脚本的定时器唤醒模块,发送数据至平台时,此时因为通讯连接仍在,所以数据发送的时间是非常短的,信号好的情况下几十毫秒之间就完成了发送,平台也能够收到,如下图:

如上图所示,从模块唤醒发送数据到 MQTT 平台接收到数据所用的时间仅几十毫秒,后面几秒钟的高功率工作其实是在运行本地基站与模组通讯的 RRC(Radio Resource Control,无线资源控制)协议,该协议配置了每个联网设备的最短释放时间,每个地区的基站配置都不一样,所以会造成不同的地区,不同运营商的卡会有功耗差异,设备需要释放 RRC 后才能进入低功耗状态。为了降低功耗,我们的固件中已经做好了 RRC 释放的相关逻辑,可以参考如下规律:

1、在首次入网时,RRC 会在第一次网络通讯完毕后 4 秒左右释放;

2、此后的每一次网络行为如果与上一次网络行为之间间隔不超 55 秒时,会根据本地基站的 RRC 配置时长释放 RRC,4 - 13 秒不等,每个地区的基站配置不同,表现不同;

3、此后的每一次网络行为如果与上一次网络行为之间间隔超过了 55 秒,底层固件则会优化 RRC 释放,在行为结束后的 4 秒左右完成释放;

因为 RRC 协议是由基站主导的,所以我们并不开放 RRC 配置调整的接口,变更该参数会造成非常严重的网络故障且极难排查!!!

9.4 为什么我的测试结果和你的测试结果大相径庭,甚至是你测试的 2 倍、5 倍不止

9.4.1 检查代码

在低功耗模式代码和 PSM+ 模式代码中,包含有中断方式配置和功能项配置的相关演示代码,部分注释了,部分没注释,可以检查一下是否有相应管脚被影响等等。

9.4.2 检查模块天线连接与驻网频段

通过 mobile.rsrp() 接口查询信号质量,通过 mobile.eci() 查询当前小区 ID,通过 mobile.scell() 查询当前小区其他信息。其他相关接口说明均可通过 mobile 核心库查看。

在休眠模式下,USB 端口会被端口,无法查看对应接口的返回值,需要通过 socket.tx()mqttc:publish()uart.write() 等其他方式查询。

earfcn 和频段关系的对照表如下

不同的信号值和不同的频段,功耗也不一样,其中信号值的影响更大一些,因为信号差的地方,需要射频电路发射功率更大才能维持和基站之间的正常通讯,当然,不同频段射频电路的发射/接收功率也不同。

如果信号较差,可以看下天线接触是否正常。

还有一种较小概率的情况,就是当前模块信号特别好,但是测试出的功耗数据很差,甚至比我上面的数据大了好几倍,有可能遇到了特殊基站,可以参考 https://docs.openluat.com/howtouselog/#_5 这篇文章,抓底层日志给合宙看看是什么情况了

如果遇到功耗差异比较大的情况,可以先查看下周围的频段,再锁频段进行测试,具体操作如下:

准备一台安卓手机(注意安卓版本要 7.0 以上),安装“Cellular-Z”这个 APP。(在 APP 商城搜索 Cellular-Z)。

其次,在手机的设置里,将"5G"关闭,打开 celular-z,看看当前小区频段和 RSRP,以及邻小区的 rsrp 的值,选择一个最好的 rsrp,并且记下对应的频段:

接下来将对应的手机卡插在被测开发板的 SIM1 卡槽内。

代码在最开头的地方加入锁频段的语句(根据你搜到的频段填入对应频段,不能直接复制粘贴过去):

local buff = zbuff.create(40)

buff[0] = 3  --band3
buff[1] = 5  --band5
buff[2] = 8  --band8
buff[3] = 40 --band40
mobile.setBand(buff, 4) --设置使用的band一共4个,为3,5,8,40

如果只需要锁一个频段测试,可以这么写

local buff = zbuff.create(40)buff[0] = 3 --band3
mobile.setBand(buff, 1) --设置使用的band为band3
9.4.3 检查硬件 PCB 设计

例如 DCDC,很多客户使用的是 5V 转 4V 的 DCDC 给 VBAT 供电,此时就需要计算下 DCDC 的损耗了。

再比如,漏电流,又或者电源管理芯片的选择。

可以对比 Air8000A 开发板的 PCB 和自己的 PCB 来进行功耗问题的排查。

9.5 超低功耗(PSM+)模式下,我设置的 3 个小时唤醒一次,为什么不到一个小时就会唤醒一次

可以检查下代码里是否在进入 PSM+ 模式之前进入了飞行模式,如果没有进飞行模式,按照 3GPP 协议规定,PSM+ 模式下,需要 54 分钟和基站进行交互一次,会启动一下模块。

9.6 在测试低功耗时为什么换个地方测试功耗效果就不一样,为什么别人同样级别的产品可以做到更低的功耗?

这里需要引入一个通信保活逻辑的概念,我们平常在做保活业务逻辑时只关注与平台的保活心跳,但是实际上底层已经帮我们处理了 4G 在工作时向基站和路由器之间的保活动作,而这些保活动作原理不同,其中也存在着直接影响功耗的秘密:

4G 在向基站保活通讯时会涉及非常多的通讯协议,其中影响最大的就是 DRX(不连续接收),DRX 是基站与终端之间用于节能的一种通信技术,让设备以固定的 DRX 周期向基站接收和上传信息,其余时间不通讯,能够有效的降低终端设备的整体运行功耗。常见的 DRX 周期是:0.64S、1.28S、2.56S,不同周期对于功耗的影响非常大,0.64S 和 1.28S 的 DRX 周期,对于终端的功耗影响可能会有 30-50% 左右。这时就会有人通过固定一个较长的 DRX 周期来降低终端功耗,来创造功耗优势,这种方式我们经过多类项目实测和客户的应用反馈总结后得出结论,不可取。因为 DRX 的配置是由基站主导的,如果模块的 DRX 和基站的 DRX 配置不匹配,有可能会造成严重的网络故障,且非常难查出原因。并且当前并没有各地基站 DRX 配置参考的数据,用户基本无法控制哪些地方的什么基站是什么 DRX 配置的,贸然变更 DRX 配置,造成的损失会非常巨大。所以合宙建议,先保证产品正常运作,再降低功耗。

今天就分享到这里啦!~~~

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐