背景
最近项目开发4G模块MQTT网关,采用的是安信可的4G Ca-01.
因为与之前的2G开发流程还是有些许不一样和独特之处,故而留此调试记录。
调试记录
1.初始化
模块会一直自查SIM卡状态,此可作为模块是否初始化成功完成标志,
以及空闲状态监测是否SIM卡异常;
若输出:“SIM REMOVED” 表示卡没插或者坏掉也是一种;
若输出:“SMS READY” 表示可以进行联网附着了;
2.联网附着,此步与普通AT联网有差异。
采用通用的那种,虽然会附着并登陆成功,但是订阅指令一直不成功,后来问官方技术支持,才知是如下联网流程。
AT+SAPBR=3,1,”CONTYPE“,"GPRS";
--> OK
AT+SAPBR=3,1,"APN","CMIOT";
--> OK
AT+SAPBR=1,1;
--> OK
3.TCP握手连接,MQTT配置登陆
AT+MIPSTART="123iot.com",1883;
--> CONNECT OK
AT+MCONFIG="1234567890","username","password";
--> OK
AT+MCONNECT=0,360;
--> OK
4.订阅主题
AT+MSUB="sub_topic_theme",0;
--> OK
5.发布主题
AT+MPUB="pub_topic_theme",0,0,"payload_data"
--> OK
根据手册内容提醒,注意发布的payload数据的双引号需要做转化为\22.
这也是使用这个模块遇到的一个相对棘手的问题,不过后来经同事提醒,在这样的一些文章标题中得到解决思路《替换一个字符数组中的所有空格符为“%20”》。
//**我做了更改并使用的是这个**
void str_replace(char *str)
{
int len = strlen(str);//计算当前输入字符串长度
int replace_num = 0;//
char *end = NULL;
char *end_new = NULL;
char *pstr = str;//p指向字符串
while (*str++ != '\0')//遍历字符串
{
if (*str == '\"')//索引到目标字符
{
replace_num++; //目标字符计数器+1
}
}
end = str;//字符串指向p
end_new =end + 2 * replace_num;//计算新长度
str=pstr;
while (end != end_new)//当新结束指针和原结束指针不相等时
{
if (*end == '\"')//发现"\"",变为"\22"
{
*end_new-- = '2';
*end_new-- = '2';
*end_new-- = '\\';
end--;
}
else
{
*end_new-- = *end--;
}
}
}
至此完成…OK!