ホームページ > バックエンド開発 > PHPチュートリアル > PHP はシリアル ポート経由でテキスト メッセージを送信します

PHP はシリアル ポート経由でテキスト メッセージを送信します

WBOY
リリース: 2016-06-13 12:21:17
オリジナル
1085 人が閲覧しました

PHP はシリアル ポートを介してテキスト メッセージを送信します

技術の進歩により、テキスト メッセージの送受信の分野では、ブロック モード、AT コマンドに基づくテキスト モード、および PDU モードの 3 つのモードが生み出されました。 ATコマンドに基づいて動作します。このうち、TEXT MODE は比較的シンプルで、多くの Nokia 携帯電話がこのモードをサポートしています。ほとんどの Siemens 携帯電話は PDU モードのみをサポートします。 PDU モードは、テキスト メッセージを送受信する方法であり、テキスト メッセージのテキストは 16 進数でエンコードされて送信されます。現在、PDU が BLOCK MODE に取って代わりました。

SMS は Etsi によって開発された仕様 (GSM 03.40 および GSM 03.38) です。 7 ビット エンコードを使用すると最大 160 文字を送信できますが、8 ビット エンコードでは最大 140 文字を送信できますが、16 ビット エンコードを使用すると最大 140 文字を送信できます。最大 70 文字。ほとんどの携帯電話で表示できる Unicode (UCS2) テキスト情報を表示するために使用されます。

今日説明するのは PDU MODE、UCS2 エンコーディングです。これは、英語、中国語に関係なく、最大 70 文字を送信できることを意味します。
「こんにちは」というメッセージを送信するとします。送信する前に、携帯電話の SIM カードが配置されている SMS センター番号を知っておく必要があります。たとえば、China Mobile の SMS センター番号:

受信した携帯電話番号: 13638197275
杭州 SMS センター番号: 13800571500
SMS の内容: こんにちは このテキスト メッセージを送信すると、エンコードが実行された後、携帯電話は実行されません。

08916831805F011000D916831872F50008F60597d 説明このコード文字列:
08
– SMS センター番号の長さを指します。つまり、(91) (683180501705F0) を 2 で割った長さ、つまり 08 = (2 14) )/ 2 91
– SMS センター番号のタイプを指します。 91 は、TON/NPI が International/E.164 標準に準拠していることを意味します。これは、数値の前に「 」記号を追加する必要があることを意味しますが、91 が最も一般的に使用されます。 683180501705F0
- SMS センター番号。位置に若干の処理が行われているため、実際の数値は 8613800571500 になります (文字 F は偶数の長さを補うために追加された文字です)。 11
- ファイルヘッダーバイト 00
- メッセージタイプ (TP-Message-Reference) 0D
- 着信番号の長さ 91
- 着信番号タイプ 実際、中国ではこれらのデータは変更されないため、実際の処理では通常 11000D91 をプログラムに書き込みます。

683136187972F5

- 着信番号はシフトされており、実際の番号は「8613638197275」です。 上記 (

00

) (0D) (91) (683136187972F5) は、テキスト メッセージ全体の 2 番目の部分を構成します。コピーの宛先アドレス (TP-Destination-Address)。 続行...

00
-プロトコル識別 TP-PID、ここでは通常 00 08
-データ エンコーディング スキーム TP- DCS (TP-Data-Coding-Scheme)、前述の USC2 (16 ビット) データ エンコーディングを使用 00
- 有効期間 TP-VP (TP-Valid-Period) 04
-Length TP-UDL (TP-User-Data-Length)、メッセージ長/2 の 16 進数 04 です。 4F60597D これがテキスト メッセージの内容です。実際の内容は次のとおりです: "Hello"
上記の状況に基づいて、SMS エンコード用のプログラム スクリプトを作成できます。

1. SMS センター番号の処理:

1. SMS センター番号「8613800571500」から番号を削除し、長さが偶数であるかどうかを確認します。そうでない場合は、F

=> を追加します。最後に「8613800571500F」
2. 奇数桁と偶数桁を入れ替えます。
=>「683108501705F0」
3. SMS センター番号の前に文字 91 を追加します。
=>「91683108501705F0」
4. 長さを計算し、結果を除算します。 2. 2 桁の 16 進数文字列、16 / 2 = 8 => “08″
=> “0891683108501705F0″

2. 携帯電話番号の処理:

1.携帯電話番号 8613638197275 から番号を削除し、長さが偶数であるかどうかを確認します。そうでない場合は、最後に F

=> "8613638197275F"
を追加します。携帯電話番号。
=>「683136187972F5」

3. ショートメッセージ処理:

1. 文字列を Unicode コードに変換します。

「Hello」の Unicode コードは 4F60597D
2. 分割します。長さを 2 倍し、2 桁の 16 進数を保持します。つまり、4F60597D = 8/ 2 => “04”、
=> “044F60597D”

4. 組み合わせ
1. 携帯電話番号の前に文字列 11000D91 を追加します (1100: 固定、0D: 携帯電話番号の長さ (+ 記号を除く、16 進数で表現)、91: 携帯電話への送信値は 91、PHS への送信値は 81)、
つまり 11000D91 683136187972F5
=> 11000D91683136187972F5
2. 携帯電話番号の後に 000800 と内容を追加します。先ほどのテキスト メッセージを書き留めてください。 000800
つまり、11000D91683136187972F5 000800 044F60597D
=> >3. メッセージ全体の長さを 2 で割って、2 桁の 10 の基数にフォーマットします。
は 11000D91683136187972F5000800044F60597D =>38 ビット/2 => 19

5 ですので、送信される内容は

AT CMGF=0 です。モード PDU

OK
AT CMGS=19 <🎜> "番号を入力する必要があります)、

ここで、xxx は市内電話の市外局番です。

--- 電話の市外局番が 3 桁の地域の場合:

xxx を電話の市外局番に置き換えてください。
例: 深センの電話市外局番は 755、
    <?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;      }             ?>  
ログイン後にコピー
チャイナ モバイルの SMS センター番号は 8613800755500

--- 電話の市外局番が 2 桁の地域:

xxxを3桁に置き換える場合は、市外局番の後に「0」を付けてください。

例: 北京の電話市外局番は 10、チャイナ モバイルのショート メッセージ センター番号は 8613800100500

現在、チャイナ ユニコム 165 ネットワークは全国で運用を開始しています。

SMS サービスを使用する前に、SMS センターのサービス番号を設定する必要があります:

北京 8613010112500

上海 8613010314500

深セン 8613010888500

山東省 8613010171500

江蘇省 8613010341500

浙江省 8613010360500

福建省 8613010380500

四川省 8613010811500

重慶 8613010831500

海南省 8613010501500

黒龍江省 8613010980500

吉林省 8613010911500

天津 8613010130500

河北省 86 13010180500

内モンゴル自治区 8613010950500

山西省8613010701500

安徽省 8613010305500

0796500

貴州省 8613010788500

雲南省 8613010868500

湖南省 8613010731500

湖北省 8613010710500

広東省 8613010200500

広西チワン族自治区 86130105915 00

河南省 8613010761500

江西省 8613010720500

遼寧省 8613010240500

付録 2

: 一般的に使用される AT コマンド:

AT CSMS ショート メッセージ サービスの選択

AT CPMS SMS メモリの選択

AT CMGF SMS フォーマットの選択

AT CSCA SMS センター アドレス

AT CNMI 新しく受信した SMS を表示

AT CMGR SMS メッセージの読み取り

AT CMGS SMS メッセージの送信

AT CMGL SIM カード内の SMS メッセージをリストします

AT CMSS SIM メモリから SMS メッセージを送信します

AT CMGW 送信ショート メッセージを SIM メモリに書き込みます

AT CMGD ショート メッセージを削除しますSIM メモリ内のメッセージ

AT CSCB が携帯ブロードキャスト メッセージを選択します

付録 3: ショート メッセージの受信

ショート メッセージの受信メッセージは基本的に SIM またはキャッシュから情報を読み取ります。これは主に、AT CMGR と AT CMG

L の 2 つの命令を使用して行われます。無線モジュールのメーカーが異なると、AT コマンド セット

の解釈コードと応答メッセージが異なるため、最初に次のようにする必要があります。モデムとの通信が確立できるかどうかを確認します。通常は AT コマンドを使用してこの確認を完了し、正しい応答を受け取った後、AT CM

GF コマンドを使用します。モデムは、AT コマンドを使用して読み取り機能を完了します。

通常、AT CMGL は、MODEM の RING データを受信するときに、リアルタイム情報を読み取るために使用されます。以下は、H6221-W を使用した SMS 受信の例であり、PDU モードの適用を示しています。

操作手順は以下の通りです({ }はコメント):

送信:AT

応答:OK {接続確立}

送信:AT CMGF =0 {PDU 形式を選択}

回答: OK {PDU 形式の選択を許可}

送信: AT CMGL=2 {既存のテキスト メッセージをリストする}

回答: CMGL: 1、2、、24 {1 はメッセージ数を表し、2 は未送信メッセージを表し、24 は合計メッセージ容量を表します}

0D71683108370105F004000D81683179133208F10000026080410033802632184C

F682D95E0DC2B36D3D170A0243106933D97A0243106933D97A02451068B1983492608

OK

上記の PDU 形式の 16 進文字列のセットには、ショート メッセージの内容だけでなく、送信者の番号とショート メッセージ センターも含まれています

番号、SMS送信時間など。

メッセージの内容は以下で分析されます:

0D: 短いメッセージ センター アドレス (番号) 長さ。

91: SMS センター番号タイプ、91 は TON/NPI です。 TON/NPI は International/E.164 標準に準拠しています。

は、数値の前に「 」記号を追加する必要があることを意味します。さらに、他の値も使用できますが、91 が最も一般的に使用されます。

683108370105F0: SMSC テキスト メッセージに使用されるサービス センターの番号は 13807310500 です。 16 を通過します

上位ニブルと下位ニブルはバイト単位で転置され、数値は奇数に F を加えたものとなり、16 進バイトを形成します。

04: PDU タイプ、ファイルヘッダーバイト。

0B: 発信番号の長さ。

81: 発信番号の種類。

3179133208F1:0A 発信者番号も処理されており、実際の番号は 13973123801 です。

00: PID、プロトコル識別子。

00: DCS ショート メッセージのエンコード タイプは GSM デフォルト アルファベットで、8 ビット

16 進コード (オクテット) を形成するためにシフトされる 7 ビット ASCII コードで構成されます。表 2 に示します。

1 進数 B0 A6 A5 A4 A3 A2 A1 A0

2 進数 C1 C0 B6 B5 B4 B3 B2 B1

3 進数 D2 D1 D0 C6 C5 C4 C3 C2

4 進数 E3 E2 E1 E0 D6 D5 D4 D3

5 進数 F4 F3 F2 F1 F0 E6 E5 E4

6 進数 G5 G4 G3 G2 G1 G0 F6 F5

6 進数 H6 H5 H4 H3 H2 H1 H0 G6

02608041003380: SCTS SMS 送信時刻、02/06/08/14:00:33.08。

26: UDL は 8 ビット コード (オクテット) の短いメッセージ バイト長を処理しました。これはメッセージの ASCII コード長よりも小さいです。

32184CF682D95E30DC2B36D3D170A0243106933D97A0243106933D97A0245106

8B1983492608: UD エンコードされた PDU データ、SMS コンテンツ "2002/06/08/ 13:48ID102OKID103

OK ID201FAIL」。

1FCraftsman_Gao
無料テキストメッセージ?
関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート