Mobile频段是指用于移动通讯的特定频率范围,这些频率范围被划分为不同的频段,以支持各种移动通信技术。本文将带您深入了解如何查找和设置4G通信的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使用多个天线来同时发送和接收数据,增加了信号的容量和覆盖范围,显著提高了数据传输速率。

. 准备硬件:typec接口USB数据线

2. 连接设备:PC电脑,操作系统为WINDOWS系统

3. 安装软件环境:基本的下载调试工具

4. 获取移动设备的软硬件资料:源码和工具

a. 使用Luatools下载和详细使用:https://docs.openluat.com/Luatools/

b. 本教程使用的demo:https://gitee.com/openLuat/LuatOS-Air780E/tree/master/demo/mobile

5. 将固件和脚本烧录到模块中,使用说明参考:Luatools下载和详细使用

6. 源码和固件已打包,如下所示:点我,下载完整压缩文件包

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

a. 常量及其类型和解释:

- 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,网络静态模式优化,需要飞行模式设置

以下是重构后的内容:

```

网络切换以信号质量优先,需要飞行模式设置。0表示不开,1表示开启,2表示开启并加速切换,但会增加功耗。

LTE跳paging时,需要飞行模式设置。谨慎使用,0表示不设置,1~7表示增大或减小DrxCycle周期倍数。例如,1表示1/8倍,2表示1/4倍,3表示1/2倍,依此类推。8~12表示配置固定的DrxCycle周期,仅当该周期大于网络分配的DrxCycle周期时该配置才会生效。例如,8表示320ms,9表示640ms,10表示1280ms,依此类推。

PSM模式中的T3324时间单位为S。

PSM模式开关,0表示关,1表示开。

attach模式,0表示EPS ONLY(仅EPS),2表示混合模式。遇到IMSIdetach脱网问题时,建议设置为0。注意,设置为EPS ONLY时会取消短信功能。

SIM写入次数的配置和读取。

伪基站禁止接入的时间,取值为0时取消,0xffff表示永久禁止。

删除已保存的协议栈参数,重启后会使用默认配置。

蜂窝网络模块的USB以太网卡控制。bit0表示开关,1表示开启,0表示关闭;bit1表示模式,1表示NAT,0表示独立IP(在USB以太网卡开启前可以修改,开启过就不行);bit2表示协议,1表示ECM,0表示RNDIS(飞行模式里设置)。

关闭邻区测量。1表示关,0表示开(除了功耗测试外不建议使用)。

验证PIN码操作。

更换PIN码操作。

启用PIN码功能。

```

.3 本 demo 使用 API 简介

本 demo 使用了以下 API:

1. `mobile.status()`:获取网络状态。

2. `mobile.getBand(band, is_default)`:获取当前使用/支持的 band。

3. `mobile.setBand(band, num)`:设置使用的 band。

4. `mobile.flymode(index, enable)`:进出飞行模式。

5. `mobile.vsimOnOff(enable)`:切换内置虚拟卡和外置实体卡。

6. `mobile.rtime(time, auto_reset_stack, data_first)`:设置 RRC 自动释放时间间隔。

具体使用方法如下:

1. 获取网络状态:调用 `mobile.status()` 函数即可。

2. 获取当前使用/支持的 band:调用 `mobile.getBand(band, is_default)` 函数,传入参数 `band` 和 `is_default`,其中 `band` 为输出参数,表示获取到的 band;`is_default` 为可选参数,默认为 false,表示获取当前支持的 band,如果传入 true 则表示获取默认支持的 band。成功返回 true,失败返回 false。

3. 设置使用的 band:调用 `mobile.setBand(band, num)` 函数,传入参数 `band` 和 `num`,其中 `band` 为要设置的 band;`num` 为要设置的 band 数量。成功返回 true,失败返回 false。

4. 进出飞行模式:调用 `mobile.flymode(index, enable)` 函数,传入参数 `index`(编号,默认为 0,仅在支持双卡的模块上出现 0 或 1)和 `enable`(是否设置为飞行模式,true 为设置,false 为退出),可选。返回值为原飞行模式的状态。

5. 切换内置虚拟卡和外置实体卡:调用 `mobile.vsimOnOff(enable)` 函数,传入参数 `enable`,true 表示开启内置虚拟卡和外置实体卡,false 表示关闭。无返回值。

6. 设置 RRC 自动释放时间间隔:调用 `mobile.rtime(time, auto_reset_stack, data_first)` 函数,传入参数 `time`(RRC 自动释放时间,单位秒)、`auto_reset_stack`(是否自动重置堆栈)和 `data_first`(是否优先使用数据业务)。成功返回 nil,无返回值。

```

data_first

boolean

是否启用数据传输优化,true 启用,false 关闭,开启后在 ACK 或超时失败时才允许 RRC 提前释放。此功能于 2024 年 8 月 12 日启用。

返回值:

返回值类型

解释

nil

无返回值

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

作用:设置一些辅助周期性或自动功能

参数:

参数

传入值类型

解释

check_sim_period

int

SIM 卡自动恢复时间,单位毫秒,建议 5000~10000。写 0 或不写则关闭功能

get_cell_period

int

周期性获取小区信息的时间间隔,单位毫秒。写 0 或不写则关闭功能

search_cell_time

int

每次搜索小区时最大搜索时间,单位秒,不要超过 8 秒

auto_reset_stack

boolean

网络故障时尝试自动恢复,和飞行模式/SIM 卡切换冲突,true 开启,false 关闭

network_check_period

int

设置定时检测网络是否正常的间隔,单位毫秒,建议 60000 以上,留空则不做更改。

返回值:

返回值类型

解释

nil

无返回值

mobile.imei(index)

作用:获取 IMEI。

参数:

参数

传入值类型

解释

index

int

编号,默认 0。支持双卡模块上才会出现 0 或 1 的情况

返回值:

返回值类型

解释

string

当前的 IMEI 值,失败返回 nil

mobile.imsi(index)

作用:获取 IMSI。

参数:

参数

传入值类型

解释

index

int

编号,默认 0。支持双卡模块上才会出现 0 或 1 的情况

返回值:

返回值类型

解释

string

当前的 IMSI 值,失败返回 nil

mobile.iccid(id)

作用:获取或设置 ICCID。

参数:

参数

传入值类型

解释

id

int

SIM 卡的编号,例如 0,1,默认 0

```

返回值:

返回值类型

解释

string

ICCID 值,失败返回 nil

int

当前 CSQ 值,失败返回 0。范围 0 - 31,值越大越好

int

当前 RSSI 值,失败返回 0。范围 0 到 -114,值越小越好

int

当前 RSRP(参考信号接收功率)值,失败返回 0。取值范围 -44 ~ -140,值越大越好

int

当前 RSRQ(参考信号发送功率)值,失败返回 0。取值范围 -3 ~ -19.5,值越大越好

int

当前 SNR(信噪比)值,失败返回 0。范围 0 - 30,值越大越好

int

当前 SIM 卡槽编号,失败返回 -1

boolean

是否优先使用 SIM0,仅在 SIM 卡编号为 2 时有效。true 表示优先使用 SIM0,false 表示按平台默认设置,必须开机时配置才能有效

string

获取或设置 APN。如果要使用非默认 APN 激活,必须大于 0

新的APN名称,不填表示获取APN,填入表示设置APN,设置是否支持取决于底层实现。

```go

func setAPN(new_apn_name string, user_name string, password string, ip_type int, protocol int, delete_apn bool) (string, error) {

// TODO: 实现设置APN的逻辑

}

func getDefaultAPN() (string, error) {

// TODO: 实现获取默认APN的逻辑

}

func getServiceCellInfo() (map[int]interface{}, error) {

// TODO: 实现获取服务小区详细信息的逻辑

}

func getBaseStationInfo() ([]map[string]interface{}, error) {

// TODO: 实现获取基站信息的逻辑

}

func configNetworkSpecial(item int, value int) (bool, error) {

// TODO: 实现网络特殊配置的逻辑

}

func reqCellInfo(timeout int) error {

// TODO: 实现发起基站信息查询的逻辑,包含临近小区信息

}

func getPhoneNumber(id int) (string, error) {

// TODO: 实现获取手机卡号的逻辑

}

```

.1.2 查询 Mobile 相关数据

本节主要介绍如何查询与 Mobile 相关的数据。首先,我们需要调用 `mobile()` 函数来获取一个 Mobile 对象,然后通过该对象的方法来查询所需的数据。例如,我们可以通过调用 `mobile.imei()` 方法来获取设备的 IMEI 号码。

6.1.3 订阅查询的信息

在本节中,我们将介绍如何订阅查询的信息。我们可以使用 `subscribe` 函数来订阅需要查询的数据,并在数据发生变化时接收通知。例如,我们可以订阅 `mobile.imei()` 方法的返回值,以便在设备更改 IMEI 号码时收到通知。

6.1.5 获取 SIM 卡状态

本节将介绍如何获取 SIM 卡的状态。我们可以使用 `sim.status()` 方法来查询 SIM 卡的状态。这个方法会返回一个表示 SIM 卡状态的字符串,如 "ready"、"unknown"、"absent" 等。

7、功能验证

在实现的功能验证部分,我们已经实现了设置频率和查找到的 Mobile 相关参数的功能。用户可以通过调用相应的方法来设置设备的频率,以及查询设备的相关参数,如 IMEI、IMSI、ICCID、CSQ、RSSI、RSRQ、RSRP、SNR 等。

8、总结

本 demo 主要实现了查找和设置 Mobile 频段,以及获取 IMEI、IMSI、ICCID、CSQ、RSSI、RSRQ、RSRP、SNR 等相关参数。通过这些功能,用户可以方便地管理设备的通讯设置和网络连接状态。

9、常见问题

在本节中,我们将解答一些关于使用该 demo 时可能遇到的问题。

9.1 获取模块 SN

出厂时未必有写 SN(序列号),通常用作唯一标识符。如果需要获取真实的唯一 ID,可以使用 `mobile.imei()` 方法代替。如果需要更精确的唯一 ID,可以使用 `mcu.unique_id()` 方法。

9.2 专网卡如何上网

在使用 `mobile.apn()` 函数时,需要注意专网卡的设置。这里的示例仅供参考,实际设置需要联系卡商获取 name、user 和 password。