跳转至

通信信息(mobile)

一、mobile 概述

简介

“4G mobile”指的是第四代移动通信技术,常用于描述通过 4G 网络进行的高速无线数据传输和通信。4G 网络最显著的特征是其高速数据传输能力。理论上,4G 可以提供下行速率高达 100Mbps(移动环境下)和上行速率达 50Mbps(静止或低速移动环境下)。

架构:

4G 网络采用了全 IP 网络架构,所有数据和语音通信都是通过 IP(Internet Protocol)传输的。相比之前的移动通信技术(如 2G 和 3G),4G 能够更有效地处理数据流量,尤其是用于互联网服务和多媒体应用。

采用技术:

4g 主要采用正交频分复用技术(OFDM)和多输入多输出技术(MIMO)。OFDM 将宽频带划分为多个窄频带,从而提高了频谱的利用效率,并减少了信号间的干扰。它使得 4G 能够在同样的频谱下传输更多的数据,并具有更强的抗干扰能力。多输入多输出(MIMO) 技术也广泛应用于 4G 网络中。MIMO 使用多个天线来同时发送和接收数据,增加了信号的容量和覆盖范围,显著提高了数据传输速率。

关于 4g mobile 技术更详细的使用说明,请参考:https://zh.wikipedia.org/wiki/4G

二、演示功能概述

本 demo 演示了查找和设置 mobile 频段,和获取相关参数。

三、准备硬件环境

3.1 开发板准备

  1. 780E 核心板一个
  2. 合宙 780E 核心板购买链接(https://item.taobao.com/item.htm?id=693774140934)
  3. 此核心板的详细使用说明参考:Air780E 产品手册 中的《开发板 Core_Air780E 使用说明 V1.0.5.pdf 》,核心板使用过程中遇到任何问题,可以直接参考这份使用说明 pdf 文档。

3.2 SIM 卡

请准备一张可正常上网的 SIM 卡,该卡可以是物联网卡或您的个人手机卡。

特别提醒:请确保 SIM 卡未欠费且网络功能正常,以便顺利进行后续操作。

3.3 数据通信线

typec 接口 USB 数据线即可。

3.4 PC 电脑

WINDOWS 系统。

四、准备软件环境

4.1 基本的下载调试工具

使用说明参考:Luatools 下载和详细使用

五、mobile 的使用软硬件资料

5.1 源码和工具

5.2 常量消息

这里是发布的消息,可以使用 sys.waitUntil()或者 sys.subscribe()函数来获取消息是否发布。

常量
类型
解释
mobile.UNREGISTER
number
未注册
mobile.REGISTERED
number
已注册
mobile.SEARCH
number
正在搜索中
mobile.DENIED
number
注册被拒绝
mobile.UNKNOW
number
未知
mobile.REGISTERED_ROAMING
number
已注册,漫游
mobile.SMS_ONLY_REGISTERED
number
已注册,仅 SMS
mobile.SMS_ONLY_REGISTERED_ROAMING
number
已注册,漫游,仅 SMS
mobile.EMERGENCY_REGISTERED
number
已注册,紧急服务
mobile.CSFB_NOT_PREFERRED_REGISTERED
number
已注册,非主要服务
mobile.CSFB_NOT_PREFERRED_REGISTERED_ROAMING
number
已注册,非主要服务,漫游
mobile.CONF_RESELTOWEAKNCELL
number
小区重选信号差值门限,需要飞行模式设置
mobile.CONF_STATICCONFIG
number
网络静态模式优化,需要飞行模式设置
mobile.CONF_QUALITYFIRST
number
网络切换以信号质量优先,需要飞行模式设置,0 不开,1 开启,2 开启并加速切换,功耗会增加
mobile.CONF_USERDRXCYCLE
number
LTE 跳 paging,需要飞行模式设置,谨慎使用,0 是不设置,1~7 增大或减小 DrxCycle 周期倍数,1:1/8 倍 2:1/4 倍 3:1/2 倍 4:2 倍 5:4 倍 6:8 倍 7:16 倍,8~12 配置固定的 DrxCycle 周期,仅当该周期大于网络分配的 DrxCycle 周期时该配置才会生效,8:320ms 9:640ms 10:1280ms 11:2560ms 12:5120ms
mobile.CONF_T3324MAXVALUE
number
PSM 模式中的 T3324 时间,单位 S
mobile.CONF_PSM_MODE
number
PSM 模式开关,0 关,1 开
mobile.CONF_CE_MODE
number
attach 模式,0 为 EPS ONLY 2 为混合,遇到 IMSI detach 脱网问题,设置为 0,注意设置为 EPS ONLY 时会取消短信功能
mobile.CONF_SIM_WC_MODE
number
SIM 写入次数的配置和读取
mobile.CONF_FAKE_CELL_BARTIME
number
伪基站禁止接入的时间,取值为 0 时取消,0xffff 永久
mobile.CONF_RESET_TO_FACTORY
number
删除已保存的协议栈参数,重启后会使用默认配置
mobile.CONF_USB_ETHERNET
number
蜂窝网络模块的 usb 以太网卡控制,bit0 开关, 1开,0关,bit1 模式, 1NAT,0独立IP(在 usb 以太网卡开启前可以修改,开启过就不行),bit2 协议 1ECM,0RNDIS,飞行模式里设置
mobile.CONF_DISABLE_NCELL_MEAS
number
关闭邻区测量 1 关,0 开,除了功耗测试外不建议使用
mobile.PIN_VERIFY
number
验证 PIN 码操作
mobile.PIN_CHANGE
number
更换 PIN 码操作
mobile.PIN_ENABLE
number
使能 PIN 码验证
mobile.PIN_DISABLE
number
关闭 PIN 码验证
mobile.PIN_UNBLOCK
number
解锁 PIN 码

5.3 本 demo 使用 api 简介

mobile.status()

作用:获取网络状态。

参数:

返回值:

返回值类型
解释
int
当前网络状态

mobile.getBand(band, is_default)

作用:获取当前使用/支持的 band

参数:

传入值类型
解释
zbuff
输出 band
boolean
true 默认支持,false 当前支持的,默认是 false,当前是预留功能,不要写 true

返回值:

返回值类型
解释
boolean
成功返回 true,失败返回 false

mobile.setBand(band, num)

作用:设置使用的 band

参数:

传入值类型
解释
zbuff
输入使用的 band
int
band 数量

返回值:

返回值类型
解释
boolean
成功返回 true,失败返回 false

mobile.flymode(index, enable)

作用:进出飞行模式

参数:

传入值类型
解释
int
编号,默认 0. 在支持双卡的模块上才会出现 0 或 1 的情况
bool
是否设置为飞行模式,true 为设置, false 为退出,可选

返回值:

返回值类型
解释
boolean
原飞行模式的状态

mobile.vsimOnOff(enable)

作用:切换内置虚拟卡和外置实体卡,2024 年 8 月 13 日启用,虚拟卡需要固件支持,否则切换后无网络,需要在飞行模式下切换,或者切换后重启协议栈。

参数:

传入值类型
解释
bool
开启,true 开启, false 关闭

返回值:

返回值类型
解释
nil
无返回值

返回值:

返回值类型
解释
string
获取到的默认 APN 值,失败返回 nil

mobile.rtime(time, auto_reset_stack, data_first)

作用:设置 RRC 自动释放时间间隔,当开启时后,遇到极弱信号 + 频繁数据操作可能会引起网络严重故障,因此需要额外设置自动重启协议栈。

参数:

传入值类型
解释
int
RRC 自动释放时间,等同于 Air724 的 AT+RTIME,单位秒,写 0 或者不写则是停用,不要超过 20 秒,没有意义
boolean
网络遇到严重故障时尝试自动恢复,和飞行模式/SIM 卡切换冲突,true 开启,false 关闭,留空时,如果设置了时间则自动开启。本参数于 2023 年 9 月 14 日已废弃
boolean
是否启用数据传输优化,true 启用,false 关闭,留空为 false,开启后必须等到 TCP 数据 ACK 或者超时失败,或者 socket CONNECT 完成(无论成功或者失败)才允许 RRC 提前释放,可能会增加功耗。本参数于 2024 年 8 月 12 日启用

返回值:

返回值类型
解释
nil
无返回值

mobile.setAuto(check_sim_period, get_cell_period, search_cell_time, auto_reset_stack, network_check_period)

作用:设置一些辅助周期性或者自动功能,目前支持 SIM 卡暂时脱离后恢复,周期性获取小区信息,网络遇到严重故障时尝试自动恢复。

参数:

传入值类型 解释
int SIM 卡自动恢复时间,单位毫秒,建议 5000~10000,和飞行模式/SIM 卡切换冲突,不能再同一时间使用,必须错开执行。写 0 或者不写则是关闭功能
int 周期性获取小区信息的时间间隔,单位毫秒。获取小区信息会增加部分功耗。写 0 或者不写则是关闭功能
int 每次搜索小区时最大搜索时间,单位秒。不要超过 8 秒
boolean 网络遇到严重故障时尝试自动恢复,和飞行模式/SIM 卡切换冲突,true 开启,false 关闭,开始状态是 false,留空则不做改变
int 设置定时检测网络是否正常并且在检测到长时间无网时通过重启协议栈来恢复,无网恢复时长,单位 ms,建议 60000 以上,为网络搜索保留足够时间,留空则不做更改

返回值:

返回值类型
解释
nil
无返回值

mobile.imei(index)

获取:获取 IMEI。

参数:

传入值类型
解释
int
编号,默认 0. 在支持双卡的模块上才会出现 0 或 1 的情况

返回值:

返回值类型
解释
string
当前的 IMEI 值,若失败返回 nil

mobile.imsi(index)

作用:获取 IMSI。

参数:

传入值类型
解释
int
编号,默认 0. 在支持双卡的模块上才会出现 0 或 1 的情况

返回值:

返回值类型
解释
string
当前的 IMSI 值,若失败返回 nil

mobile.iccid(id)

作用:获取或设置 ICCID。

参数:

传入值类型
解释
int
SIM 卡的编号, 例如 0, 1, 默认 0

返回值:

返回值类型
解释
string
ICCID 值,若失败返回 nil

mobile.csq()

作用:获取 csq。

参数:

返回值:

返回值类型
解释
int
当前 CSQ 值, 若失败返回 0. 范围 0 - 31, 越大越好

mobile.rssi()

作用:获取 rssi。

参数:

返回值:

返回值类型
解释
int
当前 rssi 值,若失败返回 0. 范围 0 到 -114, 越小越好

mobile.rsrp()

作用:获取 rsrp,参考信号接收功率。

参数:

返回值:

返回值类型
解释
int
当前 rsrp 值,若失败返回 0. 取值范围: -44 ~ -140 ,值越大越好

mobile.rsrq()

作用:获取 rsrq,参考信号发送功率。

参数:

返回值:

返回值类型
解释
int
当前 rsrq 值,若失败返回 0. 取值范围: -3 ~ -19.5 ,值越大越好

mobile.snr()

作用:获取 snr,信噪比。

参数:

返回值:

返回值类型
解释
int
当前 snq 值,若失败返回 0.范围 0 - 30, 越大越好

mobile.simid(id)

作用:获取当前 SIM 卡槽,或者切换卡槽。

参数:

填入的参数以表格中的为准。

传入值类型
解释
int
SIM 卡的编号, 例如 0, 1, 如果支持双卡,比如 EC618,可以填 2 来自适应,但是会占用掉 4 个 IO(gpio4/5/6/23)。如果不填就直接读取当前卡槽
boolean
是否优先用 SIM0,只有 SIM 卡编号写 2 自适应才有用!!!。true 优先用 SIM0,false 则由具体平台决定,支持双卡双待 SIM0 优先,不支持的是上一次检测到的优先,默认是 false,必须在开机就配置,否则就无效了

返回值:

返回值类型
解释
int
当前 sim 卡槽编号,若失败返回-1

mobile.apn(index, cid, new_apn_name, user_name, password, ip_type, protocol)

作用:获取或设置 APN,设置 APN 必须在入网前就设置好,比如在 SIM 卡识别完成前就设置好。

参数:

填入的参数以表格中的为准。

传入值类型 解释
int 编号, 默认 0。在支持双卡的模块上才会出现 0 或 1 的情况
int cid, 默认 0。如果要用非默认 APN 来激活,必须 >0
string 新的 APN,不填就是获取 APN,填了就是设置 APN,是否支持设置取决于底层实现
string 新的 APN 的 username,如果 APN 不是空,那必须填写,如果没有则留空字符串 ""。如果 APN 是空的,则可以为 nil
string 新的 APN 的 password,如果 APN 不是空,那必须填写,如果没有则留空字符串 ""。如果 APN 是空的,则可以为 nil
int 激活 APN 时的 IP TYPE,1=IPV4,2=IPV6,3=IPV4V6,默认是 1
int 激活 APN 时,如果需要 username 和 password,就要写鉴权协议类型(0没有,1:PAP,2:CHAP),1~3,默认3。一般没有用户名密码的写0,反之写3,如果不行1和2都可以尝试。不需要鉴权的写0
boolean 是否删除 APN,true 表示是,其他都否。只有参数 3 新的 APN 不是 string 的时候才有效

返回值:

返回值类型
解释
string
获取到的默认 APN 值,失败返回 nil

mobile.scell()

作用:获取当前服务小区更详细的信息。

参数:

返回值:

返回值类型
解释
table
服务小区的信息

mobile.getCellInfo()

作用:获取基站信息。

参数:

返回值:

返回值类型
解释
table
包含基站数据的数组

mobile.config(item, value)

作用:网络特殊配置。

参数:

传入值类型
解释
int
配置项目,看 mobile.CONF_XXX
int
配置值,根据具体配置的 item 决定

返回值:

返回值类型
解释
boolean
是否成功

mobile.reqCellInfo(timeout)

作用:发起基站信息查询,含临近小区。

参数:

传入值类型
解释
int
超时时长,单位秒,默认 15. 最少 5, 最高 60

返回值:

返回值类型
解释
nil
无返回值

mobile.number(id)

作用:获取手机卡号,注意,只有写入了手机号才能读出,因此有可能读出来是空的。

参数:

传入值类型
解释
int
SIM 卡的编号, 例如 0, 1, 默认 0

返回值:

返回值类型
解释
string
number 值,若失败返回 nil

六、代码示例介绍

6.1 查询 mobile 的 band 和 iccid 和 csq 等信息。

6.1.1 查询、更改、和恢复 band 的设置

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

6.1.2 查询 mobile 相关数据

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

6.1.3 订阅查询的信息:

-- 订阅式, 模块本身会周期性查询基站信息,但通常不包含临近小区
sys.subscribe("SCELL_INFO", function()
    log.info("cell", json.encode(mobile.scell()))
end)
-- 基站数据的查询

-- 订阅式, 模块本身会周期性查询基站信息,但通常不包含临近小区
sys.subscribe("CELL_INFO_UPDATE", function()
    log.info("cell", json.encode(mobile.getCellInfo()))
end)

6.1.4 轮询搜索小区信息

-- 轮询式, 包含临近小区信息,这是手动搜索,和上面的自动搜索冲突,开启一个就行
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)

6.1.5 获取 SIM 卡状态

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

七、功能验证

实现了设置频率和查找到的 mobile 相关参数的功能。

八、总结

本 demo 实现了查找和设置 mobile 频段,和获取 imei、imsi、iccid、csq、rssi、rsrq、rsrp、snr 等相关参数。

常见问题

1、获取模块 SN

出厂未必有写 SN,一般用途的唯一 id, 可以用 mobile.imei()代替,如需要真正的唯一 ID, 使用 mcu.unique_id()。

2、专网卡如何上网

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

给读者的话

本篇文章由Linden开发;

本篇文章描述的内容,如果有错误、细节缺失、细节不清晰或者其他任何问题,总之就是无法解决您遇到的问题;

请登录合宙技术交流论坛,点击文档找错赢奖金-Air780E-LuatOS-软件指南-4G通信-通信信息(mobile)

用截图标注+文字描述的方式跟帖回复,记录清楚您发现的问题;

我们会迅速核实并且修改文档;

同时也会为您累计找错积分,您还可能赢取月度找错奖金!