doip诊断第二版优化
doip诊断第二版优化
就是要使用全局的socket,要实现 前端选中5个uds诊断命令,发送给后端,后端要保证这5个uds命令在一个socket中执行,
session 就和我们编程里面的 session 含义基本一样,就像是一个通道一样。比如 安全验证 在 10 03 会话中通过了,下面切换到 10 02会话那么还要重新验证 安全验证,因为 已经不在同一个会话里的,虽然还在 同一个socket中,socket 是5分钟会关闭。
有一个测试 uds命令 在每一个socket中 发第一次 返回TRUE,但是 如果在一个socket中连续发两次 第二次就会编程 false 这是正确的。
但是 如果你每次从前端 过来的命令都是 开启一个新的 socket 那么 这个uds命令 就会一直返回TRUE 就不正确了。
先删除原来的
pip3 uninstall PyQt5
pip3 uninstall PyQt5-sip
pip3 uninstall sip
pip3 install PyQt5
pip3 install PyQt5-sip
pip3 install sip
pip3 install pycryptodome
pip3 install crypto
pip3 install pycrypto
pip3 install scapy
pip3 install cffi==1.15
在这里插入代码片
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad
from scapy.all import *
# 后续按需更换文件路径
from PLayer.logMain import logger
# 全局socket
server_socket = None
def send_tcp_message(device, gateway, host, port, tcp_route, sessioned, address, ecu_sn, ecu_interview, ecu_secret, uds_payload_list):
global server_socket
return_message = "诊断异常"
try:
if server_socket is None:
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#server_socket.setsockopt(socket.SOL_SOCKET,25,gateway_byte_data) 这里暂时有问题 后续处理 先默认为 '以太网 3')
# 连接到服务器
server_socket.connect((host, port))
# 发送路由激活报文
return_message = send_tcp_route(server_socket)
# 创建对应session 不选使用默认session
send_session(server_socket, address, sessioned)
# 27安全验证
if ecu_sn and ecu_interview and ecu_secret:
return_message = send_secret(server_socket, ecu_sn, ecu_interview, ecu_secret, address)
# 服务请求
if uds_payload_list == "null":
pass
else:
return_message = send_uds_payload(server_socket, sessioned, address, uds_payload_list, ecu_sn,ecu_interview, ecu_secret)
except Exception as e:
logger.error("诊断异常,错误信息 -> %s" % str(e))
return_message= "诊断异常"
# 关闭套接字的读取和写入功能
server_socket.shutdown(socket.SHUT_RDWR)
# 关闭套接字
server_socket.close()
return return_message
def send_tcp_route(server_socket):
# 1、发送路由激活报文
binary_data = b"\x02\xFD\x00\x05\x00\x00\x00\x07\x00\x01\x00\x00\x00\x00\x00"
server_socket.sendall(binary_data)
response = server_socket.recv(1024) # 接收最多1024字节的
return response
前端
在这里插入代码片
前端
self.uds_payload_list.clear()
self.uds_payload_list.append(self.uds_payload_str)
self.uds_payload_list.append(self.uds_payload_str1)
self.uds_payload_list.append(self.uds_payload_str2)
self.uds_payload_list.append(self.uds_payload_str3)
return_message_str = doip_nic_tool2.send_tcp_message(self.device, self.gateway, host, port,self.tcp_route, self.session, self.address,self.ecu_sn, self.ecu_interview, self.ecu_secret,self.uds_payload_list)
self.return_message.setText(return_message_str)
def main():
app = QApplication(sys.argv)
ex = window()
ex.show()
ex.inputButton()
sys.exit(app.exec_())
if __name__ == '__main__':
main()