1. Trang chủ
  2. » Luận Văn - Báo Cáo

Định Dạng Bản Tin Giao Tiếp Giữa Thiết Bị Và Máy Chủ

14 4 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Định Dạng Bản Tin Giao Tiếp Giữa Thiết Bị Và Máy Chủ
Trường học University of Science and Technology
Chuyên ngành Communication Engineering
Thể loại Technical Document
Năm xuất bản 2023
Thành phố Hà Nội
Định dạng
Số trang 14
Dung lượng 334,8 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

1 ĐỊNH DẠNG BẢN TIN GIAO TIẾP GIỮA THIẾT BỊ VÀ MÁY CHỦ Contents 2 1 PHIÊN BẢN Revision Date Author Comments 3 0 Table 1 2 CÁC QUY ĐỊNH CHUNG 2 1 Định dạng và phân loại gói tin 2 1 1 Cấu trúc gói tin g[.]

Trang 1

ĐỊNH DẠNG BẢN TIN GIAO TIẾP GIỮA THIẾT BỊ VÀ MÁY CHỦ

Contents

Trang 2

1 PHIÊN BẢN

3.0

-

-

-

Table 1

2 CÁC QUY ĐỊNH CHUNG

2.1 Định dạng và phân loại gói tin

2.1.1 Cấu trúc gói tin giữa SERVER và MS - TCP/IP/SMS

Center và MS trao đổi thông tin với nhau bằng các gói tin Các gói tin có thể là gói TCP/UDP hoặc SMS Các gói tin trao đổi giữa Center và MSID là Text Kích thước toàn bộ gói tin không được lớn hơn 1KB Với gói tin SMS, kích thước tối đa của gói tin SMS là 160 byte

Mỗi gói tin có hai phần, gồm HEADER và phần MESSAGE:

(Tranmistion Packet) Header bao gồm:

SIGN: 4bytes kí hiệu bắt đầu gói tin, có giá trị là “TTDD”

SIZE: 3bytes: Tổng kích thước của gói tin, bằng kích thước HEADER cộng với kích thước của phần Text Base85, thể hiện dưới dạng kí tự HEXA

Bảng 1: Cấu trúc gói tin trao đổi giữa Center và MS (GPRS Packet)

2 SIZE Tổng kích thước gói tin, thể hiện dưới 3

HEADER

MESSAGE (Text Only-AES Encode)

Trang 3

dạng kí tự HEXA

3 MESSAGE Phụ thuộc vào loại dữ liệu Thay đổi

6 Tổng cộng Nội dung của MESSAGE đã được

Encrypt bằng ARC-4, sau đó chuyển thành Text bằng Base85

7+Kích thước MESSAGE

Mô tả:

1 secure_encrypt(option): Mã hoá khối dữ liệu cần gửi đi với khoá là “MSPWD” thay đổi tùy theo doanh

nghiệp

Với MS, khoá lưu tại Mobile Station Với SVR, khoá được lưu trong database (Khoá ở SVR và khoá ở Mobile Station phải giống nhau)

2.base85_encode (option): Mã hoá với phương thức BASE85 để chuyển tất cả dữ liệu Binary thành Text, thích

hợp cho truyền thông với Modem GSM/GPRS

3 pack_data: Đóng gói thành GPRS Packed

4 send_data: Gửi dữ liệu đi

Các bước xử lý khi nhận được dữ liệu:

1 receive_data: Nhận dữ liệu là khối GPRS Packed

2 base85_deccode (option): Giải mã với phương thức BASE85 để chuyển dữ liệu từ dạng Text thành Binary

Add

Header

DataPacked

(RAW Pack)

Encrypted Arc-4

GPRS Packed (Send)

DataPacked (RAW Packet)

Xử lý dữ liệu trước khi gửi đi:

Xử lý dữ liệu khi sau khi nhận:

Secure

Encrypt

Base85

Encode

Text (Base85 )

Remove

Header

GPRS Packed

(Received)

Decrypt

Text (Base85 )

Base85

Encode

Encrypted Arc-4

Trang 4

3 secure_decrypt (option): Giải mã với khoá là “MSPWD”

4 process_data: Xử lý dữ liệu gốc nhận được

2.1.2 Cấu trúc gói tin DataPacked (RAW DATA)

Dữ liệu thô sẽ có cấu trúc như sau:

Bảng ?: Các trường trong gói dữ liệu thô

1 ID/IMEI Chuỗi ID hoặc IMEI của thiêt

bị

15

3 Time(RTC) Thời gian thực của thiết bị 7 Thời gian tạo ra

gói tin # thời gian gửi gói tin

đổi

Phụ thuộc vào Command ID

2.2 Phân loại gói tin

ID/IMEI (15 Bytes) Command_ID (1 Bytes) Time (RTC) (7 Byte)

Command_DATA (Command Data - nBytes) (Ít nhất 1 Byte)

Trang 5

STT Tên Giá

trị

của trung tâm/MS…

2 WLR_CMD_ACK 0x02 Xác nhận đã nhận được gói tin,

hoặc thông tin đăng nhập hệ thống

A

3 WLR_CMD_NORMAL_DATA 0x6D Thông tin dữ liệu GPS, LBS,

Wifi của hệ thống

M

4

Các gói tin có thể được truyền theo thời gian thực hoặc truyền theo sự kiện hoặc được kết hợp cả hay phương thức để tăng hiệu năng và giảm chi phí đường truyền

Để xác định chính xác loại dữ liệu cần xác định COMMAND_ID của gói Trong khi truyền về trung tâm, nếu đường truyền không tốt thì sẽ được lưu trữ tạm thời trên bộ nhớ trong của thiết bị và truyền lại khi có tín hiệu tốt trở lại

2.2.1 Cách tính checksum

Checkum được nói đến trong tài liệu này được thực hiện bởi ngôn ngữ C như bên dưới

static const uint16_t crctab16[] = {

0x0000, 0x1189, 0x2312, 0x329b, 0x4624, 0x57ad, 0x6536, 0x74bf,

0x8c48, 0x9dc1, 0xaf5a, 0xbed3, 0xca6c, 0xdbe5, 0xe97e, 0xf8f7,

0x1081, 0x0108, 0x3393, 0x221a, 0x56a5, 0x472c, 0x75b7, 0x643e,

0x9cc9, 0x8d40, 0xbfdb, 0xae52, 0xdaed, 0xcb64, 0xf9ff, 0xe876,

0x2102, 0x308b, 0x0210, 0x1399, 0x6726, 0x76af, 0x4434, 0x55bd,

0xad4a, 0xbcc3, 0x8e58, 0x9fd1, 0xeb6e, 0xfae7, 0xc87c, 0xd9f5,

0x3183, 0x200a, 0x1291, 0x0318, 0x77a7, 0x662e, 0x54b5, 0x453c,

0xbdcb, 0xac42, 0x9ed9, 0x8f50, 0xfbef, 0xea66, 0xd8fd, 0xc974,

0x4204, 0x538d, 0x6116, 0x709f, 0x0420, 0x15a9, 0x2732, 0x36bb,

0xce4c, 0xdfc5, 0xed5e, 0xfcd7, 0x8868, 0x99e1, 0xab7a, 0xbaf3,

0x5285, 0x430c, 0x7197, 0x601e, 0x14a1, 0x0528, 0x37b3, 0x263a,

0xdecd, 0xcf44, 0xfddf, 0xec56, 0x98e9, 0x8960, 0xbbfb, 0xaa72,

0x6306, 0x728f, 0x4014, 0x519d, 0x2522, 0x34ab, 0x0630, 0x17b9,

0xef4e, 0xfec7, 0xcc5c, 0xddd5, 0xa96a, 0xb8e3, 0x8a78, 0x9bf1,

0x7387, 0x620e, 0x5095, 0x411c, 0x35a3, 0x242a, 0x16b1, 0x0738,

Trang 6

0xffcf, 0xee46, 0xdcdd, 0xcd54, 0xb9eb, 0xa862, 0x9af9, 0x8b70,

0x8408, 0x9581, 0xa71a, 0xb693, 0xc22c, 0xd3a5, 0xe13e, 0xf0b7,

0x0840, 0x19c9, 0x2b52, 0x3adb, 0x4e64, 0x5fed, 0x6d76, 0x7cff,

0x9489, 0x8500, 0xb79b, 0xa612, 0xd2ad, 0xc324, 0xf1bf, 0xe036,

0x18c1, 0x0948, 0x3bd3, 0x2a5a, 0x5ee5, 0x4f6c, 0x7df7, 0x6c7e,

0xa50a, 0xb483, 0x8618, 0x9791, 0xe32e, 0xf2a7, 0xc03c, 0xd1b5,

0x2942, 0x38cb, 0x0a50, 0x1bd9, 0x6f66, 0x7eef, 0x4c74, 0x5dfd,

0xb58b, 0xa402, 0x9699, 0x8710, 0xf3af, 0xe226, 0xd0bd, 0xc134,

0x39c3, 0x284a, 0x1ad1, 0x0b58, 0x7fe7, 0x6e6e, 0x5cf5, 0x4d7c,

0xc60c, 0xd785, 0xe51e, 0xf497, 0x8028, 0x91a1, 0xa33a, 0xb2b3,

0x4a44, 0x5bcd, 0x6956, 0x78df, 0x0c60, 0x1de9, 0x2f72, 0x3efb,

0xd68d, 0xc704, 0xf59f, 0xe416, 0x90a9, 0x8120, 0xb3bb, 0xa232,

0x5ac5, 0x4b4c, 0x79d7, 0x685e, 0x1ce1, 0x0d68, 0x3ff3, 0x2e7a,

0xe70e, 0xf687, 0xc41c, 0xd595, 0xa12a, 0xb0a3, 0x8238, 0x93b1,

0x6b46, 0x7acf, 0x4854, 0x59dd, 0x2d62, 0x3ceb, 0x0e70, 0x1ff9,

0xf78f, 0xe606, 0xd49d, 0xc514, 0xb1ab, 0xa022, 0x92b9, 0x8330,

0x7bc7, 0x6a4e, 0x58d5, 0x495c, 0x3de3, 0x2c6a, 0x1ef1, 0x0f78,

};

/* calculate 16 bits CRC of the given length data */

uint16_t GetCrc16(const uint8_t* pData, uint32_t nLength){

uint16_t fcs = 0xffff; // Initialize

while(nLength>0){

fcs = (fcs >> 8) ^ crctab16[(fcs ^ *pData) & 0xff];

nLength ;

pData++;

}

return ~fcs; // Negate

}

/* Check whether the 16 bits CRC of the given length data is right */

uint8_t IsCrc16Good(const uint8_t* pData, uint32_t nLength)

{

uint16_t fcs = 0xffff; // Initialize

while(nLength>0){

fcs = (fcs >> 8) ^ crctab16[(fcs ^ *pData) & 0xff];

nLength ;

pData++;

}

return (fcs == 0xf0b8); // 0xf0b8 is CRC-ITU? "Magic Value"

}

2.2.2 Mã hóa arc-4

/*

* ARC4 key schedule

*/

Trang 7

void arc4_setup( arc4_context *ctx, unsigned char *key, int keylen )

{

int i, j, k, a;

unsigned char *m;

ctx->x = 0;

ctx->y = 0;

m = ctx->m;

for( i = 0; i < 256; i++ )

m[i] = (unsigned char) i;

j = k = 0;

for( i = 0; i < 256; i++, k++ )

{

if( k >= keylen ) k = 0;

a = m[i];

j = ( j + a + key[k] ) & 0xFF;

m[i] = m[j];

m[j] = (unsigned char) a;

}

}

/*

* ARC4 cipher function

*/

void arc4_crypt( arc4_context *ctx, unsigned char *buf, int buflen )

{

int i, x, y, a, b;

unsigned char *m;

x = ctx->x;

y = ctx->y;

m = ctx->m;

for( i = 0; i < buflen; i++ )

{

x = ( x + 1 ) & 0xFF; a = m[x];

y = ( y + a ) & 0xFF; b = m[y];

m[x] = (unsigned char) b;

m[y] = (unsigned char) a;

Trang 8

buf[i] = (unsigned char)

( buf[i] ^ m[(unsigned char)( a + b )] );

}

ctx->x = x;

ctx->y = y;

}

2.2.3 Mã hóa base85

#ifndef uint8

#define uint8 unsigned char

#endif

#ifndef uint32

#define uint32 unsigned long

#endif

/*

* 32-bit integer manipulation macros (big endian)

*/

#ifndef GET_UINT32_BE

#define GET_UINT32_BE(n,b,i) \

{ \

(n) = ( (uint32) (b)[(i) ] << 24 ) \

| ( (uint32) (b)[(i) + 1] << 16 ) \

| ( (uint32) (b)[(i) + 2] << 8 ) \

| ( (uint32) (b)[(i) + 3] ); \

}

#endif

#ifndef PUT_UINT32_BE

#define PUT_UINT32_BE(n,b,i) \

{ \

(b)[(i) ] = (uint8) ( (n) >> 24 ); \

(b)[(i) + 1] = (uint8) ( (n) >> 16 ); \

(b)[(i) + 2] = (uint8) ( (n) >> 8 ); \

(b)[(i) + 3] = (uint8) ( (n) ); \

}

#endif

//

//85*85*85*85, 85*85*85, 85*85, 85, 1

static unsigned long pow85[] = {

85*85*85*85, 85*85*85, 85*85, 85, 1

};

Trang 9

/************************************************************************************/ union u {unsigned long vi; unsigned char c[sizeof(unsigned long)];};

union v {unsigned long ni; unsigned char d[sizeof(unsigned long)];};

unsigned long base85_swap (unsigned long nLongNumber)

{

union u un;

union v vn;

un.vi = nLongNumber;

vn.d[0]=un.c[3];

vn.d[1]=un.c[2];

vn.d[2]=un.c[1];

vn.d[3]=un.c[0];

return (vn.ni);

}

/**************************************************************************************

**/

int base85_encode( unsigned char *dst, int *dlen, unsigned char *src, int slen )

{

int i, bulket, count;

long number;

long *pnumber;

unsigned char *pout , *pin;

char buf[5], *s ;

s = buf;

pout = dst;

pin = src;

bulket = slen/4;

count = slen%4;

*pout++= '<';

*pout++= '~';

for (i = 0; i < bulket; i++)

{

//GET_UINT32_BE(number, pin, 0);

//number=get_uint32_be(pin,0);

pnumber = (long *) pin;

number =base85_swap(*pnumber);

if (number == 0)

*(pout++) = 'z';

else

{

*(pout+4) = (unsigned char)('!' + (number % 85)); number /= 85;//'!' == 33

*(pout+3) = (unsigned char)('!' + number % 85); number /= 85;

Trang 10

*(pout+2) = (unsigned char)('!' + number % 85); number /= 85;

*(pout+1) = (unsigned char)('!' + number % 85); number /= 85;

*(pout) = (unsigned char)('!' + number % 85); number /= 85;

pout+=5;

}

pin+=4;

}

if (count)

{

number = 0;

memset(buf, 0, 5);

memcpy(buf, pin, count);

//GET_UINT32_BE(number, buf, 0);

//number=get_uint32_be(buf,0);

pnumber = (long *) buf;

number =base85_swap(*pnumber);

i = 5;

do

{

*s++ = (char)(number % 85);

number /= 85;

} while ( i > 0);

i = count;

do

{

s ;

*pout++ = *s+'!';

} while (i > 0);

}

*pout++ = '~';

*pout++ = '>';

*dlen = pout - dst;

*pout = 0;

return *dlen;

}

/**************************************************************************************

**/

int base85_decode( unsigned char *dst, int *dlen, unsigned char *src, int slen )

{

int buckets;

int count = 0;

int c = 0;

Trang 11

int i = 0;

long number = 0;

unsigned char *pout, *pin;

long *pnumber;

unsigned char *p;

buckets = slen / 5;

pout = dst;

pin = src;

*dlen = 0;

if (*(pin++) != '<')

return -1;

if (*(pin++) != '~')

return -1;

for (i = 0; i < slen; i++)

{

switch (c = *(pin++))

{

default:

{

if (c < '!' || c > 'u')

{

return -1;

}

number += (c - '!') * pow85[count++];

if (count == 5)

{

//PUT_UINT32_BE(number, pout, 0);

pnumber = (long *)pout;

*pnumber=base85_swap(number);

count = 0;

number = 0;

pout+=4;

}

break;

}

case 'z':

{

if (count != 0)

{

return -1;

}

*pout++=0;

*pout++=0;

Trang 12

*pout++=0;

*pout++=0;

break;

}

case '~':

{

if (*(pin) == '>')

{

if (count > 0)

{

count ;

number += pow85[count];

number = base85_swap(number);

p =(unsigned char*)&number;

switch (count)

{

case 3:

memcpy(pout,&p[0],3);

//*pout++ = number >> 24;

//*pout++ = number >> 16;

//*pout++ = number >> 8;

pout+=3;

break;

case 2:

memcpy(pout,&p[0],2);

//*pout++ = number >> 24;

//*pout++ = number >> 16;

pout++;

pout++;

break;

case 1:

memcpy(pout,&p[0],1);

pout++;

//*pout++ = number >> 24;

break;

}

}

*dlen = pout - dst;

dst[*dlen] = 0;

return *dlen;

}

}

Trang 13

case '\n': case '\r': case '\t': case ' ':

case '\0': case '\f': case '\b': case 0177:

break;

}

}

return -1;

}

2.2.4

2.3 Cơ chế giao tiếp với máy chủ

Thiết bị kết nối với máy chủ thông qua một cơ chế được định nghĩa theo sơ đồ dưới đây:

Connect

Send 1st code value and tracker infomation in heartbeat package

Generate a

heartbeat package

Receive 1st code

Generate a package to confirm

a real device

Send a package is the same heart package within a code to respond

Compare

between 2nd code

and 1st code, then

perform

autheniticating a

true server

DATA

Perform sending

data and other

operation

Receive data

Code2 = fnc(Code1_Arr, IP_PORT, private key) Code1 = fnc(IP_PORT, private key)

Figure 1: Cơ chế bắt tay giữa server và thiết bị

- Code1 là một mã được gửi tới server lần đầu tiên khi kết nối được server chấp nhận, được tạo ra bởi thiết bị Code1 dùng để cho server xác thực thiết bị đang kết nối là một thiết bị có thực và đã được đăng

Trang 14

- Code2 là mã được tạo ra bởi thiết bị và dùng để so sánh với với cái code mà server gửi lại Code2 dùng

để thiết bị xác thực server nó đang kết nối

- fnc() là phương thức tổng hợp code

- Private key: được bảo mật bởi nhà phát triển sản phẩm

3 Mô tả chi tiết về dữ liệu của bản tin

3.1 Gói tin HB/Hansake

3.2 Gói tin dữ liệu thường xuyên

Ngày đăng: 28/02/2023, 17:59

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w