-
Notifications
You must be signed in to change notification settings - Fork 1
/
setEcuDidWithoutPermission.py
77 lines (70 loc) · 3.83 KB
/
setEcuDidWithoutPermission.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
from typing import Any, Optional
from prettytable import PrettyTable
from pythoncaninit import can_init
import can
from udsoncan.connections import PythonIsoTpConnection
from udsoncan.client import Client
from udsoncan.Response import Response
from udsoncan.Request import Request
from udsoncan import services
import udsoncan.configs
import isotp
isotp_params = {
'stmin' : 32, # Will request the sender to wait 32ms between consecutive frame. 0-127ms or 100-900ns with values from 0xF1-0xF9
'blocksize' : 8, # Request the sender to send 8 consecutives frames before sending a new flow control message
'wftmax' : 0, # Number of wait frame allowed before triggering an error
'tx_data_length' : 8, # Link layer (CAN layer) works with 8 byte payload (CAN 2.0)
'tx_data_min_length' : None, # Minimum length of CAN messages. When different from None, messages are padded to meet this length. Works with CAN 2.0 and CAN FD.
'tx_padding' : 0, # Will pad all transmitted CAN messages with byte 0x00.
'rx_flowcontrol_timeout' : 1000, # Triggers a timeout if a flow control is awaited for more than 1000 milliseconds
'rx_consecutive_frame_timeout' : 1000, # Triggers a timeout if a consecutive frame is awaited for more than 1000 milliseconds
'squash_stmin_requirement' : False, # When sending, respect the stmin requirement of the receiver. If set to True, go as fast as possible.
'max_frame_size' : 4095, # Limit the size of receive frame.
'can_fd' : True # Support CAN FD (Need to change python-can configuration)
}
class BinCodeC(udsoncan.DidCodec):
def __init__(self, packstr: str | None = None):
super().__init__(packstr)
def encode(self, *did_value: Any) -> bytes:
return did_value[0]
def decode(self, did_payload: bytes) -> Any:
return did_payload
def __len__(self) -> int:
raise self.ReadAllRemainingData
def write_did_by_identifier(requestid,responseid,did,value):
result = None
can_init()
bus = can.Bus()
tp_addr = isotp.Address(isotp.AddressingMode.Normal_11bits, txid=requestid, rxid=responseid) # Network layer addressing scheme
stack = isotp.CanStack(bus=bus, address=tp_addr, params=isotp_params) # Network/Transport layer (IsoTP protocol)
stack.set_sleep_timing(0, 0) # Speed First (do not sleep)
conn = PythonIsoTpConnection(stack) # interface between Application and Transport layer
with Client(conn, request_timeout=2) as client: # Application layer (UDS protocol)
try:
req = services.WriteDataByIdentifier.make_request(did,value,{did: BinCodeC})
response = client.send_request(req)
print("SUCCESS ???????")
print(response.data)
result = True
except:
result = False
bus.shutdown()
return result
def character_pharse(data):
newdata = ""
for i in data:
if i>0x1F and not 0x7A<i<0xA0:
newdata += bytes([i]).decode('latin')
else:
newdata += '*'
return newdata
if '__main__' == __name__:
requestid = int(input("Please input UDS request id [7xx]: "),16)
responseid = int(input("Please input UDS response id [7xx]: "),16)
did = int(input("Please input UDS DID [F190]: "),16)
value = bytes.fromhex(input("Please input UDS DID value: "))
result = write_did_by_identifier(requestid,responseid,did,value)
x = PrettyTable()
x.field_names = ['DID NO.','HEX DATA','LATIN DATA','INPUT RESULT']
x.add_row([1,value.hex(),character_pharse(value),result])
print(x)