
Поделитесь информацией, пожалуйста, кто что делал

PS: сообщения будут динамические. Если бы нужно было определенное слово конвертнуть в PDU, я бы заюзал прогу PDUSpy

Спасибо!
![]() |
roboforum.ruТехнический форум по робототехнике. |
|
|
Реклама | ||||
|
|
|||
![]() |
Реклама | ||||
|
|
|||
![]() |
Omega писал(а):А Вы пожалуй писали ф-ю по декодированию СМС из PDU (а Ваш сименс текстовый формат точно не поддерживает)?
Omega писал(а):предположим команд 8мь.
Omega писал(а):сравнивать побайтно к какой команде относится та или иная СМС
Omega писал(а):А Вы пожалуй писали ф-ю по декодированию СМС из PDU ... Либо Вы просто ... сравнивали на предмет соответствия шаблону?
///////////////////////// Создаем PDU ///////////////////////////////////////////////
void create_pdu(void)
{
unsigned char i, offset, length, n;
pdu_data[0] = 0x00;
pdu_data[1] = 0x01; //исходящее сообщение
pdu_data[2] = 0x00;
pdu_data[3] = sms_dest[0] << 1; //число цифр номера
if ((sms_dest[sms_dest[0]] & 0x0F) == 0x0F) pdu_data[3]--;
pdu_data[4] = 0x91; //интернациональный номер
for (i=1; i <= sms_dest[0]; i++)
{
pdu_data[i+4] = (sms_dest[i] << 4)|(sms_dest[i] >> 4);
}
offset = sms_dest[0]+5;
pdu_data[offset++] = 0x00; //PID
pdu_data[offset++] = 0x00; //DCS
length = offset++;
i = 0;
n = 0;
while (sms_message[i] != 0) //преобразуем восьмибитную запись символов в 7ми битную
{
if (n == 0) pdu_data[offset+i] = sms_message[i] & 0x7F;
else
{
pdu_data[offset+i-1] |= sms_message[i] << (8-n);
pdu_data[offset+i] = sms_message[i] >> n;
}
if (n++ > 6)
{
n = 0;
offset--;
}
i++;
}
pdu_data[length] = i; //число букв
pdu_len = offset+i;
}
/////////////////////////////////////////////////////////////////////////////////////////
MiBBiM писал(а):вот я и говорю, что можно хранить не побайтный шаблон команды, а только размер сообщения, содержащего её. соотвественно для каждой команды свой размер.
Omega писал(а):...тогда поидее можно последние несколько символов в сообщении сравнивать. Первые-то всеравно служебные (номера СМС цента, абонента, формат номера, длина сообщения и тд). Правильно?
//////////////////////////////// Расшифровка PDU ///////////////////////////////////////////////
void decode_pdu(void)
{
char n, length, offset, i, b, mask;
offset = pdu_data[0]+2; //позиция в массиве
length = pdu_data[offset]/2+(pdu_data[offset] % 2);
offset += 2;
sms_orig[0] = length;
//номер телефона, с которого отрправлена SMS'ka
for (i = 0; i < length; i++) sms_orig[i+1] = (pdu_data[i+offset] << 4)|(pdu_data[i+offset] >> 4);
if ((sms_orig[1] & 0xF0) != 0x70) sms_orig[1] = (sms_orig[1] & 0x0F) | 0x70;
offset += length+9;
length = pdu_data[offset++];
if (length > sizeof(sms_message)-1) length = sizeof(sms_message)-1;
n = 0;
b = 0;
mask = 0x3F;
i = 0;
//декодирование сообщения (7 бит - 8 бит)
do {
if (n == 0) sms_message[b] = pdu_data[offset+i] & 0x7F;
else
{
sms_message[b] = (pdu_data[offset+i-1] >> (8-n))|((pdu_data[offset+i] & mask) << n); //!!!!
mask >>= 1;
}
if (n++ > 5)
{
if (++b >= length) break;
sms_message[b] = pdu_data[offset+i] >> 1;
n = 0;
mask = 0x3F;
}
i++;
}
while (b++ < length);
sms_message[b] = 0;
}
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0