天天看点

使用GSM6315模块,采用http或者https协议与服务器通信笔记

最近半年时间因为一直在忙项目的问题,一直没有新的跟新。现在项目已经接近尾声,自己也有一定的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 <==\r\n");						
					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 <==\r\n");						 
					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<==\r\n");		 
					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 <==\r\n");			 
					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? <==\r\n");		 
					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 <==\r\n");							
                       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<==\r\n");
					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<==\r\n");
					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 <==\r\n");
					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<===\r\n",temp_buffer);
					  Timeout_count_flag = 50;
					  livall_Send_case_flag = 18;	
				    SEGGER_RTT_printf(0,"==> 10 buffer_URL<==\r\n");
					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 <==\r\n");
					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 <==\r\n");
					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<==\r\n");
					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 <==\r\n");
					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,"\r\n==> 15 buffer_data <==\r\n");
					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 <==\r\n");
					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 <==\r\n");
					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.1\r\nHost: deliveryopenapi.meituan.com\r\nAccept: */*\r\nUser-Agent: QUECTEL_MODULE\r\nConnection: Keep-Alive\r\nContent-Type: application/x-www-form-urlencoded\r\nContent-Length:",post_data_len);//²»Êä³ö·´À¡ÐÅÏ¢
    ②、此处是①部分后面协议的部分与自己私有数据的长度
		 sprintf(data_sprintf_buffer," %d\r\n\r\n",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进制也是可以的,但是服务器会接收错误。(这里吐槽几句:服务器还真是牛逼,全部都是字符串,一点不用考虑芯片资源问题。),

使用GSM6315模块,采用http或者https协议与服务器通信笔记

上面的数据拼接好了以后,就是在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字节数据需要加上\r\n的2字节进行换行,模块才能接收),case 17 就是把这个路劲发送给模块。)

④、case 19 ,case 21 ,case 23 是https协议的配置,如果使用http,这里就不需要配置了 ,直接进入case 25 。如果使用https,这里必须要配置并且不需要在发送URL成功以后,才能进行配置。

⑤、case 25 和 case 27 就是把case 10 拼接的数据发送给服务器。

好了 ,到这里酸水讲解完了 。有兴趣的童鞋可以自己琢磨一下。