前一段時間完成了一個簡單的類庫,雖然可以完成可以完成簡訊貓簡訊的發送與接收,但是類庫還不是很完善。
如:英文簡訊的發送用的是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,以是程式擁有更好的可讀性。
枚舉:為了便於區分簡訊類型(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類的編碼方法的地方做相應改動。
附件:工程專案檔