蓝牙收发数据过大需要分包-组包处理

{
				static unsigned char Bt_RxData_Merge_Status=Bt_RxData_Merge_Defaul_Status;

				 //意思是一个iAP数据包被一个Bt_RxData发送
				if(Bt_RxData_Merge_Status==Bt_RxData_Merge_Defaul_Status && 0x55==Bt_RxData->MsgData[2])
				{
					//首先检测iAP数据包的长度
					//iAP数据包:Length域数据包含1或3字节,这取决于载荷的长度
					//一字节域可在单字节中表现0x02到0xFC (2到252)的载荷长度
					//三字节域数据包含0x00标记字节,2字节载荷长度域值紧随其后,范围从0x00FD到0xFFFA (253到65529)。
					 if (0x00 != Bt_RxData->MsgData[3]) //iAP 的Length为单字节
					{

						//解析iAP数据
						Bt_iAP_CmdList_TypeDef * iap_data =(Bt_iAP_CmdList_TypeDef *)malloc(sizeof(Bt_iAP_CmdList_TypeDef));
						if(iap_data==NULL)
						{
							return ;
						}
						memset(iap_data, 0, sizeof(Bt_iAP_CmdList_TypeDef));

						iap_data->len = Bt_RxData->MsgData[3];
						iap_data->lingo_id = Bt_RxData->MsgData[4];
						iap_data->command_id = Bt_RxData->MsgData[5];
						iap_data->trans_id = (Bt_RxData->MsgData[6] << 8) | (Bt_RxData->MsgData[7] & 0xff);
						//Bt_RxData->MsgLength=start+len+lingo_id+command_id+trans_id+checksum+paybuf
						memcpy(iap_data->rece_buf, &(Bt_RxData->MsgData[8]), Bt_RxData->MsgData[1]-7);

						//把一个完整的iAP数据插入链表
						Bt_IapCommand_CmdListInsertCmd(iap_data);

						//iAP认证通过之后开始处理EA通道
						if(GetCurBtIapAuthenticatedStatus()==BT_IAP_SUCCESS)
						{
							iap_packet_deal();
						}

						//重新设置Bt_RxData_Merge_Status标志位
						Bt_RxData_Merge_Status=Bt_RxData_Merge_Defaul_Status;

					}
				       else if(0x00==Bt_RxData->MsgData[3]) //iAP 的Length为三字节,并且是以0x00开头为标记,后面两个字节是iAP的长度,很明显是大于Bt_RxData的最大长度256,需要分包处理
					{
						iAP_point = 0;
						memset(iAP_PayLoadBuf, 0, MAX_IAP_DATA_BUFFER);

						//Bt_RxData->MsgData[1]=start+len+lingo_id+command_id+trans_id+checksum+PayBuf
						//0x99 开头后面接着用户数据长度
						//保存iap数据包的长度
						iap_data_len= (Bt_RxData->MsgData[4] << 8) | (Bt_RxData->MsgData[5]  & 0xff);

						memcpy(iAP_PayLoadBuf + iAP_point, &(Bt_RxData->MsgData[2]), Bt_RxData->MsgData[1]);
						iAP_point=iAP_point+Bt_RxData->MsgData[1];

						//重新设置Bt_RxData_Merge_Status标志位需要分包处理
						Bt_RxData_Merge_Status=Bt_RxData_Merge_Middle_Status;

					}
				}
				else if(Bt_RxData_Merge_Status==Bt_RxData_Merge_Middle_Status)
				{
						memcpy(iAP_PayLoadBuf + iAP_point, &(Bt_RxData->MsgData[2]), Bt_RxData->MsgData[1]);
						iAP_point=iAP_point+Bt_RxData->MsgData[1];

						//比较缓存的数据是否已经可以组成一个完整的iAP数据包
						if((iAP_point-5)>=iap_data_len)
						{
							//iAP_point=iap_data_len+sizeof(start)+sizeof(len)+sizeof(checksum)=iap_data_len+5
							//解析iAP数据
							Bt_iAP_CmdList_TypeDef * iap_data =(Bt_iAP_CmdList_TypeDef *)malloc(sizeof(Bt_iAP_CmdList_TypeDef));
							if(iap_data==NULL)
							{
								return ;
							}
							memset(iap_data, 0, sizeof(Bt_iAP_CmdList_TypeDef));

							iap_data->len = (iAP_PayLoadBuf[2] << 8) | (iAP_PayLoadBuf[3]  & 0xff);
							iap_data->lingo_id =iAP_PayLoadBuf[4];
							iap_data->command_id = iAP_PayLoadBuf[5];
							iap_data->trans_id = (iAP_PayLoadBuf[6] << 8) | (iAP_PayLoadBuf[7] & 0xff);
							//Bt_RxData->MsgLength=start+len+lingo_id+command_id+trans_id+checksum+paybuf
							memcpy(iap_data->rece_buf, &(iAP_PayLoadBuf[8]), iAP_point-9);

							//把一个完整的iAP数据插入链表
							Bt_IapCommand_CmdListInsertCmd(iap_data);

							//iAP认证通过之后开始处理EA通道
							if(GetCurBtIapAuthenticatedStatus()==BT_IAP_SUCCESS)
							{
								iap_packet_deal();
							}

							//重新设置Bt_RxData_Merge_Status标志位为初始化状态
							Bt_RxData_Merge_Status=Bt_RxData_Merge_Defaul_Status;
						}
						else if((iAP_point-5)<iap_data_len)
						{
							//重新设置Bt_RxData_Merge_Status标志位需要分包处理
							Bt_RxData_Merge_Status=Bt_RxData_Merge_Middle_Status;

							//组包处理计数
							iAP_Merge_test++;

						}

				}

			}
				
时间: 2024-10-06 06:26:04

蓝牙收发数据过大需要分包-组包处理的相关文章

Socket之UDP分包组包

一般传输大的文件和信息的时候需要涉及到分包和组包,方法有很多,下面一种是借鉴了别人的思路,供大家参考哈 分包 1.取出需要传输的文件和字符的长度和大小放入缓存区里面: 2.设定固定传输的长度,用需要传输的长度除以固定传输的长度都可以得到需要传输的次数: 3.传输一次字节流中包括(文件名字.文件名字大小.顺序.数据总块数.数据长度.数据总长度) 4.包组装完成后,都剩下发送:当确定到接收方收到后,在传下一次包: FileStream m = new FileStream(FullName, Fil

【NodeJs】使用TCP套接字收发数据的简单实例

因为TCP协议是流协议,在收发数据的时候会有粘包的问题.本例使用自定义的SPtcp封包协议对TCP数据再进行一次封装,解决了粘包问题. 注:其性能仍有待优化.优化方向:使用TCP自带的接收窗口缓存. sptcp.js /** * script: sptcp.js * description: 简单封包协议SPtcp类 * authors: [email protected] * date: 2016-04-14 */ var util = require('util'); function SP

java未来趋势 Java促进大数据的大发展

没有Java,甚至不会有大数据的大发展,Hadoop本身就是用Java编写的.当你需要在运行MapReduce的服务器集群上发布新功能时,你需 要进行动态的部署,而这正是Java所擅长的. 大数据领域支持Java的主流开源工具: 1. HDFS HDFS是Hadoop应用程序中主要的分布式储存系统, HDFS集群包含了一个NameNode(主节点),这个节点负责管理所有文件系统的元数据 及存储了真实数据的DataNode(数据节点,可以有很多).HDFS针对海量数据所设计,所以相比传统文件系统在

openVswitch(OVS)源代码分析之工作流程(收发数据包)

前面已经把分析openVswitch源代码的基础(openVswitch(OVS)源代码分析之数据结构)写得非常清楚了,虽然访问的人比较少,也因此让我看到了一个现象:第一篇,openVswitch(OVS)源代码分析之简介其实就是介绍了下有关于云计算现状和openVswitch的各个组成模块,还有笼统的介绍了下其工作流程,个人感觉对于学习openVswitch源代码来说没有多大含金量.云计算现状是根据公司发展得到的个人体会,对学习openVswitch源代码其实没什么帮助:openVswitch

iOS开发之音频口通信-通过方波来收发数据

之前做过的项目有需要通过音频口通信用方波来收发数据,由于这方面的资料比较少,下面就介绍下其原理,希望能给大家帮助. 一. 音频通信简介大家应该都知道支付宝声波支付和拉卡拉吧,它们都是利用手机的音频口(手机耳机口)来实现全双工的通信(手机与设备之间的双向通信).其优点是低成本,编码芯片成本低,手机的 3.5mm 通信接口广泛. 二. 市场应用支付宝声波支付手机刷卡器皮肤检测仪检测如甲醛.气压.温度.湿度等等心率.血压等等....................... 三. 通信原理手机上用的耳机大

收发数据的原理(下)

因为网络原理不是三言两语可以讲完,如果读者很忙,可以直接拉到最底下,看总结,知道个大概,再回头细读此文章.感谢关注.废话不多说,直接进入主题.在上篇我们已经讲了TCP收发数据的前两步,接下来是最后两步. 将HTTP消息传给协议栈 上篇讲到控制流程从 connect 回到应用程序之后,就到了数据收发阶段. 数据收发数据是从应用程序调用write将要发送的数据交给协议栈开始的,协议栈收到数据后执行发送操作,这一操作包含如下要点. 首先,协议栈并不关心应用程序传来的数据是什么内容.应用程序调用writ

蓝牙ble数据转语音实现Android AudioRecord方法推荐

蓝牙ble数据转语音实现Android AudioRecord方法推荐 教程 欢迎走进zozo的学习之旅. 概述 蓝牙BLE又称bluetooth smart,主打的是低功耗和快速链接,所以在支持的profile并没有audio的部分,而蓝牙语音协议A2DP只在传统蓝牙中有,本文就是提供一种利用ble数据来传输压缩语音,并最终在实现用android语音框架中的AudioRecord方法来获取语音流. 主要思路 首先问题的需求是从一种非标准的协议挂载成为一个标准协议.那通过修改kernel的blu

Qt Socket 收发图片——图像拆包、组包、粘包处理

之前给大家分享了一个使用python发图片数据.Qt server接收图片的Demo.之前的Demo用于传输小字节的图片是可以的,但如果是传输大的图片,使用socket无法一次完成发送该怎么办呢?本次和大家分享一个对大的图片拆包.组包.处理粘包的例子. 程序平台:ubuntu . Qt 5.5.1 为了对接收到的图像字节进行组包,我们需要对每包数据规定协议,协议如下图: 每包数据前10个字节对应含义如下:前两个字节对应数据包类型,中间四字节预留,最后四字节是包内数据实际长度.对应协议图片更方便刚

dsp28377控制DM9000收发数据

首先感谢上一篇转载文章的作者给出的参考,下面是一些自己在调试过程中的一些步骤: 首先把代码贴上来: //---------------------------------------------------------------------------------------------//DSP28377 利用EMIF控制网口DM9000芯片收发数据//----------------------------------------------------------------------