持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第12天,点击查看活动详情
在基于GPS的车辆位置系统中,我们经常需要对设备上传的JT808协议进行解析和分析,以便发现协议数据的bug和数据存在问题。但是二进制文本的协议格式不方便我们阅读和分析,对非开发者来说更是难上加难,为了更好的解决协议的分析和阅读,我们利用Python和PYQT5开发一个简单的协议分析工具,用来方便的解决协议数据的重要内容提取。协议原始数据如图1
图1
二 业务逻辑
1. 对于协议文本,我们处理的时候应该先去掉协议文本的占位符“-”
2. 将处理后的协议文本,我们需要安装协议文档进行分析,首先进行crc校验,校验规则如下:
图2
3. 校验通过后我们根据具体协议文档进行协议解析,在实际中,对于位置上报协议0x200使用最多,所以我们主要处理0x200协议
图3
三 相关代码
图4
软件整体文件说明:
Jt808为文件协议解析类
Main.py为系统主窗口
Main.ui 为qt界面代码
UI_Main.py为界面交互代码
l QT设计器
l 校验代码
l Main.py
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)
-
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)
l JT808 局部