Heim  >  Artikel  >  Backend-Entwicklung  >  PHP sendet Textnachrichten über die serielle Schnittstelle

PHP sendet Textnachrichten über die serielle Schnittstelle

WBOY
WBOYOriginal
2016-08-08 09:23:10971Durchsuche

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“

3. String in Unicode-Code konvertieren,

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 >AT CMGS=19
> #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 8613010731500

Hubei 8613010710500

Guangdong 8613010200500

Guangxi 86130105915 00

Henan 8613010761500

Jiangxi. 8613010720500

L iaoning 8613010240500

Anhang 2: Häufig verwendet AT-Befehle:

AT CSMS Kurznachrichtendienst auswählen

AT CPMS Kurznachrichtenspeicher auswählen

AT CMGF SMS-Format auswählen

AT CSCA SMS Center-Adresse

AT CNMI Anzeige neu empfangener SMS

AT CMGR SMS lesen

AT CMGS sendet Kurznachrichten

AT CMGL listet Kurznachrichten auf der SIM-Karte auf

AT CMSS sendet Kurznachrichten aus dem SIM-Speicher

AT CMGW schreibt in den SIM-Speicher Geben Sie die ausgehende Textnachricht ein

AT CMGD Löschen Sie die Textnachricht im SIM-Speicher

AT CSCB Wählen Sie die Mobilfunk-Broadcast-Nachricht aus

Anhang 3: Empfangen von Kurznachrichten

Beim 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 CM

GF, 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 CM

GR 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: AT

Antwort: 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 🎜>F682D

95E0DC2B36D3D170A0243106933D97A0243106933D97A02451068B1983492608

OK

Der 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.

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn