Heim > Artikel > Backend-Entwicklung > PHP sendet Textnachrichten über die serielle Schnittstelle
Mit der Weiterentwicklung der Technologie haben sich im Bereich des zeitlichen Sendens und Empfangens von SMS drei Modi herausgebildet: BLOCKMODUS, TEXTMODUS basierend auf AT-Befehlen und PDU-MODUS basierend auf AT-Befehlen. Unter anderem ist der TEXTMODUS relativ einfach und viele Nokia-Mobiltelefone unterstützen diesen Modus. Die meisten Mobiltelefone von Siemens unterstützen nur den PDU-MODUS. Der PDU-Modus ist eine Methode zum Senden und Empfangen von Textnachrichten. Der Text der Textnachricht wird hexadezimal kodiert übertragen. Derzeit hat PDU den BLOCKMODUS ersetzt.
SMS ist eine von Etsi entwickelte Spezifikation (GSM 03.40 und GSM 03.38). Bei Verwendung der 7-Bit-Kodierung können bis zu 160 Zeichen gesendet werden. Bei der 8-Bit-Kodierung können jedoch bis zu 140 Zeichen gesendet werden, die normalerweise nicht direkt über das Mobiltelefon angezeigt werden können Bis zu 70 Zeichen. Wird zur Anzeige von Unicode-Textinformationen (UCS2) verwendet, die von den meisten Mobiltelefonen angezeigt werden können.
Was wir heute besprechen, ist der PDU-MODUS, UCS2-Kodierung, was bedeutet, dass maximal 70 Zeichen gesendet werden können, unabhängig von Englisch oder Chinesisch.
Angenommen, Sie möchten die folgende Nachricht senden: „Hallo“. Vor dem Senden müssen Sie die SMS-Center-Nummer kennen, in der sich die SIM-Karte befindet, z. B. die SMS-Center-Nummer von China Mobile:
Erhaltene Mobiltelefonnummer: 13638197275
Hangzhou SMS-Center-Nummer: 13800571500
Textnachrichteninhalt: Hallo
Um diese Textnachricht zu senden, führt das Telefon sie nach der Codierung aus. Nach der Codierung wird sie zu der folgenden Zeichenfolge:
0891683180501705F011000D91683136187972F5000800044F60597D
Sie verstehen nicht? Bitte erklären Sie diese Codefolge von Anfang bis Ende:
08 –
Es bezieht sich auf die Länge der SMS-Center-Nummer, also auf die Länge von (91) (683180501705F0) geteilt durch 2, also 08 = (2 14) / 2
91 –
Bezieht sich auf den Nummerntyp des SMS-Zentrums. 91 bedeutet, dass TON/NPI dem International/E.164-Standard entspricht, was bedeutet, dass vor der Zahl ein „ “-Zeichen hinzugefügt werden muss. Es gibt jedoch andere Werte, aber 91 wird am häufigsten verwendet.
683180501705F0 -
Nummer des SMS-Zentrums. Aufgrund einer geringfügigen Verarbeitung in der Position sollte die tatsächliche Zahl lauten: 8613800571500 (der Buchstabe F ist ein hinzugefügtes Zeichen, um die gerade Länge zu erreichen).
11 – Datei-Header-Bytes
00 -
Nachrichtentyp (TP-Message-Reference)
0D – Länge der angerufenen Nummer
91 – Typ der angerufenen Nummer
Tatsächlich schreiben wir bei der tatsächlichen Verarbeitung normalerweise 11000D91 in das Programm, da sich diese Daten in China nicht ändern.
683136187972F5 – Die angerufene Nummer wurde verschoben und die tatsächliche Nummer ist „8613638197275“.
Über (00) (0D) (91) (683136187972F5 ) stellt den zweiten Teil der Zieladresse (TP-Destination-Address) der gesamten Textnachricht dar.
Weiter...
00 -
Protokollidentifikation TP-PID, hier ist im Allgemeinen 00
08 -
Datenkodierungsschema TP-DCS (TP-Data-Coding-Scheme), unter Verwendung der zuvor erwähnten USC2-Datenkodierung (16 Bit)
00 -
Gültigkeitszeitraum TP-VP (TP-Valid-Period)
04 -
Länge TP-UDL (TP-User-Data-Length), das ist der hexadezimale Wert 04 der Nachrichtenlänge/2
4F60597D Hier ist der Inhalt der Textnachricht: „Hallo“
Basierend auf der obigen Situation können Sie das Programmskript für die Textnachrichtencodierung schreiben.
1. SMS-Center-Nummernverarbeitung:
1. Entfernen Sie die Nummer aus der SMS-Center-Nummer „8613800571500“, um zu sehen, ob die Länge eine gerade Zahl ist.
=> „8613800571500F“ am Ende.
2.
=> „683108501705F0“
3. Fügen Sie das Zeichen 91 vor der SMS-Center-Nummer hinzu.
=> „91683108501705F0“
4 2. Formatieren Sie es in eine zweistellige Hexadezimalzeichenfolge, 16 / 2 => „08“
=> „0891683108501705F0“
2. Verarbeitung der Mobiltelefonnummer:
Entfernen Sie die Nummer aus der Mobiltelefonnummer 8613638197275 und prüfen Sie, ob die Länge eine gerade Zahl ist. Fügen Sie am Ende F
=> hinzu Handynummer.
=> „683136187972F5“
Der Unicode-Code von „Hallo“ ist 4F60597D
2. Teilen die Länge um 2 und behalten zwei hexadezimale Ziffern bei, d. h. 4F60597D = 8
/ 2 => „04″,
=> „044F60597D“
4. Kombination
1. Fügen Sie die Zeichenfolge 11000D91 vor der Mobiltelefonnummer hinzu (1100: fest, 0D: die Länge der Mobiltelefonnummer, ohne das +-Zeichen, ausgedrückt in Hexadezimalzahl, 91: senden
an das Mobiltelefon ist 91 und der an PHS gesendete Wert ist 81),
d. h. 11000D91 683136187972F5
=> 11000D91683136187972F5
2 Fügen Sie nach der Mobiltelefonnummer 000800 und den Inhalt von hinzu Notieren Sie sich einfach die SMS 000800
Das ist 11000D91683136187972F5 000800
044F60597D
=>
11000D91683136187972F5000800044F60597D
3. Teilen Sie die Länge der gesamten Nachricht durch 2 und formatieren Sie sie in eine zweistellige Dezimalzahl
11000D91683136187972F5000800044F60597D =>
38 Bits/2 => 19
5 Der zu sendende Inhalt ist also
AT CMGF=0
> #Geben Sie die Codierung des Textnachrichteninhalts ein
Fügen Sie den endgültigen PHP-Code hinzu:
<?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; } ?>Anhang 1: Mobile SMS-Center-Nummern an verschiedenen Orten
Geben Sie die SMS-Nummer der lokalen Mobilstation ein:
+8613800xxx500 (" "Nummer muss eingegeben werden),
wobei xxx die lokale Telefonvorwahl ist.
--- Für Gebiete, in denen die Telefonvorwahl dreistellig ist:
Ersetzen Sie einfach xxx durch die Telefonvorwahl.
Zum Beispiel: Die Telefonvorwahl von Shenzhen ist 755,
Die SMS-Center-Nummer von China Mobile lautet: 8613800755500
--- Gebiete, in denen die Telefonvorwahl zweistellig ist:
Bitte fügen Sie nach der Vorwahl „0“ hinzu, um xxx durch drei Ziffern zu ersetzen.
Zum Beispiel: Pekings Telefonvorwahl ist 10,
Die Nummer des Kurznachrichtenzentrums von China Mobile lautet: 8613800100500
Derzeit hat das China Unicom 165-Netzwerk den landesweiten Betrieb aufgenommen.
Bevor Sie den SMS-Dienst nutzen, müssen Sie die SMS-Center-Dienstnummer festlegen:
Peking 8613010112500
Shanghai 8613010314500
Shenzhen 8613010888500
Shandong 8613010171500
Jiangsu 8613010341500
Zhejiang 8613010360500
Fujian. 8613010380500
Sich uan 8613010811500
Chongqing 8613010831500
Hainan 8613010501500
Heilongjiang 8613010980500
Jilin 8613010911500
Tianjin 8613010130500
Hebei 861301 0180500
Innere Mongolei 8613010950500
Shanxi 8613010701500 >
Hunan 8613010731500Hubei 8613010710500Guangdong 8613010200500Guangxi 86130105915 00Henan 8613010761500Jiangxi. 8613010720500L iaoning 8613010240500Anhang 2: Häufig verwendet AT-Befehle: AT CSMS Kurznachrichtendienst auswählenAT CPMS Kurznachrichtenspeicher auswählenAT CMGF SMS-Format auswählenAT CSCA SMS Center-AdresseAT CNMI Anzeige neu empfangener SMSAT CMGR SMS lesenAT CMGS sendet KurznachrichtenAT CMGL listet Kurznachrichten auf der SIM-Karte aufAT CMSS sendet Kurznachrichten aus dem SIM-SpeicherAT CMGW schreibt in den SIM-Speicher Geben Sie die ausgehende Textnachricht einAT CMGD Löschen Sie die Textnachricht im SIM-SpeicherAT CSCB Wählen Sie die Mobilfunk-Broadcast-Nachricht ausAnhang 3: Empfangen von KurznachrichtenBeim Empfangen einer Kurznachricht werden im Wesentlichen die Informationen von der SIM-Karte oder dem Cache gelesen. Dies erfolgt hauptsächlich über die beiden Anweisungen AT CMGR und AT CMG L. Da verschiedene Hersteller von Funkmodulen unterschiedliche Interpretationscodes und Antwortnachrichten für den AT-Befehlssatz haben, müssen Sie dies zunächst tun Bestätigen Sie, ob die Kommunikation mit dem MODEM hergestellt werden kann. Verwenden Sie im Allgemeinen den AT-Befehl, um diese Bestätigung abzuschließen. Verwenden Sie dann den Befehl AT CMGF, um das Datenformat der Kurznachricht auszuwählen, nachdem Sie die richtige Antwort erhalten haben MODEM, verwenden Sie den AT-Befehl, um die Lesefunktion abzuschließen. AT CMGL wird im Allgemeinen zum Lesen früherer Informationen verwendet. Beim Empfang der RING-Daten des MODEMs wird AT CMGR zum Lesen von Echtzeitinformationen verwendet. Im Folgenden finden Sie ein Beispiel für den Empfang von SMS mit H6221-W, das die Anwendung des PDU-Modus veranschaulicht. Der Vorgang läuft wie folgt ab ({} sind Kommentare):Senden: ATAntwort: OK {Verbindung hergestellt🎜>Senden: AT CMGF =0 {PDU-Format auswählen🎜>
Antwort: OK {Auswahl des PDU-Formats zulassen🎜>Senden: AT CMGL=2 {Vorhandene Textnachrichten auflisten🎜>
Antwort: CMGL: 1, 2,, 24 {1 stellt die Anzahl der Nachrichten dar, 2 stellt nicht gesendete Nachrichten dar, 24 stellt die Gesamtnachrichtenkapazität dar 🎜>F682D95E0DC2B36D3D170A0243106933D97A0243106933D97A02451068B1983492608OKDer obige Satz hexadezimaler Zeichenfolgen im PDU-Format enthält nicht nur den Inhalt der Kurznachricht, sondern auch die Nummer und die Kurznachrichtenzentrale des Absenders Nummer , SMS-Versandzeit usw. Der Nachrichteninhalt wird unten analysiert: 0D: Länge der kurzen Adresse (Nummer) des Nachrichtencenters. 91: SMS-Center-Nummerntyp, 91 ist TON/NPI. TON/NPI entspricht International/E.164 Standardmäßig bedeutet , dass vor der Zahl ein „ “-Zeichen hinzugefügt werden muss. Darüber hinaus können andere numerische Werte angegeben werden, am häufigsten wird jedoch 91 verwendet. 683108370105F0: Die für SMSC-Textnachrichten verwendete Service-Center-Nummer ist 13807310500. Es durchläuft eine Transpositionsverarbeitung von High- und Low-Nibbles in hexadezimalen -Byteeinheiten, und die Zahl ist eine ungerade Zahl, gefolgt von F, wodurch ein HEX-Byte entsteht. 04: PDU-Typ, Datei-Header-Bytes. 0B: Länge der Rufnummer. 81: Rufnummerntyp.3179133208F1: 0A Die anrufende Nummer wurde ebenfalls verarbeitet und die tatsächliche Nummer ist 13973123801.
00: PID, die Protokollkennung.
00: Der DCS-Kurznachrichtenkodierungstyp ist GSM-Standardalphabet, das aus einer 7-Bit-ASCII-Codeverschiebung besteht, um einen 8-Bit-
Hexadezimalcode (Oktett) zu bilden siehe Tabelle 2.
1sthex B0 A6 A5 A4 A3 A2 A1 A0
2nhex C1 C0 B6 B5 B4 B3 B2 B1
3rhex D2 D1 D0 C6 C5 C4 C3 C2
4.hex E3 E2 E1 E0 D6 D5 D4 D3
5.hex F4 F3 F2 F1 F0 E6 E5 E4
6.hex G5 G4 G3 G2 G1 G0 F6 F5
6.hex H6 H5 H4 H3 H2 H1 H0 G6
02608041003380: SCTS-SMS-Sendezeit, 02/06/08/14:00:33.08.
26: UDL verarbeitet 8-Bit-Code (Oktett) mit kurzer Nachrichtenbytelänge, die kleiner ist als die ASCII-Codelänge der Nachricht.
32184CF682D95E30DC2B36D3D170A0243106933D97A0243106933D97A0245106
8B1983492608: UD-codierte PDU Daten, Kurznachrichteninhalt „13.06.08.2002: 48ID102OKID103
OK ID201FAIL“.
Das Obige stellt PHP zum Senden von Textnachrichten über die serielle Schnittstelle vor, einschließlich der relevanten Inhalte. Ich hoffe, es wird für Freunde hilfreich sein, die sich für PHP-Tutorials interessieren.