2017-11-02 1 views
0

가상 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 

답변

1

시작한 테이블을 힘들게 완료하지 말고 모든 ASCII 코드 차트를 살펴보십시오. 단순히 문자열을 인쇄하면 실제로 ASCII 텍스트 인 모든 문자가 해당 문자로 인쇄됩니다. 인쇄 할 수없는 문자 만 16 진수 이스케이프로 표시됩니다. 당신은 진수의 모든을 원하는 경우에, 당신은 명시 적으로 요청해야한다 : 예를 들어

import binascii 

print(binascii.hexlify(data)) 

.

+0

정확히 내가 찾고있는 것이 었습니다. 비슷한 것을 시도했지만 적절한 구문을 사용하지 않아야합니다. 내가 헥스 아스키라고 어떻게 결정 했을까? 반 번역 된 결과물은 정말 저를 날려 버렸습니다. 포맷팅과 패딩 또는 프로토콜 패밀리와 관련이 있다고 생각했습니다. 다시 한 번 감사드립니다! –

0

이미 python-can 라이브러리를 실행하셨습니까? 그렇지 않다면 우리는 CAN 메시지의 데이터를 정확하게 파싱하는 socketcan의 파이썬 버전을 가지고 있습니다. 소스의 일부가 도움이 될 수도 있고 직접 사용할 수도 있습니다. CAN_RAW은 아마 당신이 원하는 것입니다. 실제 하드웨어를 위해 가상 캔을 떠날 계획이라면 get the timestamp from the hardware을 원할 수도 있습니다.

모든 상수가 Python의 소켓 모듈에 노출 된 것은 아니므로 socketcan 브로드 캐스트 관리자 같은 것을 실험하기 쉽도록 만든 ctypes 버전이 있습니다. 두 문서는 모두 here입니다.