1.本发明涉及通信技术领域,具体涉及一种自适应的丢包检测方法。
背景技术:2.系统在与外设通信过程中,判断从外设收到的消息是否丢包是一项重要的工作。判断收到的消息是否丢包需要在传输的消息中增加一序列号字段,通过判断连续收到的两条消息中的序列号是否连续获知消息是否丢包。由于不同协议类型的消息序列号在消息中的位置以及其所占的字节数是不同的,因此目前在对收到的消息进行丢包检测时,需要首先判断出收到的消息的类型,然后针对不同的消息类型解析相应的字段得到序列号的值,最后再判断该序列号的值和上包收到的消息中的序列号是否连续得出是否丢包的结论。
3.目前这种丢包检测方法不够灵活,需要对不同协议的消息进行不同的处理,每次新增加一种协议类型就需要增加一种解析序列号字段的方法,不利于程序的扩展。
4.为解决上述问题,本发明提出一种自适应的丢包检测方法,可更灵活的对不同协议的消息进行不同的处理。
技术实现要素:5.由于现有技术存在丢包检测方法不够灵活,不利于程序的扩展的问题,运算效率低的问题,为解决该问题,本发明提出一种自适应的丢包检测方法,可有效克服上述缺点和限制。
6.为实现上述目的,本发明提出一种自适应的丢包检测方法,用于判断某个外设发来的消息是否丢包,包括以下步骤:
7.s1、系统接收来自外设当前发来的消息;
8.s2、根据序列号查找算法找到所述外设当前发来的消息中的序列号的位置,并报告结果给系统;
9.s3、根据系统收到该外设发来消息的次数和s2的报告结果判断该外设发来的消息是否丢包。
10.其中,所述的步骤s2根据系统是否第一次收到该外设发来的消息分为以下两种情况:
11.s21、如果系统是第一次收到该外设发来的消息,则保存该消息的前n个字节,将所述n个字节中每个字节的位置对应的计数值初始为0并保存该计数值,之后退出本次查找,报告未找到序列号所在的位置;
12.s22、如果系统不是第一次收到该外设发来的消息,则依序将系统收到的每m包消息作为一组进行检测,直至确定序列号的位置。
13.其中,所述的步骤s22进一步的包含以下情况:
14.s221、若系统收到该外设发来的消息小于m次,则保存该消息的前n个字节,依次逐个计算此消息的前n个字节与系统中保存的该外设发来的上一包消息的前n个字节的差值,
若某个字节与上一包消息中的对应字节对比差值为1,则对应的计数值加1;若对比差值不为1,则将对应的计数值清零,之后退出本次查找,报告未找到序列号所在的位置;
15.s222、若系统收到该外设发来的消息为m次,则保存该消息的前n个字节,依次逐个计算此消息的前n个字节与系统中保存的该外设发来的上一包消息的前n个字节的差值并检测计数值,直至找到一个与保存上一包消息中对应的字节差值为1且该位置对应的计数值为m-1的字节,该字节的位置为序列号的位置,此时报告找到的序列号所在位置;
16.s223、若系统收到该外设发来的消息超过m次,保存该此消息的前n个字节,之后检测序列号位置是否已找到,若已找到,进入步骤s3的丢包判断;若未找到序列号的位置,则将第m次消息之后的每m包消息作为一个检测组,将每组内的消息视为从第1次至第m次消息,重复步骤s221和s222的计算和判断,直至找到一个与上一包对应字节的对比差值为1且位置对应的计数值为255的字节,该字节的位置即为序列号的位置后,之后退出本次查找,报告找到的序列号的位置。
17.其中,若在步骤s222的所有n个字节中未找到所述序列号的位置,则在查找结束后,保存更新的计数值,并报告未找到序列号所在的位置。
18.其中,在步骤s223中,进一步的,若本组消息内未找到序列号位置,在下一组消息发来时,再次将该组消息视为第1次至第m次消息,重复所述步骤s221和s222的序列号查找过程。
19.其中,在步骤s22完成后,在将所述报告结果报告给系统的同时,可以选择丢弃系统中保存的所述外设发来的上一包消息。
20.其中,所述的步骤s3进一步的包括以下情况:
21.s31、系统收到该外设发来的消息不足m次,报告结果则为未找到序列号所在的位置,此时不做判断,等待收到所述外设的下一次消息时再判断;
22.s32、在系统收到该外设发来的消息为m次时,若系统收到报告的序列号位置,则未丢包;若系统未收到报告的序列号位置,则1~m次消息内系统接收的消息丢包;
23.s33、系统收到该外设发来的消息超过m次,则根据系统是否已收到过报告的序列号位置判断是否丢包。
24.其中,所述的步骤s33进一步的包含以下情况:
25.s331、若系统已收到过报告的序列号位置,只需判断本次消息的序列号与系统中保存的上次消息的序列号是否连续:如果连续,则说明本次系统接收的来自所述外设的消息未丢包;如果不连续,则说明本次系统接收的来自所述外设的消息发生了丢包;
26.s332、若系统未收到过报告的序列号位置,首先判断该消息之前的每组消息内丢包;之后对本次消息不做判断,等待收到所述外设的下一次消息,待系统收齐一组消息后再重复步骤s32判断该组消息内是否丢包。
27.其中,n为48。
28.其中,m为256。
29.综上所述,与现有技术相比,本发明具有以下优点:
30.1、上述方案根据收到的消息自动获取序列号的位置,不需要事先知道消息的格式;如果某种协议存在多个序列号字段,上述方案只需找到第一个序列号所在的位置即可;
31.2、上述方案根据序列号判断是否丢包时,不管序列号占几个字节、按大端存放还
是小端存放都适用;因为如果序列号占多个字节,每次递增的必然只是最低一个字节,因此只要判断该字节是否递增即可;
32.3、上述方案不需要开辟大块内存空间保存之前全部256条消息,只保存前一次收到的一条消息,每次都对消息进行及时判断处理,运算效率高,对内存资源占用少。
附图说明
33.图1为本发明一种自适应的丢包检测方法的流程示意图。
具体实施方式
34.以下将结合本发明实施例中的图1,对本发明实施例中的技术方案、构造特征、所达成目的及功效予以详细说明。
35.需要说明的是,附图采用非常简化的形式且均使用非精准的比例,仅用以方便、明晰地辅助说明本发明实施方式的目的,并非用以限定本发明实施的限定条件,故不具技术上的实质意义,任何结构的修饰、比例关系的改变或大小的调整,在不影响本发明所能产生的功效及所能达成的目的下,均应仍落在本发明所揭示的技术内容能涵盖的范围内。
36.需要说明的是,在本发明中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括明确列出的要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。
37.一种自适应的丢包检测方法,用于判断外设发来的消息是否丢包,如图1所示,包括以下步骤:
38.s1、系统接收来自外设的消息;
39.s2、找到所述外设的消息中的序列号(sn)的位置;
40.根据序列号查找算法获取该外设发来的消息中序列号所在的位置,所述序列号查找算法根据系统是否第一次收到该外设发来的消息分为以下几种情况;
41.s21、系统是第一次收到该外设发来的消息;
42.由于从目前已知的协议中来看,序列号字段一般在消息中的位置不会超过前48个字节,因此如果系统是第一次收到该外设发来的消息,则保存该消息的前48个字节,将所述48个字节的每个字节的位置对应的计数值初始为0并保存该计数值,之后退出本次查找,报告未找到序列号所在的位置;
43.s22、若系统不是第一次收到该外设发来的消息,则依序将系统收到的每256包消息作为一组进行检测,直至确定序列号的位置;
44.s221、若系统当前收到的该外设发来的消息小于256次,则保存该消息的前48个字节,依次逐个计算此消息的前48个字节与系统中保存的该外设发来的上一包消息的前48个字节的差值。
45.在计算过程中,若某个字节与上一包消息对应的字节的差值为1,则将该字节的位置对应的计数值加1;并将余下的字节依次进行对比计算、更新计数值,具体为:若某个字节
与上一包消息中的对应字节对比差值为1,则对应的计数值加1,若对比差值不为1,则将对应的计数值清零。
46.最后退出本次查找,报告未找到序列号所在的位置。
47.s222、若系统当前收到的该外设发来的消息为256次,则保存该消息的前48个字节,并进行如下计算和判断过程:依次逐个计算此消息的前48个字节与系统中保存的该外设发来的上一包消息的前48个字节的差值;在计算过程中,若某个字节与上一包消息对应的字节的差值为1,则检测该字节的位置对应的计数值是否为255,若是255,则该字节的位置为序列号的位置;若不是255,则将该位置对应的计数值清零,并进行下一字节的计算与判断;直至找到某位置的字节与保存上一包消息中对应的字节差值为1且该位置对应的计数值为255,则该位置即为序列号的位置。
48.理论上,前48个字节中最多存在一个字节连续256次差值为1,即最多存在一个与上一包对应字节的对比差值为1且位置对应的计数值为255的字节,该字节即为序列号。找到所述序列号的位置后,退出本次查找,报告找到的序列号的位置。
49.进一步的,若在所有48个字节中未找到所述序列号的位置,则在查找结束后,保存更新的计数值(此时应全为0),并报告未找到序列号所在的位置。
50.s223、若系统当前收到的该外设发来的消息超过256次,保存该消息的前48个字节,之后检测序列号位置是否已找到,若已找到,进入步骤s3的丢包判断;若未找到序列号的位置,则将第256次消息之后的每256包消息作为一个检测组,将每组内的消息视为从第1次至第256次消息,重复步骤s221和s222的计算和判断,直至找到一个与上一包对应字节的对比差值为1且位置对应的计数值为255的字节,该字节的位置即为序列号的位置后,之后退出本次查找,报告找到的序列号的位置。
51.例如,对于系统接收的来自外设的第257次至第512次消息,由于第1~256次内未找到序列号的位置,此时的计数值均为0,可将该组消息视为第1次至第256次消息,重复步骤s221和s222的判断。若可以找到序列号的位置,则退出本次查找,报告找到的序列号的位置;若未能找到序列号的位置,则保存此时的计数值(全为0),退出本次查找,报告未找到序列号所在的位置。进一步的,若本组消息内未找到序列号位置,在下一组消息(第513次至第768次)发来时,再次将该组消息视为第1次至第256次消息,重复步骤s221和s222的序列号查找过程。
52.上述过程中,在将报告结果报告给系统的同时,可以选择丢弃系统中保存的所述外设发来的上一包消息。
53.s3、根据系统收到该外设发来消息的次数和s2的报告结果判断是否丢包,包括以下情况:
54.s31、系统收到该外设发来的消息不足256次,报告结果则为未找到序列号所在的位置,此时不做判断,等待收到所述外设的下一次消息时再判断;
55.s32、系统收到该外设发来的消息为256次;
56.若系统收到报告的序列号位置,则未丢包;若系统未收到报告的序列号位置,则1~256次消息内系统接收的消息丢包。
57.s33、系统收到该外设发来的消息超过256次;
58.s331、若系统已收到过报告的序列号位置,只需判断本次消息的序列号与系统中
保存的上次消息的序列号是否连续:如果连续,则说明本次系统接收的来自所述外设的消息未丢包;如果不连续,则说明本次系统接收的来自所述外设的消息发生了丢包。
59.s332、若系统未收到过报告的序列号位置,首先判断该消息之前的每组消息内丢包(如本次是系统第300次收到消息,但此时序列号位置还未找到,则1~256次消息内丢包;再如本次是系统第550次收到消息,但此时序列号位置还未找到,则1~256次消息内丢包、257~512次消息内丢包);之后对本次消息不做判断,等待收到所述外设的下一次消息进行计数值更新,待系统收到一组消息(每组为256包消息)后,再重复步骤s32,来判断该组消息内是否丢包。
60.尽管本发明的内容已经通过上述优选实施例作了详细介绍,但应当认识到上述的描述不应被认为是对本发明的限制。在本领域技术人员阅读了上述内容后,对于本发明的多种修改和替代都将是显而易见的。因此,本发明的保护范围应由所附的权利要求来限定。