一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

一种基于关联容器map的报文协议超时重发方法及系统与流程

2021-11-05 20:38:00 来源:中国专利 TAG:


1.本发明涉及一种基于关联容器map的报文协议超时重发方法,属于计算机控制领域。


背景技术:

2.在多个分系统互联的大型系统中,系统间数据通过总线进行交互。在交互过程中由于干扰、故障等原因会导致错帧、乱帧、丢帧等现象,造成了系统间数据交互的失败,一些重要数据交互失败容易导致整个系统运行的失败。因此,系统间通讯过程中重要的交互数据通常需要接收确认,传统的应答方法通常采用线性表的方式对报文重发进行管理,例如在一个数组中标记出哪些报文已经发送但还未收到应答,并通过计数器进行超时未应答计数,超时后根据全局变量记录的报文内容进行重发操作。通常采用数组标记的方式进行管理,对于不同的报文类型,报文发送后在数组中标记是否需要应答,对于不断增加需要应答的报文数量,数组的长度需要不断增加,代码框架也需要改变,同时使用一个定时器进行计数来管理若干需要应答的报文,这种管理方式容易出错。在报文重发时,需要确定重发报文的目的地址、内容、长度等信息,这些信息一般为全局共有变量,从报文第一次发送到应答期间数据的值可能被篡改,致使两次发送数据内容并非完全一致,导致最终数据出现错误。


技术实现要素:

3.本发明的技术解决问题是:克服现有技术的不足,提供了一种基于关联容器map的报文协议超时重发方法。
4.本发明的技术解决方案是:
5.一种基于关联容器map的报文协议超时重发方法,步骤如下:
6.(1)设计系统间报文协议,包括发送报文协议和接收确认报文协议,且均为变长协议,报文接收方接收到报文后回复接收确认报文,发送报文和接收确认报文以帧序号为唯一标识进行关联;
7.(2)使用步骤(1)所设计的系统间报文协议进行通信,使用关联容器map对发送报文进行管理;关联容器map存储所发送报文的帧序号和重发管理结构体mainresend变量信息;
8.(3)在报文发送线程使用重发管理结构体mainresend对发送报文进行管理并将帧序号和重发管理结构体mainresend存储到关联容器map中;
9.(4)在报文接收线程,处理接收确认报文,根据接收确认报文的帧序号,在关联容器map中遍历查询该帧序号,将查找到的重发管理结构体中的是否重发标志设置为否;
10.(5)设置重发管理定时器,在重发处理定时器中周期对关联容器map变量gsndq中键进行遍历,对不需进行管理的键值对进行删除;
11.(6)对步骤(5)中所有是否重发标志isresnd为true的关联容器map元素进行管理;
12.(7)每进行一次重发操作将重发管理结构体中已重发次数进行加一操作,当已重
发次数达到需要重发的次数时,将该键值对从关联容器中移除。
13.进一步的,所述发送报文协议包括帧头frmhead、帧序号frmnum、帧长度frmlen、帧类型frmtype、目的地址frmdst、源地址frmsrc、应答标识frmackflag、功能码frmcode、负载内容frmcontent、和校验frmchk、帧尾frmtail;
14.帧头frmhead长度为两个字节,帧头具有可标识性;帧序号frmnum长度为四个字节,发送报文和接收确认报文通过帧序号frmnum进行关联;帧长度frmlen长度为两个字节,该长度包括从帧头到帧尾的所有字节数;帧类型frmtype长度为两个字节,表示该帧数据的类型;目的地址frmdst长度为四个字节,该值为接收方的ip地址值;源地址frmsrc长度为四个字节,该值为发送方的ip地址值;应答标识frmackflag长度为两个字节,表示该发送帧是否需要应答,如果这两个字节为0xff00则表示此帧需要应答,如果为0x00ff则表示此帧不需要应答;功能码frmcode长度为两个字节,功能码表示帧所传递的有效数据内容;负载内容frmcontent所具有的字节数不固定,表示实际传输数据的内容;校验frmchk长度为两个字节,检验方式采用和校验方式;帧结尾frmtail为两个字节;
15.接收确认报文协议与发送报文协议完全一致,仅负载内容frmcontent为固定字节数。
16.进一步的,定义关联容器map变量,关联容器中的键值对分别为帧序号和重发管理结构;重发管理结构包括目的地址、所要发送的数据指针、所要发送数据的长度、是否重发标志、发送次数计数、需要重发的次数。
17.进一步的,所述使用关联容器map对发送报文进行管理,具体为:
18.(2.1)设计重发管理结构体mainresend,此结构的成员变量包括

发送报文的目的地址dstaddr,类型设置为整型;

需要发送的数据地址dataaddr,类型设置为整型指针类型,该地址指向存储数据的内存;

需要发送的数据长度datalen,类型设置为短整形;

是否重发标志isresnd,类型设置为布尔型,ture表示需要重发值设置为1,false表示不需要重发,值设置为0;

已重发次数cnt,类型设置为无符号整型;

需要重发次数ncnt,类型设置为整型;此值如果设置为0则表示不需要重发;

计数器count,该变量记录重发超时次数;
19.(2.2)定义一个关联容器map变量gsndq,其中键key的类型设置为整型,这个值记录发送帧的帧序号frmnum,发送报文和接收确认报文通过帧序号frmnum进行关联,值value设置为重发管理结构体mainresend类型。
20.进一步的,所述步骤(3)在报文发送线程使用重发管理结构体mainresend对发送报文进行管理并将帧序号和重发管理结构体mainresend存储到关联容器map中,具体为:
21.(3.1)在报文发送过程,报文内容填充完后,判断应答标识frmackflag是否为0xff00,如果为0xff00则进行重发管理,如果为0x00ff,则不做处理;
22.(3.2)定义一个重发管理结构体mainresend类型变量gmresend,将帧序号frmnum、发送报文的目的地址dstaddr、需要发送的数据地址dataaddr、需要发送的数据长度datalen分别赋值到重发管理结构体变量中,将gmresend中的是否重发标志isresnd设置为true、已重发次数cnt设置为0、需要重发次数ncnt设置为times_set;
23.(3.3)定义关联容器变量map变量gsndq,使用关联容器map中插入方法将帧序号frmnum以及重发管理结构体类型变量gmresend键值对插入到关联容器map变量gsndq中,等
待遍历查询,此时报文已发送完成。
24.进一步的,所述步骤(4)在报文接收线程,处理接收确认报文,具体为:
25.(4.1)在接收到接收确认报文后,按照步骤(1)中设计的协议将报文中的帧序号frmnum提取出来;
26.(4.2)使用关联map中的遍历查询方法查询该帧序号frmnum键值是否在关联容器map变量gsndq的队列中,如果查找成功,则将重发管理结构体mainresend类型变量gmresend中的是否重发标志isresnd设置为false,等待遍历过程中该键值对从关联容器移除。
27.进一步的,所述步骤(5)设置重发管理定时器,在重发处理定时器中周期对关联容器map变量gsndq中键进行遍历,对不需进行管理的键值对进行删除,具体为:
28.(5.1)设置重发管理定时器,启动定时器,定时器设置周期时间为rates;
29.(5.2)在定时器回调函数中,通过匹配帧序号frmnum遍历重发管理结构体mainresend类型变量gmresend中的键;
30.(5.3)对于遍历到的每一个帧序号frmnum,通过对关联容器map变量gsndq进行下标索引判断重发管理结构体变量gmresend中是否重发标志isresnd是否false;
31.(5.4)若为false则使用关联容器map中的移除方法,将该序号对应内容全部从队列中移除;如果为true,则转到下一步。
32.进一步的,所述步骤(6)对步骤(5)中所有是否重发标志isresnd为true的关联容器map元素进行管理,具体为:
33.(6.1)重发管理结构体mainresend类型变量gmresend中计数器count进行加一操作,并将加一后的值对重发计数count_base进行取余操作;
34.(6.2)当取余值为times_set

1的时候,即重发基数减一,对报文进行重发,将此重发管理结构体中的发送报文的目的地址dstaddr、需要发送的数据地址dataaddr、需要发送的数据长度datalen传入到系统底层的发送函数中进行发送;同时将重发结构体变量中的已重发次数cnt进行加一操作。
35.进一步的,在步骤(6)中已重发次数cnt进行加一操作后,如果此次重发查询到接收确认帧序号frmnum匹配,则重发结束,将该键值对从关联容器map变量gsndq中移除;否则再次进行重发操作,当已重发次数cnt达到需要重发次数ncnt值times_set,将该键值对从gsndq中移除,表示重发已经达到最大次数,并对超时未应答帧进行打印提示。
36.进一步的,本发明还提出一种报文协议超时重发系统,包括:
37.报文协议设计模块:设计系统间报文协议,包括发送报文协议和接收确认报文协议,且均为变长协议,报文接收方接收到报文后回复接收确认报文,发送报文和接收确认报文以帧序号为唯一标识进行关联;
38.关联容器map管理模块:使用所设计的系统间报文协议进行通信,使用关联容器map对发送报文进行管理;关联容器map存储所发送报文的帧序号和重发管理结构体mainresend变量信息;
39.重发管理结构体管理模块:在报文发送线程使用重发管理结构体mainresend对发送报文进行管理并将帧序号和重发管理结构体mainresend存储到关联容器map中;
40.接收确认报文处理模块:在报文接收线程,处理接收确认报文,根据接收确认报文
的帧序号,在关联容器map中遍历查询该帧序号,将查找到的重发管理结构体中的是否重发标志设置为否;
41.重发管理定时器处理模块:设置重发管理定时器,在重发处理定时器中周期对关联容器map变量gsndq中键进行遍历,对不需进行管理的键值对进行删除;对所有是否重发标志isresnd为true的关联容器map元素进行管理;每进行一次重发操作将重发管理结构体中已重发次数进行加一操作,当已重发次数达到需要重发的次数时,将该键值对从关联容器中移除。
42.本发明与现有技术相比的有益效果是:
43.本发明通过使用关联容器map,设计了一个重发管理结构体,将报文帧序号和重发管理结构体以键值对记录到关联容器中,对于超时重发的管理仅需在定时器中不断查询关联容器中的报文应答状态,即可高效地完成超时应答管理,这种方法同时也提高了报文管理的可扩展性,系统间通讯增加新的报文,超时应答管理部分不需要做任何改动,不需要修改和编译源码,即可将新的报文加入超时重发管理。
附图说明
44.图1为一种基于关联容器map的报文协议超时重发方法流程图。
具体实施方式
45.下面结合附图对本发明的具体实施方式进行进一步的详细描述。
46.传统的系统间报文超时重发管理通常采用线性表的方式,通常采用数组标记的方式进行管理,对于不同的报文类型,报文发送后在数组中标记是否需要应答,对于不断增加需要应答的报文数量,数组的长度需要不断增加,代码框架也需要改变,同时使用一个定时器进行计数来管理若干需要应答的报文,这种管理方式容易出错。在报文重发时,需要确定重发报文的目的地址,内容,长度等信息,这些信息一般为全局共有变量,从报文第一次发送到应答期间数据的值可能被篡改,致使两次发送数据内容并非完全一致,导致最终数据出现错误。
47.如图1所示,本发明提出一种基于关联容器map的报文协议超时重发方法,包括如下步骤:
48.1、设计系统间报文协议,包括发送报文协议和接收确认报文协议。发送报文和接收确认报文以帧序号为唯一标识进行关联。
49.2、定义关联容器map变量,关联容器中的键值对分别为帧序号和重发管理结构。重发管理结构包括目的地址,所要发送的数据指针,所要发送数据的长度,是否重发标志,发送次数计数,需要重发的次数。
50.3、在发送报文时,确认发送报文是否需要应答,对需要应答的报文,定义重发管理结构体变量,将目的地址,要发送的数据指针,要发送的数据长度,是否重发标志,发送次数计数,需要重发的次数填入到重发管理结构体变量中。使用关联容器中的插入方法,将报文帧序号和重发管理结构体变量插入到关联容器中。
51.4、在报文接收线程,根据接收确认帧的帧序号,在关联容器map中遍历查询该帧序号,将查找到的重发管理结构体中的是否重发标志设置为否。
52.5、设置重发管理定时器,启动定时器,在定时器回调函数中遍历关联容器中的帧序号,并通过帧序号匹配方式查询重发管理结构体中是否重发标志,将是否重发标志为否的键值对从关联容器中进行移除。
53.6、对上一步重发管理结构体变量中计数器进行加一操作,重发管理结构体变量计数器对重发基数进行取余操作,取余值为重发基数减一的时候,进行报文重发,将要发送的数据指针、要发送数据的长度以及目的地址,传入到系统底层的发送函数中进行发送。同时将重发结构体变量中的发送次数进行加一操作。
54.7、每进行一次重发操作将重发管理结构体中已重发次数进行加一操作,当已重发次数达到需要重发的次数时,将该键值对从关联容器中移除。
55.本发明通过使用关联容器map,设计了一个重发管理结构体,将报文帧序号和重发管理结构体以键值对记录到关联容器中,对于超时重发的管理仅需在定时器中不断查询关联容器中的报文应答状态,即可高效地完成超时应答管理,这种方法同时也提高了报文管理的可扩展性,系统间通讯增加新的报文,超时应答管理部分不需要做任何改动,不需要修改和编译源码,即可将新的报文加入超时重发管理。
56.实施例:
57.本实施例提出一种基于关联容器map的报文协议超时重发方法,具体步骤为:
58.s1:设计系统间报文协议,报文协议带有超时重发特性。报文接收方接收到报文后需要回复接收确认帧。协议设计为变长协议。
59.(1)发送帧协议包括帧头frmhead、帧序号frmnum、帧长度frmlen、帧类型frmtype、目的地址frmdst、源地址frmsrc、应答标识frmackflag、功能码frmcode、负载内容frmcontent、和校验frmchk、帧尾frmtail。
60.①
帧头frmhead长度为两个字节,帧头具有可标识性,例如使用0x55和0xaa进行标识。
61.②
帧序号frmnum长度为四个字节,发送帧和接收确认帧通过帧序号frmnum进行关联。
62.③
帧长度frmlen长度为两个字节,该长度包括从帧头到帧尾的所有字节数。
63.④
帧类型frmtype长度为两个字节,表示该帧数据的类型,如长帧,短帧,私有帧,公开帧。
64.⑤
目的地址frmdst长度为四个字节,该值为接收方的ip地址值。
65.⑥
源地址frmsrc长度为四个字节,该值为发送方的ip地址值。
66.⑦
应答标识frmackflag长度为两个字节,表示该发送帧是否需要应答,如果这两个字节为0xff00则表示此帧需要应答,如果为0x00ff则表示此帧不需要应答。
67.⑧
功能码frmcode长度为两个字节,功能码表示帧所传递的有效数据内容,如遥测数据,导航数据,任务数据。
68.⑨
负载内容frmcontent所具有的字节数不固定。表示实际传输数据的内容,
69.⑩
校验frmchk长度为两个字节,检验方式采用和校验方式,从上面字段

到字段

所有字节的和
70.帧结尾frmtail为两个字节(如0xfe和0xef)。
71.(2)接收确认帧协议与发送帧协议完全一致,负载内容frmcontent为固定字节数,包括四个字节的帧序号frmnum、两个字节的功能码frmcode。
72.s2:使用关联容器map对发送报文进行管理。系统间使用s1所设计的报文协议进行通信。关联容器map存储所发送报文的帧序号和重发管理结构体mainresend变量信息。
73.(1)设计重发管理结构体mainresend,此结构的成员变量包括

发送报文的目的地址dstaddr,类型设置为整型。

需要发送的数据地址dataaddr,类型设置为整型指针类型,该地址指向存储数据的内存。

需要发送的数据长度datalen,类型设置为短整形

是否重发标志isresnd,类型设置为布尔型(ture表示需要重发值设置为1。false表示不需要重发,值设置为0。)。

已重发次数cnt,类型设置为无符号整型。

需要重发次数ncnt,类型设置为整型。此值如果设置为0则表示不需要重发。

计数器count,该变量记录重发超时次数(和定时器周期共同决定超时时间)。
74.(2)定义一个关联容器map变量gsndq,其中键(key)的类型设置为整型,这个值记录发送帧的帧序号frmnum,发送帧和接收确认帧通过帧序号frmnum进行关联,这种关联方式可以唯一追溯应答状态),值(value)设置为重发管理结构体mainresend类型。
75.s3:在报文发送线程使用重发管理结构体mainresend对发送报文进行管理并将帧序号和重发管理结构体mainresend存储到关联容器map中。
76.(1)在报文发送过程(报文为s1所设计的报文格式),报文内容填充完后,判断应答标识frmackflag是否为0xff00,如果为
77.0xff00则进行重发管理,如果为0x00ff,则不做处理。
78.(2)定义一个重发管理结构体mainresend类型变量gmresend,将帧序号frmnum,发送报文的目的地址dstaddr(接收方的ip值),需要发送的数据地址dataaddr,需要发送的数据长度datalen,分别赋值到重发管理结构体变量中,将gmresend中的是否重发标志isresnd设置为true、已重发次数cnt设置为0,需要重发次数ncnt设置为times_set。
79.(3)定义关联容器变量map变量gsndq,使用关联容器map中插入方法insert()将帧序号frmnum以及重发管理结构体类型变量gmresend键值对插入到关联容器map变量gsndq中,等待遍历查询,此时报文已发送完成。
80.s4:在报文接收线程中,处理接收确认报文。
81.(1)当接收到接收确认报文后,按照s1中设计的协议将报文中的帧序号frmnum提取出来。
82.(2)使用关联map中的遍历查询方法find()查询该帧序号frmnum键值是否在关联容器map变量gsndq的队列中,如果查找成功,则将重发管理结构体mainresend类型变量gmresend中的是否重发标志isresnd设置为false,等待遍历过程中该键值对从关联容器移除。
83.s5:在重发处理定时器中周期对关联容器map变量gsndq中键进行遍历,对不需进行管理的键值对进行删除。
84.(1)设置重发处理定时器,启动定时器,定时器设置周期时间为rates
85.(2)在定时器回调函数中,通过匹配帧序号frmnum遍历重发管理结构体mainresend类型变量gmresend中的键(使用foreach遍历函数)。
86.(3)对于遍历到的每一个帧序号frmnum,通过对关联容器map变量gsndq进行下标
索引判断其中变量gmresend中是否重发标志isresnd是否false
87.(4)若为false则使用关联容器map中的移除remove()方法,将该序号对应内容全部从队列中移除。
88.(5)如果为true,则转到s6。
89.s6:对s5中所有是否重发标志isresnd为true的关联容器map元素进行管理。
90.(1)重发管理结构体mainresend类型变量gmresend中计数器count进行加一操作,并将加一后的值对重发基数count_base进行取余操作。
91.(2)当取余值为times_set

1的时候,对报文进行重发,将
92.此重发管理结构体中的发送报文的目的地址dstaddr(接收方的ip值),需要发送的数据地址dataaddr,需要发送的数据长度datalen传入到系统底层的发送函数中进行发送。同时将重发结构体变量中的已重发次数cnt进行加一操作。
93.s7:在s6中已重发次数cnt进行加一操作后,如果此次重发查询到接收确认帧序号frmnum匹配,则重发结束,将该键值对从关联容器map变量gsndq中移除。否则再次进行重发操作,当已重发次数cnt达到需要重发次数ncnt值times_set,将该键值对从gsndq中移除,表示重发已经达到最大次数,并对超时未应答帧进行打印提示。
94.本发明说明书中未作详细描述的内容属于本领域的公知技术。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献