Python开发协议解析工具

223 阅读3分钟

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

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

 

相关代码

image.png
软件整体文件说明:

Jt808为文件协议解析类

Main.py为系统主窗口

Main.ui 为qt界面代码

UI_Main.py为界面交互代码

l  QT设计器

image.png

image.png
图2校验代码

image.png

Main.py

  from PyQt5 import QtCore, QtGui, QtWidgets  
  import jt808  
  import json  
    
  class Ui_Dialog(object):  
      def setupUi(self, Dialog):  
          Dialog.setObjectName("Dialog")  
          Dialog.resize(604, 527)  
          self.textBrowser_2 = QtWidgets.QTextBrowser(Dialog)  
         self.textBrowser_2.setGeometry(QtCore.QRect(20, 250, 561, 192))  
         self.textBrowser_2.setObjectName("textBrowser_2")  
         self.label = QtWidgets.QLabel(Dialog)  
         self.label.setGeometry(QtCore.QRect(30, 10, 54, 12))  
         self.label.setObjectName("label")  
         self.label_2 = QtWidgets.QLabel(Dialog)  
         self.label_2.setGeometry(QtCore.QRect(30, 230, 81, 16))  
         self.label_2.setObjectName("label_2")  
         self.pushButton = QtWidgets.QPushButton(Dialog)  
         self.pushButton.setGeometry(QtCore.QRect(380, 470, 75, 23))  
         self.pushButton.setObjectName("pushButton")  
         self.pushButton_2 = QtWidgets.QPushButton(Dialog)  
         self.pushButton_2.setGeometry(QtCore.QRect(290, 470, 75, 23))  
         self.pushButton_2.setObjectName("pushButton_2")  
         self.textEdit = QtWidgets.QTextEdit(Dialog)  
         self.textEdit.setGeometry(QtCore.QRect(20, 30, 561, 201))  
         self.textEdit.setObjectName("textEdit")  
   
   
         self.pushButton.clicked.connect(self.prase_click)  
         self.pushButton_2.clicked.connect(self.fromat_click)  
         self.retranslateUi(Dialog)  
         QtCore.QMetaObject.connectSlotsByName(Dialog)  
   
     def retranslateUi(self, Dialog):  
         _translate = QtCore.QCoreApplication.translate  
         Dialog.setWindowTitle(_translate("Dialog", "Dialog"))  
         self.label.setText(_translate("Dialog", "原始数据"))  
         self.label_2.setText(_translate("Dialog", "解析完成数据"))  
         self.pushButton_2.setText(_translate("Dialog", "格式处理"))  
         self.pushButton.setText(_translate("Dialog", "开始解析"))  
         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")  
   
     def fromat_click(self):  
         in_str= self.textEdit.toPlainText()  
         format_str=in_str.replace('-','')  
         self.textEdit.setText(format_str)  
     def prase_click(self):  
         in_str= self.textEdit.toPlainText()  
         out_dict=jt808.jt808_analysis(in_str,'serv_receive')  
         #out_Str=json.dumps(str(out_dict))  
         out_Str=(str(out_dict))  
         self.textBrowser_2.setText(out_Str)  

pip install PyQt5

pip install pyqt5-tools

四 软件效果

 

l  界面初始化

image.png
格式处理

image.png
解析结果

image.png