找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

5074

积分

0

好友

693

主题
发表于 5 小时前 | 查看: 5| 回复: 0

在面向物联网的移动通信技术中,4G-Cat.1凭借其在性能、功耗与成本之间的优异平衡,已成为中低速连接场景的主流选择。

LuatOS 提供了 Mobile 核心库,帮助开发者高效管理设备通信。该库提供简洁易用的 API 接口,涵盖网络连接、状态监控与高级功能配置,兼容所有基于 LuatOS 的通信模组。支持设备入网、信号质量监测、小区信息获取等多种物联网场景,为设备提供稳定可靠的通信能力。

其核心功能包括:

  • 联网配置:管理 SIM 卡与 APN 设置,快速建立稳定网络连接。
  • 状态监控:实时获取网络注册状态、信号强度与质量指标。
  • 信息管理:查询基站小区信息、统计通信流量等。

本文将以合宙低功耗 Cat.1 模组 Air780EPM 系列核心板/开发板为例,分享 Mobile 核心库应用示例要点。

Air780EPM核心板手持图

Air780EPM开发板

一、Mobile 功能示例 demo

Mobile 功能是 Air780EPM 最核心的功能之一,掌握这些功能的使用方法,对于开发基于移动网络的通信应用至关重要。

示例功能测试:

  • SIM 卡配置和管理功能
  • 基站数据查询(订阅式和轮询式)功能
  • SIM 卡状态订阅功能
  • 频段(Band)测试和修改功能
  • 移动网络信息获取(IMEI/IMSI/信号强度等)功能

以下是 Air780EPM 移动网络各种功能的实现方法和核心代码逻辑,完整 demo 详见源码仓库。

1.1 SIM 卡管理和选择

SIM 卡管理功能用于选择和管理设备使用的 SIM 卡,支持自动选卡功能。

功能定义: 配置设备使用的 SIM 卡,支持手动选择和自动选择两种方式,适用于双卡设备的 SIM 卡管理。

代码示例:

-- 对于双卡的设备,可以设置为自动选sim卡
-- 但是SIM1所在管脚就强制复用为SIM功能,占用4个IO口(gpio4/5/6/23),不可以再复用为GPIO
-- mobile.simid(2) -- 手动选择SIM卡
mobile.simid(2, true) -- 自动选择SIM卡,优先使用SIM0

-- 获取当前使用的SIM卡
log.info("simid", mobile.simid())

烧录运行: 使用 Luatools 将相关代码烧录到 Air780EPM 核心板/开发板。

项目管理界面截图

烧录完毕后,设备将按照代码中的配置选择 SIM 卡。如果启用了自动选卡功能,设备会优先尝试使用 SIM0,如果 SIM0 不可用,则会尝试使用 SIM1。

日志中会打印当前使用的 SIM 卡索引信息,如下图所示,使用模式 2 自动选卡功能,此时会自动识别 SIM 卡所在卡槽,并且优先识别 SIM0:

日志输出:SIM设置为2

1.2 基站数据查询

基站数据查询功能用于获取设备当前连接的基站信息,支持订阅式和轮询式两种查询方式。

功能定义: 通过订阅事件或主动轮询的方式,获取设备当前连接的基站信息,包括主服务小区和临近小区的详细数据。

代码示例:

-- 基站数据的查询
-- 订阅式,模块本身会周期性查询基站信息,但通常不包含临近小区
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
        -- 请求获取基站信息,超时时间10秒
        mobile.reqCellInfo(10)
        sys.wait(11000)
        -- 获取并打印基站信息
        log.info("cell", json.encode(mobile.getCellInfo()))
        mobile.config(mobile.CONF_SIM_WC_MODE, 2)
    end
end

-- 轮询式查找小区,包含临近小区信息,与上面订阅式搜索冲突,开启一个就行
-- sys.taskInit(get_cell_info_task)

烧录运行: 使用 Luatools 将相关代码烧录到 Air780EPM 核心板/开发板。设备成功连接到网络后,会定期获取并打印基站信息。

订阅式会在基站信息更新时触发事件:

订阅式基站信息输出

轮询式会按照设定的时间间隔主动查询:

轮询式基站信息输出

1.3 SIM 卡 APN 的设置

功能定义: 获取或设置 SIM 卡的 APN 功能。注意:APN 必须在入网前就设置好;在国内公网卡基本上都不需要设置 APN,专网卡才需要设置。

代码示例:

-- 设置默认APN
-- 注意:APN 必须在入网前就设置好;在国内公网卡基本上都不需要设置APN,专网卡才需要设置
mobile.apn(0,1,"","",nil,0)

-- 获取APN
log.info("apn", mobile.apn())

烧录运行: 使用 Luatools 将相关代码烧录到 Air780EPM 核心板/开发板。设备启动后,可以看到日志中打印 APN 相关信息:

日志输出:APN信息

1.4 频段(Band)测试和修改

频段配置功能用于查询和修改设备使用的网络频段,可根据实际需求调整支持的频段。

功能定义: 查询当前设备使用的网络频段,并演示如何修改频段配置,然后恢复默认配置。

代码示例:

log.info("************开始测试band************")
-- 创建zbuff对象用于存储频段信息
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

-- 设置要使用的频段(38,39,40)
band1[0] = 38
band1[1] = 39
band1[2] = 40
mobile.setBand(band1, 3)

-- 获取修改后的频段
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())

-- 再次获取频段确认恢复成功
band1:clear()
mobile.getBand(band1)
log.info("修改回默认使用的band:")
for i=0, band1:used()-1 do
    log.info("band", band1[i])
end

log.info("************band测试完毕************")

烧录运行: 使用 Luatools 将相关代码烧录到 Air780EPM 核心板/开发板。设备启动后,日志中会清晰显示每个步骤的频段信息。

频段测试日志输出

1.5 移动网络信息获取

移动网络信息获取功能用于获取设备的各种网络标识和信号质量参数,包括 IMEI、IMSI、信号强度等。

功能定义: 定期获取并打印设备的 IMEI、IMSI、网络状态、SIM 卡 ICCID、信号强度(CSQ、RSSI、RSRQ、RSRP、SNR)等关键信息。

代码示例:

-- 设置SIM暂时脱离后自动恢复,30秒搜索一次周围小区信息
mobile.setAuto(10000, 30000, 5) -- 此函数仅需要配置一次

-- 获取网络状态
log.info("status", mobile.status())
sys.wait(2000)

-- 定期获取并打印网络信息
while 1 do
    -- 获取并打印IMEI
    log.info("imei", mobile.imei())
    -- 获取并打印IMSI
    log.info("imsi", mobile.imsi())
    -- 获取并打印网络状态
    log.info("status", mobile.status())
    -- 获取并打印ICCID
    log.info("iccid", mobile.iccid())
    -- 获取并打印CSQ
    log.info("csq", mobile.csq()) -- 4G模块的csq并不能完全代表强度
    -- 获取并打印RSSI
    log.info("rssi", mobile.rssi()) -- 需要综合rssr/rsrq/rsrp/snr一起判断
    -- 获取并打印RSRQ
    log.info("rsrq", mobile.rsrq())
    -- 获取并打印RSRP
    log.info("rsrp", mobile.rsrp())
    -- 获取并打印SNR
    log.info("snr", mobile.snr())
    -- 获取并打印当前SIM卡槽
    log.info("simid", mobile.simid())
    -- 获取并打印APN
    log.info("apn", mobile.apn(0, 1))
    -- 打印内存信息
    log.info("lua", rtoS.meminfo())
    log.info("sys", rtoS.meminfo("sys"))
    -- 每15秒获取一次信息
    sys.wait(15000)
end

烧录运行: 使用 Luatools 将相关代码烧录到 Air780EPM 核心板/开发板。设备启动并连接到网络后,会按照设定的时间间隔(15秒)获取并打印各种网络信息。

网络信息日志输出

1.6 SIM 卡状态监控

SIM 卡状态监控功能用于实时监控 SIM 卡的插入、识别和锁定状态等变化。

功能定义: 通过订阅 SIM 卡状态事件,实时获取 SIM 卡的状态变化,并在特定状态下执行相应操作。

代码示例:

-- 订阅SIM卡状态事件
local function get_sim_status_task(status, value)
    log.info("sim status", status)
    if status == 'RDY' then
        log.info("sim", "sim OK", value)
    end
    if status == 'NORDY' then
        log.info("sim", "NO sim", value)
    end
    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)

烧录运行: 使用 Luatools 将相关代码烧录到 Air780EPM 核心板/开发板。当 SIM 卡状态发生变化时(如 SIM 卡已准备好、无 SIM 卡、SIM 卡的写入次数统计等),日志中会打印相应的状态信息。

SIM卡状态日志输出

1.7 SIM 卡热插拔功能

功能定义: 实现 SIM 卡热插拔,通过 GPIO 中断通过上下边沿电平触发中断。

代码示例:

-- SIM卡热插拔功能,通过gpio中断通过上下边沿电平触发中断
-- 设置防抖,使用wakeuP6脚,常量为gpio.WAKEUP6
-- 自己设计其他gpio热插拔只需要替换对应的gpio即可
gpio.debounce(gpio.WAKEUP6,500)
-- 设置中断触发,拔卡进入飞行模式,插卡进出飞行模式,val值为上升沿或者下降沿触发0/1
local function sim_hot_plug(val)
    if val==0 then
        log.info("插卡")
        mobile.flymode(0,true)
        mobile.flymode(0,false)
    else
        log.info("拔卡")
        mobile.flymode(0,true)
    end
end

gpio.setup(gpio.WAKEUP6,sim_hot_plug)

烧录运行: 使用 Luatools 将相关代码烧录到 Air780EPM 核心板/开发板。当把卡拔掉之后,日志中会提示“拔卡”;当把卡插入之后,日志中会提示“插卡”,并且进出飞行模式重新搜网。

热插拔拔卡日志

热插拔插卡日志

二、常见问题及解决办法

2.1 设备无法识别 SIM 卡,日志中显示 SIM 卡错误

此类问题可参考以下要点检测:

  • 检查 SIM 卡是否正确安装
  • 确认 SIM 卡是否有效且未损坏
  • 检查设备的 SIM 卡槽接口是否正常

2.2 设备网络连接不稳定,经常断开连接或信号质量差

此类问题可参考以下要点检测:

  • 检查天线连接是否良好
  • 确认使用的频段是否适合当前地区和运营商
  • 调整设备位置,避免信号屏蔽或干扰
  • 检查周围基站覆盖情况

2.3 专网卡如何上网?

使用函数 mobile.apn(),专网卡设置需要的 name、user、password 联系卡商获取。

2.4 专网卡访问白名单

用定向 IP 的物联网卡,需要把域名或 IP 加入白名单才能使用。

以下是相关应用中,合宙模组会访问的域名或 IP 服务器:

专网卡白名单表格


点击查看传感器数据采集演示

更多开发资料,详见 合宙资料中心




上一篇:VBAT电源设计避坑指南:物联网模组供电关键要点
下一篇:AI辅助理论物理研究:LLM执行完整科研计算,效率提升10倍
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-4-24 22:14 , Processed in 0.815553 second(s), 42 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表