[an error occurred while processing this directive]
если поймешь, мож заоодно и ошибку найдешь:)
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено ы 16 января 2006 г. 17:37
В ответ на: Не будутли так любезны, много уважаемые джины, поделиться сикретом кодирования раскодирования сверх сикретного формата PDU, под С++ или Delphi отправлено <font color=gray>TamTam 1</font> 16 января 2006 г. 17:28


ТАБЛИЦЫ
AREA SMS_TBL, CODE, READONLY

ENTRY

EXPORT GsmToAscii
EXPORT AsciiToGsm
EXPORT BinToAscii
EXPORT IsAscHexTbl

GsmToAscii DCB "@?$???????\r??\n???_????????? ????"
DCB " !\"#¤%&'()*+,-./0123456789:;<=>?"
DCB "¦ABCDEFGHIJKLMNOPQRSTUVWXYZ????§"
DCB "?abcdefghijklmnopqrstuvwxyz?????"

AsciiToGsm DCB "??????????\r??\n??????????????????"
DCB " !\"#\x02""%&'()*+,-./0123456789:;<=>?"
DCB "\x00""ABCDEFGHIJKLMNOPQRSTUVWXYZ????\x11"
DCB "?abcdefghijklmnopqrstuvwxyz?????"
DCB "????????????????????????????????"
DCB "????$?@_????????????????????????"
DCB "????????????????????????????????"
DCB "????????????????????????????????"

BinToAscii DCB "0123456789ABCDEF"

;// 0 1 2 3 4 5 6 7 8 9 A B C D E F
IsAscHexTbl DCB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0,0,0,0,0 ; // 0
DCB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0,0,0,0,0 ; // 1
DCB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0,0,0,0,0 ; // 2
DCB 1, 2, 3, 4, 5, 6, 7, 8, 9,10, 0,0,0,0,0,0 ; // 3
DCB 0,11,12,13,14,15,16, 0, 0, 0, 0,0,0,0,0,0 ; // 4
DCB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0,0,0,0,0 ; // 5
DCB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0,0,0,0,0 ; // 6
DCB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0,0,0,0,0 ; // 7
DCB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0,0,0,0,0 ; // 8
DCB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0,0,0,0,0 ; // 9
DCB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0,0,0,0,0 ; // A
DCB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0,0,0,0,0 ; // B
DCB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0,0,0,0,0 ; // C
DCB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0,0,0,0,0 ; // D
DCB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0,0,0,0,0 ; // E
DCB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0,0,0,0,0 ; // F

END
КОД

#include "sms.h"
#include "time.h"
#include "sa_string.h"
#include "sa_stdlib.h"

#define SMS_SCA 0
#define SWAPB(b) (((b) >> 4) + ((b) << 4) & 0xff)

/******************************************************************************
* DESCRIPTION:
*
*****************************************************************************/
extern u8_t BinToAscii [];
static void WrB(u8_t **d,u8_t b) {
REG_t u8_t *s = BinToAscii;
*(*d)++ = s[b >> 4 ];
*(*d)++ = s[b & 15];
}
/******************************************************************************
* DESCRIPTION:
*
*****************************************************************************/
extern u8_t IsAscHexTbl[];
static u8_t RdB(u8_t **s) {
REG_t u8_t *a = IsAscHexTbl;
REG_t u8_t b;
b = a[*(*s)++] << 4 ;
return (b | a[*(*s)++]) - 0x11;
}

/******************************************************************************
* DESCRIPTION:
*
*****************************************************************************/
static u8_t Get2OCT(u8_t **s) {
REG_t u8_t *a = IsAscHexTbl;
REG_t u8_t b;
b = a[*(*s)++] ;
return b + a[*(*s)++] * 10 - 11;
}

/******************************************************************************
* DESCRIPTION:
*
*****************************************************************************/
static u8_t TestAscii(u8_t *src,u16_t len) {
REG_t u8_t *a = IsAscHexTbl;
if (!len || (len & 1)) {
return NOK;
}
do {
EXNOK(a[*src++],NOK);
} while(--len);
return OK;
}

/******************************************************************************
* DESCRIPTION:
*
*****************************************************************************/
static u8_t rdADR(u8_t *dst,u8_t ** sa,u8_t id, u16_t *pFsz) {
REG_t u64_t u64 ;
REG_t u8_t *p ;
REG_t u32_t i ;
REG_t u32_t Fsz ;
REG_t u32_t asz ;
REG_t u32_t b ;

Fsz = *pFsz;
if (Fsz < 2) {
return NOK;
}

b = RdB(sa); // len
*(dst + 1) = RdB(sa); // tof
Fsz -= 2 ;

if (id == SMS_SCA) {
b--;
if (!b || (b > 7) || (b > Fsz)) {
return NOK;
}

} else {
// TP-OA or TP-DA
b = (b + 1) >> 1;
if ((b > 6) || (b > Fsz)) {
return NOK;
}
}
Fsz -= b ;
asz =
i = b ;
u64 -= u64; //= 0
do {
u64 <<= 8;
b = RdB(sa) ;
u64 |= SWAPB(b);
} while(--i);

i = asz * 2;
if ((u64 & 0x0F) == 15) {
u64 >>= 4;
i-- ;
}
*dst = i ;
p = dst + 7 ;
i = 6 ;
do { *p-- = u64;
u64 >>= 8 ;
} while(--i) ;

EXNOK (Fsz,NOK);
*pFsz = Fsz ;
return OK ;
}
/******************************************************************************
* DESCRIPTION:
*
*****************************************************************************/
static void wrADR(u8_t **dst,u8_t *src,u8_t id) {
REG_t u64_t u64;
REG_t u32_t sz ;
REG_t u32_t i ;
REG_t u32_t b ;
// src (adress structure):
// 0 1 2 3 4 5 6 7
// dig_sz tof aa bb cc dd ee ff
sz =
b = *src;
if (!id) {
b = (b + 3) >> 1;
}
WrB(dst,b ); // wr len
WrB(dst,*(src + 1)); // wr tof

u64 = 0x0F;
src += 7;
i = (sz + 1) >> 1;

do { u64 <<= 8 ;
b = *src-- ;
u64 |= SWAPB(b);
} while (--i);

if (sz & 1) {
u64 >>= 4;
}
sz = (sz + 1) >> 1;

do { WrB(dst,u64); u64 >>= 8;
} while (--sz);
}

/******************************************************************************
* DESCRIPTION:
*
* Decode SMS
*
*****************************************************************************/
extern u8_t GsmToAscii[];
PRAGMA(OPTIMIZE_SIZE)
u8_t SMS_Decode(SMSCtx_t *pSms,u8_t *src,u16_t sz) {
Time_t Tm ;
u8_t *p ;
REG_t u8_t *pd ;
REG_t u8_t *pt ;
REG_t u32_t b ;
REG_t u32_t sub ;
REG_t u32_t w ;

pSms->flag = SMS_PARSE_ERROR;
EXNOK(TestAscii(src,sz),NOK);
sz /= 2 ;
p = src;
/////// read SCA
EXNOK(rdADR(pSms->tpSCA,&p,SMS_SCA,&sz),NOK);
/////// check Type Of Adress
//.........
sub = RdB(&p) ;
EXNOK( --sz,NOK);

///// SMS-SUBMIT : SCA(?) + MTI(1) + MR(1) + DA(?) + PID(1) + DCS(1) + VP(1) + UDL(1) + UD(....
///// SMS-DELIVER: SCA(?) + MTI(1) + OA(?) + PID(1) + DCS(1) + SCTS(7) + UDL(1) + UD(....
pSms->tpMTI = sub;
sub &= 3;
if ((sub == BIN(10)) || // STATUS REPORT
(sub == BIN(11))) { // RESERVED
pSms->flag = SMS_UNSUPPORT;
return OK;
}
if (sub) {
// read tpMR (skip)
p += 2;
EXNOK(--sz,NOK);
}
/////// read OA or DA
EXNOK(rdADR(sub ? pSms->tpDA : pSms->tpOA,&p,!SMS_SCA,&sz),NOK);
if (sz <= 2) {
return NOK;
}
/////// read PID, skip if !=0
b = RdB(&p);
if (b) {
pSms->flag = SMS_UNSUPPORT;
return OK;
}
/////// read DCS (only 00000000 accept)
//tpDCS
b = RdB(&p);
if (b) {
pSms->flag = SMS_UNSUPPORT;
return OK;
}
sz -= 2; // PID + DCS
/////////////////////////////
//////// read VP or SCTS //
/////////////////////////////
if (sub) {
if (pSms->tpMTI & BIN8(00011000)) {
///// read VP (skip)
if (sz < 2) {
return NOK;
}
p += 2;
sz -= 2;
} else {
///// no VP, sz-- by UDL
EXNOK(sz--,NOK);
}
} else {
///// read SCTS
if (sz < (7 + 1)) {
return NOK;
}
sz -= 8;
Tm.year = Get2OCT(&p) + 2000;
Tm.month = Get2OCT(&p);
Tm.day = Get2OCT(&p);
Tm.hour = Get2OCT(&p);
Tm.minute = Get2OCT(&p);
Tm.sec = Get2OCT(&p); p +=2; // skip time zone
pSms->tpSCTS = DT_Long(&Tm);
}
/////// read UDL
b = RdB(&p);
if (!sz && !b) {
pSms->tpUDL = 0;
pSms->flag = 0;
return NOK;
}
EXNOK(b, NOK);
// there only default GSM alphabet!
// b = number of characters
// chck sz & b
sub = (b * 7);
if (sub & 7) {
sub += 8;
}
sub >>= 3;
if ((sub > sz) || (b > 160)) {
return NOK;
}
// start convert
//7654321076543210
// 10000000 s=0 n=1
// 221111111 s=1 n=2
// 3332222222 s=2 n=3
// 44443333333 s=3 n=4
// 555554444444 s=4 n=5
// 6666665555555 s=5 n=6
// 77777776666666 s=6 n=7
// 988888887777777 s=7 n=0 get 2 w n=1
// AA9999999 s=1 n=2
// BBBAAAAAAA s=2 n=3
// CCCCBBBBBBB s=3 n=4
// DDDDDCCCCCCC s=4 n=5
// EEEEEEDDDDDDD s=5 n=6
// FFFFFFFEEEEEEE s=6 n=7
// 10000000FFFFFFF s=7 n=0 get 2 w n=1
// ...and so on.....
pSms->tpUDL = b;
pd = pSms->tpUD;
pt = GsmToAscii;
sub = 0;
w = 0;
while(b--) {
w |= RdB(&p) << sub ;
sub = (sub + 1) & 7 ;
*pd++ = pt[w & 0x7f] ;
w >>= 7;
if (!sub && b) {
sub = 1;
b--;
*pd++ = pt[w & 0x7f];
w >>= 7;
}
}
pSms->flag = 0;
return OK;
}
PRAGMA(OPTIMIZE_TIME)
/******************************************************************************
* DESCRIPTION:
*
* Encode SMS
*
*****************************************************************************/
extern u8_t GsmToAscii[];
u8_t SMS_Encode(SMSCtx_t *pSms,u8_t *dst,u8_t ToAscii,u16_t *tSz) {
u8_t *p = dst;
u32_t b ;
u8_t *bta ;
u8_t *gta ;
u8_t *pd ;
u8_t sh ;
u8_t ch ;
u16_t w ;
u32_t i ;
///// SMS-SUBMIT : SCA(?) + MTI(1) + MR(1) + DA(?) + PID(1) + DCS(1) + VP(1) + UDL(1) + UD(....

//////// wr SCA ///////
wrADR(&p,pSms->tpSCA,SMS_SCA);
/////// MTI:sumbit ///
b = pSms->tpMTI & 0xFC;
WrB(&p,b | 1);
//////// MR : 00 //////
WrB(&p,0);
////////// DA /////////
wrADR(&p,pSms->tpDA,!SMS_SCA);
/////// PID:00 ///////
WrB(&p,0);
/////// DCS:00 ///////
WrB(&p,0);
///////// VP //////////
if (b & BIN8(00011000)) {
WrB(&p,pSms->tpVP);
}
//////// UDL //////////
b = pSms->tpUDL;
if (!b || (b > 160)) {
return NOK;
}

if (ToAscii) {
b *=2;
}
WrB(&p,b);
//7654321076543210
// s=0
// 0000000 0 s=7
// 11111110000000 =>8 1 s=6
// 111111
// 2222222111111 =>8 2 s=5
// 22222
// 333333322222 =>8 3 s=4
// 3333
// 44444443333 =>8 4 s=3
// 444
// 5555555444 =>8 5 s=2
// 55
// 666666655 =>8 6 s=1
// 6
// 77777776 =>8 7 s=0
// ...and so on.....
bta = BinToAscii;
gta = GsmToAscii;
w = 0;
sh = 0;
pd = pSms->tpUD;
if ((b * 7) & 7) {
b++;
}

if (ToAscii) {
i = 0;
while(b) {
if (i & 1) {
ch = *pd++ & 0x0f;
} else {
ch = *pd >> 4 ;
}
i++;
w |= (u16_t)gta[bta[ch]] << sh;
if (sh) {
WrB(&p,w);w >>= 8;
}
sh = (sh - 1) & 7;
b--;
}
} else {
while(b) {
w |= (u16_t)gta[*pd++ & 0x7f] << sh;
if (sh) {
WrB(&p,w);w >>= 8;
}
sh = (sh - 1) & 7;
b--;
}
}
///////////////
*tSz = (u16_t)(p - dst);
return OK;
}

/*
SMSCtx_t SMSCtx;
//const u8_t* smsstr = (u8_t*)"07919730071101F22403B986F4000050801181046261A0C227130497A7ED653A089E2687E5E1791A34AFAFD320725D9E06E9DFF03048CCCE87C969D09B5D06BDD965D09B5D060DA7CB6030081AA3CB6D78FAED0695C561B73B9D07D941F2371DB40EEBC37850FB2D2F83C865B639ED4E83CAECF29A2E7FCFE961F7381D06E5E56110BC4C4EAFD3A0769D9C5EA74179F99B9C06A541F6F01C5D06D9E769D0F9FD7EBFC9";
const u8_t* smsstr = (u8_t*)"07910759679901F001000B919761126640F100000341E110";
//const u8_t* txstr = (u8_t*)"This is a PDU message";
u8_t SmsTxBuf[500];

static void InitTx(void) {
u8_t i;
u8_t *p;

// SMSCtx.tpUDL = 80 ;
// for (i=0;i<80;i++)
// SMSCtx.tpUD[i] = i;

// i = sa_strlen((u8_t*)txstr);
// sa_memcpy(SMSCtx.tpUD,(u8_t*)txstr,i);
// SMSCtx.tpUDL = i;

SMSCtx.tpUDL = 1;
SMSCtx.tpUD[0] = 0xFF;
}

void SMS_Test(void) {
u16_t sz;
u8_t *p=SmsTxBuf;


sz = sa_strlen((u8_t*)smsstr);

SMS_Decode(&SMSCtx,(u8_t*)smsstr,sz);

// DA<=OA
// sa_memcpy(SMSCtx.tpDA,SMSCtx.tpOA,8);
InitTx();
SMS_Encode(&SMSCtx,p,1,&sz);

SMS_Decode(&SMSCtx,p,sz);

while(1) {
sz = sz;
sz = sz;
}
}
*/


Составить ответ  |||  Конференция  |||  Архив

Ответы


Отправка ответа

Имя (обязательно): 
Пароль: 
E-mail: 
NoIX ключ Запомнить

Тема (обязательно):
Сообщение:

Ссылка на URL: 
Название ссылки: 

URL изображения: 


Rambler's Top100 Рейтинг@Mail.ru
Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание

E-mail: info@telesys.ru