跳转至

02 通信信息(mobile)

作者:拓毅恒

一、mobile 概述

简介

Mobile(移动通信): 指所有移动通信技术的统称,包括 2G、3G、4G 和 5G 等。它涵盖了从基础的语音通话到数据传输的技术演进。这里将要介绍的是其中的 4G Cat1 技术。

4G Cat.1(LTE UE Category 1)是 4G LTE 网络中的一种用户设备类别,主要用于物联网(IoT)应用。与更高类别的 4G 设备相比,Cat.1 设备具有较低的传输速率和功耗,适用于对数据速率要求不高但需要稳定连接的场景。

主要特点:

传输速率:Cat.1 设备的下行峰值速率为 10Mbps,上行峰值速率为 5Mbps,满足中低速率数据传输需求。

功耗与成本:由于传输速率较低,Cat.1 设备的功耗和成本相对更低,适合对成本和功耗敏感的物联网应用。

关于 4g Cat1 技术更详细的使用说明,请上网自行搜索。

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

二、准备硬件环境

参考:Air780EGH 硬件环境清单,准备好硬件环境。

2.1 Air780EGH 核心板

三、准备软件环境

3.1 文章内容应用

在开始实践本示例之前,先筹备一下软件环境:

1. 烧录工具:Luatools 工具

2. 内核固件:https://docs.openluat.com/air780egh/luatos/firmware/version/

3. 脚本文件:https://gitee.com/openLuat/LuatOS/tree/master/module/Air780EGH/demo/mobile

4. LuatOS 运行所需要的 lib 文件:使用 Luatools 烧录时,勾选 添加默认 lib 选项,使用默认 lib 脚本文件。

准备好软件环境之后,接下来查看如何烧录项目文件到 780EGH 中,将本篇文章中演示使用的项目文件烧录到 780EGH 核心板中。

3.2 API 介绍

这里仅介绍本篇文档所使用的 API,详情请查看:API - mobile

mobile.simid(id, auto)

设置或获取当前使用的 SIM 卡

mobile.getCellInfo()

获取基站信息

mobile.reqCellInfo(timeout)

请求获取基站信息

mobile.imei()

获取设备的 IMEI 号

mobile.status()

获取移动网络状态

mobile.csq()

获取信号质量指示(CSQ)

mobile.rssi()

获取接收信号强度指示(RSSI)

mobile.apn(simid, profileid)

获取或设置 APN

mobile.setAuto(try_time, search_time, try_cnt)

设置 SIM 卡自动恢复参数

mobile.config(type, value)

配置移动网络参数

四、mobile 功能实现概述

本小节详细介绍 Air780EGH 移动网络各种功能的实现方法和核心代码逻辑。

4.1 SIM 卡管理和选择

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

4.1.1 功能定义

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

4.1.2 代码示例

-- 对于双卡的设备, 可以设置为自动选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())

4.2 基站数据查询

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

4.2.1 功能定义

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

4.2.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 true 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)

4.3 SIM 卡 APN 的设置

4.3.1 功能定义

获取或设置 SIM 卡的 APN 功能。

4.3.2 代码示例

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

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

4.4 频段(Band)测试和修改

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

4.4.1 功能定义

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

4.4.2 代码示例

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测试完毕************")

4.5 移动网络信息获取

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

4.5.1 功能定义

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

4.5.2 代码示例

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

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

-- 定期获取并打印网络信息
while true 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()) -- 需要综合rssi/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

4.6 SIM 卡状态监控

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

4.6.1 功能定义

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

4.6.2 代码示例

-- 订阅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)

4.7 SIM 卡热插拔功能

实现 sim 卡热插拔。

4.7.1 功能定义

通过 gpio 中断通过上下边沿电平触发中断。

4.7.2 代码示例

-- 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)

五、功能演示

5.1 SIM 卡管理和选择演示

使用 Luatools 将代码烧录到 Air780EGH 核心板

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

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

5.2 基站数据查询演示

使用 Luatools 将代码烧录到 Air780EGH 核心板

设备成功连接到网络后,会定期获取并打印基站信息。订阅式会在基站信息更新时触发事件

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

5.3 SIM APN 功能演示

使用 Luatools 将代码烧录到 Air780EGH 核心板

设备启动后,可以看到日志中打印 APN 相关信息:

5.4 频段(Band)测试和修改演示

使用 Luatools 将代码烧录到 Air780EGH 核心板

设备启动后,日志中会清晰显示每个步骤的频段信息

5.5 移动网络信息获取演示

使用 Luatools 将代码烧录到 Air780EGH 核心板

设备启动并连接到网络后,会按照设定的时间间隔(15 秒)获取并打印各种网络信息

5.6 SIM 卡状态监控演示

使用 Luatools 将代码烧录到 Air780EGH 核心板

当 SIM 卡状态发生变化时(如 SIM 卡已准备好、无 SIM 卡、SIM 卡的写入次数统计等),日志中会打印相应的状态信息。

5.7 SIM 卡热插拔功能演示

使用 Luatools 将代码烧录到 Air780EGH 核心板

当把卡拔掉之后,日志中会提示“拔卡”

当把卡插入之后,日志中会提示“插卡”,并且进出飞行模式重新搜网。

六、总结

本 demo 实现了查找和设置 mobile 频段,和获取移动网络信息等相关参数。

七、常见问题

7.1 SIM 卡无法识别

问题:设备无法识别 SIM 卡,日志中显示 SIM 卡错误。

解决方案

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

7.2 网络连接不稳定

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

解决方案

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

7.3 专网卡如何上网

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

7.4 专网卡访问白名单

用定向 IP 的物联网卡,需要把域名或 IP 加入白名单才能使用,下面列出模块会访问的域名或 IP 服务器。

功能
地址
端口
协议
远程升级
[iot.openluat.com](http://iot.openluat.com)
80
http
基站WIFI定位
[bs.openluat.com](http://bs.openluat.com)
12411
udp
基站WIFI定位(收费)
[airlbs.openluat.com](http://airlbs.openluat.com)
12413
udp
AGPS星历下载
[download.openluat.com](http://download.openluat.com)
80
http
NTP时间同步
[ntp.aliyun.com](http://ntp.aliyun.com)
123
udp
errdump
[dev_msg1.openluat.com](http://dev_msg1.openluat.com)
12425
udp