tag 标签: 通讯模组

相关帖子
相关博文
  • 2025-2-11 17:23
    38 次阅读|
    0 个评论
    源码开放,今天我们学习的是电源管理系统的核心功能模块,手把手教你如何通过不同的技术手段实现有效的电源管理。 这些功能旨在提升设备的性能和用户体验,以下是主要演示功能的概述: ▼ 电源管理核心功能 ▼ 电量监测: 本系统通过ADC(模数转换器)实时读取电池电压,并定期更新电量状态。通过精确监测电池电压,可以让用户清晰掌握当前电池剩余电量,避免意外关机带来的困扰。 充电检测: 系统利用GPIO中断技术,能够快速检测电池的充电状态。当设备连接到电源时,将自动判断电池是否在充电状态,并相应地调整电源管理策略,以优化充电效率和电池寿命。 自动关机: 根据监测到的电量百分比,该系统能够在电量过低时自动关机,以防止电池过度放电。这种智能管理能够保护电池,延长其使用寿命,确保设备在低电量时不会意外关机。 用户接口: 系统提供了便捷的用户交互接口,用户可以通过长按电源键实现关机操作。提升用户体验的同时,确保用户可以方便地控制设备的电源状态。 通过这些功能的实现,用户不仅可以延长设备的使用时间,还能够保证设备在关键时刻的稳定性和可靠性。在实际应用中,这些功能可有效地提升设备性能,满足用户对电源管理的需求。 接下来,我们讲解相关示例的具体使用。 1. 搭建环境 新同学建议先看前期的基础知识相关教程,更有助于理解和操作。 可以在LuaTools项目管理中新建一个项目,重新选择底层CORE和脚本;或者在原有项目的基础上,不更换CORE,将原来的脚本删除,添加为demo/pm的脚本。 1.1 硬件准备: Air201套件 SIM卡 带有数据通信功能的数据线 Win10及以上PC 1.2 软件准备: LuaTools调试工具: https://docs.openluat.com/Luatools 最新固件: https://gitee.com/openLuat/LuatOS-Air201/tree/master/core 最新脚本: https://gitee.com/openLuat/LuatOS-Air201/tree/master/demo/pm 1.3 烧录操作: 由于Air201单板子没有复位键和BOOT键,所以数据线与Air201开发板之间还需要接一个USB_BOOT板(Air201套件里已包含,无需单独购买)。 将Air201通过USB_BOOT小板连接电脑,如下图所示: 1.3.1 根据下方操作进行烧录 此时就需要大家先点击Luatools工具上的【下载脚本】或【下载底层和脚本】,再执行下方操作了。 新同学请先学习LuaTools使用和烧录教程: https://docs.openluat.com/Luatools/ 开发板处于未开机状态: 此时先按住下载模式按键(BOOT键)不放,再长按开机键(POW键)开机。若不出意外开发板将会进入下载模式,LuaTools工具下载进度条会开始跑,这时便可以松开BOOT键和POW键,等到工具提示下载完成即可。 开发板已经处于开机状态: 此时可以先按住BOOT键不放,再短按复位键(RST键)后开发板会重启并进入下载模式。 1.3.2 不同模式下的端口显示 正常开机模式: 下载模式: 2. 示例代码 2.1 ChargeICLogic.lua源码文件 该文件中的代码是一个用Lua编写的脚本,主要用于与充电 IC(集成电路)进行交互,进行状态监测和控制。 2.1.1 代码解析 1)注释部分: 这段注释用于指出代码的主要功能,即处理充电IC相关的逻辑。 2)电池上限电压表: 此部分定义了电池上限电压的不同设置值。Vreg表包含多个十六进制数,每个数对应不同的电池上限电压。在V_CTRL寄存器中,前四位用来设置电池上限电压,其余位可以用作其他设置。默认情况下,其他位为 0。 3)快速充电电流表: 这部分定义了快速充电电流的设置值。Ichg 表中列出的十六进制数对应于不同充电电流的设置。 在 I_CTRL寄存器中,前三位是设置快速充电电流的,其余位是其他设置,默认为0;该电流值是通过电阻Rsns计算得出的。 Air201的Rsns值为1KΩ,经过公式计算后得出: Ireg=500mA 4)电池上限电压表: 此部分定义了电池上限电压的不同设置值。Vreg表包含多个十六进制数,每个数对应不同的电池上限电压。在V_CTRL寄存器中,前四位用来设置电池上限电压,其余位可以用作其他设置。默认情况下,其他位为 0。 5)任务初始化: 这部分是主任务的初始化。首先等待1000毫秒,然后通过 sensor.yhm27xx 函数与传感器进行通信,以获取设备信息。后面再进行传感器设备中各寄存器参数配置。 6)传感器数据读取: 通过sensor.yhm27xx函数调用来读取传感器的数据。 参数说明: gpio_pin是传感器对应引脚; 0x04 是传感器设备ID; 0x08 是设备信息寄存器的地址。 等待200毫秒等待数据返回。 7)设备存在检查: 当检测到传感器存在时,会进行进一步的设置。此时根据不同寄存器的地址设置不同功能。 8)电压跟随与快速充电电流设置: 读取 I_CTRL 寄存器并设置电压跟随与快速充电电流。如果操作成功,将会再次读取配置寄存器并确认设置结果,记录相关的日志信息。 参数说明: gpio_pin 是传感器对应引脚; 0x04 是芯片设备ID号; 0x01 是 I_CTRL寄存器地址; 0x02 是设置电压跟随与快速充电电流为0.5×Ireg。 特别说明: 若需要在同一寄存器中设置多个参数,则需要将参数值进行或运算。 例如: 要设置电压跟随和快速充电电流为0.5×Ireg,则参数值为 0x02+0x00=0x02 。 快速充电电流表可参考下方表格: I_CTRL寄存器地址前三位是设置快速充电电流,其余位是其他设置,默认为0;Ireg是电阻Rsns配置的电流值,Air201的电阻Rsns值为1KΩ: 通过公式Ireg=500/Rsns,得出Ireg=500mA。 9)电池上限电压设置: 读取V_CTRL寄存器并设置电池上限电压。如果操作成功,将会再次读取配置寄存器并确认设置结果,记录相关的日志信息。 参数说明: gpio_pin 是传感器对应引脚; 0x04 是芯片设备ID号; 0x00 是 V_CTRL寄存器地址; 0x00 是设置电池上限电压为4.2V。 电池上限电压设置可参考下方表格: 10)异常处理: 如果在读取传感器信息时返回结果为假,则说明传感器不存在,记录警告日志。 2.1.2 总结说明 这段代码的主要功能是与充电IC进行交互以监控其状态,配置其控制参数,并在不同情况下记录相关的日志信息。 通过这种方式,系统能够检测充电IC的存在与状态,并进行相应的初始化与配置,以确保充电过程的正常进行。全程使用异步任务管理,提升系统响应能力。 2.2 pcb.lua源码文件 这段Lua代码定义了一个名为pcb的模块,其主要功能是管理和操作硬件的某些特性,特别是与PCB(印刷电路板)相关的设置和状态。 2.2.1 代码解析 1)模块初始化和变量定义: 这里定义了一个表pcb,用于存放后续的函数。定义了存储系统的OTP区域和硬件的默认版本号,以及出厂测试结果的初始值。 2)读取OTP存储区和解析硬件版本号的函数: loadParam函数首先检查OTP是否存在,然后读取OTP存储区中的数据,解码JSON格式的数据以获取硬件版本号和出厂测试结果。若解码失败或缺少数据,则根据设备型号进行版本号的设置。 3)GNSS电源控制功能: 此函数根据硬件版本控制GNSS模块的电源状态。通过GPIO接口进行电源的开启或关闭。 4)ES8311电源引脚的获取: 根据硬件版本返回ES8311控制器对应的电源引脚。 5)充电IC CMD引脚的获取: 此函数根据硬件版本返回充电IC的命令引脚。 6)出厂测试结果获取及版本号管理: 提供了获取当前硬件版本号和出厂测试结果的方法,以及设置硬件版本号的功能。 2.2.2 总结说明 整段代码的主要功能是提供对印刷电路板(PCB)相关硬件配置和状态的管理。通过读取OTP存储区,程序能够获取设备的特定参数(如版本号和出厂测试结果)。 此外,它还实现对GNSS电源、ES8311音频编解码器以及充电IC的控制接口,根据不同的硬件版本提供不同的引脚控制方案。 2.3 batteryManage.lua源码文件 这段代码是一个电池管理模块的实现,主要用于监控和管理电池状态,包括电压检测、充电状态判断、电量计算和自动关机功能。 2.3.1 代码解析 1)模块定义: 创建一个名为M的模块,定义模块名称为: batteryManage 这段注释用于指出代码的主要功能,即处理充电IC相关的逻辑。 2)引入库: 引入了sys和sysplus库,这些库提供了系统和附加功能的支持。 3)初始化状态变量: M.vbat: 当前电池电压; M.batteryPercent: 电池电量百分比,初始为50; M.isCharge: 标识是否正在充电; M.BATTERY_UPDATE_INTERVAL: 电池信息更新的时间间隔(秒); M.noChargeDuration: 记录未插入电源的时间; M.CHARGE_THRESHOLD_TIME: 未充电持续时间的阈值(2 分钟); M.blueLed和M.redLed: 用于设置蓝灯和红灯的状态,分别用GPIO接口进行控制。 4)电池放电曲线: 定义一个电池放电曲线数组,该数组存储对应电量的电压值,用于通过电压推算电量百分比。 5)重置未充电时长: 重置未充电计时器的函数。 6)关机函数: 该函数用于发布关机信号,以请求系统关机。 7)充电状态检测: 使用GPIO中断回调来检测充电状态,如果通过GPIO引脚检测到充电状态发生变化,将更新充电状态并检查电池状态。 8)电量百分比计算: 根据当前电压M.vbat计算电池百分比。如果电压在放电曲线数组的范围内,则返回相应的电量百分比。 9)定期检查电池状态: 定期更新电池电量,读取电压并计算电量。如果电量低于 30%,且没有插入电源的时间超过2分钟,则调用关机函数。 10)长按电源键关机: 实现了长按电源键的关机逻辑,按下电源键3秒后进行关机,松开时取消关机。 2.3.2 总结说明 整体而言,该模块负责监控电池的电压和充电状态。它能够定期更新电量百分比,并在必要时自动关机。此外,该模块还允许用户通过长按电源键来手动关机。其主要功能是确保设备在电量过低时保护系统不受损坏,同时提供充电状态的实时反馈。 2.4 main.lua源码文件 该文件中的代码使用Lua语言编写,主要用于管理和监控设备的电源和电池状态。 2.4.1 代码解析 1)项目和版本信息: 这部分定义了项目名称和版本,并记录日志信息,便于后续的调试和维护。 2)库的引入: 在这里引入了多个必要的库文件,包括系统管理库sys、电路板库pcb、充电逻辑库和电池管理库。通过这些库,程序可以实现对系统的控制和管理。 特别说明: 主要功能代码已经模块化到batteryManage库文件中。 3)开机防抖: 这部分代码用于防止开机时的抖动,并点亮红色指示灯,以表明设备正在启动。 4)GPIO设置: 通过gpio.setup配置了两个引脚:一个用于监测充电状态,另一个用于电源键的回调。 5)关机处理: 这段代码订阅了系统关机事件,当设备接收到关机信号时,会调用pm.shutdown()函数进行安全关机。 6)启动初始检查: 在系统启动时,首先进行一次电池充电状态检查,并设置一个定时器,每60秒更新一次电池电量信息。 7)日志输出: 此段代码设置了一个定时器,每隔5秒输出一次当前电池状态的日志信息,包括电压、电池电量及充电状态,便于监控和调试。 8)程序运行: 最后,sys.run()函数用于启动系统的主循环,让程序保持运行状态。 2.4.2 总结说明 该代码的主要功能是管理和监控嵌入式设备的电源与电池状态,具备开机防抖、充电状态检测、定时更新电池电量和记录日志等功能。 2.5 完整源码文件 此处只展示main.lua,其余完整代码请下载源码查看。 最新源码下载: https://gitee.com/openLuat/LuatOS-Air201/tree/master/demo/pm 2.6 运行结果展示 可通过LuaTools工具查看运行结果,如下图所示: 3. 常见问题 设备无法开启或频繁自动关机 检查电池电量是否低于安全工作水平,确保设备充电。如果电量很低,请连接电源并充电一段时间再尝试开机。 电池电量显示不准确 确保电池电压监测模块正常工作,检查ADC通道是否正确配置。如有必要,重新校准电池电量百分比计算的映射表。 充电状态无法正确识别 检查充电检测的GPIO引脚连接是否正常,确认是否存在接触不良或线路损坏的问题。此外,确保所用充电器和数据线与设备兼容。 系统在充电时无法正常运行 检查是否有其他程序或任务占用过多资源,导致系统不稳定。可以考虑优化系统任务的优先级或关闭不必要的功能模块。 长按电源键无反应 确认电源键的GPIO引脚连接正常,确保其可被正常识别。如果仍然无效,请检查相关代码对电源键的事件处理是否正确。 设备发热严重 设备发热可能是由于充电速率过高或设备运行负载过重引起的。建议降低负载、优化代码,或调整充电策略。 无法更新固件或脚本 检查USB连接是否正常,确保LuaTools工具正确识别设备。注意遵循烧录步骤,并确保所用的固件版本与硬件兼容。 今天的分享就到这里了~
  • 2025-2-11 17:18
    41 次阅读|
    0 个评论
    本指南教你如何用 Air724 开发板,使用 sms 功能,并通过日志观察实验结果。 对于仅支持4G网络的Cat.1模块Air724UG而言,移动、联通卡不需开通VOLTE可以支持短信功能,电信卡只有SIM卡开通VOLTE功能才能使用短信功能。可以通过登录运营商 APP、登录运营商网站、或者拨打运营商客服电话,确认开通 VOLTE功能。 一、准备硬件环境 1.1 开发板准备 使用 EVB_Air724 开发板,如下图所示: 此开发板的详细使用说明参考: https://docs.openluat.com/air724ug/product/ Air724UG 产品手册中的《EVB_Air724UG_AXX 开发板使用说明》,写这篇文章时最新版本的使用说明为:《EVB_Air724UG_A14 开发板使用说明》;开发板使用过程中遇到任何问题,可以直接参考这份使用说明文档。 api文档: https://doc.openluat.com/wiki/21?wiki_page_id=2068 1.2 数据通信线 USB 数据线一根(micro USB)。 1.3 PC 电脑 WIN7 以及以上版本的 WINDOWS 系统。 1.4 SIM 卡 中国大陆环境下,可以上网的SIM卡。一般来说,使用移动、电信、联通的物联网卡或者手机卡都行。 1.5 组装硬件环境 USB 数据线插入 USB 口,另一端与电脑相连,拨码开关全部拨到 ON,串口切换开关选择 UART1,USB 供电的 4V 对应开关拨至 ON 档,SIM 卡放到 SIM 卡槽中锁紧,如下图所示。 二、准备软件环境 2.1 下载调试工具 使用说明参考: Luatools 下载和详细使用: https://docs.openluat.com/Luatools/ 2.2 源码及固件 1、底层 core 下载 下载底层固件,并解压 链接: https://docs.openluat.com/air724ug/luatos/firmware/ 如下图所示,红框的是我们要使用到的。 2、本教程使用的 demo: https://gitee.com/openLuat/LuatOS-Air724UG/tree/master/script_LuaTask/demo/sms 2.3 下载固件和脚本到开发板中 打开 Luatools,开发板上电开机,如开机成功 Luatools 会打印如下信息。 点击项目管理测试选项。 进入管理界面,如下图所示。 点击选择文件,选择底层固件,我的文件放在 D:luatOSAir724 路径中 点击增加脚本或资源文件,选择 之前下载的程序源码,如下图所示。 点击下载底层和脚本,下载完成如下图所示。 三、代码示例介绍 3.1 API 说明 sms.send(phone, msg, auto_phone_fix) 作用:发送短信 参数: 返回值: sms.setNewSmsCb(func) 作用:设置新 SMS 的回调函数 参数: 返回值: 3.2 testSms.lua 代码 只需要调用 sms.send()函数,填入对方手机号和消息内容即可。 通过设置回调函数。或者订阅发送完成的系统消息,来进行发送完成的处理。 本 demo 的效果是给服务商发短信消息,查询话费信息,收到返回的短信息打印日志。 3.3 main.lua 代码 本代码为主程序脚本,系统启动后首先会对 4G 网络进行配置,等待网络连接成功,然后加载测试模块。 四、开机调试 4.1 开发板开机 连接好硬件并下载固件后,启动 Luatools 软件,系统运行信息将显示在界面中。红框中为开发板连接到 PC 机后正常打印的信息,如下图所示。 4.2 功能调试 发送短信息 收到短信息 五、常见问题 5.1 物联网卡支持短信功能吗? 一般来说,物联网卡是不支持短信功能的,具体需要咨询物联网卡供应商。 5.2 支持移动、电信,联通卡的短信功能吗? 支持,电信 sim 卡必须开通 VOLTE 功能。 5.3 是否支持彩信功能 不支持。 5.4 如何开通 VOLTE 功能? 对于仅支持 4G 网络 的 CAT1 模块(Air720UG、Air724UG)而言,移动,联通卡不需开通 VOLTE 可以支持短信功能,电信卡只有 sim 卡开通 VOLTE 功能才能使用短信功能。 如何开通 VOLTE 功能,有如下几种方式: 登录运营商手机端 app 开通 登录运营商官网开通 拨打运营商客服电话开通
  • 2025-2-11 17:12
    35 次阅读|
    0 个评论
    很多朋友都问我不会Lua又想open开发,怎么办?我的答复是Lua先学起来,再看LuatOS具体应用示例,上手极快,感兴趣的朋友们,可以参照本文一起学。 Lua视频教程 无废话30分钟Lua快速入门教程: https://b23.tv/DMaAHQ1 LuatOS文档教程 资料中心: https://docs.openluat.com LuatOS支持的主要模组型号: Air780E/Air780EX/Air780EP/Air780EPS/ Air201… 可通过资料中心查看对应型号模组的LuatOS二次开发快速入门教程,内容持续更新中。 今天,我们先一起看看LuatOS基础知识: LuatOS系统通过Lua虚拟机,支持Lua脚本在4G模组的的运行。LuatOS系统还实现了一套多任务的机制,这套机制是在sys库实现的。 一、sys模块简述 sys模块利用了Lua语言的协程机制,实现了实时多任务的调度。开发者可以在业务代码中,新建多个任务,而不用像单片机的开发方式一样,只能用定时器进行延时。 在开发LuatOS业务代码时,需要在代码中引用sys库(_G.sys=require("sys")),并且在代码的最后一行,调用sys.run()以启动主程序,使得框架内的任务代码会在sys.run()中运行。 二、sys模块的实时多任务机制详解 01.创建多个并行的任务 如下代码创建了两个任务,每个任务都是一个循环,只要循环不结束,任务就一直在运行。 02.多任务之间互相等待 通过sys模块的publish和waitUntil调用,实现多个任务之间的同步。 03.多任务之间互相等待并传递数据 04.传统定时器 三、sys库接口文档 01.sys.wait(ms) Task任务延时函数,只能用于任务函数中。 参数: 返回值: 定时结束返回nil,被其他线程唤起返回调用线程传入的参数。 例子: sys.wait(30) 02.sys.waitUntil(id, ms) Task任务的条件等待函数(包括事件消息和定时器消息等条件),只能用于任务函数中。 参数: 返回值: result接收到消息返回true,超时返回false data,接收到消息返回消息参数。 例子: result, data = sys.waitUntil("SIM_IND", 120000) 03.sys.waitUntilExt(id, ms) Task任务的条件等待函数扩展(包括事件消息和定时器消息等条件),只能用于任务函数中。 参数: 返回值: message接收到消息返回message,超时返回false data,接收到消息返回消息参数。 例子: result, data = sys.waitUntilExt("SIM_IND", 120000) 04.sys.taskInit(fun, ...) 创建一个任务线程,在模块最末行调用该函数并注册模块中的任务函数,main.lua导入该模块即可。 参数: 返回值: co返回该任务的线程号。 例子: sys.taskInit(task1,'a','b') 05.sys.timerStop(val, ...) 关闭定时器。 参数: 返回值: 无 例子: timerStop(1) 06.sys.timerStopAll(fnc) 关闭同一回调函数的所有定时器。 参数: 返回值: 无 例子: timerStopAll(cbFnc) 07.sys.timerStart(fnc, ms, ...) 开启一个定时器。 参数: 返回值: number定时器ID,如果失败,返回nil。 例子: 08.sys.timerLoopStart(fnc, ms, ...) 开启一个循环定时器。 参数: 返回值: number定时器ID,如果失败,返回nil。 例子: 09.sys.timerIsActive(val, ...) 判断某个定时器是否处于开启状态。 参数: 返回值: number开启状态返回true,否则nil。 例子: 10.sys.subscribe(id, callback) 订阅消息 参数: 返回值: 无 例子: subscribe("NET_STATUS_IND", callback) 11.sys.unsubscribe(id, callback) 取消订阅消息 参数: 返回值: 无 例子: unsubscribe("NET_STATUS_IND", callback) 12.sys.publish(...) 发布内部消息,存储在内部消息队列中。 参数: 返回值: 无 例子: publish("NET_STATUS_IND") 13.sys.run() 从底层获取core消息并及时处理相关消息,查询定时器并调度各注册成功的任务线程运行和挂起。 参数: 无 返回值: 无 例子: sys.run() 今天的内容就分享到这里了
  • 2025-2-11 17:08
    45 次阅读|
    0 个评论
    众所周知alarm闹钟是电子产品中常用来作为设备软件定时开关机的一项基本功能,本文介绍如何用Air724开发板,进行闹钟功能演示。 一、演示功能概述 本教程教你如何用Air724开发板,进行闹钟的功能演示。 二、准备硬件环境 2.1 开发板准备 使用 EVB_Air724 开发板,如下图所示: 此开发板的详细使用说明参考: https://docs.openluat.com/air724ug/product/ Air724UG 产品手册中的《EVB_Air724UG_AXX 开发板使用说明》,写这篇文章时最新版本的使用说明为:《EVB_Air724UG_A14 开发板使用说明》;开发板使用过程中遇到任何问题,可以直接参考这份使用说明文档。 api文档: https://doc.openluat.com/wiki/21?wiki_page_id=2068 2.2 数据通信线 USB 数据线一根(micro USB)。 2.3 PC 电脑 WIN7以及以上版本的WINDOWS系统。 2.4 SIM 卡 中国大陆环境下,可以上网的 SIM 卡。一般来说,使用移动,电信,联通的物联网卡或者手机卡都行。 2.5 组装硬件环境 USB 数据线插入 USB 口,另一端与电脑相连,拨码开关全部拨到 ON,串口切换开关选择 UART1,USB 供电的 4V 对应开关拨至 ON 档,SIM 卡放到 SIM 卡槽中锁紧,如下图所示。 三、准备软件环境 3.1 下载调试工具 使用说明参考: Luatools 下载和详细使用: https://docs.openluat.com/Luatools/ 3.2 源码及固件 3.2.1 底层 core 下载 下载底层固件,并解压 链接: https://docs.openluat.com/air724ug/luatos/firmware/ 如下图所示,红框的是我们要使用到的。 3.2.2 本教程使用的 demo 见附件: https://gitee.com/openLuat/LuatOS-Air724UG/tree/master/script_LuaTask/demo/alarm 3.3 下载固件和脚本到开发板中 打开 Luatools,开发板上电开机,如开机成功 Luatools 会打印如下信息。 点击项目管理测试选项。 进入管理界面,如下图所示。 点击选择文件,选择底层固件,我的文件放在 D:luatOSAir724 路径中 点击增加脚本或资源文件,选择 之前下载的程序源码,如下图所示。 点击下载底层和脚本,下载完成如下图所示。 四、代码示例介绍 4.1 API 说明 --注册闹钟模块 rtos.init_module(rtos.MOD_ALARM) --注册闹钟消息的处理函数(如果是开机闹钟,闹钟事件到来时会调用 alarmsg) rtos.on(rtos.MSG_ALARM,alarMsg) 模块进行 lua 开发的 lua 虚拟机架设在 RTOS 操作系统之上,所以在设置完系统时间,闹钟开关机时间之后,需要将闹钟消息进行注册,才能对操作系统进行开关机启动操作 --设定闹铃 rtos.set_alarm(1,onTimet.year,onTimet.month,onTimet.day,onTimet.hour,onTimet.min,onTimet.sec) set_alarm 接口参数中的第一个参数 1 表示开启闹钟,0 表示关闭闹钟 闹钟关机之后,模块将进入超低功耗模式,此时停止解析应用层的代码,大部分协议栈也将停止,所以闹钟开机需软件主动重启一次 4.2 testAlarm.lua 代码 首先通过 misc.setClock()接口函数手动设置当前系统时间,该函数可传入 table 类型的变量,依次包含年、月、日、时、分、秒等 6 个参数,设置后,系统时间即更新生效;通过 rtos.set_alarm()接口函数设置闹钟关机后再次开机的时间间隔,在这里修改为 60,即模块关机 60S 后再次开机: 4.3 main.lua 代码 本代码为主程序脚本,系统启动后首先会对 4G 网络进行配置,等待网络连接成功,然后加载测试模块。 五、开机调试 5.1 开发板开机 连接好硬件并下载固件后,启动 Luatools 软件,系统运行信息将显示在界面中。红框中为开发板连接到 PC 机后正常打印的信息,如下图所示。 5.2 功能调试 5.2.1 设置闹钟 通过misc.setClock()接口函数手动设置当前系统时间,然后通过rtos.set_alarm()接口函数设置闹钟关机后再次开机的时间间隔,在这里修改为60,即模块关机开始60S后再次开机`。 5.2.2 闹钟时间到打印输出 六、常见问题 6.1 为什么烧录完 demo 之后,用户反映不能进行闹钟关机? 答:demo 中已经将闹钟关机的函数屏蔽掉,需要用户释放时才能进行闹钟关机。 6.2 为什么烧录完 demo 之后,用开发板测试时发现代码中设定的时间跟我们看到的网络时间不一样,甚至比当前的时间早,但是还是会安装设定的时间间隔开机? 答:demo 中设定的时间为手动设置,并没有与网络时间同步,模块是以手动设定的时间为基础计时运行。 分享完毕。
  • 2025-2-9 14:23
    53 次阅读|
    0 个评论
    本文说的所谓的心跳包就是(探测性的)数据包,之所以叫心跳包是因为:它像心跳一样每隔固定时间发一次,以此来告诉服务器,这个客户端还活着。事实上这是为了保持长连接,至于这个包的内容,是没有什么特别规定的,不过一般都是很小的包,或者只包含包头的一个空包。 最大的作用就一句话,就是告诉服务器: 我还活着,别给我踢下线了。 1.为什么需要心跳? 4G物联网设备受限于自身工作环境的影响,极有可能发生网络不稳定的情况。 例如: 人多的环境中,为了保证人联网的及时性,物联网设备的通讯优先级会被运营商调低,极有可能出现多个物联网设备互相竞争4G通讯通道,或者与手机等人联网设备竞争网络通道的情况。 再比如: 野外环境下,本身就人烟罕至的地方,运营商基站覆盖弱。 又或者 : 半夜运营商降低基站发射功率来省电,或者半夜进行基站的维护。 还有可能: 服务器遇到特殊情况进行维护升级,没有及时通知物联网设备,导致设备一直进行重连/数据重传等操作,耗尽了物联网卡的流量。 以上等等诸如此类的意外情况,都会使本来正常环境下能联网的4G物联网设备,突然断网,导致服务器长期收不到模组发过来的数据或者模组收不到服务器发过来的数据,进而导致数据延迟、丢失,最终导致用户资产受损。 所以在客户端/服务器设计之初,都会设计一个心跳机制,用来处理服务器/网络异常的情况。 ▼ 4G模组心跳设置 ▼ 如果使用AT固件: 可以参考如下指令设置心跳: 1)AT+CIPTKA 2)AT^HEARTCONFIG 具体的参数参考的AT指令集,可以设置心跳内容、心跳周期等。 如果使用LuatOS固件: 可以使用socket.config接口: 接口参数设置详见: https://wiki.luatos.com/api/socket.html 也可以使用sys.timerLoopStart函数: 创建一个定时器,进行心跳包的传输。 2.推荐的心跳间隔 一般来说,人联网的设备,对实时性要求较高,所以一般人联网的设备,根据实际业务的实时性不同,一般心跳间隔时间也从5秒~40秒不等。 物联网设备的实时性要求大多数都不是很高, 所以一般来说1分钟/2分钟/3分钟/5分钟也就够用了, 可以根据真实的使用场景,以及服务器能够承载的冗余链路数量决定具体的心跳间隔。 如果你使用的是阿里云/腾讯云等可靠的物联网平台,也可以适当拉长自己的心跳周期。例如:阿里云物联网平台推荐的心跳为300秒以上,最长为1200秒。 值得一提的是,心跳间隔时间越短,同等时间内,模组耗电越多。为了节约流量和省电,对大多数物联网设备来说,并不是真的会在用户设定的心跳间隔时间时给服务器发送心跳—— 真正发送心跳包的间隔时间,往往是用户设置的1.5倍时长, 这是心跳机制决定的。 3.如果不用心跳,服务器怎么设计 一般来说,用户使用的是TCP协议或者基于TCP的MQTT这种长连接协议。 如果客户对功耗比较看重,既希望能保持长连接,又不希望在没有数传的时候发送心跳数据导致功耗上升,可以与服务器进行协商, 将定时的数据报文,当作应用层心跳报文。 如果上下两包数据接收时间小于设置的应用层心跳时间, 则在下一包数据收到以后,检测心跳周期的定时器事件重置。 注意:此种方式仅限于数传间隔较小(15分钟内)的情况。 当然,如果对数据传输的完整性不做严格要求,也可以将自己通讯协议改为UDP。 4.不用心跳方式的弊端 TCP协议层是有默认两小时的心跳机制,但是这会造成服务器有时需要处理大量的TCP冗余链接, 所以一般服务器都会和客户端协商,启用应用层心跳。 如果没有服务器心跳,4G模组和4G基站之间也是需要一个心跳机制的——因为4G模组不是直接跟服务器连接的,而是通过NAT(即网络地址转换)与服务器连接,NAT就是网络地址转换。 NAT会维护一个映射表,这个映射表会定时检查 。如果10分钟内这路socket跟服务器没任何数据往来,就会回收这路的地址,10分钟后应用上再发数据就找不到路由地址了,也就是常说的和服务器断开了链接;如果10分钟内有数据更新,计时器会重新置为10分钟。 如果不需要和模组保持长连接,且不怎么需要和服务器进行交互,半小时甚至更久: 那么可以考虑使用HTTP等链接方式,或者参考4G模组【PSM+超低功耗】教程。
相关资源