808 프로토콜 해결

10196 단어 도구 및 기타
부표808 협의
통신 방식
프로토콜이 사용하는 통신 방식은 JT/T 794의 관련 규정에 부합되고 통신 프로토콜은 TCP 또는 UDP, 플랫폼을 사용해야 한다.
서버로서 터미널은 클라이언트로서데이터 통신 링크가 비정상적일 때 터미널은 SMS 메시지 방식으로 들어갈 수 있다
2. 데이터 유형
프로토콜 메시지에 사용되는 데이터 형식은 표1:
표 1 데이터 유형
데이터 형식
설명 및 요구 사항
BYTE
기호 없는 싱글바이트 정수(바이트, 8비트)
WORD
부호 없는 2바이트 정수 (글자, 16비트)
DWORD
부호 없는 4바이트 정형 (두 글자, 32비트)
BYTE[n]
n 바이트
BCD[n]
8421야드, n바이트
STRING
GBK 인코딩, 0 종결자 사용, 데이터가 없으면 0 종결자 넣기
전송 규칙
프로토콜은 빅뱅 모드 (big-endian) 의 네트워크 바이트 시퀀스로 글자와 두 글자를 전달합니다.
약정은 다음과 같습니다.
- 바이트(BYTE)의 전송 약정: 바이트 흐름에 따라 전송한다.
- 글자(WORD)의 전송 약정: 먼저 높은 8위를 전달하고 낮은 8위를 전달한다.
- 두 글자(DWORD)의 전송 약정: 먼저 24비트 높이를 전달한 다음에 16비트 높이를 전달하고 8비트 높이를 전달한다.
마지막으로 여덟 계단 아래로 패스했다.
3. 소식의 구성
메시지 구조
각 메시지는 식별 비트, 메시지 헤더, 메시지 글꼴 및 검사 코드로 구성되며 메시지 구조 다이어그램은 그림 1과 같습니다.
표지 위치
메시지 헤더
메시지
검사 코드
표지 위치
그림1 메시지 구조체
JT/T 808-2011
표지 위치
Ox7e 표시로 검사 코드, 메시지 헤더 및 메시지체에 0x7e가 나타나면 전의 처리, 전의
규칙은 다음과 같이 정의됩니다.
0x7e0x7d 뒤에 0x02 뒤따르기;
0x7d0x7d 뒤에 0x01이 옵니다.
이스케이프 프로세스는 다음과 같습니다.
메시지를 보낼 때: 메시지 봉인 -> 검사 코드를 계산하고 채우기 -> 전의;
메시지를 받을 때: 이스케이프 복원 -> 검증 코드 -> 메시지 확인.
예:
0x30 0x7e 0x08 0x7d 0x55 패키지를 전송하면 패키지는 0x7e 0x30 7d 0x02 0x08 0x7d 0x01 0x55 0x7e로 패키지됩니다.
 
해석 부분
    -----------------------------------------------------------
0x7e 0x1 0x0 0x0 0x21 0x1 0x41 0x46 0x66 0x53 0x47 0x0 0x29 0x0 0x2c 0x1 0x2f 0x37 0x30 0x31 0x31 0x31 0x42 0x53 0x4a 0x4d 0x31 0x31 0x2d 0x32 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x1 0xd4 0xc1 0x42 0x38 0x38 0x38 0x38 0x38 0x1e 0x7e

0x7e --    
0x1 0x0   --   (  ID)
0x0 0x21   --   (     ) (    : 0000 0000 0010 0001)       、   
0x1 0x41 0x46 0x66 0x53 0x47  --   (     )
0x0 0xf  --   (     )
0x0 0x2c --  ID
0x1 0x2f --   ID
0x37 0x30 0x31 0x31 0x31  --   ID
0x42 0x53 0x4a 0x4d 0x31 0x31 0x2d 0x32   --    
0x30 0x30 0x30 0x30 0x30 0x30 0x30   --  ID
0x1 --    (      01 02  ,        GBK   byte  )(JT/T 415-2006   5.4.12)
0xd4 0xc1 0x42 0x38 0x38 0x38 0x38 0x38  --  GBK  (                )
0x38   --    
0x7e   --   
---------------------------------------------------------------------------------------

  ---------8100  -------  
7E 81 00 00 0A 01 41 46 66 53 47 6B 26 00 0F 00 31 32 33 34 35 36 BA 7E

7E 81 00 
00 09 --    
01 41 46 66 53 47 --   
00 35 --  ID

00 0b --      
00 --    
31 32 33 34 35 36 --     
BA
7E

  --------------------------------102--------------------  --
0x7e 0x1 0x2 0x0 0x6 0x1 0x41 0x46 0x66 0x53 0x47 0x0 0xd 0x31 0x32 0x33 0x34 0x35 0x36 0x7b 0x7e
0x7e 
0x1 0x2 
0x0 0x6 --    
0x1 0x41 0x46 0x66 0x53 0x47 --   
0x0 0xe --  ID

0x31 0x32 0x33 0x34 0x35 0x36 
0x78 
0x7e

-----------------------------------------------------------------------------------------
  --------------------------801------------------------  -
7E 80 01 00 05 01 41 46 66 53 47 73 31 00 -- 01 02 00 

7E 
80 01 
00 05
01 41 46 66 53 47
73 13  //   

00 03  //     
01 02  //  ID
00     //    0  
--------------    ----------------
0x7e 0x2 0x0 0x0 0x40 0x1 0x41 0x46 0x66 0x53 0x47 0x0 0x7c 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x3 0x2 0x7 0xf2 0xb4 0x6 0xc9 0x72 0xf8 0x0 0x0 0x0 0x0 0x0 0x3d 0x20 0x7 0x11 0x11 0x7 0x41 0x1 0x4 0x0 0x0 0x0 0x0 0x30 0x1 0x12 0x31 0x1 0x18 0xeb 0x16 0x0 0xc 0x0 0xb2 0x89 0x86 0x4 0x42 0x19 0x19 0x91 0x5 0x37 0x95 0x0 0x6 0x0 0x89 0xff 0xff 0xff 0xff 0xae 0x7e

0x7e 
0x2 0x0 
0x0 0x40 
0x1 0x41 0x46 0x66 0x53 0x47 
0x0 0x3b 
0x0 0x0 0x0 0x0 ---    
0x0 0x0 0x0 0x3 ---      16 2    20 
0x2 0x7 0xf2 0xb4 ---   16 10      10   6      34075316   21-24
0x6 0xc9 0x72 0xf8 ---   16 10      10   6     113865464
0x0 0x0 ---       ,   
0x0 0x0 ---    16 10    10
0x0 0x3d ---    0-359,   0,     
0x20 0x7 0x11 0x11 0x2 0x20    20 07 11 11 02 20 
0x1 0x4 0x0 0x0 0x0 0x0 ---  
0x30 0x1   ID
0x12 0x31 0x1 0x18 0xeb 0x16 0x0 0xc 0x0 0xb2 0x89 0x86 0x4 0x42 0x19 0x19 0x91 0x5 0x37 0x95 
0x0 0x6 0x0 0x89 0xff 0xff 0xff 0xff 
0x8d 0x7e           
    :0100
    :7E 81 00 00 09 01 41 46 66 53 47 -- -- 00 -- 00 31 32 33 34 35 36
    :0102
    :7E 80 01 00 05 01 41 46 66 53 47 -- -- 00 -- 01 02 00 
    :0002
    :7E 80 01 00 05 01 41 46 66 53 47 -- -- 00 -- 00 02 00 
    :0200
    :7E 80 01 00 05 01 41 46 66 53 47 -- -- 00 -- 02 00 00
    :0704
    :7E 80 01 00 05 01 41 46 66 53 5f -- -- 00 -- 07 04 00

python 분석 예
import socketserver
import struct
import threading
import datetime
ADDRESS = ('0.0.0.0', 9904)  #     
import random
import ws8_bd09
g_conn_pool = []  #    

class Data_format(object):
    def str_to_hex(self,str):
        str = str.replace(' ', '')
        str2 = b""  #    
        while str:
            str1 = str[0:2]  #      ,       
            s = int(str1, 16)  #       16  
            str2 += struct.pack('B', s)  #       ,“B“    ,    unsigned char (     struct)
            str = str[2:]  #      ,          
        return str2

    def hex_to_str(self,data):
        res_data_list = [hex(x) for x in bytes(data)]
        data_str = ' '.join(res_data_list)
        return data_str

    def get_bcc(self,data):
        inputStr = data[3:]
        bcc = 0
        for i in inputStr.split(' '):
            bcc = bcc ^ int(i, 16)
        return data + " " + f'{bcc:x}'.upper() + " " + "7E"

    def data_handle(self,str):
        head_data, msg = " ", " "
        str_list = str.split(' ')
        head_id = str_list[1:3]
        if head_id == ['0x1', '0x0']:
            data = '7E 81 00 00 09 01 41 46 66 53 47 %s %s 00 %s 00 31 32 33 34 35 36' % (
            random.randint(10, 90), random.randint(10, 90), str_list[12][2:].rjust(2, '0'))
            head_data = self.get_bcc(data)
            msg = self.str_to_hex(head_data)
            # print(msg)
        if head_id == ['0x1', '0x2']:
            data = '7E 80 01 00 05 01 41 46 66 53 47 %s %s 00 %s 01 02 00' % (
                random.randint(10, 90), random.randint(10, 90), str_list[12][2:].rjust(2, '0'))
            head_data = self.get_bcc(data)
            msg = self.str_to_hex(head_data)
            # print(msg)

        if head_id == ['0x0', '0x2']:
            data = '7E 80 01 00 05 01 41 46 66 53 47 %s %s 00 %s 00 02 00' % (
                random.randint(10, 90), random.randint(10, 90), str_list[12][2:].rjust(2, '0'))
            head_data = self.get_bcc(data)
            msg = self.str_to_hex(head_data)
            # print(msg)
        if head_id == ['0x7', '0x4']:
            data = '7E 80 01 00 05 01 41 46 66 53 5f %s %s 00 %s 07 04 00' % (
                random.randint(10, 90), random.randint(10, 90), str_list[12][2:].rjust(2, '0'))
            head_data = self.get_bcc(data)
            msg = self.str_to_hex(head_data)
        if head_id == ['0x2', '0x0']:
            ret = self.format_data(str_list)
            bd09_pos = ws8_bd09.wgs84_to_bd09(ret[1]/1000000,ret[0]/1000000)
            with open('position.csv', 'a+') as a:
                a.write("%s,%s"%(bd09_pos[0],bd09_pos[1]) + '
') print(" :",ret) data = '7E 80 01 00 05 01 41 46 66 53 5f %s %s 00 %s 02 00 00' % ( random.randint(10, 90), random.randint(10, 90), str_list[12][2:].rjust(2, '0')) head_data = self.get_bcc(data) msg = self.str_to_hex(head_data) # print(msg) return head_data, msg def format_data(self,data_list): # data_list = data.split(' ') latitude = int('0x'+''.join([i[2:].rjust(2, '0') for i in data_list[21:25]]),16) longitude = int('0x'+''.join([i[2:].rjust(2, '0') for i in data_list[25:29]]),16) v = int('0x'+''.join([i[2:].rjust(2, '0') for i in data_list[31:33]]),16) h = int('0x'+''.join([i[2:].rjust(2, '0') for i in data_list[33:35]]),16) Time = ''.join([i[2:].rjust(2, '0') for i in data_list[35:41]]) return latitude,longitude,v,h,Time class ThreadedTCPRequestHandler(socketserver.BaseRequestHandler,Data_format): def setup(self): self.request.sendall(" !".encode(encoding='utf8')) # g_conn_pool.append(self.request) def handle(self): while True: # try: bytes = self.request.recv(1024) if bytes == " ": pass # print(hex(bytes)) # res_data_list = [hex(x) for x in bytes(data)] else: strBytes = self.hex_to_str(bytes) print(" %s:%s"% (datetime.datetime.now(),strBytes)) data = self.data_handle(strBytes) if data[0] == " ": pass else: print(' :',data[0]) g_conn_pool[0].sendall(data[1]) # except: # # self.remove() # break def finish(self): print(" 。") def remove(self): print(" 。") g_conn_pool.remove(self.request) self.request.close() class ThreadedTCPServer(socketserver.ThreadingMixIn, socketserver.TCPServer): pass if __name__ == '__main__': import time server = ThreadedTCPServer(ADDRESS, ThreadedTCPRequestHandler) # server_thread = threading.Thread(target=server.serve_forever) server_thread.daemon = True server_thread.start() # while True: msg = input('') # msg = server.get_bcc(msg) # print(' :',msg) # msg = str_to_hex(msg) # g_conn_pool[0].sendall(msg)

 
 
 
 
 
 
 
 
 

좋은 웹페이지 즐겨찾기