最近半年时间因为一直在忙项目的问题,一直没有新的跟新。现在项目已经接近尾声,自己也有一定的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 = 400mslivall_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 = 4000mslivall_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配置 1GSM6315_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配置 2GSM6315_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);//设置URLsprintf(temp_buffer,"AT+QHTTPURL=%d",POST_data_len);  //URLGSM6315_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);//发送URLGSM6315_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配置 1GSM6315_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 配置2GSM6315_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 配置 3GSM6315_Send(temp_buffer,strlen(temp_buffer));Timeout_count_flag = 50;//20*10 = 200mslivall_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 = 400mslivall_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= 2000mslivall_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 = 200mslivall_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进制也是可以的,但是服务器会接收错误。(这里吐槽几句:服务器还真是牛逼,全部都是字符串,一点不用考虑芯片资源问题。),

上面的数据拼接好了以后,就是在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 拼接的数据发送给服务器。

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

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

  1. http协议与服务器通信,iPhone应用用HTTP协议和服务器通信

    iPhone应用用HTTP协议和服务器通信是本文要介绍的内容,主要是来学习iphone应用中的通信协议,具体内容来看本文详解. iPhone用http协议和服务器通信有两种方式,一种是同步一种是异步的 ...

  2. java 调用tomcat api,Tomcat采用双向认证https协议通过JavaAPI调用(一)配置SSL

    双向认证(个人理解): 客户端认证: 客户端通过浏览器访问某一网站时,如果该网站为HTTPS网站,浏览器会自动检测系统中是否存在该网站的信任证书,如果没有信任证书,浏览器一般会拒绝访问,IE会有一个继 ...

  3. 4g模块通过什么协议与服务器通信,4G通信模块的分析说明

    4g通信模块一种基于4G网络进行数据传输的工业级通讯终端,其主要作用是将采集到的传感器数据.仪表数据,传输至服务器/上位机.监控中心.众山研发生产的4g无线通讯设备--是一款物联网数据传输设备,支持R ...

  4. 微信小程序用udp协议与服务器通信(一):连接服务器,将数据传输给服务器

    在微信小程序中udp通信传送的message支持两种格式: ArrayBuffer和string,可按服务器要接受的格式传送 ArrayBuffer格式传送 要使用ArrayBuffer格式传送,就需 ...

  5. 图解HTTPS协议加密解密全过程

    为什么80%的码农都做不了架构师?>>>    我们都知道HTTPS能够加密信息,以免敏感信息被第三方获取.所以很多银行网站或电子邮箱等等安全级别较高的服务都会采用HTTPS协议. ...

  6. https协议及与http协议的比较

    一.HTTP和HTTPS的基本概念 HTTP:是互联网上应用最为广泛的一种网络协议,是一个客户端和服务器端请求和应答的标准(TCP),用于从WWW服务器传输超文本到本地浏览器的传输协议,它可以使浏览器 ...

  7. HTTP与HTTPS协议

    目录 一.HTTP协议的原理 二.HTTP报文组成 请求报文 响应报文 响应状态码 常见状态码 常见请求方法 三.HTTPS协议的原理 四.HTTP与HTTPS的区别 一.HTTP协议的原理 HTTP ...

  8. http、https 协议运行过程 公钥私钥,证书存放位置,传递证书,(非)对称加密。

    http 采用的TCP / IP通信协议,http默认的是 80 端口.主要特点: 1.无连接 2.无状态 3.媒体独立 参考:https://blog.csdn.net/qq_41291945/ar ...

  9. 详解HTTP协议和HTTPS协议

    目录 一.HTTP协议 1.什么是HTTP 2.HTTP发展历史 3.HTTP请求和响应 4. 抓包的方式和工具Fiddler 1.开发者工具 2.Fiddler 二.请求和响应 1.请求和响应报文 ...

  10. 网络篇 - https协议中的数据是否需要二次加密

    随着互联网整体的发展,https 也被越来越多的应用.甚至苹果去年还曾经放言要强制所有的 app 都使用 https,可见在如今的互联网它的重要性.前面的文章说了 OSI 七层模型,https 可以保 ...

最新文章

  1. Cocos 全局变量的使用
  2. 科学家调查了72名图灵奖得主背景,却发现计算机专业很难得奖!
  3. mysql8.0.13可以用在生产环境_(13)生产环境出现大量DB死锁
  4. [BZOJ3944]Sum
  5. 线程阻塞问题-功能:环信登录失败后自动登录5次
  6. 《Spring 揭秘》读书笔记
  7. ArcMap数据处理
  8. Mysql的INTERVAL()函数和INTERVAL关键字
  9. 生活,平淡,些许沉思,些许感概
  10. 暴雪和黑客的战争四:暴雪的杀手锏-The Warden
  11. Linux下套接字详解(六)----基于pthread的多线程的TCP套接字(阻塞/同步/并发)
  12. VS常见问题|VS LNK1168错误 有效解决方法
  13. virtual box实现内外网共用
  14. Circulation(IF=23.054):更年期后的女性冠心病患者代谢组学研究
  15. python画虚线代码_python – 使用matplotlib绘制虚线2D矢量?
  16. 10 Python Matplotlib 绘制极坐标图和散点图
  17. 从过去的错误中吸取教训_要学会从错误中吸取,经验教训,才能更加完善提高,自我价值...
  18. Moov itom not found 详解及修复。
  19. 转贴:卡森麦克勒斯:《伤心咖啡馆之歌》
  20. 解题-->在线OJ(七)

热门文章

  1. xpath兄弟结点语法
  2. matlab求对数正态的均值和标准差,matlab – 从变量的均值,系数生成对数正态分布随机数...
  3. Codevs1378选课题解
  4. 2021深圳入户新政策大变动(软考中、高级职称请留意)
  5. js原生css修改,原生js获取、添加、修改_非行间css样式
  6. 数据库系统概论(第七章:数据库设计)
  7. 小米之家真的是有效的渠道模式么?
  8. java自动拼图_java 拼图游戏完整源码,图片剪切,包含拼图自动还原功能
  9. WPS使用宏操作——减少重复性操作,提高效率
  10. 美通企业日报 | 英特尔与阿里云签署战略合作备忘录;赛默飞在苏州扩建临床试验工厂...