
由WIFI模块引入4G模块
4G模块通过 插入SIM卡进行 上网。就像手机插卡才能开移动数据,才能访问网络资源。
WIFI模块则通过连接到 路由器进行上网。
所以4G模块的初始化主要围绕 连接基站开启移动数据
而WIFI模块主要围绕接入 路由器
4G优点: WIFI模块需要在有路由器的环境下才能上网,而4G模块就像是开了流量在有基站的环境下就能上网。
注意: 插入4G模块的SIM卡 也需要有流量。如果卡内没有流量,也上不了网。
如果再用了一段时间后,4G模块无法接入 互联网,有可能是流量不够了。
物理连接

4G模块初始化
重点AT指令: (注意所有AT指令后都有\r\n,在串口助手测试要勾选发送新行)
- ATE1————指令回显
- AT+CPIN? ————检查是否有SIM卡
- AT+CREG? ————检查入网状态
- AT+CSQ ———— 查看信号强度
- AT+CGSN ————得到产品序列号
/**
* @brief 测试EC20是否就绪
* @param 无
* @retval EC20_OK 初始化自检成功
*/
uint8_t EC20_work_test(void)
{
memset(EC20CSQ,0,BUFLEN);
//连接快慢也看天线的摆放位置
if(NULL==EC20_send_cmd((uint8_t *)"AT","OK",150)) {
if(NULL==EC20_send_cmd((uint8_t *)"AT","OK",200))
return SIM_COMMUNTION_ERR; //通信不上
}
if(NULL==EC20_send_cmd((uint8_t *)"ATE1","OK",150))
return SIM_COMMUNTION_ERR; //通信不上
if(NULL==EC20_send_cmd((uint8_t *)"AT+CPIN?","READY",150))
return SIM_CPIN_ERR; //没有SIM卡
if(NULL==EC20_send_cmd((uint8_t *)"AT+CREG?","2,1",150))
{
if(strstr((const char*)strEC20_Fram_Record.Data_RX_BUF,"0,1")==NULL)
{
if(strstr((const char*)strEC20_Fram_Record.Data_RX_BUF,"0,5")==NULL)
{
if(NULL!=EC20_send_cmd((uint8_t *)"AT+CSQ","OK",150)) // 200
{
memcpy(EC20CSQ,strEC20_Fram_Record.Data_RX_BUF+15,2);
}
return SIM_CREG_FAIL; //等待附着到网络
}
}
}
if(NULL==EC20_send_cmd((uint8_t *)"AT+CGSN","OK",150))
return IMEI_ERR; //IMEI错误
/*存储设备识别码IMEI*/
strncpy(IMEI_Code,(strEC20_Fram_Record.Data_RX_BUF+10),15);
return EC20_OK;
}
连接MQTT(数据交互)
if(NULL==EC20_send_cmd((uint8_t *)"AT+CGATT?", ": 1",140)) return 1; // 检测激活PDP
if(NULL==EC20_send_cmd((uint8_t *)"AT+QIACT?", "OK",100)) return 2; // 检测激活ACT
if(NULL==EC20_send_cmd((uint8_t *)"AT+QIDEACT=1", "OK",120)) return 3; // 关闭当前连接
if(NULL==EC20_send_cmd((uint8_t *)"AT+QMTCLOSE=0", NULL,0)) return 4; // 关闭MQTT客户端
if(NULL==EC20_send_cmd((uint8_t *)"AT+QMTDISC=0", NULL,0)) return 5; // 关闭和MQTT服务器的所有连接
//设置MQTT接收数据的模式
if(NULL==EC20_send_cmd((uint8_t *)"AT+QMTCFG=\"recv/mode\",0,0,1", "OK",250)) return 12;
//为模块打开网络链接
memset(AtStrBuf,0,BUFLEN);
sprintf(AtStrBuf, "AT+QMTOPEN=0,\"%s\",%d",Ec20_Mqtt_Ip,Ec20_Mqtt_Port);
if(NULL==EC20_send_cmd((uint8_t *)AtStrBuf, "+QMTOPEN: 0,0",1500)) //3000 return 13;
//连接到MQTT服务器
memset(AtStrBuf,0,BUFLEN);
sprintf(AtStrBuf, "AT+QMTCONN=0,\"%s\",\"%s\",\"%s\"",Ec20_Mqtt_Clientid,Ec20_Mqtt_Username,Ec20_Mqtt_Password);
if(NULL==EC20_send_cmd((uint8_t *)AtStrBuf, "+QMTCONN: 0,0,0",250))
return 14;
//当前订阅的Topic
if(NULL==EC20_send_cmd((uint8_t *)AtStrBuf, "+QMTSUB: 0,1,0,0",300))
return 15;
return 0;
服务器pub Topic就可以给EC20传递数据
串口接收数据。
服务器端sub Topic就可以收到来自EC20的数据。
AT+QMTPUBEX=0,0,0,0,"/device/out/%s"
以上参数的时间在EC官方手册中有,但是都是最大值,如需优化可以调试出最优值。
连接速度跟以下相关:
天线的摆放位置(向窗边摆)
距离基站的远近
如果连了SWD下载器的会连接不上,需要拔掉
给的延时少了也会出错(参考官方延时+自己调试)
问题
卡没流量
1.先确认卡是否损坏或插入正确
AT+QCCID
正确返回该卡的ID
2.AT+CREG? 返回 0,0 或者 0,3

3.AT+CGATT? 返回0 ,代表连不上网
如果能正确识别卡,但连不上网,就是卡没流量了。
一些重要的AT指令
获取 lac ci 确定基站位置
AT+COPS=3,2
AT+COPS?
AT+CREG=2
AT+CREG?
发送短信
AT+CMGF=1
AT+CMGS=195xxxxxx
xxxxxx(content)
1A
1A 代表文本内容的结束
获取时间
AT+QLTS=2
还有很多如打电话,播放音频等功能,感兴趣可以去官方文档里看看。



3816

被折叠的 条评论
为什么被折叠?



