Browse Source

update: 更新mobile demo示例

tuoyiheng 2 months ago
parent
commit
e56c4e4489

+ 57 - 112
module/Air780EHM_Air780EHV_Air780EGH/demo/mobile/main.lua

@@ -1,122 +1,67 @@
-
--- LuaTools需要PROJECT和VERSION这两个信息
+--[[
+@module  main
+@summary LuatOS用户应用脚本文件入口,总体调度应用逻辑
+@version 1.0
+@date    2025.10.23
+@author  拓毅恒
+@usage
+本demo演示的核心功能为:
+移动网络功能测试,包括SIM卡管理、基站数据查询、频段(Band)测试和修改、移动网络信息获取(IMEI/IMSI/信号强度等)以及SIM卡状态监控。
+通过加载mobile_test模块来运行相关测试功能。
+
+更多说明参考本目录下的readme.md文件
+]]
+
+--[[
+必须定义PROJECT和VERSION变量,Luatools工具会用到这两个变量,远程升级功能也会用到这两个变量
+PROJECT:项目名,ascii string类型
+        可以随便定义,只要不使用,就行
+VERSION:项目版本号,ascii string类型
+        如果使用合宙iot.openluat.com进行远程升级,必须按照"XXX.YYY.ZZZ"三段格式定义:
+            X、Y、Z各表示1位数字,三个X表示的数字可以相同,也可以不同,同理三个Y和三个Z表示的数字也是可以相同,可以不同
+            因为历史原因,YYY这三位数字必须存在,但是没有任何用处,可以一直写为000
+        如果不使用合宙iot.openluat.com进行远程升级,根据自己项目的需求,自定义格式即可
+]]
 PROJECT = "mobiledemo"
-VERSION = "1.0.0"
-
-log.info("main", PROJECT, VERSION)
-
--- sys库是标配
-_G.sys = require("sys")
-
+VERSION = "001.000.000"
 
+log.info("main", "project name is ", PROJECT, "version is ", VERSION)
 
--- Air780E的AT固件默认会为开机键防抖, 导致部分用户刷机很麻烦
-if rtos.bsp() == "EC618" and pm and pm.PWK_MODE then
-    pm.power(pm.PWK_MODE, false)
+-- 如果内核固件支持wdt看门狗功能,此处对看门狗进行初始化和定时喂狗处理
+-- 如果脚本程序死循环卡死,就会无法及时喂狗,最终会自动重启
+if wdt then
+    --配置喂狗超时时间为9秒钟
+    wdt.init(9000)
+    --启动一个循环定时器,每隔3秒钟喂一次狗
+    sys.timerLoopStart(wdt.feed, 3000)
 end
 
-
--- 对于双卡的设备, 可以设置为自动选sim卡
--- 但是, 这样SIM1所在管脚就强制复用为SIM功能, 不可以再复用为GPIO
--- mobile.simid(2)
-mobile.simid(2,true)--优先用SIM0
-
-
-sys.taskInit(function()
-
-	log.info("status", mobile.status())
-    local band = zbuff.create(40)
-    local band1 = zbuff.create(40)
-    mobile.getBand(band)
-    log.info("当前使用的band:")
-    for i=0,band:used()-1 do
-        log.info("band", band[i])
-    end
-    band1[0] = 38
-    band1[1] = 39
-    band1[2] = 40
-    mobile.setBand(band1, 3)    --改成使用38,39,40
-    band1:clear()
-    mobile.getBand(band1)
-    log.info("修改后使用的band:")
-    for i=0,band1:used()-1 do
-        log.info("band", band1[i])
-    end
-    mobile.setBand(band, band:used())    --改回原先使用的band,也可以下载的时候选择清除fs
-
-    mobile.getBand(band1)
-    log.info("修改回默认使用的band:")
-    for i=0,band1:used()-1 do
-        log.info("band", band1[i])
-    end
-	-- mobile.vsimInit()
-	-- mobile.flymode(nil,true)
-	-- mobile.vsimOnOff(true)
-	-- mobile.flymode(nil,false)
-    -- mobile.apn(0,2,"") -- 使用默认APN激活CID2
-    -- mobile.rtime(3) -- 在无数据交互时,RRC 3秒后自动释放
-    -- 下面是配置自动搜索小区间隔,和轮询搜索冲突,开启1个就可以了
-    -- mobile.setAuto(10000,30000, 5) -- SIM暂时脱离后自动恢复,30秒搜索一次周围小区信息
-	log.info("status", mobile.status())
-    sys.wait(2000)
-    while 1 do
-        log.info("imei", mobile.imei())
-        log.info("imsi", mobile.imsi())
-        local sn = mobile.sn()
-        if sn then
-            log.info("sn",   sn:toHex())
-        end
-		log.info("status", mobile.status())
-        
-
-        log.info("iccid", mobile.iccid())
-        log.info("csq", mobile.csq()) -- 4G模块的CSQ并不能完全代表强度
-        log.info("rssi", mobile.rssi()) -- 需要综合rssi/rsrq/rsrp/snr一起判断
-        log.info("rsrq", mobile.rsrq())
-        log.info("rsrp", mobile.rsrp())
-        log.info("snr", mobile.snr())
-        log.info("simid", mobile.simid()) -- 这里是获取当前SIM卡槽
-        log.info("apn", mobile.apn(0,1))
-        log.info("ip", socket.localIP())
-		log.info("lua", rtos.meminfo())
-        -- sys内存
-        log.info("sys", rtos.meminfo("sys"))
-        sys.wait(15000)
-    end
-end)
-
--- 基站数据的查询
-
--- 订阅式, 模块本身会周期性查询基站信息,但通常不包含临近小区
-sys.subscribe("CELL_INFO_UPDATE", function()
-    log.info("cell", json.encode(mobile.getCellInfo()))
-end)
-
--- 轮询式, 包含临近小区信息,这是手动搜索,和上面的自动搜索冲突,开启一个就行
-sys.taskInit(function()
-    sys.wait(5000)
-	mobile.config(mobile.CONF_SIM_WC_MODE, 2)
-    while 1 do
-        mobile.reqCellInfo(10)
-        sys.wait(11000)
-        log.info("cell", json.encode(mobile.getCellInfo()))
-		mobile.config(mobile.CONF_SIM_WC_MODE, 2)
-    end
-end)
-
--- 获取sim卡的状态
-
-sys.subscribe("SIM_IND", function(status, value)
-    log.info("sim status", status)
-    if status == 'GET_NUMBER' then
-        log.info("number", mobile.number(0))
-    end
-	if status == "SIM_WC" then
-        log.info("sim", "write counter", value)
-    end
-end)
+-- 如果内核固件支持errDump功能,此处进行配置,【强烈建议打开此处的注释】
+-- 因为此功能模块可以记录并且上传脚本在运行过程中出现的语法错误或者其他自定义的错误信息,可以初步分析一些设备运行异常的问题
+-- 以下代码是最基本的用法,更复杂的用法可以详细阅读API说明文档
+-- 启动errDump日志存储并且上传功能,600秒上传一次
+-- if errDump then
+--     errDump.config(true, 600)
+-- end
+
+-- 使用LuatOS开发的任何一个项目,都强烈建议使用远程升级FOTA功能
+-- 可以使用合宙的iot.openluat.com平台进行远程升级
+-- 也可以使用客户自己搭建的平台进行远程升级
+-- 远程升级的详细用法,可以参考fota的demo进行使用
+
+-- 启动一个循环定时器
+-- 每隔3秒钟打印一次总内存,实时的已使用内存,历史最高的已使用内存情况
+-- 方便分析内存使用是否有异常
+-- sys.timerLoopStart(function()
+--     log.info("mem.lua", rtos.meminfo())
+--     log.info("mem.sys", rtos.meminfo("sys"))
+-- end, 3000)
+
+-- 加载 mobile_test 功能模块
+require "mobile_test"
 
 -- 用户代码已结束---------------------------------------------
 -- 结尾总是这一句
 sys.run()
 -- sys.run()之后后面不要加任何语句!!!!!
+

+ 114 - 0
module/Air780EHM_Air780EHV_Air780EGH/demo/mobile/mobile_test.lua

@@ -0,0 +1,114 @@
+--[[
+@module  mobile_test
+@summary Air780Exx mobile功能测试模块
+@version 1.0
+@date    2025.10.21
+@author  拓毅恒
+@usage
+本文件为 Air780Exx 核心板演示移动网络功能的代码示例,核心业务逻辑包括:
+1. SIM卡管理和选择(自动选卡功能)
+2. 基站数据查询(订阅式和轮询式两种方式)
+3. 频段(Band)测试和修改
+4. 移动网络信息获取(IMEI、IMSI、信号强度等)
+5. SIM卡状态监控
+]]
+
+-- 对于双卡的设备, 可以设置为自动选sim卡
+-- 但是SIM1所在管脚就强制复用为SIM功能, 占用4个IO口(gpio4/5/6/23),不可以再复用为GPIO
+-- mobile.simid(2)
+mobile.simid(2,true)--优先用SIM0
+
+-- 基站数据的查询
+-- 订阅式, 模块本身会周期性查询基站信息,但通常不包含临近小区
+local function sub_cell_info_task()
+    log.info("cell", json.encode(mobile.getCellInfo()))
+end
+
+sys.subscribe("CELL_INFO_UPDATE", sub_cell_info_task)
+
+-- 轮询式, 包含临近小区信息,这是手动搜索,和上面的自动搜索冲突,开启一个就行
+local function get_cell_info_task()
+    sys.wait(5000)
+	mobile.config(mobile.CONF_SIM_WC_MODE, 2)
+    while 1 do
+        mobile.reqCellInfo(10)
+        sys.wait(11000)
+        log.info("cell", json.encode(mobile.getCellInfo()))
+		mobile.config(mobile.CONF_SIM_WC_MODE, 2)
+    end
+end
+
+-- 获取sim卡的状态
+local function get_sim_status_task(status, value)
+    log.info("sim status", status)
+    if status == 'GET_NUMBER' then
+        log.info("number", mobile.number(0))
+    end
+	if status == "SIM_WC" then
+        log.info("sim", "write counter", value)
+    end
+end
+
+sys.subscribe("SIM_IND", get_sim_status_task)
+
+-- 定义测试band和移动网络信息的函数
+local function mobileinfo_task()
+    -- 设置默认APN 
+    -- 注意:在国内公网卡基本上都不需要设置APN, 专网卡才需要设置
+    mobile.apn(0,1,"cmiot","","",nil,0)
+    -- 开启SIM暂时脱离后自动恢复,30秒搜索一次周围小区信息
+    mobile.setAuto(10000,30000, 5) -- 此函数仅需要配置一次
+    
+    log.info("************开始测试band************")
+    local band = zbuff.create(40)
+    local band1 = zbuff.create(40)
+    mobile.getBand(band)
+    log.info("当前使用的band:")
+    for i=0,band:used()-1 do
+        log.info("band", band[i])
+    end
+    band1[0] = 38
+    band1[1] = 39
+    band1[2] = 40
+    mobile.setBand(band1, 3)    --改成使用38,39,40
+    band1:clear()
+    mobile.getBand(band1)
+    log.info("修改后使用的band:")
+    for i=0,band1:used()-1 do
+        log.info("band", band1[i])
+    end
+    mobile.setBand(band, band:used())    --改回原先使用的band,也可以下载的时候选择清除fs
+
+    mobile.getBand(band1)
+    log.info("修改回默认使用的band:")
+    for i=0,band1:used()-1 do
+        log.info("band", band1[i])
+    end
+    log.info("************band测试完毕************")
+
+	log.info("status", mobile.status())
+    sys.wait(2000)
+    while 1 do
+        log.info("imei", mobile.imei())
+        log.info("imsi", mobile.imsi())
+        log.info("apn", mobile.apn()) -- 获取当前APN
+        log.info("status", mobile.status())
+        log.info("iccid", mobile.iccid())
+        log.info("csq", mobile.csq()) -- 4G模块的CSQ并不能完全代表强度
+        log.info("rssi", mobile.rssi()) -- 需要综合rssi/rsrq/rsrp/snr一起判断
+        log.info("rsrq", mobile.rsrq())
+        log.info("rsrp", mobile.rsrp())
+        log.info("snr", mobile.snr())
+        log.info("simid", mobile.simid()) -- 这里是获取当前SIM卡槽
+        log.info("apn", mobile.apn(0,1))
+        -- sys内存
+        log.info("lua", rtos.meminfo())
+        log.info("sys", rtos.meminfo("sys"))
+        sys.wait(15000)
+    end
+end
+
+-- 轮询式查找小区, 包含临近小区信息,与上面订阅式搜索冲突,开启一个就行
+-- sys.taskInit(get_cell_info_task)
+-- 启动测试任务
+sys.taskInit(mobileinfo_task)

+ 103 - 0
module/Air780EHM_Air780EHV_Air780EGH/demo/mobile/readme.md

@@ -0,0 +1,103 @@
+## 功能模块介绍
+
+1、main.lua:主程序入口,负责初始化系统环境和加载移动网络测试模块;
+
+2、mobile_test.lua:移动网络功能测试模块,演示Air780EHM/Air780EHV/Air780EGH的移动网络相关功能;
+
+## 演示功能概述
+
+1、mobile_test:演示以下几种应用场景的使用方式
+
+- SIM卡配置和管理功能演示;
+- 基站数据查询(订阅式和轮询式)功能演示;
+- SIM卡状态订阅功能演示;
+- 频段(Band)测试和修改功能演示;
+- 移动网络信息获取(IMEI/IMSI/信号强度等)功能演示;
+
+## 演示硬件环境
+
+1、Air780EHM/Air780EHV/Air780EGH核心板一块 + 可上网的SIM卡一张 + 4G天线一根:
+
+- SIM卡插入核心板的SIM卡槽
+- 天线装到核心板上
+
+2、TYPE-C USB数据线一根 + USB转串口数据线一根,Air780EHM/Air780EHV/Air780EGH核心板和数据线的硬件接线方式为:
+
+- Air780EHM/Air780EHV/Air780EGH核心板通过TYPE-C USB口供电;(外部供电/USB供电 拨动开关 拨到 USB供电一端)
+- TYPE-C USB数据线直接插到核心板的TYPE-C USB座子,另外一端连接电脑USB口;
+
+## 演示软件环境
+
+1、Luatools下载调试工具
+
+2、固件获取地址:
+
+[Air780EHM 固件](https://docs.openluat.com/air780epm/luatos/firmware/version/#air780ehmluatos)
+
+[Air780EHV 固件](https://docs.openluat.com/air780ehv/luatos/firmware/version/)
+
+[Air780EGH 固件](https://docs.openluat.com/air780egh/luatos/firmware/version/)
+
+## 演示核心步骤
+
+1、搭建好硬件环境
+
+2、确保SIM卡已正确插入核心板
+
+3、Luatools烧录内核固件和demo脚本代码
+
+4、烧录成功后,自动开机运行,通过串口日志可以观察到以下信息:
+
+- SIM卡状态监控信息
+- 基站数据查询结果
+- 移动网络信息(IMEI/IMSI/信号强度等)
+- 频段测试和修改结果
+
+``` lua
+[2025-10-23 15:58:31.141][000000000.361] I/user.main project name is  mobiledemo version is  001.000.000
+[2025-10-23 15:58:31.142][000000000.370] I/mobile sim set to 2 , ret 0
+[2025-10-23 15:58:31.144][000000000.373] I/user.************开始测试band************
+[2025-10-23 15:58:31.161][000000001.774] I/user.当前使用的band:
+[2025-10-23 15:58:31.163][000000001.775] I/user.band 1
+[2025-10-23 15:58:31.165][000000001.775] I/user.band 3
+[2025-10-23 15:58:31.167][000000001.775] I/user.band 5
+[2025-10-23 15:58:31.169][000000001.776] I/user.band 8
+[2025-10-23 15:58:31.170][000000001.776] I/user.band 34
+[2025-10-23 15:58:31.172][000000001.776] I/user.band 38
+[2025-10-23 15:58:31.173][000000001.776] I/user.band 39
+[2025-10-23 15:58:31.175][000000001.777] I/user.band 40
+[2025-10-23 15:58:31.176][000000001.777] I/user.band 41
+[2025-10-23 15:58:31.178][000000001.791] I/user.修改后使用的band:
+[2025-10-23 15:58:31.179][000000001.792] I/user.band 38
+[2025-10-23 15:58:31.180][000000001.792] I/user.band 39
+[2025-10-23 15:58:31.182][000000001.793] I/user.band 40
+[2025-10-23 15:58:31.183][000000001.799] I/user.修改回默认使用的band:
+[2025-10-23 15:58:31.184][000000001.800] I/user.band 1
+[2025-10-23 15:58:31.186][000000001.800] I/user.band 3
+[2025-10-23 15:58:31.187][000000001.800] I/user.band 5
+[2025-10-23 15:58:31.189][000000001.800] I/user.band 8
+[2025-10-23 15:58:31.190][000000001.801] I/user.band 34
+[2025-10-23 15:58:31.191][000000001.801] I/user.band 38
+[2025-10-23 15:58:31.193][000000001.801] I/user.band 39
+[2025-10-23 15:58:31.195][000000001.802] I/user.band 40
+[2025-10-23 15:58:31.196][000000001.802] I/user.band 41
+[2025-10-23 15:58:31.198][000000001.802] I/user.************band测试完毕************
+[2025-10-23 15:58:48.147][000000018.809] I/user.imei 864793080175404
+[2025-10-23 15:58:48.149][000000018.809] I/user.imsi 460240452233401
+[2025-10-23 15:58:48.151][000000018.810] I/user.status 1
+[2025-10-23 15:58:48.153][000000018.810] I/user.iccid 89860855102480513401
+[2025-10-23 15:58:48.155][000000018.810] I/user.csq 27
+[2025-10-23 15:58:48.157][000000018.811] I/user.rssi -58
+[2025-10-23 15:58:48.158][000000018.811] I/user.rsrq -9
+[2025-10-23 15:58:48.160][000000018.811] I/user.rsrp -87
+[2025-10-23 15:58:48.161][000000018.812] I/user.snr 16
+[2025-10-23 15:58:48.163][000000018.812] I/user.simid 0
+[2025-10-23 15:58:48.169][000000018.812] I/user.apn cmiot.MNC024.MCC460.GPRS
+[2025-10-23 15:58:48.171][000000018.813] I/user.lua 4194296 56552 56552
+[2025-10-23 15:58:48.172][000000018.813] I/user.sys 3202992 355468 360724
+[2025-10-23 15:58:56.722][000000027.379] I/user.cell [{"mnc":0,"dlbandwidth":5,"tdd":0,"earfcn":1300,"ulbandwidth":5,"band":3,"mcc":460,"pci":219,"rsrp":-86,"tac":18511,"rssi":-57,"rsrq":-9,"snr":16,"cid":190213964},{"mnc":15,"earfcn":1300,"pci":219,"rsrp":-86,"tac":18511,"mcc":460,"rsrq":-9,"snr":16,"cid":190213964},{"mnc":0,"earfcn":40936,"pci":368,"rsrp":-103,"tac":18511,"mcc":460,"rsrq":-7,"snr":0,"cid":192844432}]
+[2025-10-23 15:58:56.726][000000027.382] I/user.sim status SIM_WC
+[2025-10-23 15:58:56.728][000000027.383] I/user.sim write counter 2
+```
+
+5、日志中会实时显示移动网络相关信息的变化,可通过观察日志来验证功能是否正常工作

+ 57 - 112
module/Air780EPM/demo/mobile/main.lua

@@ -1,122 +1,67 @@
-
--- LuaTools需要PROJECT和VERSION这两个信息
+--[[
+@module  main
+@summary LuatOS用户应用脚本文件入口,总体调度应用逻辑
+@version 1.0
+@date    2025.10.23
+@author  拓毅恒
+@usage
+本demo演示的核心功能为:
+移动网络功能测试,包括SIM卡管理、基站数据查询、频段(Band)测试和修改、移动网络信息获取(IMEI/IMSI/信号强度等)以及SIM卡状态监控。
+通过加载mobile_test模块来运行相关测试功能。
+
+更多说明参考本目录下的readme.md文件
+]]
+
+--[[
+必须定义PROJECT和VERSION变量,Luatools工具会用到这两个变量,远程升级功能也会用到这两个变量
+PROJECT:项目名,ascii string类型
+        可以随便定义,只要不使用,就行
+VERSION:项目版本号,ascii string类型
+        如果使用合宙iot.openluat.com进行远程升级,必须按照"XXX.YYY.ZZZ"三段格式定义:
+            X、Y、Z各表示1位数字,三个X表示的数字可以相同,也可以不同,同理三个Y和三个Z表示的数字也是可以相同,可以不同
+            因为历史原因,YYY这三位数字必须存在,但是没有任何用处,可以一直写为000
+        如果不使用合宙iot.openluat.com进行远程升级,根据自己项目的需求,自定义格式即可
+]]
 PROJECT = "mobiledemo"
-VERSION = "1.0.0"
-
-log.info("main", PROJECT, VERSION)
-
--- sys库是标配
-_G.sys = require("sys")
-
+VERSION = "001.000.000"
 
+log.info("main", "project name is ", PROJECT, "version is ", VERSION)
 
--- Air780E的AT固件默认会为开机键防抖, 导致部分用户刷机很麻烦
-if rtos.bsp() == "EC618" and pm and pm.PWK_MODE then
-    pm.power(pm.PWK_MODE, false)
+-- 如果内核固件支持wdt看门狗功能,此处对看门狗进行初始化和定时喂狗处理
+-- 如果脚本程序死循环卡死,就会无法及时喂狗,最终会自动重启
+if wdt then
+    --配置喂狗超时时间为9秒钟
+    wdt.init(9000)
+    --启动一个循环定时器,每隔3秒钟喂一次狗
+    sys.timerLoopStart(wdt.feed, 3000)
 end
 
-
--- 对于双卡的设备, 可以设置为自动选sim卡
--- 但是, 这样SIM1所在管脚就强制复用为SIM功能, 不可以再复用为GPIO
--- mobile.simid(2)
-mobile.simid(2,true)--优先用SIM0
-
-
-sys.taskInit(function()
-
-	log.info("status", mobile.status())
-    local band = zbuff.create(40)
-    local band1 = zbuff.create(40)
-    mobile.getBand(band)
-    log.info("当前使用的band:")
-    for i=0,band:used()-1 do
-        log.info("band", band[i])
-    end
-    band1[0] = 38
-    band1[1] = 39
-    band1[2] = 40
-    mobile.setBand(band1, 3)    --改成使用38,39,40
-    band1:clear()
-    mobile.getBand(band1)
-    log.info("修改后使用的band:")
-    for i=0,band1:used()-1 do
-        log.info("band", band1[i])
-    end
-    mobile.setBand(band, band:used())    --改回原先使用的band,也可以下载的时候选择清除fs
-
-    mobile.getBand(band1)
-    log.info("修改回默认使用的band:")
-    for i=0,band1:used()-1 do
-        log.info("band", band1[i])
-    end
-	-- mobile.vsimInit()
-	-- mobile.flymode(nil,true)
-	-- mobile.vsimOnOff(true)
-	-- mobile.flymode(nil,false)
-    -- mobile.apn(0,2,"") -- 使用默认APN激活CID2
-    -- mobile.rtime(3) -- 在无数据交互时,RRC 3秒后自动释放
-    -- 下面是配置自动搜索小区间隔,和轮询搜索冲突,开启1个就可以了
-    -- mobile.setAuto(10000,30000, 5) -- SIM暂时脱离后自动恢复,30秒搜索一次周围小区信息
-	log.info("status", mobile.status())
-    sys.wait(2000)
-    while 1 do
-        log.info("imei", mobile.imei())
-        log.info("imsi", mobile.imsi())
-        local sn = mobile.sn()
-        if sn then
-            log.info("sn",   sn:toHex())
-        end
-		log.info("status", mobile.status())
-        
-
-        log.info("iccid", mobile.iccid())
-        log.info("csq", mobile.csq()) -- 4G模块的CSQ并不能完全代表强度
-        log.info("rssi", mobile.rssi()) -- 需要综合rssi/rsrq/rsrp/snr一起判断
-        log.info("rsrq", mobile.rsrq())
-        log.info("rsrp", mobile.rsrp())
-        log.info("snr", mobile.snr())
-        log.info("simid", mobile.simid()) -- 这里是获取当前SIM卡槽
-        log.info("apn", mobile.apn(0,1))
-        log.info("ip", socket.localIP())
-		log.info("lua", rtos.meminfo())
-        -- sys内存
-        log.info("sys", rtos.meminfo("sys"))
-        sys.wait(15000)
-    end
-end)
-
--- 基站数据的查询
-
--- 订阅式, 模块本身会周期性查询基站信息,但通常不包含临近小区
-sys.subscribe("CELL_INFO_UPDATE", function()
-    log.info("cell", json.encode(mobile.getCellInfo()))
-end)
-
--- 轮询式, 包含临近小区信息,这是手动搜索,和上面的自动搜索冲突,开启一个就行
-sys.taskInit(function()
-    sys.wait(5000)
-	mobile.config(mobile.CONF_SIM_WC_MODE, 2)
-    while 1 do
-        mobile.reqCellInfo(10)
-        sys.wait(11000)
-        log.info("cell", json.encode(mobile.getCellInfo()))
-		mobile.config(mobile.CONF_SIM_WC_MODE, 2)
-    end
-end)
-
--- 获取sim卡的状态
-
-sys.subscribe("SIM_IND", function(status, value)
-    log.info("sim status", status)
-    if status == 'GET_NUMBER' then
-        log.info("number", mobile.number(0))
-    end
-	if status == "SIM_WC" then
-        log.info("sim", "write counter", value)
-    end
-end)
+-- 如果内核固件支持errDump功能,此处进行配置,【强烈建议打开此处的注释】
+-- 因为此功能模块可以记录并且上传脚本在运行过程中出现的语法错误或者其他自定义的错误信息,可以初步分析一些设备运行异常的问题
+-- 以下代码是最基本的用法,更复杂的用法可以详细阅读API说明文档
+-- 启动errDump日志存储并且上传功能,600秒上传一次
+-- if errDump then
+--     errDump.config(true, 600)
+-- end
+
+-- 使用LuatOS开发的任何一个项目,都强烈建议使用远程升级FOTA功能
+-- 可以使用合宙的iot.openluat.com平台进行远程升级
+-- 也可以使用客户自己搭建的平台进行远程升级
+-- 远程升级的详细用法,可以参考fota的demo进行使用
+
+-- 启动一个循环定时器
+-- 每隔3秒钟打印一次总内存,实时的已使用内存,历史最高的已使用内存情况
+-- 方便分析内存使用是否有异常
+-- sys.timerLoopStart(function()
+--     log.info("mem.lua", rtos.meminfo())
+--     log.info("mem.sys", rtos.meminfo("sys"))
+-- end, 3000)
+
+-- 加载 mobile_test 功能模块
+require "mobile_test"
 
 -- 用户代码已结束---------------------------------------------
 -- 结尾总是这一句
 sys.run()
 -- sys.run()之后后面不要加任何语句!!!!!
+

+ 114 - 0
module/Air780EPM/demo/mobile/mobile_test.lua

@@ -0,0 +1,114 @@
+--[[
+@module  mobile_test
+@summary Air780EPM mobile功能测试模块
+@version 1.0
+@date    2025.10.21
+@author  拓毅恒
+@usage
+本文件为 Air780EPM 开发板演示移动网络功能的代码示例,核心业务逻辑包括:
+1. SIM卡管理和选择(自动选卡功能)
+2. 基站数据查询(订阅式和轮询式两种方式)
+3. 频段(Band)测试和修改
+4. 移动网络信息获取(IMEI、IMSI、信号强度等)
+5. SIM卡状态监控
+]]
+
+-- 对于双卡的设备, 可以设置为自动选sim卡
+-- 但是SIM1所在管脚就强制复用为SIM功能, 占用4个IO口(gpio4/5/6/23),不可以再复用为GPIO
+-- mobile.simid(2)
+mobile.simid(2,true)--优先用SIM0
+
+-- 基站数据的查询
+-- 订阅式, 模块本身会周期性查询基站信息,但通常不包含临近小区
+local function sub_cell_info_task()
+    log.info("cell", json.encode(mobile.getCellInfo()))
+end
+
+sys.subscribe("CELL_INFO_UPDATE", sub_cell_info_task)
+
+-- 轮询式, 包含临近小区信息,这是手动搜索,和上面的自动搜索冲突,开启一个就行
+local function get_cell_info_task()
+    sys.wait(5000)
+	mobile.config(mobile.CONF_SIM_WC_MODE, 2)
+    while 1 do
+        mobile.reqCellInfo(10)
+        sys.wait(11000)
+        log.info("cell", json.encode(mobile.getCellInfo()))
+		mobile.config(mobile.CONF_SIM_WC_MODE, 2)
+    end
+end
+
+-- 获取sim卡的状态
+local function get_sim_status_task(status, value)
+    log.info("sim status", status)
+    if status == 'GET_NUMBER' then
+        log.info("number", mobile.number(0))
+    end
+	if status == "SIM_WC" then
+        log.info("sim", "write counter", value)
+    end
+end
+
+sys.subscribe("SIM_IND", get_sim_status_task)
+
+-- 定义测试band和移动网络信息的函数
+local function mobileinfo_task()
+    -- 设置默认APN 
+    -- 注意:在国内公网卡基本上都不需要设置APN, 专网卡才需要设置
+    mobile.apn(0,1,"cmiot","","",nil,0)
+    -- 开启SIM暂时脱离后自动恢复,30秒搜索一次周围小区信息
+    mobile.setAuto(10000,30000, 5) -- 此函数仅需要配置一次
+    
+    log.info("************开始测试band************")
+    local band = zbuff.create(40)
+    local band1 = zbuff.create(40)
+    mobile.getBand(band)
+    log.info("当前使用的band:")
+    for i=0,band:used()-1 do
+        log.info("band", band[i])
+    end
+    band1[0] = 38
+    band1[1] = 39
+    band1[2] = 40
+    mobile.setBand(band1, 3)    --改成使用38,39,40
+    band1:clear()
+    mobile.getBand(band1)
+    log.info("修改后使用的band:")
+    for i=0,band1:used()-1 do
+        log.info("band", band1[i])
+    end
+    mobile.setBand(band, band:used())    --改回原先使用的band,也可以下载的时候选择清除fs
+
+    mobile.getBand(band1)
+    log.info("修改回默认使用的band:")
+    for i=0,band1:used()-1 do
+        log.info("band", band1[i])
+    end
+    log.info("************band测试完毕************")
+
+	log.info("status", mobile.status())
+    sys.wait(2000)
+    while 1 do
+        log.info("imei", mobile.imei())
+        log.info("imsi", mobile.imsi())
+        log.info("apn", mobile.apn()) -- 获取当前APN
+        log.info("status", mobile.status())
+        log.info("iccid", mobile.iccid())
+        log.info("csq", mobile.csq()) -- 4G模块的CSQ并不能完全代表强度
+        log.info("rssi", mobile.rssi()) -- 需要综合rssi/rsrq/rsrp/snr一起判断
+        log.info("rsrq", mobile.rsrq())
+        log.info("rsrp", mobile.rsrp())
+        log.info("snr", mobile.snr())
+        log.info("simid", mobile.simid()) -- 这里是获取当前SIM卡槽
+        log.info("apn", mobile.apn(0,1))
+        -- sys内存
+        log.info("lua", rtos.meminfo())
+        log.info("sys", rtos.meminfo("sys"))
+        sys.wait(15000)
+    end
+end
+
+-- 轮询式查找小区, 包含临近小区信息,与上面订阅式搜索冲突,开启一个就行
+-- sys.taskInit(get_cell_info_task)
+-- 启动测试任务
+sys.taskInit(mobileinfo_task)

+ 97 - 0
module/Air780EPM/demo/mobile/readme.md

@@ -0,0 +1,97 @@
+## 功能模块介绍
+
+1、main.lua:主程序入口,负责初始化系统环境和加载移动网络测试模块;
+
+2、mobile_test.lua:移动网络功能测试模块,演示Air780EPM的移动网络相关功能;
+
+## 演示功能概述
+
+1、mobile_test:演示以下几种应用场景的使用方式
+
+- SIM卡配置和管理功能演示;
+- 基站数据查询(订阅式和轮询式)功能演示;
+- SIM卡状态订阅功能演示;
+- 频段(Band)测试和修改功能演示;
+- 移动网络信息获取(IMEI/IMSI/信号强度等)功能演示;
+
+## 演示硬件环境
+
+1、Air780EPM开发板一块 + 可上网的SIM卡一张 + 4G天线一根:
+
+- SIM卡插入开发板的SIM卡槽
+- 天线装到开发板上
+
+2、TYPE-C USB数据线一根 + USB转串口数据线一根,Air780EPM开发板和数据线的硬件接线方式为:
+
+- Air780EPM开发板通过TYPE-C USB口供电;(外部供电/USB供电 拨动开关 拨到 USB供电一端)
+- TYPE-C USB数据线直接插到核心板的TYPE-C USB座子,另外一端连接电脑USB口;
+
+## 演示软件环境
+
+1、Luatools下载调试工具
+
+2、Air780EPM 版本固件:[Air780EPM 版本固件](https://docs.openluat.com/air780epm/luatos/firmware/version/)
+
+## 演示核心步骤
+
+1、搭建好硬件环境
+
+2、确保SIM卡已正确插入开发板
+
+3、Luatools烧录内核固件和demo脚本代码
+
+4、烧录成功后,自动开机运行,通过串口日志可以观察到以下信息:
+
+- SIM卡状态监控信息
+- 基站数据查询结果
+- 移动网络信息(IMEI/IMSI/信号强度等)
+- 频段测试和修改结果
+
+``` lua
+[2025-10-23 15:58:31.141][000000000.361] I/user.main project name is  mobiledemo version is  001.000.000
+[2025-10-23 15:58:31.142][000000000.370] I/mobile sim set to 2 , ret 0
+[2025-10-23 15:58:31.144][000000000.373] I/user.************开始测试band************
+[2025-10-23 15:58:31.161][000000001.774] I/user.当前使用的band:
+[2025-10-23 15:58:31.163][000000001.775] I/user.band 1
+[2025-10-23 15:58:31.165][000000001.775] I/user.band 3
+[2025-10-23 15:58:31.167][000000001.775] I/user.band 5
+[2025-10-23 15:58:31.169][000000001.776] I/user.band 8
+[2025-10-23 15:58:31.170][000000001.776] I/user.band 34
+[2025-10-23 15:58:31.172][000000001.776] I/user.band 38
+[2025-10-23 15:58:31.173][000000001.776] I/user.band 39
+[2025-10-23 15:58:31.175][000000001.777] I/user.band 40
+[2025-10-23 15:58:31.176][000000001.777] I/user.band 41
+[2025-10-23 15:58:31.178][000000001.791] I/user.修改后使用的band:
+[2025-10-23 15:58:31.179][000000001.792] I/user.band 38
+[2025-10-23 15:58:31.180][000000001.792] I/user.band 39
+[2025-10-23 15:58:31.182][000000001.793] I/user.band 40
+[2025-10-23 15:58:31.183][000000001.799] I/user.修改回默认使用的band:
+[2025-10-23 15:58:31.184][000000001.800] I/user.band 1
+[2025-10-23 15:58:31.186][000000001.800] I/user.band 3
+[2025-10-23 15:58:31.187][000000001.800] I/user.band 5
+[2025-10-23 15:58:31.189][000000001.800] I/user.band 8
+[2025-10-23 15:58:31.190][000000001.801] I/user.band 34
+[2025-10-23 15:58:31.191][000000001.801] I/user.band 38
+[2025-10-23 15:58:31.193][000000001.801] I/user.band 39
+[2025-10-23 15:58:31.195][000000001.802] I/user.band 40
+[2025-10-23 15:58:31.196][000000001.802] I/user.band 41
+[2025-10-23 15:58:31.198][000000001.802] I/user.************band测试完毕************
+[2025-10-23 15:58:48.147][000000018.809] I/user.imei 864793080175404
+[2025-10-23 15:58:48.149][000000018.809] I/user.imsi 460240452233401
+[2025-10-23 15:58:48.151][000000018.810] I/user.status 1
+[2025-10-23 15:58:48.153][000000018.810] I/user.iccid 89860855102480513401
+[2025-10-23 15:58:48.155][000000018.810] I/user.csq 27
+[2025-10-23 15:58:48.157][000000018.811] I/user.rssi -58
+[2025-10-23 15:58:48.158][000000018.811] I/user.rsrq -9
+[2025-10-23 15:58:48.160][000000018.811] I/user.rsrp -87
+[2025-10-23 15:58:48.161][000000018.812] I/user.snr 16
+[2025-10-23 15:58:48.163][000000018.812] I/user.simid 0
+[2025-10-23 15:58:48.169][000000018.812] I/user.apn cmiot.MNC024.MCC460.GPRS
+[2025-10-23 15:58:48.171][000000018.813] I/user.lua 4194296 56552 56552
+[2025-10-23 15:58:48.172][000000018.813] I/user.sys 3202992 355468 360724
+[2025-10-23 15:58:56.722][000000027.379] I/user.cell [{"mnc":0,"dlbandwidth":5,"tdd":0,"earfcn":1300,"ulbandwidth":5,"band":3,"mcc":460,"pci":219,"rsrp":-86,"tac":18511,"rssi":-57,"rsrq":-9,"snr":16,"cid":190213964},{"mnc":15,"earfcn":1300,"pci":219,"rsrp":-86,"tac":18511,"mcc":460,"rsrq":-9,"snr":16,"cid":190213964},{"mnc":0,"earfcn":40936,"pci":368,"rsrp":-103,"tac":18511,"mcc":460,"rsrq":-7,"snr":0,"cid":192844432}]
+[2025-10-23 15:58:56.726][000000027.382] I/user.sim status SIM_WC
+[2025-10-23 15:58:56.728][000000027.383] I/user.sim write counter 2
+```
+
+5、日志中会实时显示移动网络相关信息的变化,可通过观察日志来验证功能是否正常工作

+ 61 - 112
module/Air8000/demo/mobile/main.lua

@@ -1,118 +1,67 @@
-
--- LuaTools需要PROJECT和VERSION这两个信息
+--[[
+@module  main
+@summary LuatOS用户应用脚本文件入口,总体调度应用逻辑
+@version 1.0
+@date    2025.10.23
+@author  拓毅恒
+@usage
+本demo演示的核心功能为:
+移动网络功能测试,包括SIM卡管理、基站数据查询、频段(Band)测试和修改、移动网络信息获取(IMEI/IMSI/信号强度等)以及SIM卡状态监控。
+通过加载mobile_test模块来运行相关测试功能。
+
+更多说明参考本目录下的readme.md文件
+]]
+
+--[[
+必须定义PROJECT和VERSION变量,Luatools工具会用到这两个变量,远程升级功能也会用到这两个变量
+PROJECT:项目名,ascii string类型
+        可以随便定义,只要不使用,就行
+VERSION:项目版本号,ascii string类型
+        如果使用合宙iot.openluat.com进行远程升级,必须按照"XXX.YYY.ZZZ"三段格式定义:
+            X、Y、Z各表示1位数字,三个X表示的数字可以相同,也可以不同,同理三个Y和三个Z表示的数字也是可以相同,可以不同
+            因为历史原因,YYY这三位数字必须存在,但是没有任何用处,可以一直写为000
+        如果不使用合宙iot.openluat.com进行远程升级,根据自己项目的需求,自定义格式即可
+]]
 PROJECT = "mobiledemo"
-VERSION = "1.0.0"
-
-log.info("main", PROJECT, VERSION)
-
--- sys库是标配
-_G.sys = require("sys")
-
-
-
-
-
--- 对于双卡的设备, 可以设置为自动选sim卡
--- 但是, 这样SIM1所在管脚就强制复用为SIM功能, 不可以再复用为GPIO
--- mobile.simid(2)
-mobile.simid(2,true)--优先用SIM0
-
-
-sys.taskInit(function()
-
-	log.info("status", mobile.status())
-    local band = zbuff.create(40)
-    local band1 = zbuff.create(40)
-    mobile.getBand(band)
-    log.info("当前使用的band:")
-    for i=0,band:used()-1 do
-        log.info("band", band[i])
-    end
-    band1[0] = 38
-    band1[1] = 39
-    band1[2] = 40
-    mobile.setBand(band1, 3)    --改成使用38,39,40
-    band1:clear()
-    mobile.getBand(band1)
-    log.info("修改后使用的band:")
-    for i=0,band1:used()-1 do
-        log.info("band", band1[i])
-    end
-    mobile.setBand(band, band:used())    --改回原先使用的band,也可以下载的时候选择清除fs
-
-    mobile.getBand(band1)
-    log.info("修改回默认使用的band:")
-    for i=0,band1:used()-1 do
-        log.info("band", band1[i])
-    end
-	-- mobile.vsimInit()
-	-- mobile.flymode(nil,true)
-	-- mobile.vsimOnOff(true)
-	-- mobile.flymode(nil,false)
-    -- mobile.apn(0,2,"") -- 使用默认APN激活CID2
-    -- mobile.rtime(3) -- 在无数据交互时,RRC 3秒后自动释放
-    -- 下面是配置自动搜索小区间隔,和轮询搜索冲突,开启1个就可以了
-    -- mobile.setAuto(10000,30000, 5) -- SIM暂时脱离后自动恢复,30秒搜索一次周围小区信息
-	log.info("status", mobile.status())
-    sys.wait(2000)
-    while 1 do
-        log.info("imei", mobile.imei())
-        log.info("imsi", mobile.imsi())
-        local sn = mobile.sn()
-        if sn then
-            log.info("sn",   sn:toHex())
-        end
-		log.info("status", mobile.status())
-        
-
-        log.info("iccid", mobile.iccid())
-        log.info("csq", mobile.csq()) -- 4G模块的CSQ并不能完全代表强度
-        log.info("rssi", mobile.rssi()) -- 需要综合rssi/rsrq/rsrp/snr一起判断
-        log.info("rsrq", mobile.rsrq())
-        log.info("rsrp", mobile.rsrp())
-        log.info("snr", mobile.snr())
-        log.info("simid", mobile.simid()) -- 这里是获取当前SIM卡槽
-        log.info("apn", mobile.apn(0,1))
-        log.info("ip", socket.localIP())
-		log.info("lua", rtos.meminfo())
-        -- sys内存
-        log.info("sys", rtos.meminfo("sys"))
-        sys.wait(15000)
-    end
-end)
-
--- 基站数据的查询
-
--- 订阅式, 模块本身会周期性查询基站信息,但通常不包含临近小区
-sys.subscribe("CELL_INFO_UPDATE", function()
-    log.info("cell", json.encode(mobile.getCellInfo()))
-end)
-
--- 轮询式, 包含临近小区信息,这是手动搜索,和上面的自动搜索冲突,开启一个就行
-sys.taskInit(function()
-    sys.wait(5000)
-	mobile.config(mobile.CONF_SIM_WC_MODE, 2)
-    while 1 do
-        mobile.reqCellInfo(10)
-        sys.wait(11000)
-        log.info("cell", json.encode(mobile.getCellInfo()))
-		mobile.config(mobile.CONF_SIM_WC_MODE, 2)
-    end
-end)
-
--- 获取sim卡的状态
-
-sys.subscribe("SIM_IND", function(status, value)
-    log.info("sim status", status)
-    if status == 'GET_NUMBER' then
-        log.info("number", mobile.number(0))
-    end
-	if status == "SIM_WC" then
-        log.info("sim", "write counter", value)
-    end
-end)
+VERSION = "001.000.000"
+
+log.info("main", "project name is ", PROJECT, "version is ", VERSION)
+
+-- 如果内核固件支持wdt看门狗功能,此处对看门狗进行初始化和定时喂狗处理
+-- 如果脚本程序死循环卡死,就会无法及时喂狗,最终会自动重启
+if wdt then
+    --配置喂狗超时时间为9秒钟
+    wdt.init(9000)
+    --启动一个循环定时器,每隔3秒钟喂一次狗
+    sys.timerLoopStart(wdt.feed, 3000)
+end
+
+-- 如果内核固件支持errDump功能,此处进行配置,【强烈建议打开此处的注释】
+-- 因为此功能模块可以记录并且上传脚本在运行过程中出现的语法错误或者其他自定义的错误信息,可以初步分析一些设备运行异常的问题
+-- 以下代码是最基本的用法,更复杂的用法可以详细阅读API说明文档
+-- 启动errDump日志存储并且上传功能,600秒上传一次
+-- if errDump then
+--     errDump.config(true, 600)
+-- end
+
+-- 使用LuatOS开发的任何一个项目,都强烈建议使用远程升级FOTA功能
+-- 可以使用合宙的iot.openluat.com平台进行远程升级
+-- 也可以使用客户自己搭建的平台进行远程升级
+-- 远程升级的详细用法,可以参考fota的demo进行使用
+
+-- 启动一个循环定时器
+-- 每隔3秒钟打印一次总内存,实时的已使用内存,历史最高的已使用内存情况
+-- 方便分析内存使用是否有异常
+-- sys.timerLoopStart(function()
+--     log.info("mem.lua", rtos.meminfo())
+--     log.info("mem.sys", rtos.meminfo("sys"))
+-- end, 3000)
+
+-- 加载 mobile_test 功能模块
+require "mobile_test"
 
 -- 用户代码已结束---------------------------------------------
 -- 结尾总是这一句
 sys.run()
 -- sys.run()之后后面不要加任何语句!!!!!
+

+ 114 - 0
module/Air8000/demo/mobile/mobile_test.lua

@@ -0,0 +1,114 @@
+--[[
+@module  mobile_test
+@summary Air8000 mobile功能测试模块
+@version 1.0
+@date    2025.10.21
+@author  拓毅恒
+@usage
+本文件为 Air8000 开发板演示移动网络功能的代码示例,核心业务逻辑包括:
+1. SIM卡管理和选择(自动选卡功能)
+2. 基站数据查询(订阅式和轮询式两种方式)
+3. 频段(Band)测试和修改
+4. 移动网络信息获取(IMEI、IMSI、信号强度等)
+5. SIM卡状态监控
+]]
+
+-- 对于双卡的设备, 可以设置为自动选sim卡
+-- 但是SIM1所在管脚就强制复用为SIM功能, 占用4个IO口(gpio4/5/6/23),不可以再复用为GPIO
+-- mobile.simid(2)
+mobile.simid(2,true)--优先用SIM0
+
+-- 基站数据的查询
+-- 订阅式, 模块本身会周期性查询基站信息,但通常不包含临近小区
+local function sub_cell_info_task()
+    log.info("cell", json.encode(mobile.getCellInfo()))
+end
+
+sys.subscribe("CELL_INFO_UPDATE", sub_cell_info_task)
+
+-- 轮询式, 包含临近小区信息,这是手动搜索,和上面的自动搜索冲突,开启一个就行
+local function get_cell_info_task()
+    sys.wait(5000)
+	mobile.config(mobile.CONF_SIM_WC_MODE, 2)
+    while 1 do
+        mobile.reqCellInfo(10)
+        sys.wait(11000)
+        log.info("cell", json.encode(mobile.getCellInfo()))
+		mobile.config(mobile.CONF_SIM_WC_MODE, 2)
+    end
+end
+
+-- 获取sim卡的状态
+local function get_sim_status_task(status, value)
+    log.info("sim status", status)
+    if status == 'GET_NUMBER' then
+        log.info("number", mobile.number(0))
+    end
+	if status == "SIM_WC" then
+        log.info("sim", "write counter", value)
+    end
+end
+
+sys.subscribe("SIM_IND", get_sim_status_task)
+
+-- 定义测试band和移动网络信息的函数
+local function mobileinfo_task()
+    -- 设置默认APN 
+    -- 注意:在国内公网卡基本上都不需要设置APN, 专网卡才需要设置
+    mobile.apn(0,1,"cmiot","","",nil,0)
+    -- 开启SIM暂时脱离后自动恢复,30秒搜索一次周围小区信息
+    mobile.setAuto(10000,30000, 5) -- 此函数仅需要配置一次
+    
+    log.info("************开始测试band************")
+    local band = zbuff.create(40)
+    local band1 = zbuff.create(40)
+    mobile.getBand(band)
+    log.info("当前使用的band:")
+    for i=0,band:used()-1 do
+        log.info("band", band[i])
+    end
+    band1[0] = 38
+    band1[1] = 39
+    band1[2] = 40
+    mobile.setBand(band1, 3)    --改成使用38,39,40
+    band1:clear()
+    mobile.getBand(band1)
+    log.info("修改后使用的band:")
+    for i=0,band1:used()-1 do
+        log.info("band", band1[i])
+    end
+    mobile.setBand(band, band:used())    --改回原先使用的band,也可以下载的时候选择清除fs
+
+    mobile.getBand(band1)
+    log.info("修改回默认使用的band:")
+    for i=0,band1:used()-1 do
+        log.info("band", band1[i])
+    end
+    log.info("************band测试完毕************")
+
+	log.info("status", mobile.status())
+    sys.wait(2000)
+    while 1 do
+        log.info("imei", mobile.imei())
+        log.info("imsi", mobile.imsi())
+        log.info("apn", mobile.apn()) -- 获取当前APN
+        log.info("status", mobile.status())
+        log.info("iccid", mobile.iccid())
+        log.info("csq", mobile.csq()) -- 4G模块的CSQ并不能完全代表强度
+        log.info("rssi", mobile.rssi()) -- 需要综合rssi/rsrq/rsrp/snr一起判断
+        log.info("rsrq", mobile.rsrq())
+        log.info("rsrp", mobile.rsrp())
+        log.info("snr", mobile.snr())
+        log.info("simid", mobile.simid()) -- 这里是获取当前SIM卡槽
+        log.info("apn", mobile.apn(0,1))
+        -- sys内存
+        log.info("lua", rtos.meminfo())
+        log.info("sys", rtos.meminfo("sys"))
+        sys.wait(15000)
+    end
+end
+
+-- 轮询式查找小区, 包含临近小区信息,与上面订阅式搜索冲突,开启一个就行
+-- sys.taskInit(get_cell_info_task)
+-- 启动测试任务
+sys.taskInit(mobileinfo_task)

+ 97 - 0
module/Air8000/demo/mobile/readme.md

@@ -0,0 +1,97 @@
+## 功能模块介绍
+
+1、main.lua:主程序入口,负责初始化系统环境和加载移动网络测试模块;
+
+2、mobile_test.lua:移动网络功能测试模块,演示Air8000的移动网络相关功能;
+
+## 演示功能概述
+
+1、mobile_test:演示以下几种应用场景的使用方式
+
+- SIM卡配置和管理功能演示;
+- 基站数据查询(订阅式和轮询式)功能演示;
+- SIM卡状态订阅功能演示;
+- 频段(Band)测试和修改功能演示;
+- 移动网络信息获取(IMEI/IMSI/信号强度等)功能演示;
+
+## 演示硬件环境
+
+1、Air8000开发板一块 + 可上网的SIM卡一张 + 4G天线一根:
+
+- SIM卡插入开发板的SIM卡槽
+- 天线装到开发板上
+
+2、TYPE-C USB数据线一根 + USB转串口数据线一根,Air8000开发板和数据线的硬件接线方式为:
+
+- Air8000开发板通过TYPE-C USB口供电;(外部供电/USB供电 拨动开关 拨到 USB供电一端)
+- TYPE-C USB数据线直接插到核心板的TYPE-C USB座子,另外一端连接电脑USB口;
+
+## 演示软件环境
+
+1、Luatools下载调试工具
+
+2、Air8000 版本固件:[Air8000 版本固件](https://docs.openluat.com/air8000/luatos/firmware/)
+
+## 演示核心步骤
+
+1、搭建好硬件环境
+
+2、确保SIM卡已正确插入开发板
+
+3、Luatools烧录内核固件和demo脚本代码
+
+4、烧录成功后,自动开机运行,通过串口日志可以观察到以下信息:
+
+- SIM卡状态监控信息
+- 基站数据查询结果
+- 移动网络信息(IMEI/IMSI/信号强度等)
+- 频段测试和修改结果
+
+``` lua
+[2025-10-23 15:58:31.141][000000000.361] I/user.main project name is  mobiledemo version is  001.000.000
+[2025-10-23 15:58:31.142][000000000.370] I/mobile sim set to 2 , ret 0
+[2025-10-23 15:58:31.144][000000000.373] I/user.************开始测试band************
+[2025-10-23 15:58:31.161][000000001.774] I/user.当前使用的band:
+[2025-10-23 15:58:31.163][000000001.775] I/user.band 1
+[2025-10-23 15:58:31.165][000000001.775] I/user.band 3
+[2025-10-23 15:58:31.167][000000001.775] I/user.band 5
+[2025-10-23 15:58:31.169][000000001.776] I/user.band 8
+[2025-10-23 15:58:31.170][000000001.776] I/user.band 34
+[2025-10-23 15:58:31.172][000000001.776] I/user.band 38
+[2025-10-23 15:58:31.173][000000001.776] I/user.band 39
+[2025-10-23 15:58:31.175][000000001.777] I/user.band 40
+[2025-10-23 15:58:31.176][000000001.777] I/user.band 41
+[2025-10-23 15:58:31.178][000000001.791] I/user.修改后使用的band:
+[2025-10-23 15:58:31.179][000000001.792] I/user.band 38
+[2025-10-23 15:58:31.180][000000001.792] I/user.band 39
+[2025-10-23 15:58:31.182][000000001.793] I/user.band 40
+[2025-10-23 15:58:31.183][000000001.799] I/user.修改回默认使用的band:
+[2025-10-23 15:58:31.184][000000001.800] I/user.band 1
+[2025-10-23 15:58:31.186][000000001.800] I/user.band 3
+[2025-10-23 15:58:31.187][000000001.800] I/user.band 5
+[2025-10-23 15:58:31.189][000000001.800] I/user.band 8
+[2025-10-23 15:58:31.190][000000001.801] I/user.band 34
+[2025-10-23 15:58:31.191][000000001.801] I/user.band 38
+[2025-10-23 15:58:31.193][000000001.801] I/user.band 39
+[2025-10-23 15:58:31.195][000000001.802] I/user.band 40
+[2025-10-23 15:58:31.196][000000001.802] I/user.band 41
+[2025-10-23 15:58:31.198][000000001.802] I/user.************band测试完毕************
+[2025-10-23 15:58:48.147][000000018.809] I/user.imei 864793080175404
+[2025-10-23 15:58:48.149][000000018.809] I/user.imsi 460240452233401
+[2025-10-23 15:58:48.151][000000018.810] I/user.status 1
+[2025-10-23 15:58:48.153][000000018.810] I/user.iccid 89860855102480513401
+[2025-10-23 15:58:48.155][000000018.810] I/user.csq 27
+[2025-10-23 15:58:48.157][000000018.811] I/user.rssi -58
+[2025-10-23 15:58:48.158][000000018.811] I/user.rsrq -9
+[2025-10-23 15:58:48.160][000000018.811] I/user.rsrp -87
+[2025-10-23 15:58:48.161][000000018.812] I/user.snr 16
+[2025-10-23 15:58:48.163][000000018.812] I/user.simid 0
+[2025-10-23 15:58:48.169][000000018.812] I/user.apn cmiot.MNC024.MCC460.GPRS
+[2025-10-23 15:58:48.171][000000018.813] I/user.lua 4194296 56552 56552
+[2025-10-23 15:58:48.172][000000018.813] I/user.sys 3202992 355468 360724
+[2025-10-23 15:58:56.722][000000027.379] I/user.cell [{"mnc":0,"dlbandwidth":5,"tdd":0,"earfcn":1300,"ulbandwidth":5,"band":3,"mcc":460,"pci":219,"rsrp":-86,"tac":18511,"rssi":-57,"rsrq":-9,"snr":16,"cid":190213964},{"mnc":15,"earfcn":1300,"pci":219,"rsrp":-86,"tac":18511,"mcc":460,"rsrq":-9,"snr":16,"cid":190213964},{"mnc":0,"earfcn":40936,"pci":368,"rsrp":-103,"tac":18511,"mcc":460,"rsrq":-7,"snr":0,"cid":192844432}]
+[2025-10-23 15:58:56.726][000000027.382] I/user.sim status SIM_WC
+[2025-10-23 15:58:56.728][000000027.383] I/user.sim write counter 2
+```
+
+5、日志中会实时显示移动网络相关信息的变化,可通过观察日志来验证功能是否正常工作