Home > Article > Backend Development > PHP sends text messages through serial port
With the advancement of technology, three modes have emerged in the field of text messaging: BLOCK MODE, TEXT MODE based on AT commands, and PDU MODE based on AT commands. Among them, TEXT MODE is relatively simple, and many Nokia mobile phones support this mode. Most Siemens mobile phones only support PDU MODE. PDU mode is a method of sending and receiving text messages. The text of the text message is transmitted after hexadecimal encoding. Currently, PDU has replaced BLOCK MODE.
SMS is a specification developed by Etsi (GSM 03.40 and GSM 03.38). When using 7-bits encoding, it can send up to 160 characters; but with 8-bit encoding, it can send up to 140 characters, which usually cannot be displayed directly through the mobile phone; and when using 16-bit encoding, up to 70 characters, Used to display Unicode (UCS2) text information, which can be displayed by most mobile phones.
Today’s discussion is PDU MODE, UCS2 encoding, which means that a maximum of 70 characters can be sent, regardless of English or Chinese.
Suppose you want to send the following message: "Hello". Before sending, you need to know the SMS center number where the SIM card is located, such as China Mobile’s SMS center number:
Received mobile phone number: 13638197275
Hangzhou SMS Center Number: 13800571500
Text message content: Hello
To send this text message, the phone will execute it after encoding. After encoding, it will become the following string of characters:
0891683180501705F011000D91683136187972F5000800044F60597D
You don’t understand, please explain this string of codes from beginning to end:
08 –
It refers to the length of the SMS center number, that is, the length of (91)+(683180501705F0) divided by 2, that is, 08 = (2+14)/2
91 –
Refers to the SMS center number type. 91 means that TON/NPI complies with the International/E.164 standard, which means that a ‘+’ sign needs to be added before the number; there are other values, but 91 is the most commonly used.
683180501705F0 -
SMS center number. Due to slight processing in position, the actual number should be: 8613800571500 (the letter F is a character added to make up the even length).
11 - File header bytes
00 -
Message type (TP-Message-Reference)
0D - Called number length
91 - Called number type
In fact, in actual processing, we usually write 11000D91 into the program, because in China, these data will not change.
683136187972F5- The called number has been shifted and the actual number is "8613638197275".
The above (00) + (0D) + (91) + (683136187972F5 ), constitutes the second part of the destination address (TP-Destination-Address) of the entire text message.
Continue...
00 -
Protocol identification TP-PID, here is generally 00
08 -
Data coding scheme TP-DCS (TP-Data-Coding-Scheme) uses the USC2 (16bit) data coding mentioned earlier
00 -
Validity period TP-VP (TP-Valid-Period)
04 -
Length TP-UDL (TP-User-Data-Length), which is the hexadecimal 04 of the message length/2
4F60597D Here is the text message content. The actual content is: "Hello"
Based on the above situation, you can write the program script for text message encoding.
1. SMS center number processing:
1. Remove the + sign from the SMS center number "+8613800571500" to see if the length is an even number. If not, add F
=> "8613800571500F" at the end
2. Remove the odd digits Swap with even bits.
=> “683108501705F0″
3. Add the character 91 in front of the SMS center number. 91 means internationalization
=> “91683108501705F0″
4. Calculate the length, divide the result by 2, and format it into a 2-digit 16 Base string, 16 / 2 = 8 => “08″
=> “0891683108501705F0″
2. Mobile phone number processing:
1. Remove the + sign from the mobile phone number +8613638197275 and see if the length is an even number. If not, add F
=> "8613638197275F" at the end
2. Swap the odd and even digits of the mobile phone number.
=> “683136187972F5″
3. Short message processing:
1. Convert the string to Unicode code,
The unicode code of “Hello” is 4F60597D
2. Divide the length by 2 and keep two digits in hexadecimal System number, that is 4F60597D = 8
/ 2 => “04″,
=> “044F60597D″
4. Combination
1. Add the string 11000D91 before the mobile phone number (1100: fixed, 0D: the length of the mobile phone number, not counting the + sign, expressed in hexadecimal, 91: 91 when sending
to the mobile phone, 91 when sending to the small Lingtong is 81),
That is, 11000D91 + 683136187972F5
=> 11000D91683136187972F5
2. After the mobile phone number, add 000800 and the content of the text message just now, just write down 000800
That is, 11000D91683136 187972F5 + 000800 +
044F60597D
=>
11000D91683136187972F5000800044F60597D
3. Divide the length of the entire message by 2 and format it into a 2-digit decimal number
That is
11000D91683136187972F5000800044F60597D =>
38 bits / 2 => 19
5. So the content to be sent is
AT+CMGF=0
OK
AT+CMGS=19
> #Enter the text message content encoding
Attach the final PHP code:
<?php // Requirement dio, use cmd install: pecl install dio set_time_limit(0); // Windows use COM1: $fd=dio_open('/dev/ttyS0', O_RDWR); if(!$fd) { die("打开串口ttyS0失败"); } // dio_tcsetattr() only Linux // Windows 使用 exec('mode COM1: baud=9600 data=8 stop=1 parity=n xon=on'); dio_tcsetattr($fd, array( 'baud' => 9600, 'bits' => 8, 'stop' => 1, 'parity' => 0 )); //$ff=dio_stat($fd); //print_r($ff); //echo "GSM AT is start on ttyS0\n"; //短信中心号码 $smsc = "8613800571500"; $invert_smsc = invertNumbers($smsc); // 转换短信中心号码 $inter = chr(13); // 回车字符 $ctrlz = chr(26); // ctrl+z // 发送信息 $text = '你好'; $send_to = '8613638197275'; $pdu_phone = hex2str(utf82unicode($text)); $pdu_phone = sprintf("%02X", strlen($pdu_phone)/2) . $pdu_phone; $pdu_phone = '11000D91' . invertNumbers($send_to) . '000800' . $pdu_phone; $atcmd = 'AT+CMGF=0' . $inter; @dio_write($fd, $atcmd); $atcmd = 'AT+CMGS=' . sprintf("%d", strlen($pdu_phone)/2) . $inter; @dio_write($fd, $atcmd); $pdu_addr = '0891' . invertNumbers($smsc); $pdu_all = $pdu_addr . $pdu_phone . $ctrlz . $inter; @dio_write($fd, $pdu_all); dio_close($fd); // 我的是utf-8编码 function utf82unicode($str) { return iconv("utf-8", "UCS-2BE", $str); } function hex2str($hexstring) { $str = ''; for($i = 0, $len = strlen($hexstring); $i < $len; $i++) { $str .= sprintf("%02X", ord(substr($hexstring, $i, 1))); } return $str; } function invertNumbers($msisdn) { $len = strlen($msisdn); if ( 0 != fmod($len, 2) ) { $msisdn .= "F"; $len = $len + 1; } for ($i=0; $i<$len; $i+=2) { $t = $msisdn[$i]; $msisdn[$i] = $msisdn[$i+1]; $msisdn[$i+1] = $t; } return $msisdn; } ?>
Attachment 1: Mobile SMS center number in various places
Enter the SMS number of the local mobile bureau:
+8613800xxx500 ("+ "number must be entered),
where xxx is the local telephone area code.
---For areas where the telephone area code is three digits:
Just replace xxx with the telephone area code.
For example: Shenzhen’s telephone area code is 755,
China Mobile’s SMS center number is: +8613800755500
--- For areas where the telephone area code is two digits:
Please add "0" after the area code and replace it with three digits xxx .
For example: Beijing’s telephone area code is 10,
China Mobile’s short message center number is: +8613800100500
Currently, China Unicom 165 network has launched operations nationwide.
Before using the SMS service, you need to set the SMS center service number:
Beijing +8613010112500
Shanghai +8613010314500
Shenzhen +8613010888500
Shandong +8613010171500
Jiangsu +8613010341500
Zhejiang +8613010360500
Fujian +8613010380500
Sichuan +8613010811500
Chongqing +8613010831500
Hainan +8613010501500
Heilongjiang +8613010980500
Jilin +8613010911500
Tianjin +8613010130500
Hebei +8613010180500
Inner Mongolia +8613010950500
Shanxi +8613010701500
Anhui +8613010305500
Xinjiang +8613010969500
Qinghai +8613010776500
Gansu +8613010879500
Ningxia +8613010796500
Guizhou +8613010788500
Yunnan +8613010868500
Hunan +8613010731500
Hubei +8613010710500
Guangdong +8613010200500
Guangxi +8613010591500
Henan +8613010761500
Jiangxi +8613010720500
Liaoning +8613010240500
Appendix 2: Common AT commands:
AT+CSMS Select short message service
AT+CPMS Select short message memory
AT+CMGF Select SMS Format
AT+CSCA SMS center address
AT+CNMI Display newly received SMS messages
AT+CMGR Read SMS messages
AT+CMGS Send SMS messages
AT+CMGL List SMS messages in SIM card
AT+CMSS Send SMS from SIM memory
AT+CMGW Write the SMS to be sent to SIM memory
AT+CMGD Delete the SMS in SIM memory
AT+CSCB Select cellular broadcast information
Appendix 3: Receiving short messages
Receiving short messages is essentially reading the information from the SIM or cache. This is mainly done using the two commands AT+CMGR and AT+CMG
L. Since different manufacturers of wireless modules have different interpretation codes and response messages for the AT command set,
so you must first confirm whether it can be established with the MODEM. For communication, the AT command is generally used to complete this confirmation; then the AT+CM
GF command is used to select the data format of the short message; after receiving the correct answer from the MODEM, the AT command is used to complete the reading function.
Generally use AT+CMGL to read previous information, and when receiving MODEM's RING data, use AT+CM
GR to read real-time information. The following is an example of receiving SMS using H6221-W, which illustrates the application of PDU mode.
The operation process is as follows ({} are comments):
Send: AT
Answer: OK {Connection established}
Send: AT+CMGF=0 {Select PDU format}
Answer: OK {Allow selection PDU format}
Send: AT+CMGL=2 {List existing short messages}
Answer: +CMGL: 1, 2,, 24 {1 represents the number of messages, 2 represents unsent messages, 24 represents messages Total capacity}
0D71683108370105F004000D81683179133208F10000026080410033802632184C
F682D
95E0DC2B36D3D170A0243106 933D97A0243106933D97A02451068B1983492608
OK
The above set of hexadecimal strings in PDU format not only contains the content of the short message, but also the number and short message of the sender
Center number, SMS sending time, etc.
The message content is analyzed below:
0D: Short message center address (number) length.
91: SMS center number type, 91 is TON/NPI. TON/NPI complies with International/E.164 Standard,
means that a '+' sign needs to be added before the number; in addition, there can be other numerical values, but 91 is the most commonly used.
683108370105F0: The service center number used for SMSC text messages is 13807310500. It is processed by transposing the high and low nibbles in byte units in hexadecimal. The number is an odd number plus F, forming a HEX byte.
04: PDU type, file header bytes.
0B: Calling number length.
81: Calling number type.
3179133208F1: 0A The calling number has also been processed, and the actual number is 13973123801.
00: PID, which is the protocol identifier.
00: The DCS short message encoding type is GSM Default Alphabet, which is composed of 7-bit ASCII code shifting to form an 8-bit
hex code (octet). The method is shown in Table 2.
1sthex B0 A6 A5 A4 A3 A2 A1 A0
2ndhex C1 C0 B6 B5 B4 B3 B2 B1
3rdhex D2 D1 D0 C6 C5 C4 C3 C2
4thhex E3 E2 E1 E0 D6 D5 D4 D3
5th hex F4 F3 F2 F1 F0 E6 E5 E4
6thhex G5 G4 G3 G2 G1 G0 F6 F5
6thhex H6 H5 H4 H3 H2 H1 H0 G6
02608041003380: SCTS SMS sending time, 02/06/08/14:00:33.08.
26: UDL processed 8-bit code (octet) short message byte length, which is smaller than the message ASCII code length.
32184CF682D95E30DC2B36D3D170A0243106933D97A0243106933D97A0245106
8B1983492608: UD encoded PDU Data, text message content "2002/06/08/13: 48ID102OKID103
OK ID201FAIL".
The above introduces PHP to send text messages through the serial port, including the relevant content. I hope it will be helpful to friends who are interested in PHP tutorials.