가상 CAN 네트워크를 사용하여 CAN 데이터를 가져 오려고하는데 CAN 데이터 패킷을 압축 해제 할 때 이상한 결과가 발생합니다. 그래서 나는이처럼 보이는 CAN 패킷이있을 때 수입 소켓, SYS, 구조체RAW CAN 디코딩
sock = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
interface = "vcan0"
try:
sock.bind((interface,))
except OSError:
sys.stderr.write("Could not bind to interface '%s'\n" % interface)
fmt = "<IB3x8s"
while True:
can_pkt = sock.recv(16)
can_id, length, data = struct.unpack(fmt, can_pkt)
can_id &= socket.CAN_EFF_MASK
data = data[:length]
print(data, can_id , can_pkt)
: 파이썬 3.3.7
코드를 사용하고 있습니다.
candump vcan0: vcan0 0FF [8] 77 9C 3C 21 A2 9A B9 66
output in Python: b'\xff\x00\x00\x00\x08\x00\x00\x00w\x9c<!\xa2\x9a\xb9f'
여기에서 vcan0은 인터페이스이고 [x]는 페이로드의 바이트 수이며 나머지는 8 바이트 16 진수 페이로드입니다.
잘못된 서식을 지정 했습니까? PF_CAN이 새로운 Python 버전으로 업데이트 되었습니까? 내 프로토콜 패밀리에 CAN_BCM을 사용해야 할 때 CAN_RAW를 사용하고 있습니까? 또는 압축을 푼 데이터를 디코딩하는 방법이 누락 되었습니까?
어떤 방향이나 대답을 주시면 감사하겠습니다.
또한, 내가 뽑은 can-utils 값에 대한 스크립트 출력은 다음과 같습니다. 내가 아무것도 찾을 수 없다면, 나는 아마도 많은 양의 데이터를 모으고 제대로 변환하지 않는 바이트의 데이터를 디코딩 할 것입니다. 나는 내가 일을 복잡하게 끝내고, 아마도 하나의 중요한면을 놓치고 있다고 생각합니다.
Python3 output == can-utils/socketCAN (hex)
M= == 4D 3D
~3 == 7E 33
p == 70
. == 2E
@ == 40
r: == 0D 3A
c == 63
5g == 35 67
y == 79
a == 61
) == 29
E == 45
M == 4D
C == 43
P> == 50 3E
SGN == 53 47 4E
8 == 38
정확히 내가 찾고있는 것이 었습니다. 비슷한 것을 시도했지만 적절한 구문을 사용하지 않아야합니다. 내가 헥스 아스키라고 어떻게 결정 했을까? 반 번역 된 결과물은 정말 저를 날려 버렸습니다. 포맷팅과 패딩 또는 프로토콜 패밀리와 관련이 있다고 생각했습니다. 다시 한 번 감사드립니다! –