GD32 4G模块通信调试记录
本篇博文介绍一下移远EG800AK系列4G模组与GD32通信的调试过程。
4G模块介绍
-
EG800AK-CN 是移远通信专为 M2M 和 IoT 领域而设计的超小尺寸 LTE Cat 1 bis 无线通信模块,支持最大下行速率10 Mbps 和最大上行速率 5 Mbps,超小尺寸,超高性价比。同时,EG800AK-CN在封装上兼容LTE Standard EC800E-CN、EC800G-CN、EC800M-CN、EC800K-CN、EG800W-CN、EG800K系列和 EG810M系列模块。
-
EG800AK-CN采用镭雕工艺,具有外观精美、金属质感强、散热更好、信息不容易被抹除、更能适应自动化需求等优点。
-
EG800AK-CN内置丰富的网络协议,集成多个工业标准接口,并支持多种驱动和软件功能(如 Windows 10/11、Linux、Android 等操作系统下的 USB 转串口驱动),极大地拓展了其在 M2M 和 IoT 领域的应用范围,如追踪器、POS、IPC、数据卡、智能安全以及工业级 PDA 等。
超小尺寸,专为 M2M 和 IoT 应用设计,尤其是小尺寸终端的需求 支持 DFOTA 远程在线升级,降低后期运维成本 支持 Wi-Fi Scan(可选) 支持 GNSS(可选)* 超高性价比

电路参考

8pin Usim接口

6pin Usim接口

串口

串口与主芯片通信

程序
硬件相关AT指令
AT+QPOWD 关闭模块

(U)SIM 卡相关命令
AT+CIMI 查询 IMSI

bash
AT+CIMI
460023210226023 //查询 ME 中的(U)SIM 卡的 IMSI。
OK
AT+CSQ 查询信号强度


bash
AT+CSQ=?
+CSQ: (0-31,99),(0-7,99)
AT+CGATT PS 域附着或去附着

查询
bash
AT+CGATT=1 //附着到 PS 域。
OK
AT+CGATT=0 //从 PS 域分离。
OK
AT+CGATT? //查询当前 PS 域状态。
+CGATT: 0
OK
启动TCP连接透传模式


TCP连接命令
bash
AT+QIOPEN=1,0,"TCP","36.137.226.30",34064,0,2\r\n
目标IP:36.137.226.30
目标端口号:34064
程序设计
配置
1、读写
读写函数设计理念是在发送命令前清除串口缓存,然后发送命令,然后读取4G模块返回的结果。匹配目标结果,如果匹配上了则返回1,匹配失败则返回0;超时读取失败也返回0。
可以根据自己串口读写函数来设计读写接口,如果没有串口缓存的话,可以跳过这一步。
bash
static uint8_t Proto_M4G_Cmd(char* str, const char *ExpRcvStr, uint32_t timeOutMs)
{
uint8_t i, buf[100], length=0;
do
{
uint8_t tmpbuf[32];
if(0 == drv_usart_read(M4G_COM , tmpbuf, 32, 10))
{
break;
}
}while(1);//串口读空
for(i=0; i<1; i++)
{
if(drv_usart_write(M4G_COM, (uint8_t*)str, strlen(str), 10))
{
memset(buf,0,sizeof(buf));
length = drv_usart_read(M4G_COM, buf, 100, timeOutMs);
if((length)&&(length<100))
{
if(strstr((char *)buf, ExpRcvStr) !=NULL)
{
return 1;
}
}
}
}
return 0;
}
2、断开连接
bash
uint8_t Proto_M4G_discon(void)
{
Proto_M4G_Cmd("+++", "OK\r\n", 200);
osDelay(1000);
if(1 == Proto_M4G_Cmd("AT+QICLOSE=0\r\n", "OK\r\n", 200))
{
return 1;
}
return 0;
}
3、初始化程序
初始化时,首先确认进入了命令模式,连接已经断开,AT指令下发能够生效。
然后再测试AT指令;
再查询是否有卡;
然后就是查询卡信号;
再查询卡附着;
然后再启动TCO透传模式,成功则连接上服务器。
注意:每个步骤如果返回失败最多重复5次,就执行下一个步骤,如果成功则直接进行下一个步骤。如果5次TCP连接都失败了,返回第一步重新进行配置。
bash
uint8_t Proto_M4G_init(uint8_t *pServer, uint32_t pPort)
{
static uint8_t init_step = 0, recount = 0;
char cmd[128];
if(recount>5)
{
init_step = 0;
}
switch(init_step)
{
case 0: //重连时确保断开了连接
{
if(1 == Proto_M4G_discon())
{
recount = 0;
init_step = 1;
}
}
case 1: //进入AT命令模式并确保成功
{
if(1 == Proto_M4G_Cmd("AT\r\n", "OK\r\n", 200))
{
recount = 0;
init_step = 2;
}
break;
}
case 2: //查询是否有卡
{
recount++;
if(1 == Proto_M4G_Cmd("AT+CIMI\r\n", "OK\r\n", 200))
{
recount = 0;
init_step = 3;
}
break;
}
case 3: //查询卡附着
{
recount++;
if(1 == Proto_M4G_Cmd("AT+CSQ\r\n", "OK\r\n", 200))
{
//获取信号
if(drv_usart_write(M4G_COM, (uint8_t*)"AT+CSQ\r\n", strlen("AT+CSQ\r\n"), 10))
{
uint8_t buf[100], length=0;
memset(buf,0,sizeof(buf));
length = drv_usart_read(M4G_COM, buf, 100, 200);
if((length)&&(length<100))
{
char *colon_pos = strstr((char*)buf, ":"); // 找到冒号位置
char *value_str = colon_pos + 1; // 跳过冒号
char *endptr;
long value = strtol(value_str, &endptr, 10); // 转换为数值
if (endptr != value_str) { // 确保转换成功
//printf("提取的数值: %ld\n", value);
m4g_CSQ = value;
}
}
}
recount = 0;
init_step = 4;
}
else
{
m4g_CSQ = 0;
}
break;
}
case 4: //查询卡信号
{
recount++;
if(1 == Proto_M4G_Cmd("AT+CGATT?\r\n", "OK\r\n", 200))
{
recount = 0;
init_step = 5;
}
break;
}
case 5: //启动TCP连接透传模式
{
recount++;
sprintf(cmd, "AT+QIOPEN=1,0,\"TCP\",\"%s\",%d,0,2\r\n", pServer, pPort);
if(1 == Proto_M4G_Cmd(cmd, "CONNECT\r\n", 200))
{
recount = 0;
init_step = 0;
return 1;
}
break;
}
default:break;
}
return 0;
}
进入连接
初始化连接上服务器后,进入连接状态,就可以进行数据收发了。一般使用心跳帧来判断连接是否保持,如果判断断开后则返回到未登录状态,再次进行初始化配置连接。下面的示例中就没有实现心跳,后续根据具体通信协议完善。
bash
void M4G_Com_Thread(void const * argument)
{
static uint32_t heartbeatMs = 0;
uint8_t rdvLen = 0;
uint8_t rcvBuf[128];
for( ; ; )
{
switch(LoginStatus)
{
case 0: //掉线后尝试重新连接,并读取信号强度
{
if(1==Proto_M4G_init((uint8_t *)"36.137.226.30", 34064))
{
LoginStatus = 1;
}
osDelay(1000); /* AT指令之间时间定位1s, 后续再优化重连时间 */
break;
}
case 1:
{
if(Tick_Out(&heartbeatMs, 10000)) //10s周期发送数据 - 后续再完善心跳超时 重连机制
{
Tick_Out(&heartbeatMs, TICK_OUT_RESTART);
Proto_m4g_send((uint8_t*) "TEST MSG FROM DC7000", strlen("TEST MSG FROM DC7000"), 100);
}
memset(rcvBuf, 0, sizeof(rcvBuf));
rdvLen = Proto_m4g_recv(rcvBuf, 100, 100);
if(rdvLen>0)
{
Proto_m4g_send((uint8_t*) rcvBuf, rdvLen, 100);
}
break;
}
default:break;
}
osDelay(50);
}
}
通信测试
本案例视同安可信透传云来做测试。具体步骤如下:
连接前

连接后

数据交互
设备周期上传数据
设备端代码

服务器端

服务器下发数据,设备端收到后原帧返回
设备端代码

设备端接收数据缓存

服务器端

总结
本篇博文记录了移远4G模块的初始化和连接通信测试。更多详细的参数设置和AT指令可以查看移远模块的详细资料。