簡訊貓軟體的實現(C#)7bitPDU的編碼

來源:互聯網
上載者:User

前一段時間完成了一個簡單的類庫,雖然可以完成可以完成簡訊貓簡訊的發送與接收,但是類庫還不是很完善。
如:英文簡訊的發送用的是USC2編碼,每條簡訊最多可發送70字元。而如果用7bit編碼則每條能發送160字元 ,本文即在之前類的基礎上加入了PDU的編碼。

  • 方案:和之前相同,僅加入了部分代碼。
    PDU類更改了UserData的set訪問器,以完成7bit編碼,同時加入一個7bit編碼函數。另外改動了部分函數名,以利於程式的可讀性。
    GSMModem類加入SendMsg的重載加入一個參數判斷是7bit編碼還是USC2編碼。
    具體方案見之前文章:
    簡訊貓軟體的實現(C#)<四>PDU格式編碼C#實現
    簡訊貓軟體的實現(C#)<五>PDU格式解碼C#實現
    簡訊貓軟體的實現(C#)<六>發送接收簡訊C#實現(API)
  • PDU類:

UserData屬性:
UserData僅改動的set訪問器以便7bit編碼
編碼演算法:
高低交換,從高每8位取為一個字元即可。例:
Test:
        T:01010100  e:01100101  s:01110011  t:01110100
    去最高位0,變為7位
    T:1010100  e:1100101  s:1110011  t:1110100
    高低位交換:tseT
    1110100 1110011 1100101 1010100
    從高位每8位取為一個位組:1 1010100  11 110010  100 11100  0000 1110
    D4F29C0E  完成編碼!
原始碼如下:

 1:  set
 2:   {
 3:      if (DataCodingScheme == "08" || DataCodingScheme == "18")           //USC2編碼使用 原來部分:完成USC2
  4:      {
 5:          userData = string.Empty;
 6:          Encoding encodingUTF = Encoding.BigEndianUnicode;
 7:   
 8:          byte[] Bytes = encodingUTF.GetBytes(value);
 9:   
10:          for (int i = 0; i < Bytes.Length; i++)
11:          {
12:              userData += BitConverter.ToString(Bytes, i, 1);
13:          }
14:          userDataLenghth = (userData.Length / 2).ToString("X2");
15:      }
16:      else                                                                //7bit編碼使用  新增內容 利於7bit編碼
17:      {
18:          userData = string.Empty;
19:          userDataLenghth = value.Length.ToString("X2");                  //7bit編碼 使用者資料長度:源字串長度
20:   
21:          Encoding encodingAsscii = Encoding.ASCII;
22:          byte[] bytes = encodingAsscii.GetBytes(value);
23:   
24:          string temp = string.Empty;                                     //儲存中間字串 二進位串
25:          string tmp;
26:          for (int i = value.Length; i > 0; i--)                          //高低交換 二進位串
27:          {
28:              tmp = Convert.ToString(bytes[i - 1], 2);
29:              while (tmp.Length < 7)                                      //不夠7位,補齊
30:              {
31:                  tmp = "0" + tmp;
32:              }
33:              temp += tmp;
34:          }
35:   
36:          for (int i = temp.Length ; i > 0; i -= 8)                    //每8位取位一個字元 即完成編碼 同時高位取為低位
37:          {
38:              if (i > 8)
39:              {
40:                  userData += Convert.ToInt32(temp.Substring(i-8, 8), 2).ToString("X2");
41:              }
42:              else
43:              {
44:                  userData += Convert.ToInt32(temp.Substring(0, i), 2).ToString("X2");
45:              }
46:          }
47:   
48:      }
49:  }

加入後只需讀取欄位userData即完成對應部分編碼。

PDU7BitEncoder函數:
新加入7bit編碼方法 代碼如下:

 1:  public string PDU7BitEncoder(string phone, string Text)
 2:  {
 3:      if (Text.Length > 160)
 4:      {
 5:          throw new Exception("簡訊字數大於160");
 6:      }
 7:      dataCodingScheme = "00";
 8:      DestinationAddress = phone;
 9:      UserData = Text;
10:   
11:      return serviceCenterAddress + protocolDataUnitType
12:          + messageReference + destinationAddress + protocolIdentifer
13:          + dataCodingScheme + validityPeriod + userDataLenghth + userData;
14:  }

方法只完成對應屬性的賦值,直接返回欄位字串即完成7bit的解碼。

其他改動:

1:  public string PDUUSC2Encoder(string phone, string Text)

原來的方法名由PDUEncoder改為PDUUSC2Encoder,以是程式擁有更好的可讀性。

  • GSMModem類:

枚舉:為了便於區分簡訊類型(USC2編碼還是7bit編碼)加入枚舉類型

1:  public enum MsgType { AUSC2, A7Bit };              //枚舉 簡訊類型 AUSC2 A7Bit:7位編碼 (中文用AUSC2,英文都可以 但7Bit能發送160字元,USC2僅70)

在命名空間GSMMODEM中加入枚舉類型MsgType

SendMsg重載:

 1:  public void SendMsg(string phone, string msg, MsgType msgType)
 2:  {
 3:      if (msgType == MsgType.AUSC2)
 4:      {
 5:          SendMsg(phone, msg);
 6:      }
 7:      else
 8:      {
 9:   
10:      }
11:  }

如果類型為AUSC2,調用原來的發送方法 用USC2編碼傳送簡訊,如果是A7Bit類型用PDUEncoding類的7bit編碼函數,程式尚未實現,將在下篇部落格中給出詳細原始碼
當然,原來的調用PDU類的編碼方法的地方做相應改動。

附件:工程專案檔

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.