電気通信業界におけるショートメッセージピアツーピア(SMPP )は、外部ショートメッセージエンティティ(ESME)、ルーティングエンティティ(RE)、 SMSC間でショートメッセージ[ 1 ]データを転送するための柔軟なデータ通信インターフェースを提供するように設計されたオープンな業界標準プロトコルです。[ 2 ]
SMPPは、サードパーティ(ニュース組織などの付加価値サービスプロバイダーなど)がメッセージを一括送信できるようにするために使用されることが多いですが、SMSピアリングにも使用できます。SMPPは、EMS、ボイスメール通知、セルブロードキャスト、WAPプッシュメッセージ( MMS通知の配信に使用)、USSDメッセージなどのショートメッセージを伝送できます。汎用性が高く、 UMTS、IS-95(CDMA)、CDMA2000、ANSI-136(TDMA)、iDENなどの非GSM SMSプロトコルをサポートしているため、SMPPはSS7ネットワーク外でのショートメッセージ交換に最も一般的に使用されるプロトコルです。
SMPP(Short Message Peer-to-Peer)は、元々はアイルランドの小規模企業であるAldisconによって設計されました。Aldisconは後にLogica (2016年以降はMavenirに改称)に買収されました。このプロトコルは、SS7テスト機器を使用せずにメッセージを送信することでSMSCの機能をテストするために、開発者のIan J Chambersによって作成されました。
1995年にETSIはSMPPプロトコルを技術報告書TR 03.39に含めた。[ 3 ]
1999年、LogicaはSMPPを正式にSMPP開発者フォーラム(後にSMSフォーラムと改名)に引き渡した。
SMSフォーラムは2007年に解散し、次のような発表を行った。「世界の無線業界の利益のためにSMS(ショートメッセージサービス)を開発、育成、促進することを使命とする非営利団体であるSMSフォーラムは、2007年7月27日までに解散します。」[ 4 ] 当初の引き渡し条件の一部として、SMPPの所有権はMavenirに戻った。
SMPPは、その名称に「ピアツーピア」とありますが、クライアント・サーバー型の運用モデルを採用しています。ショートメッセージサービスセンター(SMSC)は通常サーバーとして機能し、ESMEからの接続を待ち受けます。SMPPをSMSピアリングに使用する場合、送信側のMCは通常クライアントとして機能します。
このプロトコルは、 OSIレイヤ 4 ( TCPセッションまたはX.25 SVC3) 接続を介して交換される要求/応答 PDU (プロトコル データ ユニット、またはパケット)のペアに基づいています。 [ 5 ] TCP上で動作する SMPP 用にIANAによって割り当てられたよく知られたポートは2775ですが、メッセージング環境では複数の任意のポート番号がよく使用されます。
メッセージの交換を行う前に、bind コマンドを送信して確認応答する必要があります。bind コマンドは、メッセージの送信方向を決定します。bind_transmitter はクライアントがサーバーにメッセージを送信することのみを許可し、bind_receiver はクライアントがメッセージを受信することのみを意味し、bind_transceiver (SMPP 3.4 で導入) は双方向のメッセージ転送を許可します。[ 6 ] bind コマンドでは、ESME は system_id、system_type、password を使用して自身を識別します。ESME アドレスを格納するように設計された address_range フィールドは通常空のままです。bind コマンドには、使用する SMPP プロトコルのバージョンを指定する interface_version パラメーターが含まれています。
メッセージ交換は、同期方式と非同期方式の2種類があります。同期方式では、各ピアは送信される各PDUに対する応答を待ちます。非同期方式では、複数の要求を待機せずに発行でき、相手ピアによって不規則な順序で確認応答されます。確認応答されない要求の数はウィンドウと呼ばれます。最高のパフォーマンスを得るには、通信する両方の側で同じウィンドウサイズを設定する必要があります。
SMPP規格は、時間の経過とともに進化を遂げてきました。最も一般的に使用されているSMPPのバージョンは以下のとおりです。
適用可能なバージョンは、bindコマンドのinterface_versionパラメータで渡されます。
SMPP PDUは効率化のためバイナリエンコードされています。ヘッダーで始まり、その後にボディが続く場合があります。
各PDUはヘッダーで始まる。ヘッダーは4つのフィールドで構成され、各フィールドの長さは4オクテットである。
command_lengthcommand_idcommand_statussequence_numberSMPP のすべての数値フィールドはビッグエンディアン順序を使用します。つまり、最初のオクテットが最上位バイト (MSB) になります。
これは、60オクテットのsubmit_sm PDUのバイナリエンコードの例です。データは1つのダンプとして16進オクテット値で表示され、その後にそのPDUのヘッダーとボディの内訳が続きます。
エンコードがフィールドごとの定義とどのように一致するかを理解するには、SMPP仕様のsubmit_sm PDUの定義と比較するのが最適です。
値の内訳は、括弧内に小数点、その後に16進数で示されています。1つまたは複数の16進数オクテットが末尾に表示されている箇所は、指定されたフィールドサイズが1オクテット以上のエンコーディングを使用しているためです。
繰り返しになりますが、仕様書にあるsubmit_sm PDUの定義を読めば、すべてがより明確になるでしょう。
'command_length'、(60) ... 00 00 00 3C 'command_id'、(4) ... 00 00 00 04 'command_status'、(0) ... 00 00 00 00 'sequence_number', (5) ... 00 00 00 05
'service_type', () ... 00 'source_addr_ton'、(2) ... 02 'source_addr_npi '、(8) ... 08 'source_addr'、(555) ... 35 35 35 00 'dest_addr_ton'、(1) ... 01 'dest_addr_npi '、(1) ... 01 'dest_addr', (555555555) ... 35 35 35 35 35 35 35 35 35 35 00 'esm_class'、(0) ... 00 'protocol_id'、(0) ... 00 'priority_flag'、(0) ... 00 'schedule_delivery_time'、(0) ... 00 'validity_period'、(0) ... 00 'registered_delivery'、(0) ... 00 'replace_if_present_flag', (0) ... 00 'data_coding'、(3) ... 03 'sm_default_msg_id'、(0) ... 00 'sm_length'、(15) ... 0F 'short_message', (こんにちは Wikipedia) ... 48 65 6C 6C 6F 20 57 69 6B 69 70 65 64 69 61
short_message フィールドのテキストは data_coding と一致する必要があることに注意してください。data_coding が 8 (UCS2) の場合、テキストは UCS-2BE (またはその拡張であるUTF-16BE ) である必要があります。data_coding が 7 ビットのエンコーディングを示している場合、各セプテットは short_message フィールドの個別のオクテットに格納されます (最上位ビットは 0 に設定されます)。SMPP 3.3 の data_coding はGSM 03.38の TP-DCS 値を正確にコピーしたため、GSM 7 ビットのデフォルトアルファベット、UCS2、またはバイナリ メッセージにのみ適しています。SMPP 3.4 では、新しい data_coding 値のリストが導入されました。
data_coding=4またはの意味は8SMPP 3.3 と同じです。 1~15 の範囲の他の値は SMPP 3.3 で予約されています。 残念ながら、data_coding=0 が明確に GSM 7 ビットデフォルトアルファベットであった SMPP 3.3 とは異なり、SMPP 3.4 以降では、GSM 7 ビットデフォルトアルファベットはこのリストに含まれておらず、さまざまなショートメッセージサービスセンターdata_coding=0によって異なる場合があります。ISO -8859-1、ASCII、GSM 7 ビットデフォルトアルファベット、UTF-8、または ESME ごとに設定可能な場合もあります。 を使用する場合は、両側 (ESME と SMSC) が同じエンコーディングであることを確認する必要があります。そうでない場合は、 を使用しない方が良いでしょう。 GSM 7 ビットデフォルトアルファベットの使用は難しい場合があります。一部のショートメッセージサービスセンターではが必要で、他のセンターでは などが必要です。data_coding=0data_coding=0data_coding=0data_coding=241
広く受け入れられているにもかかわらず、SMPPにはいくつかの問題点がある。
data_codingGSMデフォルトアルファベットの標準値はありませんdata_coding=0submit_sm_respSMPPバージョン間の非互換性SMPP 3.3 の値はGSM 03.38data_codingに基づいているものの、SMPP 3.4 以降ではGSM デフォルト アルファベット ( GSM 03.38 ) の標準化された値は存在しません。また、7 ビット文字が GSM のようにパックされて 140 オクテットで 160 文字を送信できるのか、それとも 7 ビット文字がそれぞれオクテット全体としてエンコードされるのか (ASCII のように最上位ビットがゼロに設定される) も曖昧です。data_coding
SMPP 3.4および5.0によると、この値はdata_coding=0「SMSCデフォルトアルファベット」を意味します。実際にどのエンコーディングになるかは、SMSCの種類とその構成によって異なります。
CDMA規格C.R1001のエンコーディングの1つに、日本語で使用されるShift-JISがあります。SMPP 3.4および5.0では、日本語用に3つのエンコーディング(JIS、ISO-2022-JP、拡張漢字JIS)が指定されていますが、いずれもCDMA MSG_ENCODING 00101とは一致しません。SMPPでは、Shift-JISのメッセージを伝送するためにピクトグラムエンコーディング(data_coding=9)が使用されているようです。
submit_sm が失敗した場合、SMSC はsubmit_sm_respcommand_status がゼロ以外の値で message_id が「空」である を返します。
message_id field「このフィールドが存在しない場合は、単一のNULLバイトを含める必要がある」と明示的に規定されています。PDUの長さは少なくとも17オクテットです。SUBMIT_SM_RESP」というセクションに、残念な注記があります。その場合、PDU の長さは 16 オクテットになります。submit_sm_respcommand_statusmessage_idのCオクテット文字列型の必須パラメータとして指定されていますsubmit_sm_resp。セクション3.1.1「NULL設定」によると、「NULL文字列」は0x00としてエンコードされます。PDUの長さは少なくとも17オクテットです。最高の互換性を確保するためには、SMPPの実装は、submit_sm_resp通信に使用されるSMPP規格のバージョンに関係なく、否定表現の両方のバリアントを受け入れるべきである。
エラーシナリオの本来の意図は、PDU 応答にボディが返されないことでした。これは、すべての Aldiscon/Logica SMSC および他のほとんどのベンダーで見られる標準的な動作でした。WAP フォーラムで SMPP 3.4 が取り上げられたとき、NACK 応答にボディを含めるべきかどうかについていくつかの明確化が求められ、仕様のセクション
submit_smやbind_transceiverセクションなど、いくつかの場所でこの点を明確にするための措置が取られました。最終的に V5.0 で追加した明確化、つまりエラー応答にはボディを含めるべきではないという点を追加するべきでした。一部のベンダーは実装で非常に愚かで、拒否されたbind_transmitter応答にはボディを含めますが、bind_transceiver応答には含めません。ベンダーへの推奨事項は、上記のように、両方のバリアントを受け入れることです。しかし、空のボディの有無にかかわらず、NACKsubmit_sm_respおよびdeliver_sm_respPDU を発行することも賢明です。これら 2 つの PDU の場合、空のボディはストリームの最後に 1 つの NULL オクテットのように見えます。 NACKされたリクエストに、いわゆるダミーボディを含める機能が必要になる理由は、相手側がボディの欠落を許容するように実装を変更できない、あるいは変更したがらない可能性があるからです。(私はAldiscon/LogicaでSMPP仕様の3つのバージョンに携わり、Openmind Networks向けにESMEソリューションを設計しました。)
—コーマック・ロング
SMPP 3.3 で配信確認を渡す唯一の方法は、テキスト形式の情報をフィールドに入力することですshort_message。ただし、テキストの形式は SMPP 3.4 の付録 B に記載されていますが、SMPP 3.4 ではその目的で TLV を使用することもできます (また使用すべきです) receipted_message_id。SMPP message_state3.3 ではメッセージ ID は最大 8 文字 (末尾の '\0' を含む) の C オクテット文字列 (16 進数) であると規定されていますが、SMPP 3.4 仕様では配信確認フォーマットの id フィールドは最大 10 文字の C オクテット文字列 (10 進数) であると規定されています。これにより、SMPP の実装は 2 つのグループに分かれます。
message_id配信受領書の本文の id フィールドでは整数メッセージ ID の 10 進数表現を、フィールドreceipted_message_idでは整数メッセージ ID の 16 進数表現を使用する実装message_idパラメータと配送受領書本文のidフィールドの両方で同じ16進数(または同じ任意の文字列)を使用する実装ただし、SMPP 3.4仕様では、配信確認フォーマットはSMSCベンダー固有のものであると規定されており、仕様に含まれるフォーマットはあくまで可能性の一つに過ぎません。前述のとおり、SMPP 3.4を使用する場合はreceipted_message_id、message_stateメッセージの結果を伝達するためにTLVを使用する必要があります。
バージョン3.4でTLVパラメータが導入されて以来、SMPPは拡張可能なプロトコルとみなせるようになりました。可能な限り高い互換性と相互運用性を実現するためには、あらゆる実装においてインターネットの堅牢性原則、「送信するものには慎重を期し、受信するものには寛容を期す」を適用する必要があります。タスクを達成するために必要な最小限の機能セットのみを使用すべきです。そして、目的が些細な議論ではなく通信であるならば、各実装は標準規格との軽微な不適合を克服する必要があります。
generic_nackwith」を返すcommand_status=3が、通信を停止してはならない。command_lengthフィールドによって決まります。メッセージフィールドはPDUの末尾を超えてはなりません。フィールドが正しく終了していない場合、PDUの末尾で切り捨てられたものとして扱われ、後続のPDUに影響を与えてはなりません。あるバージョンのSMPPに適用される情報は、別のバージョンのSMPPにも記載されている場合がよくあります。例えば、上記で説明したSMPP 3.3における唯一の納品受領メカニズムについて、SMPP 3.4では説明されています。
SMPPプロトコルは平文バイナリプロトコルに基づいて設計されているため、SMS経由でワンタイムパスワードなどの機密情報を送信する場合は注意が必要です。ただし、必要に応じてSSL/TLS上でSMPPを実装することも可能です。[ 7 ]