A simple class library was completed some time ago. Although it can complete sending and receiving SMS messages, the class library is not perfect.
For example, the USC2 encoding is used to send an English text message. Each text message can contain up to 70 characters. If 7-bit encoding is used, each message can send 160 characters. This article adds the PDU Encoding Based on the previous class.
- Solution: Same as before, only partCode.
The PDU class changes the set accessors of userdata to complete the 7bit encoding and adds a 7bit encoding function. In addition, some function names are modified to facilitateProgramReadability.
Add a parameter to the sendmsg overload of the gsmmodem class to determine whether it is 7bit encoding or USC2 encoding.
For specific solutions, see the previous sectionArticle:
Implementation of sms cat Software (C #) <4> PDU format encoding C # implementation
Implementation of sms cat Software (C #) <5> PDU Format Decoding C # implementation
Implementation of sms cat Software (C #) <6> sending and receiving sms c # implementation (API)
- PDU type:
Userdata attributes:
Userdata only changes the set accessors for 7bit encoding.
EncodingAlgorithm:
High/low switching, each 8-bit height can be taken as a character. Example:
Test:
T: 01010100 E: 01100101 S: 01110011 T: 01110100
Go to the highest digit 0 and change it to 7 digits
T: 1010100 E: 1100101 S: 1110011 T: 1110100
High/low bit switching: tset
1110100 1110011 1100101 1010100
From a high position, every 8 digits is regarded as a single-digit group: 1 1010100 11 110010 100 11100 0000 1110
D4f29c0e completes encoding!
Source codeAs follows:
1:Set
2: {
3:If(Datacodingscheme ="08"| Datacodingscheme ="18")// USC2 encoding: complete USC2
4:{
5:Userdata =String. Empty;
6:EncodingEncodingutf =Encoding. Bigendianunicode;
7:
8:Byte[] Bytes = encodingutf. getbytes (Value);
9:
10:For(IntI = 0; I <bytes. length; I ++)
11:{
12:Userdata + =Bitconverter. Tostring (bytes, I, 1 );
13:}
14:Userdatalenghth = (userdata. Length/2). tostring ("X2");
15:}
16:Else// Add the 7bit encoding content to facilitate the 7bit Encoding
17:{
18:Userdata =String. Empty;
19:Userdatalenghth =Value. Length. tostring ("X2");// 7-bit encoded user data length: Source String Length
20:
21:EncodingEncodingasscii =Encoding. ASCII;
22:Byte[] Bytes = encodingasscii. getbytes (Value);
23:
24:StringTemp =String. Empty;// Store the binary string of the intermediate string
25:StringTMP;
26:For(IntI =Value. Length; I> 0; I --)// High/low swap binary string
27:{
28:TMP =Convert. Tostring (Bytes [I-1], 2 );
29:While(TMP. Length <7)// Not enough 7 digits, complete
30:{
31:TMP ="0"+ TMP;
32:}
33:Temp + = TMP;
34:}
35:
36:For(IntI = temp. length; I> 0; I-= 8)// Each 8-bit bitwise takes one character, that is, the encoding is completed and the high bitwise is taken as the low bitwise.
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:}
After adding, you only need to read the userdata field to complete the corresponding part of the encoding.
Pdu7bitencoder function:
The code for adding a new 7-bit encoding method is as follows:
1:Public StringPdu7bitencoder (StringPhone,StringText)
2:{
3:If(Text. size> 160)
4:{
5:Throw newException("The number of text messages exceeds 160");
6:}
7:Datacodingscheme ="00";
8:Destinationaddress = phone;
9:Userdata = text;
10:
11:ReturnServicecenteraddress + protocoldataunittype
12:+ Messagereference + destinationaddress + protocolidentifer
13:+ Datacodingscheme + validityperiod + userdatalenghth + userdata;
14:}
The method only assigns values to the corresponding attribute, and returns the field string to complete 7bit decoding.
Other changes:
1:Public StringPduusc2encoder (StringPhone,StringText)
The original method name was changed from pduencoder to pduusc2encoder, so that the program has better readability.
Enumeration: To facilitate the differentiation of SMS types (USC2 encoding or 7bit encoding), add enumeration types.
1:Public EnumMsgtype{Ausc2, a7bit };// Enumeration text message type ausc2 a7bit: 7-bit encoding (both Chinese and English can be used, but 7-bit can send 160 characters, USC2 only 70)
Add the enumeration type msgtype to the namespace gsmmodem
Sendmsg overload:
1:Public voidSendmsg (StringPhone,StringMSG,MsgtypeMsgtype)
2:{
3:If(Msgtype =Msgtype. Ausc2)
4:{
5:Sendmsg (phone, MSG );
6:}
7:Else
8:{
9:
10:}
11:}
If the type is ausc2, call the original sending method and use USC2 encoding to send text messages. If the a7bit type uses the 7bit encoding function of the pduencoding class, the program has not been implemented yet. The detailed source code will be provided in the next blog
Of course, the original calling of the PDU class encoding method is changed accordingly.
Attachment: project documents