一种多路多通道高速数据流的实时分包解析方法与流程

文档序号:11253955阅读:684来源:国知局
一种多路多通道高速数据流的实时分包解析方法与流程
本发明属于高速数据流分级缓存
技术领域
,是一种二级环形实时分包解析技术,尤其是一种多路多通道高速数据流的实时分包解析方法。
背景技术
:数据流解析是软硬件交互的一个重要过程。远程设备通过tcp协议以较高的传输速率的传输原始数据流到服务器某端口,服务器异步或者同步接收到原始数据流后,实时地通过数据帧协议的固定结构去把原始数据流进行分包成帧,把有用的帧内部的有效数据提取出来,并送到相关的计算单元进行计算。原始数据流传输速度很快,在内部数据帧处于多重帧结构的情况下,需要对数据帧进行多次分包解析,要达到实时接收并分包解析是很困难的,很容易出现缓存溢出的情况。在同时存在多路数据流的情况下,对每一路单独设置缓存区的做法,既增大了内存消耗,也增大了cpu压力。而且由于多线程的无序性,该做法不能保证解析出数据帧是有序的,其实用性不强。目前许多方法针对这个不足提出了改良做法,但是效果不佳,难以应对数据流复杂度和传输速率很极端的情况。技术实现要素:本发明的目的是针对现有技术的不足而提供的一种多路多通道高速数据流的实时分包解析方法,该方法高效率地对数据流进行精确分包和解析,最终解析出有效数据用于后续处理。实现本发明目的的具体技术方案是:一种多路多通道高速数据流的实时分包解析方法,特点是该方法包括以下具体步骤:步骤1:根据远程硬件设备的数据流传输速度,动态地初始化大环形缓存区和小环形缓存区的容量大小;其中,大环形缓存区的容量大小为多路数据流传输速率之和的三倍;小环形缓存区为大环形缓存区的容量大小除以通道个数;具体包括:a1:根据数据流传输速度初始化大环形缓存区的容量大小,若传输速率为vmbps,则大环形缓存区的容量为(3*v)mb;根据数据流中数据的通道数量初始化小环形缓存区的个数,若每一路数据流中有q个通道的信号数据,则初始化q个环形小缓存区;a2:把大环形缓存区和所有小环形缓存区的首、尾指针归零;步骤2:对大环形缓存区的所有写线程使用互斥锁进行保护;具体包括:b1:多个线程各自监听一个独立的端口来接收一路数据流;b2:对大环形缓存区使用互斥锁;b3:一个写线程收到m字节数据后,申请互斥锁;若获得互斥锁,则向大环形缓存区写入m字节,m是单次接收的数据流的字节数;首指针向后移动m位,释放互斥锁,处于等待状态的写线程开始申请互斥锁;步骤3:解析线程对大环形缓存区的多路数据进行实时分包得到复帧,并解析得到每一通道的子帧,线程池把子帧写入相应通道的小环形缓存区中;具体包括:c1:解析线程根据复帧的帧结构,大环形缓存区的尾指针位置开始对数据流进行分包;c2:解析线程每找到一个复帧的首、尾位置,并把该复帧的位置信息传递给线程池,将大环形缓存区的尾指针向后移动复帧的长度个字节;c3:线程池获取到该复帧位置后,解析出该复帧中所有子帧;进一步解析出子帧包含的回传数据帧的通道号和有效数据部分的起始位置;根据通道号把有效数据部分的内容写入对应的小环形缓存区,小环形缓存区的首指针向后移动一个单位,该小环形缓存有效数据量的计数加1;步骤4:轮询线程对所有通道的小环形缓存区进行轮询,把帧数量达到规定值的通道数据读出并送入计算单元,具体包括:d1:轮询线程从第一个小环形缓存开始,查询当前环形小缓存的有效数据量;若当前环形小缓存的有效数据量小于n,n是预设值,表示可以一次性取走的数据量,则轮询线程去访问下一个小环形缓存;d2:若当前小环形缓存取出n个单位的数据,当前环形小缓存的尾指针向后移动n个单位。本发明针对多路复杂的高速数据流,提出了大缓存和小缓存的二级分包解析方法。避免单独对每一路数据流进行解析,既节省了内存也保证了解析出来的数据帧的有序性。对每一路数据流中解析出的多个通道的数据,使用多个通道的小环形缓存进行处理,并使用轮询线程对所有通道内的有效数据进行监听,保证数据不发生沾包或者丢包的问题。附图说明图1为本发明应用场景的硬件部局示意图;图2为本发明所需解析的帧结构示意图;图3为本发明的具体实施流程图;图4本发明实施例具体工作流程图。具体实施方式下面结合附图及实施例,对本发明作详细描述。实施例本发明实施例的硬件布局如图1所示,外部网络如卫星等,传输各种类型的数据到信号接收设备,信号接收设备上有多个端口负责传输数据流,本实施例设有两个端口,信号接收设备上有两块板卡。端口1收发板卡1的数据,端口2收发板卡2的数据。每块板卡上有多个通道来接收外部网路发送过来的信号数据,并按照规定的网络协议将多通道数据进行封装成一路数据流。封装后的数据以数据流的形式分别由端口1和端口2发送到交换机中。交换机一端与信号接收设备相连,另外一端与服务器相连。服务器通过tcp协议异步接收接收机传输过来的两路数据流,并实时完成分包解析工作。本实施例的复帧结构如表1所示,复帧的内部包含多个子帧。子帧的结构如表2所示。子帧的帧结构比较复杂,子帧有自己的帧头和帧尾和其它信息。子帧内部包含一个回传数据帧结构。回传数据帧结构如表3所示,回传数据部分是最终要取出用于后续计算的部分。表1、复帧结构字段名称字节数说明复帧头4数据帧起始标志,例如0xaa00ff00复帧长度n从标志头到标志尾字节数其它信息m比如时间信息等子帧不定子帧的信息如表2所述复帧尾4数据帧结束标志,例如0x0d0a0a0d表2、子帧结构字段名称字节数说明子帧头4子帧的起始标志,例如0xww00ee00子帧长度4从子帧标志头到标志尾的字节数其它信息4比如时间信息或gps信息回传数据部分不定回传数据帧结构如表3子帧尾4子帧的结束标志,例如0xrr00tt00表3、回传数据帧结构复帧的帧结构示意图如图2的第一行所示。图中区域①是复帧头,区域②是复帧尾。区域③、④都表示一个完整的子帧。由于一个复帧中包含的不是多个完整的子帧,所以区域⑥是一个子帧的后半部分,区域⑦是一个子帧的前半部分。区域⑤是设置指令。设置指令和子帧的结构一样,只是设置指令的回传数据部分为空。子帧的帧结构示意图如图2的第二行所示。图中区域⑨是子帧的帧头。区域是帧长度部分,区域表示时间信息等,区域表示回传数据帧。回传数据帧结构示意图如图2的第三行所示。图中区域是回传数据的帧头,区域是通道号,区域是回传数据的有效长度,区域是回传数据部分。信号接收设备把多个子帧封装成一个复帧。此复帧从帧头之后的开始部分可能会是一个子帧的一部分,此子帧的另外一部分在上一个复帧的结尾处。此复帧的结尾部分也可能会是一个子帧的一部分,另外一部分在下一个复帧的开始处。最终需要把子帧包含回传数据帧内部的数据部分取出来做后续处理。本发明实施例的具体实施流程如图3所示。信号接收设备的两个网卡的地址分别是ip1和ip2,各自通过tcp和udp协议发送数据。交换机的一端连接两个网卡,另一端连接服务器。信号接收设备上电启动以后,两个网卡广播udp数据包到局域网中,服务器收到udp广播后,会从udp广播中解析出ip地址。服务器得到两块网卡的ip地址后,通过tcp协议连接两块板卡,准备异步接收从信号接收设备上高速传输过来的数据。ip1和ip2所属的两块网卡各自发送一路数据流,每一路数据流封装多个通道的数据。对于两路数据流,都用一个大环形缓存区接收。由于所有的数据帧都是带有时标的,为了避免两个端口同时存放数据帧时顺序出现错乱的情况,本发明采用的方法是对大环形缓存使用互斥锁。这样既能保证所有数据帧的顺序也能保证复帧的完整性。本实施例假定数据传输速率为10mbps,大环形缓存大小假定为数据流传输率的整数倍,假定此容量为30mb。由两个线程执行接收tcp数据,另一个线程负责分包操作(计算出单个复帧的起始地址和结束地址),线程池解析出子帧的通道号,删去数据帧头部分和数据帧尾部分则为大数据子帧,根据通道号把大数据子帧送入相应的小通道缓存中。本发明实施例的具体工作流程图如图4:1.信号接收设备上电启动后,服务器接收局域网的udp广播并获取信号接收设备的ip地址。如果获取成功,执行步骤2。2.服务器通过tcp异步连接信号接收设备。如果连接成功,执行步骤3;如果连接超时或失败,提示用户。3.初始化端口1收发线程、端口2收发线程和分包线程。如果初始化成功,同时执行步骤4、8。如果初始化失败,提示用户。4.端口1或者端口2监听到有数据。监听到有新的数据进来,查看当前互斥锁是否被申请。如果是,执行步骤4;如果否,执行步骤5。5.当前收发线程开始异步接收远程数据,判断大环形缓存区是否溢出。如果是,提示用;如果否,执行步骤6。6.当前收发线程环形缓存区是否此时是否处于环绕。如果环绕,计算环绕点,分两次把当前数据存入缓存区;如果非环绕,直接存入缓存区。继续执行步骤7。7.更新大环形缓存区的首指针。8.分包线程判断当前大环形缓存区中的数据量是否足够分包。如果是,同时执行步骤9和步骤15;如果否,重复执行步骤8。9.匹配总帧帧头,解析当前数据帧的长度和指令类型。根据指令类型判断当前数据帧是否是回传数据帧帧结构。如果是,执行步骤10。如果否,执行步骤13。10.判断当前复帧是否环绕。如果是,分两次复帧当前帧到新空间;如果否,直接复制当前帧内容到新空间。11.判断当前复帧的有效容量是否大于子帧的长度。如果是,执行步骤12;如果否,执行步骤13。12.把子帧的首位指针发送给线程池。13.把新空间的有效数据移动到新空间的起始位置。执行步骤14。14.更新当前大环形缓存区的尾指针。15.初始化线程池用于解析线程。执行步骤16。16.获取线程传递的参数,得到收尾指针的地址。执行步骤17。17.判断当前子帧是否是控制指令。如果是,执行步骤18,如果否,同时执行步骤19和步骤20。18.解析控制指令并发送给信号接收设备。19.解析通道号,将数据送入小通道缓存。20.初始化多个读写线程。执行步骤21。21.轮询线程从编号1到m的环形小通道循环查看当前通道数据量是否大于64。如果是,将当前通道的数据取出64帧送入相应的计算单元。本实施例的实验及结果:当前实验环境均是在rtmi7-4600u2.70ghz的cpu下进行。实验结果如表4所示。表4、实施例实验结果可以看出,本发明包含针对该问题适当地提出了大缓存和小缓存的二级数据结构,并合理地根据数据流的内容设计了解析顺序以及相应的线程任务分工。在具体实施中,使用两台服务器连接信号接收设备,两台设备同时解析数据流,分别针对管理端口和业务端口进行实时工作。在1.7ghz的双核四线程处理器上,进行了长达一周的实时拷机测试,在接收机信号稳定数据封装无误的前提下以10mbps的速度发送数据,该方法能实时完成接收并解析的工作,不会发生沾包或者丢包的问题。由于在工业应用中,复杂的卫星信号被接收机接收下来后,会经过解码、译码、解调等大量算法,所以以往的做法都是先将数据流接收后先存盘。然后一层一层地经历不同的算法,拿到需要的输出并再次存盘,直到最后得到有效数据。整个流程复杂,io操作太多,耗时太长。本发明的提出,将整个数据流接收、解码、译码、解调等操作完全封装到一个端到端的过程中,避免了io操作,节省了大量时间。当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1