基于Python的 协议解析小工具

370 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第12天,点击查看活动详情

在基于GPS的车辆位置系统中,我们经常需要对设备上传的JT808协议进行解析和分析,以便发现协议数据的bug和数据存在问题。但是二进制文本的协议格式不方便我们阅读和分析,对非开发者来说更是难上加难,为了更好的解决协议的分析和阅读,我们利用Python和PYQT5开发一个简单的协议分析工具,用来方便的解决协议数据的重要内容提取。协议原始数据如图1

image.png 图1

二 业务逻辑

1.      对于协议文本,我们处理的时候应该先去掉协议文本的占位符“-”

2.      将处理后的协议文本,我们需要安装协议文档进行分析,首先进行crc校验,校验规则如下:

image.png 图2

3.      校验通过后我们根据具体协议文档进行协议解析,在实际中,对于位置上报协议0x200使用最多,所以我们主要处理0x200协议

image.png 图3

三 相关代码

image.png 图4

软件整体文件说明:

Jt808为文件协议解析类

Main.py为系统主窗口

Main.ui 为qt界面代码

UI_Main.py为界面交互代码

l  QT设计器

image.png l  校验代码

image.png l  Main.py

 

image.png l  Ui_main.py

 

 

1.   from PyQt5 import QtCore, QtGui, QtWidgets  

2.   import jt808  

3.   import json  

4.     

5.   class Ui_Dialog(object):  

6.       def setupUi(self, Dialog):  

7.           Dialog.setObjectName("Dialog")  

8.           Dialog.resize(604, 527)  

9.           self.textBrowser_2 = QtWidgets.QTextBrowser(Dialog)  

  1.         self.textBrowser_2.setGeometry(QtCore.QRect(20, 250, 561, 192))  

  2.         self.textBrowser_2.setObjectName("textBrowser_2")  

  3.         self.label = QtWidgets.QLabel(Dialog)  

  4.         self.label.setGeometry(QtCore.QRect(30, 10, 54, 12))  

  5.         self.label.setObjectName("label")  

  6.         self.label_2 = QtWidgets.QLabel(Dialog)  

  7.         self.label_2.setGeometry(QtCore.QRect(30, 230, 81, 16))  

  8.         self.label_2.setObjectName("label_2")  

  9.         self.pushButton = QtWidgets.QPushButton(Dialog)  

  10.         self.pushButton.setGeometry(QtCore.QRect(380, 470, 75, 23))  

  11.         self.pushButton.setObjectName("pushButton")  

  12.         self.pushButton_2 = QtWidgets.QPushButton(Dialog)  

  13.         self.pushButton_2.setGeometry(QtCore.QRect(290, 470, 75, 23))  

  14.         self.pushButton_2.setObjectName("pushButton_2")  

  15.         self.textEdit = QtWidgets.QTextEdit(Dialog)  

  16.         self.textEdit.setGeometry(QtCore.QRect(20, 30, 561, 201))  

  17.         self.textEdit.setObjectName("textEdit")  

  18.   

  19.   

  20.         self.pushButton.clicked.connect(self.prase_click)  

  21.         self.pushButton_2.clicked.connect(self.fromat_click)  

  22.         self.retranslateUi(Dialog)  

  23.         QtCore.QMetaObject.connectSlotsByName(Dialog)  

  24.   

  25.     def retranslateUi(self, Dialog):  

  26.         _translate = QtCore.QCoreApplication.translate  

  27.         Dialog.setWindowTitle(_translate("Dialog", "Dialog"))  

  28.         self.label.setText(_translate("Dialog", "原始数据"))  

  29.         self.label_2.setText(_translate("Dialog", "解析完成数据"))  

  30.         self.pushButton_2.setText(_translate("Dialog", "格式处理"))  

  31.         self.pushButton.setText(_translate("Dialog", "开始解析"))  

  32.         self.textEdit.setText("7E-02-00-00-E3-01-40-90-87-46-81-00-02-00-00-00-00-00-00-00-02-01-D2-13-6E-06-33-E4-00-02-4F-00-00-00-00-21-11-01-08-33-51-E1-01-02-EB-C2-00-04-00-2D-DA-C6-00-04-00-08-00-12-00-06-00-89-FF-FF-FF-FF-00-70-00-B9-05-36-34-3A-30-35-3A-65-39-3A-30-62-3A-37-62-3A-39-30-2C-2D-34-34-2C-63-30-3A-66-66-3A-64-34-3A-38-37-3A-33-33-3A-66-35-2C-2D-34-38-2C-61-30-3A-63-35-3A-66-32-3A-62-33-3A-33-33-3A-34-32-2C-2D-35-30-2C-39-34-3A-64-39-3A-62-33-3A-35-61-3A-30-65-3A-38-66-2C-2D-35-31-2C-36-34-3A-30-35-3A-65-39-3A-32-30-3A-32-35-3A-61-31-2C-2D-36-32-00-06-00-C5-00-00-10-D0-00-0C-00-B2-89-86-04-03-10-18-70-84-14-89-00-24-00-A9-01-CC-00-06-81-09-D6-80-2E-81-09-71-66-2B-81-09-D6-81-28-81-09-D6-7F-24-81-09-C8-0E-22-81-09-C8-10-22-EC-7E")  

  33.   

  34.     def fromat_click(self):  

  35.         in_str= self.textEdit.toPlainText()  

  36.         format_str=in_str.replace('-','')  

  37.         self.textEdit.setText(format_str)  

  38.     def prase_click(self):  

  39.         in_str= self.textEdit.toPlainText()  

  40.         out_dict=jt808.jt808_analysis(in_str,'serv_receive')  

  41.         #out_Str=json.dumps(str(out_dict))  

  42.         out_Str=(str(out_dict))  

  43.         self.textBrowser_2.setText(out_Str)  

l  JT808 局部

image.png