概述
最近半年时间因为一直在忙项目的问题,一直没有新的跟新。现在项目已经接近尾声,自己也有一定的free时间,这次把该项目的一个新的知识点记成笔记,来提供大家学习分享。
1、项目内容
这个项目有使用到一个2G模块(GSM6315)和nrf51822,使用2G网络,与服务器通信。通信方式为post,每次都是我(设备端),去获取服务器的数据或者发送采集的数据给服务器。协议是使用http/https,每次post数据时候,我需要把自己采集的数据加载到http、https协议里面,一起给服务器。
2、操作方式。
相信熟悉2G模块的一个童鞋应该都知道,该模块使用AT指令的,而且,我看了一下这个模块的指令集资料,尽然和M26 的AT指令 有相似之处。不知道是不是互相参考了。这个地方不做辩解,随他们怎么搞,我们主要是如何在http、https里面增加自己的数据。大致操作如下。
1、激活sim卡,进行入网配置
2、进行http或者https配置
3、拼接数据
4、post数据
5、从服务器获取数据。
3、具体操作和相关代码
代码只给出部分代码,因为这个函数是单独封装的,在200ms的定时器里面进行轮询,里面有指令回馈超时处理,指令错误处理,指令解析,数据解析等等,造成代码很多,很长,很复杂。这里只给出发送指令部分,其他的需要童鞋自己去敲了 。
相关代码(大家可以直接复制,然后修改进行使用)
switch(livall_Send_case_flag)
{
case 0 :
GSM6315_Send("ATE0",4); //关闭回显
livall_Send_case_flag = 1;
Timeout_count_flag =10;//200ms*10 = 2000ms //指令超时
SEGGER_RTT_printf(0,"==>1 ATE0 <==rn");
break ;
case 1 :
//等待串口指令反馈
break ;
case 2:
sprintf(temp_buffer,"AT+CGDCONT=%d,"%s","%s"",1,"IP","CMNET"); //运营商配置
GSM6315_Send(temp_buffer,strlen(temp_buffer));
Timeout_count_flag =20;//200*20 = 4000ms//指令超时
livall_Send_case_flag = 3;
SEGGER_RTT_printf(0,"==>2 AT+CGDCONT=1 IP,CMNET <==rn");
break ;
case 3:
//µÈ´ý½á¹û·µ»Ø
break ;
case 4:
sprintf(temp_buffer,"AT+CGACT=%d,%d",1,1);
GSM6315_Send(temp_buffer,strlen(temp_buffer));
Timeout_count_flag = 40;//20*20 = 400ms
livall_Send_case_flag = 5;
SEGGER_RTT_printf(0,"==> 3 AT+CGACT=1.1<==rn");
break ;
case 5:
//等待串口指令反馈
break ;
case 6:
sprintf(temp_buffer,"AT+QNTP="cn.ntp.org.cn",123");//获取北京时间配置
GSM6315_Send(temp_buffer,strlen(temp_buffer));
Timeout_count_flag = 20;//200*20 = 4000ms
livall_Send_case_flag = 7;
SEGGER_RTT_printf(0,"==> 4 AT+QNTP="cn.ntp.org.cn",123 <==rn");
break ;
case 7:
//等待串口指令反馈
break ;
case 8:
GSM6315_Send("AT+CCLK?",8);//获取北京时间
Timeout_count_flag = 100;
livall_Send_case_flag = 9;
SEGGER_RTT_printf(0,"==> 5 AT+CCLK? <==rn");
break ;
case 9:
//等待串口指令反馈
break;
case 10:
if(send_ready_flag==GSM_POST_DATA )
{
lv_POST_DATA_TO_Sever(); //数据拼接
}
else if( send_ready_flag==GSM_GET_CONFIG)
{
lv_POST_GET_Helmet_Config();//数据拼接
}
else if( send_ready_flag==GSM_GET_ThresholdInfo)
{
lv_POST_GET_Helmet_ThresholdInfo();//数据拼接
}
else if(send_ready_flag==GSM_POST_SW_VER)
{
lv_POST_Helmet_SW_VER();//数据拼接
}
livall_Send_case_flag = 11;
SEGGER_RTT_printf(0,"==> 6 copy data to buffer <==rn");
Timeout_count_flag = 0;
break ;
case 11:
sprintf(temp_buffer,"AT+QHTTPCFG="requestheader",%d",1);//http/https配置 1
GSM6315_Send(temp_buffer,strlen(temp_buffer));
Timeout_count_flag = 50;
livall_Send_case_flag = 12;
SEGGER_RTT_printf(0,"==> 7 AT+QHTTPCFG=requestheader<==rn");
break ;
case 12:
//等待反馈
break ;
case 13:
sprintf(temp_buffer,"AT+QHTTPCFG ="responseheader",%d",1);//http/https配置 2
GSM6315_Send(temp_buffer,strlen(temp_buffer));
Timeout_count_flag = 50;
livall_Send_case_flag = 14;
SEGGER_RTT_printf(0,"==> 8 AT+QHTTPCFG = responseheader<==rn");
break ;
case 14:
//µÈ´ý½á¹û·µ»Ø
break ;
case 15:
POST_data_len = (strlen(buffer_URL)+2);//设置URL
sprintf(temp_buffer,"AT+QHTTPURL=%d",POST_data_len); //URL
GSM6315_Send(temp_buffer,strlen(temp_buffer));
Timeout_count_flag = 50;
livall_Send_case_flag = 16;
SEGGER_RTT_printf(0,"==> 9 AT+QHTTPURL <==rn");
break ;
case 16:
//µÈ´ý½á¹û·µ»Ø
break ;
case 17:
sprintf(temp_buffer,"%s",buffer_URL);//发送URL
GSM6315_Send(temp_buffer,strlen(temp_buffer));
SEGGER_RTT_printf(0,"===>url = %s<===rn",temp_buffer);
Timeout_count_flag = 50;
livall_Send_case_flag = 18;
SEGGER_RTT_printf(0,"==> 10 buffer_URL<==rn");
break ;
case 18:
//µÈ´ý½á¹û·µ»Ø
break;
case 19:
sprintf(temp_buffer,"AT+QSSLCFG="httpsctxi",%d",0); //https配置 1
GSM6315_Send(temp_buffer,strlen(temp_buffer));
Timeout_count_flag = 50;
livall_Send_case_flag = 20;
SEGGER_RTT_printf(0,"==> 11 AT+QSSLCFG = httpsctxi <==rn");
break ;
case 20:
break ;
case 21:
sprintf(temp_buffer,"AT+QSSLCFG="https",%d",1); //https 配置2
GSM6315_Send(temp_buffer,strlen(temp_buffer));
Timeout_count_flag = 50;
livall_Send_case_flag = 22;
SEGGER_RTT_printf(0,"==> 12 AT+QSSLCFG = https <==rn");
break ;
case 22:
break ;
case 23:
sprintf(temp_buffer,"AT+QSSLCFG="seclevel",%d,%d",0,0); //https 配置 3
GSM6315_Send(temp_buffer,strlen(temp_buffer));
Timeout_count_flag = 50;//20*10 = 200ms
livall_Send_case_flag = 24;
SEGGER_RTT_printf(0,"==> 13 AT+QSSLCFG=seclevel<==rn");
break ;
case 24:
break ;
case 25:
POST_data_len = strlen(buffer_data); //Êý¾Ý´óС
sprintf(temp_buffer,"AT+QHTTPPOST=%d",POST_data_len); //post 数据的长度
GSM6315_Send(temp_buffer,strlen(temp_buffer));
Timeout_count_flag = 50;//20*20 = 400ms
livall_Send_case_flag = 26;
SEGGER_RTT_printf(0,"==> 14 AT+QHTTPPOST <==rn");
break ;
case 26:
//µÈ´ý½á¹û·µ»Ø
break;
case 27:
SEGGER_RTT_printf(0,"%s",buffer_data);
GSM6315_Send(buffer_data,strlen(buffer_data));//开始post数据
Timeout_count_flag = 50;//20*100= 2000ms
livall_Send_case_flag = 28;
SEGGER_RTT_printf(0,"rn==> 15 buffer_data <==rn");
break ;
case 28:
//µÈ´ý½á¹û·µ»Ø
break ;
case 29:
sprintf(temp_buffer,"AT+QHTTPREAD=%d",30)//从服务器获取数据
GSM6315_Send(temp_buffer,strlen(temp_buffer));
Timeout_count_flag = 30;//20*10 = 200ms
livall_Send_case_flag = 30;
SEGGER_RTT_printf(0,"==> 16 AT+QHTTPREAD <==rn");
break ;
case 30:
//µÈ´ý½á¹û·µ»Ø
break ;
case 31:
sprintf(temp_buffer,"AT+QPOWD=%d",1); //关机。
GSM6315_Send(temp_buffer,strlen(temp_buffer));
Timeout_count_flag = 50;
livall_Send_case_flag = 32;
SEGGER_RTT_printf(0,"==> 17 AT+QPOWD <==rn");
break ;
case 32:
break ;
4、代码讲解
这里给大家细细讲解。
①、case 10 的数据拼接?
case 10的拼接是本次的重点的重点,大家要自己看一下。下面贴出case 10 里面的数据 拼接的部分代码(这个涉及到项目的安全问题,暂时只能贴出该部分)。
static void sprintf_post_data(uint8_t *buffer,uint8_t *strbuffer,uint16_t post_data_len)
{
uint8_t data_sprintf_buffer[750];
uint8_t buffer_len ;
①、http、https协议部分,必须要有不能缺少
sprintf(buffer,"POST /helmet/reportHelmetData HTTP/1.1rnHost: deliveryopenapi.meituan.comrnAccept: */*rnUser-Agent: QUECTEL_MODULErnConnection: Keep-AlivernContent-Type: application/x-www-form-urlencodedrnContent-Length:",post_data_len);//²»Êä³ö·´À¡ÐÅÏ¢
②、此处是①部分后面协议的部分与自己私有数据的长度
sprintf(data_sprintf_buffer," %drnrn",post_data_len);
buffer_len = strlen(data_sprintf_buffer);
③、拼接自己的私有数据
memcpy(data_sprintf_buffer+buffer_len,strbuffer,post_data_len);
memcpy((buffer+204),data_sprintf_buffer,strlen(data_sprintf_buffer));
}
下面是case 10 的完成输出样式,自己的数据必须是字符串格式,16进制也是可以的,但是服务器会接收错误。(这里吐槽几句:服务器还真是牛逼,全部都是字符串,一点不用考虑芯片资源问题。),
上面的数据拼接好了以后,就是在case 25 把整个数据(包括http,https协议数据和自己的数据)长度计算出来,通过AT指令告知2G模块,然后在case 27把整个数据丢给模块,模块就会把数据丢给你的URL所指定的服务器
②、case 11 和case 13 是http,https协议配置里面的必要部分,不可缺少的指令、
③、case 15 是告知2G模块,自己的URL长度 case 17 是告知2g 模块自己的URL路劲(比如:www.baidu.com ,在case 15就是长度15(网址13字节数据需要加上rn的2字节进行换行,模块才能接收),case 17 就是把这个路劲发送给模块。)
④、case 19 ,case 21 ,case 23 是https协议的配置,如果使用http,这里就不需要配置了 ,直接进入case 25 。如果使用https,这里必须要配置并且不需要在发送URL成功以后,才能进行配置。
⑤、case 25 和 case 27 就是把case 10 拼接的数据发送给服务器。
好了 ,到这里酸水讲解完了 。有兴趣的童鞋可以自己琢磨一下。
最后
以上就是舒心麦片为你收集整理的使用GSM6315模块,采用http或者https协议与服务器通信笔记的全部内容,希望文章能够帮你解决使用GSM6315模块,采用http或者https协议与服务器通信笔记所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复