车胎压力监测系统(TPMS)协议研究

远程监测汽车轮胎气压的系统(简称TPMS-轮胎压力监测系统)旨在迅速告知用户轮胎压力的下降和轮胎的临界温度。



传感器可在内部或外部使用。内部的安装在无内胎轮胎盖内,外部的固定在车轮配件上。具有内部传感器的车轮看起来与没有传感器的车轮完全一样。这样的轮子很容易打气。外部传感器引人注目,它可能被盗,并且在给车轮充气时必须先将其拧松。它也受到大气现象的影响。



为了研究TPMS系统的协议,我想到了在婴儿车上安装这样的系统以快速监视轮胎压力的想法。



图片

图。1。 TPMS系统外观



图片

图2。 TPMS系统控制器板



不能像这样安装标准接收单元,因为最小允许压力值为1.1 Bar,而在婴儿车中则较小。因此,模块不断发出蜂鸣声,提示轮胎气压低。在我的文章[1]中,您可以阅读有关“ Smart”婴儿推车“ Maksimka”的控制器的开发信息,其中已应用了研究结果。



通过在Internet上搜索文章开始收集有关TPMS操作的信息。但是,不幸的是,几乎没有信息。它也适用于通常较为标准的汽车系统,这些系统稍微复杂一些,而且价格昂贵得多。而且我需要有关一个简单的中国廉价系统的信息。我有些了解,现在必须开始尝试。



因此,我们用DVB调谐器的USB耳机武装自己,启动RTL-SDR并观看广播。传感器在FSK调制下工作于433.92 MHz。最初,我录制了广播,然后手动分析了协议。困难从这里开始。以前仅遇到OOK调制。那里的一切都很简单。这里有点复杂。该信息以两个频率编码。因此,我研究了实例,即调制理论。然后,我看到了如何使用URH-Universal Radio Hacker程序[2,3]。我试图安装它,但在WinXP 32bit上不起作用。我必须寻找具有win8 64位的计算机,然后安装了该程序。您可以在开发者的网站上阅读有关其工作的更多信息。 URH对我来说使此过程更容易一些,因为它捕获空气中的信号,并用波形图显示,并立即将其解码为二进制和十六进制形式的原始数字形式。



图片

图3。截取TPMS发送帧的程序屏幕截图



传感器在一个会话中一个接一个地发送多个消息。会话之间的时间间隔可能长达一分钟或更长。如果发生警报情况,传感器将立即开始发送数据包。来自传感器[8]的消息的声音文件。从URH程序获取的来自传感器的一条消息的示例:



010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101011001100110100110101001011001011010011010100110101001100101010101011010010101010101010110101001011001101010010101100101101001010101011001011001100110101001


以十六进制形式,该前提将采用以下形式:



5555555555555555555555555555555555555555555555555555555555555555555556669a965a6a6a6555a5555a966a565a556599a9


很明显,一个会话中的所有4个包裹都具有相同的数据,这意味着该数据包已被正确接受,您可以开始对其进行分析。



在上面的示例中,您可以看到序言(序列01010101…。),后跟数据。阅读互联网后,我们了解到我们有一个使用曼彻斯特编码(GE Thomas)编码的软件包。每一位都用两位01或10编码。我本来是手工编码的,因此加强了编码/解码理论。但是后来我决定转向在线解码器[4,5,6],这大大加快了过程。



因此,使用曼彻斯特代码解码来自传感器的原始消息,我们得到



000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010101101110010011011101110100000011000000001110010111000100110000010010101110


前136个零为前导,可以丢弃。我们只对数据感兴趣。



将它们转换为十六进制形式,我们得到:0x15B937740C03971304AE



这已经有了漂亮的初始数据,其中的标识符,轮胎压力和温度隐藏在某个地方。



为了进一步研究,有必要收集数据统计信息。为此,我将一个传感器缠绕在车轮上并捕获了空气,同时记录了原始系统板显示的内容。他释放了压力,将其泵起,将轮子放入冰箱中使其达到负温度,然后将其加热。然后,他寻求相同的条件让另一个传感器找出温度和压力字节。



整个包占用10个字节。如果将接收到的解码数据排成一列,则可以看到恒定数据和变化数据。



15B937740C03971304AE
15B937740C03A1FC00A4
15B937740C03A700087B


人体传感器上贴有贴纸。每个传感器都不同:0A,1B,2C,3D。



刻板印象在这里效果不佳。我以为这是ID传感器。

我怀疑为什么ID仅占用1个字节,但是后来我忘记了它,而是尝试在流中搜索这些标识符。然后,在系统原始接收器的菜单中,我看到其他传感器可以绑定到该接收器,并且接收器本身在每个车轮上显示传感器ID。而且,瞧,我发现第四个车轮传感器的ID = 3774。



15B937740C03971304AE


因此,包裹的第3和第4个字节是车轮ID。与其他传感器相比,标识符也与标准面板显示的标识符一致。



我将第一个字节算作数据开头的前缀,将第二个字节算作TPMS子系统的标识符。

以下是来自不同传感器的包裹的比较。



15B9F3FA2300BE1B007B传感器0A ID = 0xF3FA

15B91AA43201B71B002A传感器1B ID = 0x1AA4

15B9ABFF32027B1B029B传感器2C ID = 0xABFF

15B937740C03971304AE传感器3D ID = 0x3774



而且我意识到,传感器(0A,1B,2C,3D)上的铭文只是数字形式的车轮编号,不是字母,而是十六进制车轮编号。但是,尽管如此,包装中的第6个字节与传感器的序列号非常相似。对于我自己,我得出的结论是这是车轮识别符。因此,再解码一个字节。



最后一个字节很可能是校验和,我不知道该如何读取。直到最后,这一直是我的谜。



下一个已解码字节是车轮温度。幸运在这里。温度占1个字节,以整数表示。负数为二进制补码。这意味着温度-127 ... 128摄氏度将适合一个字节。



在我们的程序包中,温度是第8个字节



15B9F3FA2300BE1B007B0x1B对应于+27度

15B937740C03A1FC00A40xFC对应于-4度



第三个,第三个,第九个和第三个未被识别的字节。从变化的动态来看,轮胎压力隐藏在7个字节中,而第9个字节中最有可能隐藏在传感器的状态位中。根据Internet上的各种信息来源以及TPMS系统的功能,应该有一些电量耗尽的电池,一些快速的压力损失以及一些不清楚的内容。



因此,我们将分析第7个字节,因为我们的意思是压力隐藏在其中。

在对具有不同压力的不同传感器键入统计信息之后,我无法明确定义重新计算压力的公式。目前尚不清楚传感器默认以何种单位传输压力(Bar,PSI)。结果,Excel中内置的表与标准TPMS记分板没有完全匹配。可以忽略这个0.1 Bar的差异,但是我想要一个协议的概念到最后一刻。兴奋盛行。



如果您不了解压力字节的形成方式,则需要制作一个压力传感器仿真器,并在更改压力值的情况下查看标准面板显示的内容。



仍然需要找出数据包的第5个和第9个字节的用途,但它们很少更改,因此您可以像原始数据包一样接受它们的值,仅更改压力字节。现在的问题仅在于计算校验和。没有它,标准面板将忽略我的包裹并且什么也不显示。



为了模拟传感器,您必须发送一个数据包。为此,我将一个SI4432收发器连接至PIC16F88,该收发器曾用于其他用途。



图片

图4。测试板照片



使用旧的数据传输实践,我为PIC绘制了一个程序,该程序传输使用URH程序接收到的一个数据包。打开发射机一段时间后,面板会显示已传输的数据!但这是具有现成CRC的现成数据包,为了让我更改压力字节,我还需要重新计算CRC。



我开始阅读,寻找有关使用哪些CRC的信息,尝试使用不同的Xor,等等,但是没有任何效果。我已经认为,什么都解决不了,必须满足我根据表格所承受的压力,但与原始记分板略有不同。但是在互联网上,我看到了一篇有关CRC选择的文章。有一个程序向您提供了几个数据包,它会尝试查找校验和,如果成功,将输出多项式值和CRC初始化值。[7]我们



给程序几个软件包:



reveng -w 8 -s 15B9ABFF3202AA1B0017 15B9ABFF3202AA1B0249 15B9F3FA2300D01A00D8 15B937740C037B130089 15B937740C03BD18025E 15B9ABFF32028F150834


该程序的问题:



width=8  poly=0x2f  init=0x43  refin=false  refout=false  xorout=0x00  check=0x0c  residue=0x00  name=(none)


我编写了一个程序,在考虑这些数据的情况下计算CRC,并通过我之前收到的数据包进行了处理-一切都放在一起了!



//  CRC  
 crc=0x43;    //     
 for(j=0;j<9;j++)
 {
  crc ^= tmp[j];
  for(i=0;i<8;i++)
   crc=crc&0x80 ? (crc<<1)^0x2F : crc<<1;  //  0x2F    CRC
 }


双手发痒以传输压力数据。用CRC计算完成测试程序后,我发送了第一个数据包。 OEM面板接收到该信号并显示压力和温度。一个小问题是标准面板的小数点后一位,并且在将数值传输到空中时,屏幕始终显示相同的压力,因为其余的放电不可见。传递的字节值0..255。但这又不清楚。原来,当第7个字节包含值97时,压力0.00 Bar开始。尚不清楚为什么会这样。但是随后一切都清楚了,分辨率为0.01 Bar。



字节P压力,巴

255 1.58

254 1.57

... ...

107 0.10

106 0.09

105 0.08

104 0.07

103 0.06

102 0.05

101 0.04

100 0.03

99 0.02

98 0.01

97 0.00



从表中可以看出,适合一个字节的最大压力仅为1.58 Bar,但是系统允许您测量最高4 Atm的压力。这意味着最高有效位的1位隐藏在其他位置。不需要遍历所有字节并更改其中的位。找到了汽车的车轮,传感器缠绕在车轮上,并捕获了信号。好奇心盛行,在我心中,我押注于节拍的出现位置。而且这将恰好是一位,而不是其他一些编码方案。



解码数据包后,我看到了这一点。它是第6个字节的第7位。这意味着第六个字节不仅包含车轮编号,还包含轮胎压力的最高有效位。

15B937740C833C18025C



0x83和0x3C的最高有效位为0x13C = 219,对应于2.19 Bar的压力

将压力转换为Bar的公式:P =(ADC-97)/ 100,

其中ADC =(B7 >> 7)* 0x100 + B6,其中B6和B7是字节6和字节7



的值。值为511时,我们的最大压力为4 ,14巴。还不清楚为什么压力条为4.14 Bar,但是我想这等于4个大气压-传感器的最大允许压力。



仍然需要了解状态位的作用。通过释放压力,将传感器连接到稳压电源并降低电压来获得钻头。仍然不清楚2位。也许还有更多,但是他们在整个实验中从未接受过价值。



为了简化分析,编写了一个程序[8]



图片

图5。用于检查TPMS软件包的程序界面的外观



您可以将URH程序中的原始数据包设置为十六进制格式,然后程序对该数据包进行解码,读取校验和并以常温和压力单位显示数据。



我不知何故回到了标准面板的菜单,发现传感器标识符不是两个字节,而是四个字节。面板上有大小不一的指示器,我没有立即注意到传感器ID中也包含第2和第5个字节。



15B937740C833C18025C



因此,只有第一个字节无法识别,但始终为0x15(0b010101),这看起来像数据包的某个前同步码或其开始标识符。



同样,状态位不能准确识别,但可以识别。



好奇地找出传感器内部普遍存在的东西,我分解了其中一个(图6)6



图片

。 TPMS传感器



它基于带有少量捆扎带的Infineon SP372微电路。搜索该特定微电路的文档没有任何结果。我发现的是调查或广告。因此,不可能找到该协议。但是文章提到这是一个可编程控制器,因此程序可以是任何东西。因此,我不敢单独购买微电路。



协议



现在开始从传感器接收数据到SI4432收发器。最初计划从SI4432接收原始数据,以便控制器对曼彻斯特进行解码并收集字节。但是此收发器具有数据包处理功能。也就是说,对于发送,您可以将发送器配置为所需的频率,调制,偏差,设置前同步码长度,编码,同步字,比特率,数据长度。然后将原始数据包写入发送器缓冲区(例如,我们的15B937740C833C18025C)并开始传输。收发器本身将形成一个数据包并进行广播,同时遵守所有指定的参数,此时控制器可以自由处理其他信息。



理想情况下,我希望在接收期间从SI4432接收批处理数据。为了使接收方接收到数据包并生成已接收到数据包的中断。然后,控制器只需读取接收缓冲区,该缓冲区已经以其纯格式存储了数据,从而为其他功能腾出了处理器时间。



我开始研究用于收发信机操作的寄存器设置。事实证明,这比转移包裹困难得多。在这里,您需要了解无线电接收的理论,而我没有。在Excel中有一些用于计算此收发器的寄存器的表,但是由于Excel是俄语而无法使用,或者它们被截断了。开发人员也有一个应用程序,但是那里的一切也不是很透明。看完许多例子并查看计算表后,我根据文档手动读取了寄存器值。



我将记录仪连接到接收器的输出并捕获了空气,具体取决于接收器的输出。结果,我设法配置了接收器过滤器,以便它可以让我的数据包通过。他操纵了流速,打了铃鼓。不幸的是,该理论对我仍然不清楚。



为了使接收器能够接收数据包,它需要指定前同步码长度,必须存在的同步字以及数据长度。接收器也可以读取校验和本身,但是在SI4432中,计算算法与压力传感器的CRC算法不对应。



两字节同步字的强制性存在可能使接收数据包的想法蒙上阴影,但幸运的是,来自传感器的消息始于0x15B9(15B937740C833C18025C),并且对于所有传感器都是相同的。这意味着为同步字指定了0x15B9。数据包长度为8个字节,禁用了校验和分析。我们在接收数据包时设置中断的产生并开始接收过程。



当接收器接收到前同步码,同步字0x15B9和8个字节的数据时,它将向主控制器发出中断,该主控制器仅从接收器的缓冲区中读取8个字节的数据。接下来,主控制器将计算校验和,对其进行比较并解码接收到的数据。幸运的是,一切都按计划进行了!



图片

图7。标准TPMS指示器的照片和“智能”婴儿车的显示



以下是初始化SI4432收发器以接收的示例:



WriteSI4432(0x06, 0x05);	   // interrupt all disable
   WriteSI4432(0x07, 0x01);	   // to ready mode
   WriteSI4432(0x09, 0x7f);	   // cap = 12.5pf
   WriteSI4432(0x0A, 0x06);	   // uC CLK: 1 MHz

   WriteSI4432(0x73, 0x00);	   // no frequency offset
   WriteSI4432(0x74, 0x00);	   // no frequency offset 
   WriteSI4432(0x75, 0x53);	   // 430-440MHz range   
   WriteSI4432(0x76, 0x62);	   // 0x621A-433.924 
   WriteSI4432(0x77, 0x1A);	   //  
   WriteSI4432(0x79, 0x00);	   // no frequency hopping
   WriteSI4432(0x7a, 0x00);	   // no frequency hopping  
 
   //      9090/2
   WriteSI4432(0x1C, 0x81);    // 01 IF Filter Bandwidth 
   WriteSI4432(0x1D, 0x44);    // 44 AFC Loop Gearshift Override 
   WriteSI4432(0x1E, 0x0A);    // 0A AFC Timing Control
   WriteSI4432(0x1F, 0x05);    // 00 Clock Recovery Gearshift Override
   WriteSI4432(0x20, 0x28);    // 64 Clock Recovery Oversampling Ratio 
   WriteSI4432(0x21, 0xA0);    // 01 Clock Recovery Offset 2 
   WriteSI4432(0x22, 0x18);    // 47 Clock Recovery Offset 1 
   WriteSI4432(0x23, 0xD2);    // AE Clock Recovery Offset 0 
   WriteSI4432(0x24, 0x08);    // 12 Clock Recovery Timing Loop Gain 1 
   WriteSI4432(0x25, 0x19);    // 8F Clock Recovery Timing Loop Gain 0 
   WriteSI4432(0x2A, 0x00);    // 00 AFC Limiter 
   WriteSI4432(0x69, 0x60);    // 60 AGC Override 1
   
   WriteSI4432(0x70, 0x26);     //  Manchester,   
   WriteSI4432(0x71, 0x22);	    //  FSK, FIFO
   WriteSI4432(0x72, 31);       //  31*625=19375  (     )
   WriteSI4432(0x34,10);         // 10 -    4- 
   WriteSI4432(0x35,0x1A);      // preambula threshold
   
   WriteSI4432(0x36,0x15);      //  3  0x15
   WriteSI4432(0x37,0xB9);      //  2  0xB9
   
   WriteSI4432(0x27,0x2C);      // RSSI

   //  
   WriteSI4432(0x33, 0x0A);     // fixpklen=1, Synchronization Word 3 and 2
   WriteSI4432(0x32, 0x00);     //   
   WriteSI4432(0x30, 0x80);	    // Skip2ph, Enable Packet RX Handling=0 (   Skip2ph...)
   WriteSI4432(0x3E, 0x08);     //    8 

   WriteSI4432(0x0B, 0x12);     //  GPIO0     TX 
   WriteSI4432(0x0C, 0x15);     //  GPIO1     RX

   //  FIFO TX
   WriteSI4432(0x08, 0x01);// 0x01  Operating Function Control 2 
   WriteSI4432(0x08, 0x00);// 0x00  Operating Function Control 2      
   //  FIFO RX
   WriteSI4432(0x08, 0x02);// 0x02  Operating Function Control 2 
   WriteSI4432(0x08, 0x00);// 0x00  Operating Function Control 2      
 
   //   :  ,  ,  
   WriteSI4432(0x05, 0x02);     //    
   WriteSI4432(0x06, 0x00); 
   //   ,       NIRQ  . 1
   SI4432_stat[0] = ReadSI4432(0x03); 
   SI4432_stat[1] = ReadSI4432(0x04); 
   WriteSI4432(0x07, 0x05);     //   


数据接收本身将如下所示:



if (si_int)		//      SI4432
   {
    //      
    SI4432_stat[0] = ReadSI4432(0x03); 
    SI4432_stat[1] = ReadSI4432(0x04); 
    SI4432_RSSI = ReadSI4432(0x26); 
    if (SI4432_stat[0]&0x02)
    {
     WriteSI4432(0x07, 0x01);      //  .     .  ,     
     SI4432_ReadFIFO();            //   FIFO 8  
     TPMS_Parsing();               //  CRC   
     //  FIFO
     WriteSI4432(0x08, 0x02);      //  0x02  Operating Function Control 2 
     WriteSI4432(0x08, 0x00);      //  0x00  Operating Function Control 2      
     //WriteSI4432(0x07, 0x05);      //   
    }
    else
    {
     //  FIFO TX
     WriteSI4432(0x08, 0x01);// 0x01  Operating Function Control 2 
     WriteSI4432(0x08, 0x00);// 0x00  Operating Function Control 2      
     //  FIFO RX
     WriteSI4432(0x08, 0x02);// 0x02  Operating Function Control 2 
     WriteSI4432(0x08, 0x00);// 0x00  Operating Function Control 2      
    }
    if (SI4432_stat[0]&0x80)
    {
     //  FIFO RX
     WriteSI4432(0x08, 0x02);// 0x02  Operating Function Control 2 
     WriteSI4432(0x08, 0x00);// 0x00  Operating Function Control 2      
    }
    WriteSI4432(0x07, 0x05);      //   
    si_int=0;
   }


SI4432_ReadFIFO()函数仅从接收器缓冲区读取8个字节,其中包含来自传感器的数据。



TPMS_Parsing()函数分析校验和并将信息解码为最终压力和温度单位以及状态信息。



问题



  1. 在读取有关传感器的信息时,提到了传感器之间的同步。由于某种原因,有必要配对传感器,在30分钟内,速度超过20 km / h。尚不清楚为什么这是必要的。也许这是由于信息传输的时刻,但这是我的猜测。
  2. 直到压力传感器的状态位功能结束才发现。
  3. 尚不清楚SI4432收发器的设置,使用曼彻斯特编码的波特率。它对我有用,但是对该原理尚不了解。


工作成果



本文涉及的研究大约花了一个月的空闲时间。



通过对胎压监测系统协议的研究,提出了无线传输和接收数据的问题,简要考虑了信号编码,并测试了SI4432收发器的发送和接收性能。这项任务使TPMS可以集成到智能婴儿推车的主要项目中。了解了交换协议,您可以连接更多传感器并将其集成到您的开发中。此外,控制压力可以在宽范围内,而不是在标准系统1.1-3.2 Bar中,因为 超出此范围的压力伴随着标准中央单元系统的警报声。而且,TPMS现在可以用于监视摩托车,自行车或例如充气床垫的轮胎压力。剩下的就是物理安装传感器并编写一个顶层程序。



链接



  1. “智能”婴儿车“ Maksimka”
  2. github.com/jopohl/urh
  3. habr.com/ru/company/neuronspace/blog/434634
  4. www.rapidtables.com/convert/number/hex-to-binary.html
  5. www.rapidtables.com/convert/number/binary-to-hex.html
  6. eleif.net/manchester.html
  7. hackaday.com/2019/06/27/reverse-engineering-cyclic-redundancy-codes
  8. 我的实用程序,样本包,CRC选择。存档密码“ tPmSutiLity” dropmefiles.com/MtS9W
  9. i56578-swl.blogspot.com/2017/08/eavesdropping-wheels-close-look-at-tpms.html
  10. www.rtl-sdr.com/tag/tpms



All Articles