Professional Documents
Culture Documents
ĐỊNH DẠNG BẢN TIN GIAO TIẾP GIỮA THIẾT BỊ VÀ MÁY CHỦ
Contents
1
-------------------------------------------------------------------------------------------------------------------------------------------------------
1. PHIÊN BẢN
Revision Date Author Comments
-
-
3.0
-
Table 1
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.
HEADER
MESSAGE (Text Only-AES Encode)
7 Bytes n Bytes
(Tranmistion Packet)
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
-------------------------------------------------------------------------------------------------------------------------------------------------------
dạng kí tự HEXA.
GPRS Packed
DataPacked Secure Encrypted Base85 Text Add
(Send)
(RAW Pack) Arc-4 (Base85 )
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.
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.
3
-------------------------------------------------------------------------------------------------------------------------------------------------------
ID/IMEI
(15 Bytes)
Command_ID
(1 Bytes)
Time (RTC)
(7 Byte)
Command_DATA
2 COMMAND_ID Mã lệnh. 1
4
-------------------------------------------------------------------------------------------------------------------------------------------------------
trị
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.
5
-------------------------------------------------------------------------------------------------------------------------------------------------------
6
-------------------------------------------------------------------------------------------------------------------------------------------------------
{
int i, j, k, a;
unsigned char *m;
ctx->x = 0;
ctx->y = 0;
m = ctx->m;
j = 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;
7
-------------------------------------------------------------------------------------------------------------------------------------------------------
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
};
8
-------------------------------------------------------------------------------------------------------------------------------------------------------
/************************************************************************************/
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;
9
-------------------------------------------------------------------------------------------------------------------------------------------------------
}
*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;
10
-------------------------------------------------------------------------------------------------------------------------------------------------------
int c = 0;
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;
11
-------------------------------------------------------------------------------------------------------------------------------------------------------
*pout++=0;
*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;
}
12
-------------------------------------------------------------------------------------------------------------------------------------------------------
return -1;
}
2.2.4.
13
-------------------------------------------------------------------------------------------------------------------------------------------------------
- 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
ký.
- 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.
- Private key: được bảo mật bởi nhà phát triển sản phẩm.
14