0

複数のモデムで動作する優れたオンライン コンバーターを探しています。私が扱っている問題 - pdu モードで SMS を送信できません ( Cinterion BGS-2Tを使用)。私自身のライブラリ(まだ作業中)と次のようないくつかのオンラインコンバーターで試しました:

  1. http://www.smartposition.nl/resources/sms_pdu.html
  2. http://m2msupport.net/m2msupport/module-tester/
  3. http://hardisoft.ru/soft/otpravka-sms-soobshhenij-v-formate-pdu-teoriya-s-primerami-na-c-chast-1/

ユーザーデータは適切にエンコードされているように見えますが (どこでも同じ結果)、TPDU の最初の部分 (PDU-Type、TP-MR などを使用) は少し変化する可能性があります (しかし、決して機能しません)。

ちょっとしたこと:

  1. モデムは間違いなく pdu モードをサポートしています。
  2. キャッシュオンバランスあり。
  3. モデムは "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) & 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
メッセージ: こんにちは!GSM-7 で SMS をテストする

エンコードされた 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 - To 番号の長さ。
5. 81 - 番号のタイプ (不明、国際的な 0x91 も試した)
6. 83 90 33 25 62 02 - 番号
7. 00 - TP-PID
8. 00 - TP-DCS (GSM 7 ビット、デフォルトの SMS クラス)
9. 18 - TP-UD (24 文字)
10. C8 32 ... B6 6E - パックされたメッセージ
11. 1A - ctrl+z

4

2 に答える 2