是否有任何良好稳定的在线短信到PDU转换器?

时间:2014-06-25 09:28:55

标签: sms gsm pdu

我正在寻找一款可以与多种调制解调器配合使用的在线转换器。我正在处理的问题 - 我无法在pdu模式下发送短信(使用 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/
  4. 用户数据似乎编码得很好(到处都是相同的结果),但TPDU的第一部分(带有PDU类型,TP-MR,......)可能有点变量(但从不起作用,该死的)。

    几点:

    1. 调制解调器肯定支持pdu模式。
    2. 现金余额。
    3. 使用“>”对“AT + CMGS”进行调制解调器响应它对PDU字符串的响应为“\ r \ n \ n \ n \ n \ n \ n \ n \ n \ n \ n \ n \ n \ n \ n”,但没有以“+ CMGS”响应(当然我没有收到我的短信)。
    4. 如果有必要,这是我自己代码的一部分:

      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;
      }
      

      我的日常工作示例:

      致:38​​0933522620
      消息:您好!在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类型
      3. 00 - TP-MR
      4. 0C - To number的长度。
      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

2 个答案:

答案 0 :(得分:1)

问题得到解决。我发送消息不是十六进制字符串,而是二进制,愚蠢的我:(

答案 1 :(得分:0)

我已经为我的openwrt路由器创建了balance checker。它是用C语言编写的,非常简单。对于velcom.by和mts.by都可以正常工作。