#sms #gsm #pdu
#смс #gsm #pdu
Вопрос:
Я ищу хороший онлайн-конвертер, который мог бы работать с несколькими модемами. Проблема, с которой я имею дело — я не могу отправлять sms в режиме pdu (с Cinterion BGS-2T). Пробовал с моей собственной библиотекой (все еще работаю над ней) и несколькими онлайн-конвертерами, такими как:
- http://www.smartposition.nl/resources/sms_pdu.html
- http://m2msupport.net/m2msupport/module-tester/
- http://hardisoft.ru/soft/otpravka-sms-soobshhenij-v-formate-pdu-teoriya-s-primerami-na-c-chast-1/
Пользовательские данные, похоже, хорошо закодированы (везде один и тот же результат), но первая часть TPDU (с типом PDU, TP-MR, …) может быть немного переменной (но никогда не работает, черт возьми).
Несколько моментов:
- Модем определенно поддерживает режим pdu.
- На балансе есть наличные.
- Модем отвечает на «AT CMGS» с помощью «>», и он отвечает на строку PDU с помощью » r nOK r n», но не отвечает » CMGS» (и, конечно, я не получаю свои sms).
Если это необходимо, вот часть моего собственного кода:
void get_pdu_string(sms_descriptor* sms, char dst[]) {
char tempnum[8] = "";
char* pTemp = dst;
uint8_t i = 0;
// SMSC
//*pTemp = 0x00;
// PDU-Type
*pTemp = (0<<TP_MTIH) | (1<<TP_MTIL); // MTI = 01 - outbox sms
// TP-MR
*pTemp = 0x00; // unnecessary
// TP-DA
*pTemp = strlen(sms->to_number); // address number length
*pTemp = 0x91; // address number format (0x91 - international)
gsm_number_swap(sms->to_number,tempnum);
i = (((*(pTemp-2) amp; 0x01) == 0x01)? (*(pTemp-2) 1) : *(pTemp-2))>>1;
strncpy(pTemp, tempnum, i ); // address number
pTemp = i;
// TP-PID
*pTemp = 0;
// TP-DCS
switch(sms->encoding) {
case SMS_7BIT_ENC:
*pTemp = 0x00;
break;
case SMS_UCS2_ENC:
*pTemp = 0x08;
break;
}
if (sms->flash == 1)
*(pTemp-1) |= 0x10;
// TP-VP
// skip if does not need
// TP-UDL
switch(sms->encoding) {
case SMS_7BIT_ENC:
*pTemp = strlen(sms->msg);
break;
case SMS_UCS2_ENC:
*pTemp = strlen(sms->msg) << 1;
break;
}
// TP-UD
switch(sms->encoding) {
case SMS_7BIT_ENC: {
char packed_msg[140] = "";
char* pMsg = packed_msg;
gsm_7bit_enc(sms->msg, packed_msg);
while(*pMsg != 0)
*pTemp = *pMsg ;
} break;
case SMS_UCS2_ENC: {
wchar_t wmsg[70] = L"";
wchar_t* pMsg = wmsg;
strtoucs2(sms->msg, wmsg, METHOD_TABLE);
while(*pMsg != 0) {
*pTemp = (char) (*pMsg >> 8);
*pTemp = (char) (*pMsg );
}
} break;
}
*pTemp = 0x1A;
return;
}
Пример моей обычной работы:
Кому: 380933522620
Сообщение: Привет! Тест SMS в GSM-7
Закодированная строка PDU:
00 01 00 0C 81 83 90 33 25 62 02 00 00 18 C8 32 9B FD 0E 81 A8 E5 39 1D 34 6D 4E 41 69 37 E8 38 6D B6 6E 1A
Подробности о строке PDU:
1. 00 — пропущенный SMSC
2. 01 — PDU-Type
3. 00 — TP-MR
4. 0C — длина номера.
5. 81 — тип номера (неизвестен, также пробовал 0x91, который является международным)
6. 83 90 33 25 62 02 -На номер
7. 00 — TP-PID
8. 00 — TP-DCS (GSM 7bit, класс SMS по умолчанию)
9. 18 — TP-UD (24 буквы)
10. C8 32 … B6 6E — упакованное сообщение
11. 1A — ctrl z
Комментарии:
1. Можете ли вы предоставить пример PDU, который вы сгенерировали и хотели отправить. Тогда я могу вам больше помочь 🙂
2. пример @aldridmc добавлен в первое сообщение
3. Этот вопрос неясен. Вы ищете существующий онлайн-конвертер (это было бы не по теме здесь) или у вас есть точный вопрос относительно вашей реализации?
4. У меня есть несколько вопросов. 1) да, я ищу существующий онлайн-конвертер, который работает . 2) и я не уверен в своей реализации, поэтому, я думаю, ваши комментарии были бы полезны.
Ответ №1:
Проблема устранена. Я отправлял сообщение не как шестнадцатеричную строку, а как двоичный файл, глупый я: (
Комментарии:
1. и отвечая на главный вопрос — вот хороший конвертер: smspdu.benjaminerhart.com
Ответ №2:
Я создал средство проверки баланса для своих маршрутизаторов openwrt. Он написан на C и очень прост. Отлично работает для velcom.by и mts.by .