一种车载CAN总线网络报文异常检测方法与流程
未命名
10-25
阅读:182
评论:0
一种车载can总线网络报文异常检测方法
技术领域
1.本发明属于车载信息检测领域,具体涉及一种车载can总线网络报文异常检测方法。
背景技术:
2.本发明主要针对汽车can总线网络信号周期发送的异常检测技术。近年来汽车中的can总线信号越来越多,can总线负载率越来越大,而在整车对can信号发送的实时性要求也越来越高,can信号在车载功能占比也越来越大,can网络信号发送的周期必须符合要求,因此拥有精准的can信号周期算法检测越来越重要。
3.目前常用的can信号周期异常检测有以下几种:1)基于统计方法的异常检测算法:通过计算一个时间窗口内can总线上不同id的报文频率,得到总线上的信息熵;2)基于报文间隔的异常检测算法:依据在正常情况下一些 ecu 会周期性的发送报文这一特点,通过检测相邻两条消息的时间间隔来判断异常,如果两条连续的同 id 报文的时间间隔小于阈值,就判断为异常;3)基于频率的异常检测算法:通过计算一个滑动时间窗内报文频率,与历史平均记录进行比较来报告异常。
4.以上方式都存在一些弊端,方法1)只有在大量报文异常时总线上的信息熵才会引起变化;方法2)没有考虑到非周期报文对报文间隔值的影响,而且不能检测非周期报文的异常。方法3)不能定位异常报文。
技术实现要素:
5.本发明根据can总线网络报文的特征,提出一种车载can总线网络报文异常检测方法,目的在于克服上述现有技术中针对传统检测方法性能低下、消耗硬件资源以及成本高等不足之处,提供一种易于实现、低成本、高性能以及高准确率的汽车can总线网络报文异常检测算法,本发明的技术方案如下:一种车载can总线网络报文异常检测方法,方法包括以下步骤:步骤一:实时读取当前车载can总线数据报文,并初始化;步骤二:对读取到的报文进行处理,通过比较读取到的报文的id与当前已处理过的所有报文id是否相同来判断当前id是否为首次出现的id。如果该id是首次出现,则需要记录下该id首次出现的时间(即init_time),并将max_time初始化为0、min_time初始化为正无穷大。对于can总线上读取到的报文,一般包括id标识符,用于区分不同类型的报文;data数据域,包含实际传输的数据信息;dlc数据长度码,表示data中实际传输数据所占用的字节数。处理当前id是否为首次出现的目的在于记录每个id首次出现的时间,方便后续计算diff_time时能够准确地计算每个id之间的时间间隔。这样做便于检测和排除故障,并提高系统稳定性和可靠性。
6.优选地,步骤一包括:以id为标识符,并初始化总id的个数count1为0,本步骤的目的是初始化总id的个数为0,即在开始时将计数器归零。这是一个重要的步骤,因为在后续的操作中需要统计和管理can报文中不同id的数量,以便进行异常检测和处理。通过将计数器初始化为0,可以确保每次开始新的统计时都从空白状态开始,并避免出现错误的计数结果;建立一个用于存储can报文中出现的不同id的数组single_id,定义数组single_id,不限制其大小;同一个id出现的时间差计为diff_time;定义diff_time的目的是记录can报文中同一个id出现的时间差,即两个相邻相同id的报文之间的时间间隔。通过计算diff_time,可以了解can总线上数据传输的速率和延迟情况,以及检测可能存在的通信异常或故障。例如,如果同一个id的报文出现时间间隔较长,则可能表示某个节点发送数据时出现了问题或总线负载过高导致通信速度变慢。因此,通过记录并分析diff_time可以对can网络进行实时监测和故障排除。
7.计同一个id出现的时间间隔最大值为max_time = 0,最小值为min_time = +∞,记id首次出现的时间为init_time。将同一个id出现的时间间隔的最大值初始化为0,最小值初始化为正无穷大,是为了在后续计算diff_time时能够准确记录每个id的时间间隔情况。同时,记id首次出现的时间也可以提供更精确的时间参考,以便进行实时监测和故障排除。
8.如果不对max_time和min_time进行初始化,则第一次计算diff_time可能会得到错误的结果。如果max_time未被初始化,而某个id首次出现之前已经有其他id出现过,则第一次计算该id的diff_time时可能会得到负数。同样地,如果min_time未被初始化,则第一次计算diff_time时可能会得到比实际间隔时间更短的结果。因此,在can总线上进行数据传输分析时,对这些变量进行正确的初始化非常重要。
9.优选地,步骤二包括:实时判断当前id是否为首次出现的id;判断当前id是否为第n次出现,其中n≥2,若是则将当前出现时间temp_time与上一次出现该id的时间做差暂存于diff_time;否则将id号加入数组single_id中,count1和count2都加1,记录当前id首次出现的时间init_time;将该id当前时间间隔值diff_time与该id出现的时间间隔最大值max_time、时间间隔最小值min_time比较,判断是否diff_time≥max_time;计算id的平均周期;判断id的平均周期是否在该id的标准周期误差范围内,将计算出的平均周期avg_time与该id的标准周期进行比较。
10.优选地,实时判断当前id是否为首次出现的id采用以下方法:建立一个id列表,记录已经出现过的所有id;每当接收到一个新的can报文时,先在id列表中查找该报文的id是否已经存在;如果该id不存在于列表中,则说明当前id是首次出现的,将其加入到single_id列表中;如果该id已经存在于列表中,则不是首次出现。
11.优选地,判断是否diff_time≥max_time,若是则将该id当前时间间隔值diff_
time赋值给时间间隔最大值max_time = diff_time,并记录当前id对应的count1的值;否则diff_time《min_time,则将该id当前时间间隔值diff_time赋值给时间间隔最小值min_time = diff_time,并记录当前id对应的count1的值。
12.优选地,计算id的平均周期包括:某id最后一次出现的temp_time减去初始时间init_time并将其除以该id出现次数count2,得到该id的出现间隔时间,即可得到该id的平均周期avg_time。
13.优选地,将计算出的平均周期avg_time与该id的标准周期进行比较,如果平均周期在其误差范围内,则认为该id检测无误并结束检测;否则判断为异常并记录该异常id的最大时间间隔max_time和最小时间间隔min_time对应的id序列,即当时count1的值,定位该异常id出现的位置,检测结束。
14.优选地,如果当前id为首次出现的id,则将其加入数组single_id中,同时count1和count2都加1。( single_id:这是一个数组,用于存储所有首次出现的can id。每当遇到一个新的can id时,就将其加入该数组中。count1:表示所有出现的can id数量即出现次序。每当一个can id出现时,count1就会加1。count2:表示不同can id出现的数量。)记录当前id首次出现的时间init_time;否则将当前出现时间temp_time(当前id出现的时间)与上一次出现该id的时间做差暂存于diff_time(时间差即同一个id出现的时间间隔)。
15.优选地,步骤一中初始化的步骤包括配置can控制器寄存器、设置波特率和滤波器,目的是确保can控制器能够正常地接收和发送can报文,并且只接收需要的报文,避免干扰和冲突,此外初始化设置还包括报文缓冲区和中断处理程序,以便实现对can报文的实时获取和处理。
16.优选地,初始化数组single_id后,在后续的操作中,如果有新的id出现,则将其添加到single_id数组中,并增加count2计数器的值;如果已经存在于single_id中,则不进行任何操作,通过建立这样一个数组并记录其中所有不同的id,可以方便地对can报文进行分析和处理,例如识别和过滤掉重复的报文或异常数据等。
17.相对于现有技术,本发明的有益效果为:1)实时分析总线上的报文特征,报文接收完毕即统计完毕;本发明通过spy3接口实时读取当前车载can总线数据报文,当spy3停止收取报文,统计随即结束并输出统计结果;2)算法复杂度低;在报文接收过程中,通过简洁的算法即可完成检测;3)报文接收过程中计算量小,不影响报文接收的实时性;通过实时接收的报文,经过简单的算法计算即可得到想要的结果,且结果可靠;4)对操作资源占用少,包括cpu以及内存等;5)可直接定位异常报文位置,方便测试结束查找异常报文;在计算过程中记录不同id最大最小时间间隔的id次序,如若出现异常,可根据count1找到异常id的确切位置。
附图说明
18.图1为本实施例中检测方法流程示意图。
具体实施方式
19.下面结合附图和具体实施方式,进一步阐明本发明,应理解下述具体实施方式仅用于说明本发明而不用于限制本发明的范围。
20.实施例1:如图1所示,一种车载can总线网络报文异常检测方法,方法包括以下步骤:步骤一:通过spy3接口实时读取当前车载can总线数据报文,并初始化;初始化的步骤包括配置can控制器寄存器、设置波特率和滤波器,目的是确保can控制器能够正常地接收和发送can报文,并且只接收需要的报文,避免干扰和冲突,此外初始化设置还包括报文缓冲区和中断处理程序,以便实现对can报文的实时获取和处理。
21.第一步,以id为标识符,设置总id的个数为count1 = 0,本步骤的目的是初始化总id的个数为0,即在开始时将计数器归零。这是一个重要的步骤,因为在后续的操作中需要统计和管理can报文中不同id的数量,以便进行异常检测和处理。通过将计数器初始化为0,可以确保每次开始新的统计时都从空白状态开始,并避免出现错误的计数结果;第二步,建立一个用于存储can报文中出现的不同id的数组single_id,初始化数组single_id。该数组用于存储can报文中出现的不同id,每个id只能出现一次。在后续的操作中,如果有新的id出现,则将其添加到single_id数组中,并增加count2计数器的值;如果已经存在于single_id中,则不进行任何操作。通过建立这样一个数组并记录其中所有不同的id,可以方便地对can报文进行分析和处理,例如识别和过滤掉重复的报文或异常数据等。
22.第三步,同一个id出现的时间差计为diff_time,定义diff_time的目的是记录can报文中同一个id出现的时间差,即两个相邻相同id的报文之间的时间间隔。通过计算diff_time,可以了解can总线上数据传输的速率和延迟情况,以及检测可能存在的通信异常或故障。例如,如果同一个id的报文出现时间间隔较长,则可能表示某个节点发送数据时出现了问题或总线负载过高导致通信速度变慢。因此,通过记录并分析diff_time可以对can网络进行实时监测和故障排除。
23.第四步,计同一个id出现的时间间隔最大值为max_time = 0,最小值为min_time = +∞,记id首次出现的时间为init_time。将同一个id出现的时间间隔的最大值初始化为0,最小值初始化为正无穷大,是为了在后续计算diff_time时能够准确记录每个id的时间间隔情况。同时,记id首次出现的时间也可以提供更精确的时间参考,以便进行实时监测和故障排除。
24.如果不对max_time和min_time进行初始化,则第一次计算diff_time可能会得到错误的结果。如果max_time未被初始化,而某个id首次出现之前已经有其他id出现过,则第一次计算该id的diff_time时可能会得到负数。同样地,如果min_time未被初始化,则第一次计算diff_time时可能会得到比实际间隔时间更短的结果。因此,在can总线上进行数据传输分析时,对这些变量进行正确的初始化非常重要。
25.步骤二:对读取到的报文进行处理,通过比较读取到的报文的id与当前已处理过的所有报文的id是否相同来判断当前id是否为首次出现的id。如果该id是首次出现,则需要记录下该id首次出现的时间(即init_time),并将max_time初始化为0、min_time初始化为正无穷大。对于can总线上读取到的报文,一般包括id标识符,用于区分不同类型的报文;
data数据域,包含实际传输的数据信息;dlc数据长度码,表示data中实际传输数据所占用的字节数。处理当前id是否为首次出现的目的在于记录每个id首次出现的时间,并再后续计算diff_time时能够准确地计算每个id之间的时间间隔。这样做可以方便检测和排除故障,并提高系统稳定性和可靠性。
26.第一步:实时判断当前id是否为首次出现的id;实时判断当前id是否为首次出现的id采用以下方法:建立一个id列表,记录已经出现过的所有id;每当接收到一个新的can报文时,先在id列表中查找该报文的id是否已经存在;如果该id不存在于列表中,则说明当前id是首次出现的,将其加入到id列表中;如果该id已经存在于列表中,则不是首次出现。
27.如果当前id为首次出现的id,则将其加入数组single_id中,同时count1和count2都加1。( single_id:这是一个数组,用于存储所有首次出现的can id。每当遇到一个新的can id时,就将其加入该数组中。count1:表示所有出现的can id数量即出现次序。每当一个can id出现时,count1就会加1。count2:表示不同can id出现的数量。)记录当前id首次出现的时间init_time;否则将当前出现时间temp_time(当前id出现的时间)与上一次出现该id的时间做差暂存于diff_time(时间差即同一个id出现的时间间隔)。
28.第二步:判断当前id是否为第n次出现,其中n≥2,若是则将当前出现时间temp_time与上一次出现该id的时间做差暂存于diff_time;否则将id号加入数组single_id中,count1和count2都加1,记录当前id首次出现的时间init_time;第三步:将该id当前时间间隔值diff_time与该id出现的时间间隔最大值max_time、时间间隔最小值min_time比较,判断是否diff_time≥max_time;判断是否diff_time≥max_time,若是则将该id当前时间间隔值diff_time赋值给时间间隔最大值max_time = diff_time,并记录当前id对应的count1的值;否则diff_time《min_time,则将该id当前时间间隔值diff_time赋值给时间间隔最小值min_time = diff_time,并记录当前id对应的count1的值。
29.第四步:计算id的平均周期;某id最后一次出现的temp_time减去初始时间init_time并将其除以出现次数count2,得到每个id的出现间隔时间;即可得到id的平均周期avg_time。
30.第五步:判断id的平均周期是否在该id的周期误差范围内,将计算出的平均周期avg_time与该id的标准周期进行比较,如果平均周期在误差范围内,则认为该id检测无误并结束检测;否则判断为异常并记录该异常id的最大时间间隔max_time和最小时间间隔min_time对应的id序列,即当时count1的值,定位该异常id出现的位置,检测结束。
31.实施例2:表1中id号为162的报文为例;表1
32.can总线报文的消息特征主要在于它的标识和时间,因此处理的数据是 can 报文的标识符以及对应的时间周期等特征。如表1所示中id号为162的报文为例:
步骤一:通过spy3接口实时读取当前报文,并初始化。
33.第一步,以id为标识符,设置总id的个数为count1 = 0;第二步,建立一个数组single_id,设置single_id的个数为count2 = 0;第三步,同一个id出现的时间差计为diff_time;第四步,计同一个id出现的时间间隔最大值为max_time = 0,最小值为min_time = +∞,记id首次出现的时间为init_time;步骤二:对读取到的报文处理。
34.第一步:检测到报文id为162,先判断是否为第一次出现,为第一次出现,则跳转至第二步;第二步:将162放入single_id数组中,count1+1,count2+1;并记录第一出现的时间init_time=0.000000;第三步:检测下一个id, count1+1;当第二次出现162时, count1=4, count2=2,temp_time=0.026327;第四步:用当前出现的时间temp_time与init_time做差,得到diff_time=0.026327;第五步:将diff_time与max_time、min_time比较,判断是否diff_time≥max_time,若是则跳转第六步,否则diff_time《min_time,跳转第七步;第六步:diff_time≥max_time,max_time = diff_time;即0.026327≥0,max_time =0.026327。并记录当前id对应的count1的值:count1=4;第七步:diff_time《max_time,min_time = diff_time;并记录当前id对应的count1的值;第八步:循环直到最后一次162出现;第九步:计算id162的平均周期avg_time =(temp_time-init_time)/ count2。avg_time=0.0131635;第十步:将avg_time与162的标准周期对比,在误差范围内,无异常,测试结束。(假如不在误差范围内则异常,记录异常时的max_time的id序列count2=2,以及count1=4。即异常的位置为第4个id,162第二次出现时。)需要说明的是,以上内容仅仅说明了本发明的技术思想,不能以此限定本发明的保护范围,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰均落入本发明权利要求书的保护范围之内。
技术特征:
1.一种车载can总线网络报文异常检测方法,其特征在于,方法包括以下步骤:步骤一:实时读取当前车载can总线数据报文,并初始化;步骤二:对读取到的报文进行处理,通过比较读取到的报文id与当前已处理过的所有报文id是否相同来判断当前id是否为首次出现的id。2.根据权利要求1所述的一种车载can总线网络报文异常检测方法,其特征在于,步骤一包括:以id为标识符,并初始化总id的个数count1为0;建立一个用于存储can报文中出现的不同id的数组single_id,定义数组single_id,不限制其大小;同一个id出现的时间差计为diff_time;计同一个id出现的时间间隔最大值为max_time = 0,最小值为min_time = +∞,记id首次出现的时间为init_time。3.根据权利要求1所述的一种车载can总线网络报文异常检测方法,其特征在于,步骤二包括:实时判断当前id是否为首次出现的id;判断当前id是否为第n次出现,其中n≥2,若是则将当前出现时间temp_time与上一次出现该id的时间做差暂存于diff_time;否则将id号加入数组single_id中,count1和count2都加1,记录当前id首次出现的时间init_time;将该id当前时间间隔值diff_time与该id出现的时间间隔最大值max_time、时间间隔最小值min_time比较,判断是否diff_time≥max_time;计算id的平均周期;判断id的平均周期是否在该id的周期误差范围内,将计算出的平均周期avg_time与该id的标准周期进行比较。4.根据权利要求3所述的一种车载can总线网络报文异常检测方法,其特征在于,实时判断当前id是否为首次出现的id采用以下方法:建立一个id列表,记录已经出现过的所有id;每当接收到一个新的can报文时,先在id列表中查找该报文的id是否已经存在;如果该id不存在于列表中,则说明当前id是首次出现的,将其加入到single_id列表中;如果该id已经存在于列表中,则不是首次出现。5.根据权利要求3所述的一种车载can总线网络报文异常检测方法,其特征在于,判断是否diff_time≥max_time,若是则将该id当前时间间隔值diff_time赋值给时间间隔最大值max_time = diff_time,并记录当前id对应的count1的值;否则diff_time < min_time,则将该id当前时间间隔值diff_time赋值给时间间隔最小值min_time = diff_time,并记录当前id对应的count1的值。6.根据权利要求3所述的一种车载can总线网络报文异常检测方法,其特征在于,计算id的平均周期包括:最后一次出现的时间temp_time减去初始时间init_time并将其除以该id出现的次数count2,得到该id出现的平均间隔时间;即可得到该id的平均周期avg_time。7.根据权利要求3所述的一种车载can总线网络报文异常检测方法,其特征在于,将计算出的平均周期avg_time与该id的标准周期进行比较,如果平均周期在规定的误差范围
内,则认为该id检测无误并结束检测;否则判断为异常并记录该异常id的最大时间间隔max_time和最小时间间隔min_time对应的id序列,即当时count1的值,定位该异常id出现的位置,检测结束。8.根据权利要求4所述的一种车载can总线网络报文异常检测方法,其特征在于,如果当前id为首次出现的id,则将其加入数组single_id中,同时count1和count2都加1。9.根据权利要求1所述的一种车载can总线网络报文异常检测方法,其特征在于,步骤一中初始化的步骤包括配置can控制器寄存器、设置波特率和滤波器,此外初始化设置还包括报文缓冲区和中断处理程序。10.根据权利要求2所述的一种车载can总线网络报文异常检测方法,其特征在于,初始化数组single_id后,在后续的操作中,如果有新的id出现,则将其添加到single_id数组中,并增加count2计数器的值;如果已经存在于single_id中,则不进行任何操作,通过建立这样一个数组并记录其中所有不同的id。
技术总结
本发明公开了一种车载CAN总线网络报文异常检测方法,属于车载信息检测领域,方法包括以下步骤:步骤一:通过Spy3接口实时读取当前车载CAN总线数据报文,并初始化;步骤二:对读取到的报文进行处理,通过比较读取到的报文ID与当前已处理过的所有报文ID是否相同来判断当前ID是否为首次出现的ID,本发明克服了传统检测方法性能低下、消耗硬件资源以及成本高等不足之处,本发明实时分析总线上的报文特征,报文接收完毕即统计完毕;报文接收过程中计算量小,不影响报文接收的实时性;算法复杂度低;对操作资源占用少。对操作资源占用少。对操作资源占用少。
技术研发人员:甯聆怡 叶晓昶
受保护的技术使用者:延锋伟世通电子科技(南京)有限公司
技术研发日:2023.09.12
技术公布日:2023/10/20
版权声明
本文仅代表作者观点,不代表航家之家立场。
本文系作者授权航家号发表,未经原创作者书面授权,任何单位或个人不得引用、复制、转载、摘编、链接或以其他任何方式复制发表。任何单位或个人在获得书面授权使用航空之家内容时,须注明作者及来源 “航空之家”。如非法使用航空之家的部分或全部内容的,航空之家将依法追究其法律责任。(航空之家官方QQ:2926969996)
航空之家 https://www.aerohome.com.cn/
航空商城 https://mall.aerohome.com.cn/
航空资讯 https://news.aerohome.com.cn/
上一篇:一种便于拆装的净水器的制作方法 下一篇:一种省力的摇摆行进小车的制作方法