第一次总结:整体框架

tcp部份:

1、初始化WiFi连接路由器

wifi.begin();bool b = wifi.Initialize(STA, SSID, PASSWORD);连接局域网if(!b){DebugSerial.println("Init error");}delay(8000);  //make sure the module can have enough time to get an IP address String ipstring  = wifi.showIP();DebugSerial.println(ipstring);     //show the ip address of moduledelay(5000);wifi.confMux(1);delay(100);if(wifi.confServer(1,8080))DebugSerial.println("Server is set up");

2、终端登录

if(AT+ CIPSTATUS?){pro_avtice_TeConnect();  //终端登录函数}if(gprs_upl_mnginfo_ptr()->flags.upl_timesynch == FALSE) //时间同步{gprs_pro_ack_TimeSynch();

3、tcp连接并向服务器发送数据

void pro_avtice_TeConnect(void){gprs_pro_cmd_t local_com; //结构体 memset((u8*)&local_com,0,sizeof(gprs_pro_cmd_t));local_com.pro_data = malloc(128);local_com.command_id = 0x0002;//终端登录local_com.seq_num = 0x0001;  //暂定local_com.dev_id = 0x30313233343536;//{0x30,0x31,0x32,0x33,0x34,0x35,0x36};local_com.pro_data = 0x324235....;local_com.len = 74;protocol_datapack(&local_com);}

4.接受数据:
rece_data函数接受的数据类型为int型需用String tempstr函数转化为string型,最后由pro_protocol_analysis函数根据通信协议分析数据内容

void rec_data(){接受数据int rece_data = wifi.ReceiveMessage(buf);String tempstr = String(rece_data);if (strcmp(rece_data, "@@") == 0)对比字符串是否一样{data = pro_protocol_analysis((u8*)&rece_data,tempstr.length)}
}

函数总结:

1.打包程序:将GPRS数据根据通信协议进行打包发送到服务器端,event.size函数内的 17 为通信协议中GPRS数据包排除校验的数据长度。

其中:

消息头:固定两个字符“@@”, HEX 表示为 40h 40h;
消息长度:Word 数据类型,从消息流水号到校验字段前所有字节的总和;
消息流水号:Word 数据类型,标识本数据包的流水号;
设备 ID:7 字节 ID,第 1 个字节为 ASCII,表示传感器类型,第 2-7 字节为 BCD 码,高字节在前,低字节在后,如:
传感器设备 ID: M121501010001,即 0x4D,0x12,0x15,0x01,0x01,0x00,0x01;
功能 ID:Word 数据类型,标识本数据包的功能;

void protocol_datapack(gprs_pro_cmd_t *com){/mab_event_t event; u8 *com_para;u16 crc16;//event:event.size = (17 +com->len);    17为排除校验event.buff = malloc(event.size);if(NULL == event.buff){printf("Pro package can't malloc!\r\n");return;}com_para = event.buff; ////head:  消息头com_para[0] = 0x40;com_para[1] = 0x40;com_para += 2;//len:消息长度crc16 = com->len +GPRS_PRO_SEQ_LEN +GPRS_PRO_DEV_ID_LEN +GPRS_PRO_CMD_LEN;memcpy(com_para, (u8*)&crc16, 2); buff_overturn(com_para,2);   //待定处理com_para += 2;//seq:   消息流水号memcpy(com_para, (u8*)&com->seq_num, 2);  com_para += 2;//id:memcpy(com_para, com->dev_id, GPRS_PRO_DEVICE_ID);com_para += GPRS_PRO_DEVICE_ID;//cmd:   功能idmemcpy(com_para, (u8*)&com->command_id, 2);buff_overturn(com_para,2);com_para += 2;//Data info:  数据段if(com->len)    {memcpy(com_para, com->pro_data, com->len);com_para += com->len;}//verify:    校验crc16 = verify_crc16(event.buff, event.size -GPRS_PRO_VRFY_LEN);  //校验函数待定memcpy(com_para, (u8*)&crc16, 2);buff_overturn(com_para,2);//send:wifi.Send(event.buff,event.size);  //待定处理free(event.buff,event.size);
}

**2.解析函数:**帮助arduino理解服务器端发送的数据

void pro_protocol_analysis(u8 *data_buff, u16 data_len){gprs_pro_cmd_t pro_com;u8 *com_para;u16 crc16,calc_crc;u8 device_id[GPRS_PRO_DEVICE_ID+1];com_para = data_buff;while(data_len >= GPRS_PRO_BASE_LEN)   {//head info:if((com_para[0] != 0x40) ||(com_para[1] != 0x40))  {data_len --;com_para ++;continue;}//len:0x404000144883  pro_com.len = (u16)(com_para[2] <<8) +com_para[3];   if((pro_com.len < 12)||((pro_com.len+GPRS_PRO_LENGTH_LEN+GPRS_PRO_VRFY_LEN) > data_len)) {printf("Pro anly len err!len=%d,data_len=%d\r\n",pro_com.len,data_len);data_len --;com_para ++;continue;}//verify:crc16 = (u16)(com_para[pro_com.len+4] << 8) + com_para[pro_com.len+5];  //CRCcalc_crc = verify_crc16(com_para,4+pro_com.len);  if(crc16 != calc_crc){printf("Pro anly verify err!calc_crc=%04x\r\n",calc_crc);data_len --;com_para ++;continue;}data_len -= 4;  com_para += 4; //seq:memcpy((u8*)&pro_com.seq_num, com_para, 2);  data_len -= 2;com_para += 2;//id:       memcpy(pro_com.dev_id, com_para, GPRS_PRO_DEVICE_ID);  data_len -= GPRS_PRO_DEVICE_ID;com_para += GPRS_PRO_DEVICE_ID;//cmd id:   pro_com.command_id = (u16)((com_para[0] << 8) + com_para[1]);data_len -= 2;com_para += 2;//data:pro_com.len -= (GPRS_PRO_SEQ_LEN+GPRS_PRO_DEV_ID_LEN+GPRS_PRO_CMD_LEN);  pro_com.pro_data = com_para;           data_len -= pro_com.len;com_para += pro_com.len;//handler:gprs_pro_menue_handler(&pro_com);  }
}

**3.终端登陆函数:**其中心跳函数防止于服务器端连接中断

void pro_avtice_TeConnect(void){gprs_pro_cmd_t local_com; //结构体 memset((u8*)&local_com,0,sizeof(gprs_pro_cmd_t));local_com.pro_data = malloc(128);local_com.command_id = 0x0002;//终端登录local_com.seq_num = 0x0001;  //暂定local_com.dev_id = 0x30313233343536;//{0x30,0x31,0x32,0x33,0x34,0x35,0x36};local_com.pro_data = 0x324235....;local_com.len = 74;protocol_datapack(&local_com);}void gprs_pro_active_PingReq(void)  //心跳
{gprs_pro_cmd_t local_com;memset((u8*)&local_com,0,sizeof(gprs_pro_cmd_t));local_com.command_id = 0x0003;local_com.seq_num = 0x0001;local_com.dev_id = 0x30313233343536;gprs_pro_datapack(&local_com);
}void gprs_pro_active_TimeSynch(void)  // 时间同步
{gprs_pro_cmd_t local_com;memset((u8*)&local_com,0,sizeof(gprs_pro_cmd_t));local_com.command_id = 0x0004;local_com.seq_num = 0x0001;local_com.dev_id = 0x30313233343536;gprs_pro_datapack_package(&local_com);//sys_mng_info_ptr()->clksych_SEQ = local_com.seq_num;
}

第一次总结:整体框架相关推荐

  1. C语言程序设计:单词本整体框架实现

    目录 概述 头文件.声明等 主函数编写 登录/注册界面编写 1.注册/登录框架编写 2."注册"子函数编写 3."登录"子函数编写 主菜单编写 效果图 主界面 ...

  2. 【推荐系统】推荐系统整体框架概览

    感谢博文作者 Kevin_Duan 原文链接:https://blog.csdn.net/chunyun0716/article/details/83152037 推荐系统整体架构 先说点题外话,最近 ...

  3. 通俗易懂SpringMVC整体框架理解

    最近又重新温习了一下前台SpringMVC框架,能够从整体上对SpringMVC有一个全局的认识.在这里也总结一下,为那些即将学习SpringMVC的亲们,做一个很好的开端吧! 1. SpringMV ...

  4. V4L2 driver(一). 整体框架

    1.1 从字符设备说起 熟悉v4l2用户空间编程的都知道, v4l2编程主要是调用一系列的ioctl函数去对v4l2设备进行打开, 关闭, 查询, 设置等操作. v4l2设备是一个字符设备, 而且其驱 ...

  5. 第一次创建springboot框架项目

    第一次创建springboot框架项目 1.1_创建步骤 2.1_启动时遇到的问题 2.2_启动响应网页测试 2.3_连接数据库尝试 1.1_创建步骤 (1)创建spring项目 (2) (3) 加入 ...

  6. 推荐系统整体框架概览

    推荐系统整体框架概览 推荐系统整体架构 推荐系统的核心组成部分 离线 核心节点 服务 UI 总结 推荐系统整体架构 先说点题外话,最近在看的书中讲到了怎么进行自学的方法,分了十个层级.第一个便是要了解 ...

  7. 浅谈opencl之整体框架

    结合四大模型,以CPU和GPU平台为例子,opencl整体框架如下: CPU为host端, GPU为device端, host和device端的交互是以context为主.context贯穿到整个op ...

  8. jQuery源码分析 整体框架部分及部分常用方法

    最近尝试看看jQuery的源码. 版本 version = "1.11.1" 相对于看一本jQuery如何使用的书,看jQuery源码对它可以有更深层次的理解.jQuery中大量使 ...

  9. zeptojs库解读1之整体框架

    首先看的是整体框架, // zepto骨骼,这个函数的作用使得Zepto(slector, context)使用很多$.fn里面的方法 var Zepto = (function(){// zepto ...

最新文章

  1. PL/SQL编程:loop-if-exit-end循环算5的阶乘
  2. 给程序员的几条建议,精彩配图!
  3. Eclipse中异常断点问题
  4. Guava RateLimiter限流源码解析和实例应用
  5. python计算最大回撤_Python进阶量化交易场外篇3——最大回撤评价策略风险
  6. 工业机器人电路图讲解话术_6张经典电路图分析助你进阶高级电工,你都会了吗?...
  7. LeetCode 第 207 场周赛(245/4115,前5.95%)
  8. latex 作者加小标_Latex 写期刊论文的小技巧
  9. bootstrap table无法服务器分页_layui分页的大坑,RequestPayload和FormData
  10. 【AI面试题】特征归一化
  11. 【Java从0到架构师】MySQL 基础
  12. nodejs注册为windows服务实现开机自启动
  13. 安卓开发_使用AlertDialog实现对话框
  14. VirtualBox虚拟机,WIN7的性能远远落后于LINUX及解决办法
  15. 最基本的25道深度学习面试问题和答案
  16. 计算机网络实验三思考题,计算机网络实验思考题答案
  17. codeforces228A Is your horseshoe on the other hoof?(水题)
  18. java考勤表导出_Sql通过存储过程生成全年日历考勤表数据
  19. live2d_Live2D解锁丨SR羁绊复刻,生日定制服装上架!
  20. KindEditor编辑器上传修改拿shell漏洞

热门文章

  1. 等级VIN行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)
  2. php file_get_contents 效率,php 浅析file_get_contents、curl 的效率和稳定性
  3. 写markdown用vscode的插件Markdown Preview Enhanced
  4. 揭晓AI算力池化的五大场景
  5. 开源的“底线”在哪里?
  6. Kotlin 1.5 新特性:密封接口有啥用?
  7. 从科大讯飞跳槽到腾讯被判赔 1200 万;华为多款机型将取消充电器;苹果春季发布会定档4月21日|极客头条...
  8. 湖南区块链服务网络(BSN)门户运营商确定
  9. 双十一重磅福利来袭,拯救 “四大皆空” 的你!
  10. 西门子大中华区总裁兼CEO赫尔曼:智能自主制造将重塑工业格局!