中移物联ML307C模组OPENCPU笔记4
本文介绍了中移物联ML307C模组OPENCPU的网络初始化流程,主要包括:1)系统启动和基础初始化;2)设备身份识别(获取SN、IMEI);3)SIM卡验证(读取IMSI、ICCID);4)网络连接等待(循环检测PDP状态,设置2秒超时机制)。该流程通过代码示例展示了从系统启动到网络就绪的全过程,确保设备在通信前完成身份认证和网络连接准备。最后用流程图直观呈现了初始化各环节的逻辑关系。
中移物联ML307C模组OPENCPU笔记4–demo例程中关于整体网络初始化流程的介绍
整体网络初始化流程
设备身份识别:首先获取模组的SN和IMEI信息,用于设备身份标识
SIM卡验证:读取SIM卡的IMSI和ICCID,确认SIM卡状态正常
网络连接等待:循环检测PDP激活状态,等待网络连接建立完成
超时处理:设置10次(约2秒)超时机制,防止无限等待
这个流程确保了在进行网络通信之前,设备身份、SIM卡和网络连接都处于正常状态。
网络连接等待
循环检测PDP状态(最大等待约2秒)
成功激活则继续,超时则报告错误
身份信息获取:获取设备和SIM卡标识信息
命令处理:进入主循环等待用户指令
该流程确保了在进行网络通信前,系统资源和网络连接都已准备就绪。以下是以CD_ML307C-DC-CN_OpenCPU_Standard_1.0.1.25072510_release的cm_demo_main为例子,介绍的一些相关的代码以及简单的注释
1.系统启动和基础初始化cm_demo_uart();
// 初始化UART通信
2. 系统信息打印
获取并打印SDK版本信息
获取并打印文件系统信息(总大小和剩余空间)
获取并打印堆内存信息(总大小和剩余空间)
3. 网络连接等待
int pdp_time_out = 0;
cm_demo_printf("waiting for network...\n");
while(1)
{
if(pdp_time_out > 10)
{
cm_demo_printf("network timeout\n");
break;
}
if(cm_modem_get_pdp_state(1) == 1) // 检查PDP状态
{
cm_demo_printf("network ready\n");
break;
}
osDelay(200);
pdp_time_out++;
}
- 时间信息获取和显示
cm_sec_to_date((long)(cm_rtc_get_current_time() + cm_rtc_get_timezone() * 60 * 60), &t);
cm_demo_printf("Now:%d-%d-%d:%d:%d:%d,%s\n", t.tm_year, t.tm_mon, t.tm_mday, t.tm_hour, t.tm_min, t.tm_sec, weekday[cm_time_to_weekday(&t)-1]);
- 设备身份信息读取
// 读取序列号(SN)
ret = cm_sys_get_sn(buf);
if (ret == 0) {
cm_demo_printf("SN:%s\n", buf);
}
// 读取国际移动设备识别码(IMEI)
ret = cm_sys_get_imei(buf);
if (ret == 0) {
cm_demo_printf("IMEI:%s\n", buf);
}
- SIM卡信息读取
// 读取国际移动用户识别码(IMSI)
ret = cm_sim_get_imsi(buf);
if (ret == 0) {
cm_demo_printf("IMSI:%s\n", buf);
}
// 读取集成电路卡识别码(ICCID)
ret = cm_sim_get_iccid(buf);
if (ret == 0) {
cm_demo_printf("ICCID:%s\n", buf);
}
首先调用函数cm_virt_at_init进行虚拟AT通道初始化,然后发送虚拟AT指令“AT+ICCID?”获取ICCID,通过虚拟AT通道的回调函数打印获取到的ICCID;
- 获取ICCID函数
- 通过AT指令获取SIM卡的ICCID号
- 参数:
- iccid: 用于存储ICCID号的缓冲区
- 返回值:
- 成功返回0,失败返回-1
int32_t cm_sim_get_iccid(char* iccid)
{
char iccid_str[21] = {0};
int32_t get_iccid = -1;
uint8_t rsp[64] = {0};
int32_t rsp_len = sizeof(rsp);
if(cm_virt_at_send_sync((const uint8_t *)"AT*ICCID?\r\n", rsp, &rsp_len, 200) == 0)
{
sscanf((const char *)rsp, "%*[^\"]\"%[^\"]\"", iccid_str);
memcpy(iccid, iccid_str, strlen(iccid_str));
get_iccid = 0;
}
return get_iccid;
}
模组网络初始化流程框图
更多推荐



所有评论(0)