当プロトコルは、地震情報・津波予報・地震感知情報メッセージの3つを、P2Pネットワークで速やかに伝達・共有することを目的としたものです。Ver0.20より、地震情報の署名・発信元ピアの保証を追加し、安全性が格段に向上しました。
TCP/IPを使用します(IPv4のみをサポートします)。「サーバー」との通信は6910ポート、「ピア」との通信は6911〜6915ポート等(特に制限はない)を使用します。
通信は、すべて「3桁の数字(コード) + 半角スペース + 経由数 + 半角スペース + データ + 改行(CRLF)」の形で行われます。データはShift-JISエンコードで、複数ある場合は原則として「:(半角コロン)」で区切ります。
「経由数」は、発信元からデータを受信するまでに経由したピアの数です。サーバーとの通信では常に「1」です。ピアとの通信では、データを他のピアへ伝達する際に1増やさなくてはいけません。また、無限ループを防ぐため、経由数が総参加ピア数の平方根もしくは10のいずれか大きいほうを超える場合、データをそれ以上他のピアに伝達してはいけません。
(Ver0.28 重要追記)
また、Ver0.24から、コード298(プロトコル仕様への非準拠エラー)が追加されました。このプロトコル仕様とは少しでも異なる手順を取ると、サーバーからコード298が返され、それ以降の処理を一切行わないようになっています。
[サーバーとの通信データ例]
↑ 116 1 25:6911:901:2
↓ 236
[ピア同士の通信データ例]
↓ 551 12 ABCDEFG:23時56分,3,0,1,4,東海道沖,10km,3.2,1:-奈良県,+震度1,下北山村
↑(他ピアに) 551 13 ABCDEFG:23時56分,3,0,1,4,東海道沖,10km,3.2,1:-奈良県,+震度1,下北山村
注:公開鍵暗号への対応は必須ではありません。ただし、対応しない場合「データの正当性を検証できない」「地震感知情報メッセージを発信できない」という制限があります。
当プロトコルでは、地震情報・津波予報の偽装防止、地震感知情報メッセージの連続発信の制限を目的として、公開鍵暗号を使用しています。
PKCS #8 (DER)形式
MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQC8p/vth2yb/k9x2/PcXKdb6oI3gAbhvr
/HPTOwla5tQHB83LXNF4Y+Sv/Mu4Uu0tKWz02FrLgA5cuJZfba9QNULTZLTNUgUXIB0m/d
q5Rx17IyCfLQ2XngmfFkfnRdRSK7kGnIXvO2/LOKD50JsTf2vz0RQIdw6cEmdl+Aga7i8Q
IBEQ==
PKCS #8 (DER)形式
MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQDTJKLLO7wjCHz80kpnisqcPDQvA9voNY
5QuAA+bOWeqvl4gmPSiylzQZzldS+n/M5p4o1PRS24WAO+kPBHCf4ETAns8M02MFwxH/Fl
QnbvMfi9zutJkQAu3Hq4293rHz+iCQW/MWYB5IfzFBnWtEdjkhqHsGy6sZMMe+qx/F1rcQ
IBEQ==
当プロトコルでは、鍵やデータの有効期限は、すべて「プロトコル時刻」を基準にしています。コンピュータの時計のズレ、あるいは時差の影響を受けることのないようにするためです。「プロトコル時刻」において許容される時刻誤差は、プラスマイナス1秒未満です。
プロトコル時刻は、P2Pネットワークへの参加時にサーバーから供給されます。「コンピュータの時計」と「プロトコル時刻」との差がプラスマイナス1秒未満であれば、コンピュータの時計をそのままプロトコル時刻として使っても構いません。
差がプラスマイナス1秒以上であれば、コンピュータの時計とプロトコル時刻との差を記憶しておくといった方法で、必要な時に「プロトコル時刻」を算出する必要があります。
「x1x」「x2x」は「要求」、「x3x」「x4x」は「返答」、「x5x」「x6x」は「伝達・発信」、「x9x」は「エラー」となっています。
注意:下記で「データ:不要」「データ:なし」と記されているのは、プロトコルにおける「データ」部分で何も指定(解析)する必要がないという意味です。逆に言えば、データに何を指定しても構いません。
ピアからサーバーへ(100番台) | |
112 | (※通信ステップの簡略化により使用していません) サーバーの対応プロトコルバージョン、ソフトウェア名・ソフトウェアバージョンを要求します。 データ:不要 |
113 | ピアIDの暫定割り当てを要求します。 データ:不要 |
114 | ポート開放のチェックを要求します。 データ:ピアID、ポート番号 |
115 | 参加中のピアデータを要求します。 データ:ピアID |
116 | ピアIDの本割り当てを要求します。 データ:ピアID、ポート番号、地域コード、接続数、最大接続数 |
117 | 鍵の割り当てを要求します。 データ:ピアID |
118 | 基準となるプロトコル時刻を要求します。 データ:なし |
119 | 通信の終了を要求します。 データ:不要 |
123 | エコー日時更新を要求します。 データ:ピアID、接続数 |
124 | 鍵の再割り当てを要求します。 データ:ピアID、以前割り当てた秘密鍵 |
126 | Ver0.30 廃止(115に統合)参加中のピアデータを要求します(接続維持用)。 データ:ピアID |
127 | (Ver0.21新規)各地域ピア数を要求します。 データ:なし |
128 | 参加終了を要求します。 データ:ピアID、以前割り当てた秘密鍵 |
131 | ([211]に対し)対応プロトコルバージョン、ソフトウェア名・ソフトウェアバージョンを返します。 データ:プロトコルバージョン、ソフトウェア名、バージョン |
155 | Ver0.30 追加 ([235]受信後)新たに接続出来たピアのIDを通知します。 データ:ピアID |
192 | サーバーの対応プロトコルバージョンが古く、互換性がありません。 データ:不要 |
サーバーからピアへ(200番台) | |
211 | ピアの対応プロトコルバージョン、ソフトウェア名・ソフトウェアバージョンを要求します。 データ:なし |
212 | (※本来は[112]に対するものですが、通信ステップの簡略化により変更しています) ([131]に対し)対応プロトコルバージョン、ソフトウェア名・ソフトウェアバージョンを返します。 データ:プロトコルバージョン、ソフトウェア名、バージョン |
233 | ([113]に対し)ピアIDを暫定的に割り当てます。割り当てたピアIDを返します。 データ:割り当てたピアID |
234 | ([114]に対し)ポート開放のチェック結果を返します。 データ:結果(成功:1、失敗:0) |
235 | Ver0.30 変更 ([115]に対し)参加中のピアデータを返します。 データ:「IPアドレス,ポート,ピアID:IPアドレス,ポート,ピアID...」 |
236 | ([116]に対し)ピアIDの本割り当てを行います。 データ:現在の参加ピア総数 |
237 | ([117]に対し)鍵の割り当てを行います。 データ:秘密鍵、公開鍵、有効期限、鍵の署名 |
238 | ([118]に対し)基準となるプロトコル時刻を返します。 データ:プロトコル時刻 |
239 | ([119]に対し)通信の終了を受け入れます。 データ:なし |
243 | ([123]に対し)エコー日時更新を受け入れます。 データ:なし |
244 | ([124]に対し)鍵の再割り当てを行います。 データ:秘密鍵、公開鍵、有効期限、鍵の署名 |
246 | Ver0.30 廃止(235に統合)([126]に対し)参加中のピアデータを返します(接続維持用)。 データ:「IPアドレス,ポート:IPアドレス,ポート...」 |
247 | 各地域のピア数を伝達します。 データ:地域コード,ピア数;地域コード,ピア数... |
248 | ([128]に対し)参加終了を受け入れます。 データ:なし |
291 | 原因不明のエラーが発生しました。 データ:なし 対処:処理を中止します。 |
292 | ([131]に対し)ピアの対応プロトコルバージョンが古く、互換性がありません。 データ:なし 対処:ユーザーにその旨を伝え、P2Pネットワークへの参加を中止します。 |
293 | 要求が正しくありません。 データ:なし 対処:処理を中止します。 |
295 | ([117][124]に対し)鍵は既に割り当て済みです。 データ:なし 対処:(鍵がない・期限が切れている場合)次回サーバーへのエコー時に再割り当てを要求します。 |
298 | 処理の流れがプロトコル仕様に準拠していません。 データ:なし 対処:プログラムがプロトコル仕様に準拠するよう修正します。 |
299 | IPアドレスが違います。 データ:なし 対処:一旦ネットワークから切断し、参加しなおします。 |
ピアからピアへ(データ伝達は500番台、システム通信は600番台) | |
550 | 予約コード。 |
551 | 地震情報を伝達します。 データ:データ署名、有効期限、地震情報概要、地震情報詳細 |
552 | 津波予報を伝達します。 データ:データ署名、有効期限、津波予報詳細 |
553 ~ 554 |
予約コード。 |
555 | 地震感知情報を伝達します。 データ:データ署名、有効期限、公開鍵、鍵署名、鍵期限、感知情報データ |
556 | Ver0.33 廃止伝言板を伝達します。 データ:データ署名、有効期限、公開鍵、鍵署名、鍵期限、伝言板データ |
557 ~ 560 |
予約コード。 |
561 |
Ver0.34,0.36 変更 各地域のピア数を伝達します。緊急地震速報 配信試験の伝達、緊急地震速報(警報)の簡易的な伝達にも使用します。 データ:データ署名、有効期限、「地域コード,ピア数;地域コード,ピア数...」 |
562 ~ 589 |
予約コード。 |
611 | ピアエコーを要求します。 データ:不要 |
612 | ピアIDを要求します。 データ:不要 |
614 | Ver0.30 追加 ピア対応プロトコルバージョン、ソフトウェア名・ソフトウェアバージョンを要求します。 データ:プロトコルバージョン、ソフトウェア名、バージョン |
615 | 調査エコーを要求します。 データ:発信者ピアID、一意な数値 |
620 ~ 629 |
予約コード。 |
631 | ([611]に対し)ピアエコーを返します。 データ:不要 |
632 | ([612]に対し)ピアIDを返します。 データ:ピアID |
634 | Ver0.30 追加 ([614]に対し)ピア対応プロトコルバージョン、ソフトウェア名・ソフトウェアバージョンを返します。 データ:プロトコルバージョン、ソフトウェア名、バージョン |
635 | ([615]に対し)調査エコーを返します。 データ:発信者ピアID、一意な数値、自ピアID、接続中(隣接)ピアID、到達経路(hop)数 |
640 ~ 649 |
予約コード。 |
694 | Ver0.30 追加 ([614][634]に対し)相手ピアの対応プロトコルバージョンが低く、互換性がありません。 データ:なし 対応:いくつかのピアから同様のエラーが返る場合、最新バージョンを確認します。 |
「地域コード」は3ケタの数値で、「地震感知情報」の送受信や、「ピア分布」の作成に必要となるものです。地域の区切りに深い意味はありません。なお、今後変更される可能性がありますので、変更に対応しやすい実装を行うことを推奨します。
(Ver0.30r重要)Ver0.30rより、地域コード区分が変更されました。新しい地域区分は、震度速報で用いられる地域区分(計186)を、少しおおまかにしたものです(計138、未設定など含め計141)。
注1:分散化への対応は必須ではありません。が、安定性や信頼性向上のために、対応することを強く推奨します。対応しない場合、接続先はclient.p2pquake.netとしてください。
注2:Ver0.20時点で分散化しているとの表記を行っておりましたが、これは誤りです。分散化はVer0.22より対応しています。
当プロトコルに準拠するサーバーは、全国各地で複数稼動しています。これは、大規模地震(または軽微なメンテナンス)等で一部のサーバーがダウンした場合や、地震発生時に集中するアクセスの分散などを想定したものです。プロトコル仕様書リリースの時点で稼動しているサーバーは、次の通りです。
サーバーアドレス | 地方 |
p2pquake.info | 北海道 |
www.p2pquake.net | 関東 |
p2pquake.xyz | |
p2pquake.ddo.jp |
各サーバーは常にデータを同期しているため、アクセスを分散する意味でも接続するサーバーは毎回ランダムで決定してください。
決定したら、サーバーへの接続を開始します(ポートは6910)。タイムアウト等で接続出来なかった場合は、再びサーバーを選びなおして作業を繰り返してください。なお、タイムアウトまでの時間は2〜3秒と短くても構いません。
注意:同一IPアドレスから2セッション目の接続を確立しようとした場合や、接続から60秒が経過した場合、サーバーから接続が切断されることがあります。
サーバーへの接続が完了した後、サーバーからコード211(対応プロトコルバージョン等の要求)が送られてきます。これに対しては、コード131(対応プロトコルバージョン等の返答)にて応答します。
データは「対応プロトコルバージョン」「ソフトウェア名」「ソフトウェアバージョン」の3つです。プロトコルバージョンは「x.xx(例:0.20)」の形式である必要がありますが、ソフトウェア名・ソフトウェアバージョンの表記は自由です。
↓ 211 1
↑ 131 1 0.20:P2PQ_Client:Beta2_Rev1000
↓ 212 1 0.20:P2PQ_Server:Beta2_Rev1000
(↓ 292 1 Protocol_version_incompatible)
(↑ 192 1)
問題がなければ、サーバーからコード212(対応プロトコルバージョン等の返答)が返ります。データ形式はコード131で送ったものと同じです。
対応するプロトコルバージョンが古く互換性がない場合は、サーバーからコード292(エラー:バージョンが古い)が返されます。その場合は、その旨をユーザーに伝えてP2Pネットワークへの接続を中止する必要があります。逆に、もしサーバーの対応するプロトコルバージョンが古く互換性がない場合は、コード192(エラー:バージョンが古い)を送信し、別のサーバーとの接続を試みてください。
ピアIDとは、P2Pネットワークにおいてピアを識別するために使われるIDのことです。まず、サーバーから暫定的にピアIDを割り当ててもらう必要があります。コード113(ピアID暫定割り当て要求)を送信します。これに対しては、コード233(ピアID暫定割り当て)が返ります。データはピアIDです。
↑ 113 1
↓ 233 1 25
次に、他ピアからの接続を受け付ける場合は、正しくポートが開放されているかチェックするために、受け付け用のポート(6911〜6915等、制限なし)でListenしてから、コード114(ポート開放チェック要求)を送信します。データはピアID、ポート番号です。
↑ 114 1 25:6911
↓ 234 1 1
チェック結果は、コード234(ポート開放チェック返答)で返されます。データが1であれば成功、それ以外(0)であれば失敗です。
次に、ピアとの接続を行うために、ピアデータを取得します。コード115(ピアデータの取得)を送信します。データはピアIDです。サーバーからは、コード235(ピアデータ)が返ります。
↑ 115 1 25
↓ 235 1 192.168.0.1,6911,15:192.168.0.2,6915,81:192.168.0.3,6913,66
↑ 155 1 15:66
データは、ピアごとに「コロン区切り」です。さらに、ピアごとのIPアドレス・ポート番号・ピアID(Ver0.30新規)が「カンマ区切り」となっています。これを元に、ピアに接続を試みます。
3〜5ピアと接続したか、ピアデータを使い果たしたら、(Ver0.30新規)コード155(接続ピアID通知)を送信します。データは、接続したピアのIDです。
ピアとの接続が完了した場合、暫定的に割り当てられていたピアIDの本割り当てを要求します。コード116(ピアIDの本割り当て要求)を送信します。データは、ピアID、ポート番号、地域コード、接続数、受け入れ可能な最大接続数です。
↑ 116 1 25:6911:901:2:6:5,8,3
↓ 236 1 29
本割り当てが完了した場合、サーバーからコード236(ピアIDの本割り当て)が返ります。データは、現在の参加ピア総数です。ピアIDは暫定的に割り当てられていたものをそのまま使用します。
この後、自らがP2Pネットワークへデータを発信する際に必要なRSA鍵を取得します(地震感知情報メッセージを発信しない場合、取得する必要はありません)。コード117(鍵割り当ての要求)を送信します。データはピアIDです。鍵の割り当てが成功した場合、コード237(鍵割り当て)が返ります。データは、秘密鍵、公開鍵、有効期限、鍵の署名です。秘密鍵・公開鍵・鍵署名はBASE64エンコードされています。有効期限は「YYYY/MM/DD HH-MM-SS」フォーマットです。
↑ 117 1 25
↓ 237 1 ABCDEFGHIJKLMNOPQRSTU:ABCDEFGHIJKLMN:2005/03/14
12-34-56:ABCDEFGHIJKLMN
(↓ 295 1 Key_has_allocated)
同一IPアドレスから一定時間内に複数の鍵を取得しようとした場合などでは、コード295(エラー:鍵割り当て済み)が返ります。この場合、P2Pネットワーク参加中の「サーバーへのエコー」時に鍵の再割り当てを試み、割り当てが行われるまでは、「鍵がない(未署名)」状態で地震感知情報メッセージを送信することになります。
各地域のピア数を取得します。コードは127です。サーバーからは、コード247が返ります。
↑127 1
↓247 1 001,0;002,2;003,5;004,3
地域ピア数は、地域ごとに「セミコロン区切り」です。さらに、地域コードとその地域のピア数が「カンマ区切り」となっています。なお、地域ピア数が0である地域のデータは含まれません。
鍵やデータの有効期限をチェックする際に必要な「プロトコル時刻」を取得します。コードは118です。サーバーからは、コード238が返ります。
↑ 118 1
↓ 238 1 2005/03/19 12-34-56
時刻フォーマットは「YYYY/MM/DD HH-MM-SS」です。原則として、日本標準時とほぼ同じです。
ここまでの処理が正常に行われた場合、P2Pネットワークへの参加処理は完了しました。コード119(通信終了要求)を送信し、サーバーからコード239(通信終了)が返れば、サーバーとの接続を切断してください。
↑ 119 1
↓ 239 1
ピアは、正常に動作していることを通知するため、サーバーに「エコー」する必要があります。エコーは、10分間隔で行ってください。30分以上行われないと、サーバーは「ピアがダウンした」と判断します。
「P2Pネットワークへの参加 - 1.サーバーへの接続」と同様
「P2Pネットワークへの参加 - 2.プロトコルバージョン等の通知」と同様
エコーは、コード123です。データには、ピアIDと現在のピアとの接続数をを指定します。成功すると、コード243(エコーOK)が返ります。
↑ 123 1 25:3
↓ 243 1
(↓ 299 1 IP_Address_has_been_changed)
エコー時のIPアドレスが参加時と変わっている場合、コード299が返されることがあります。この場合、一旦ネットワークから切断し、参加しなおしてください。
鍵の有効期限が切れる30分前から、必要に応じてコード124(鍵の再割り当て要求)を行うことが出来ます。データには、ピアID、以前割り当てられた秘密鍵(のBASE64エンコード)を指定します。もし、参加時にコード295が返された等で以前割り当てられた秘密鍵がない場合、「Unknown」を指定します。
↑ 124 1 25:ABCDEFG
↓ 244 1 ABCDEFGHIJKLMNOPQRSTU:ABCDEFGHIJKLMN:2005/03/14
12-34-56:ABCDEFGHIJKLMN
(↓ 295 1 Key_has_allocated)
鍵の再割り当てが成功すると、コード244が返ります。データは、秘密鍵、公開鍵、有効期限、鍵の署名です。詳細なフォーマットは「P2Pネットワークへの参加 - 5.ピアIDの本割り当て・鍵の取得」と同様です。同一IPアドレスから一定時間内に複数の鍵を取得しようとした場合などでは、コード295が返ります。この場合、次回エコー時に再び割り当てを試みてください。
Ver0.30で、コードが統合されました。「P2Pネットワークへの参加 - 4.ピアデータの取得・ピアとの接続」と同様
ただし、既に接続済みのピアと複数のセッションを確立することのないよう、ID・IPアドレスが重複していないかチェックする必要があります。
また、コード155による接続ピアID通知には、新たに接続したピアのIDのみを通知します。
「P2Pネットワークへの参加 - 7.プロトコル時刻の取得」と同様
「P2Pネットワークへの参加 - 8.サーバーとの接続終了」と同様に、コード119を送信し、コード239が返れば接続を切断します。
全てのピアとの接続を切断してください。
「P2Pネットワークへの参加 - 1.サーバーへの接続」と同様
「P2Pネットワークへの参加 - 2.プロトコルバージョン等の通知」と同様
参加終了は、コード128で行います。データは、ピアID、以前割り当てた秘密鍵(のBASE64エンコード)です(鍵が割り当てられていない場合は「Unknown」)。正常に完了すれば、コード248が返ります。
↑ 128 1 25:ABCDEFG
↓ 248 1
鍵が正しくない場合はコード293(要求が正しくない)、IPアドレスが参加時と異なっている場合はコード299(IPアドレスが一致しない)が返ります。この場合、どうすることも出来ないので、そのまま次のステップに進んでください。
「P2Pネットワークへの参加 - 8.サーバーとの接続終了」と同様に、コード119を送信し、コード239が返れば接続を切断します。
ポートを開放している場合、他ピアからの接続を受け付けることがあります。接続数が限界ではない限り、速やかに接続を受け入れてください。
受け入れた後、接続先のIPアドレスを調べた上で、他に接続しているピアとIPアドレスが重複していないか確認してください。重複していた場合、受け入れた接続を切断してください。これは、同一ピアと2セッション接続してしまうことを防ぐためです。
他ピアからの接続を受け付けた場合、プロトコルバージョンとピアIDをやり取りします。
まず、コード614(バージョン要求)でプロトコルバージョンを要求します。コード634(バージョン返答)が返ります。
↑ 614 1 0.30:P2PQ_Client:Beta2.1_Rev1000
↓ 634 1 0.30:P2PQ_Client:Beta2.1_Rev1002
(↓ 694 1 Protocol_version_incompatible)
相手プロトコルバージョンが古い場合、コード694を返し、接続を切断します。
次に、ピアIDを把握するために、コード612(ピアID要求)でピアIDを要求します。ピアからは、コード632(ピアID返答)が返ります。データはピアIDです。
↑ 612 1
↓ 632 1 26
コード632が返りピアIDが判明した場合、接続中のピアとピアIDが重複していないか確認してください。重複していた場合、新たに接続してきたピアとの接続を切断します。これは、同一ピアと2セッション接続してしまうことを防ぐためです。
注意:2セッション接続しているかどうかの判定がIPアドレス・ピアIDと二重ですが、問題はありません。
ピアとの接続が切断していないかチェックするために、2〜5分程度の間隔で接続中のピアにコード611(ピアエコー要求)を送信します。接続が正常であれば、相手からはコード631(ピアエコー返答)が返ります。
↑ 611 1
↓ 631 1
10〜30秒以内に相手から応答が返らない場合や、ソケット状態が「エラー」となっている場合は、ピアとの接続を切断してください。
ピアとピアとの繋がりを視覚化します。いわばEPSP上のtracerouteですが、仕組みは若干異なります。
↑ 615 1 35:35196742
↓ 615 7 35:35196742
↑ 635 1 35:35196742:38:12,67:7
なお、このネットワーク調査については、完全な対応を必須としません。ただし、受信した「調査エコー」または「調査エコーリプライ」を接続中の全てのピアにリレーすることは必須です。
将来の拡張のために予約されている予約コードについては、「ピアとのデータ通信 - 1.重複判定・各ピアへの伝達」に従って処理してください。
当プロトコルでは、複数のピアと接続していることから、複数のピアから同一の通信データを受信することが当たり前のようにあります。そのため、同一の通信データかどうかを判断し、同一「ではない」場合にのみ処理を行う必要があります。
同一の通信データかどうかは、通信のデータ部分で判断してください。「データ署名」のある通信は、これを用いることもできます。
そして、同一「ではない」と判断された場合、署名やその他を検証する前に、速やかにデータを送ってきたピア「以外」の他ピアへ情報を伝達する必要があります(※その際、「基本概要 - 2.基本仕様」に記されているよう、経由数を1プラスする必要があります)。
将来の拡張のために予約されている予約コードについても、上記の通り処理してください。
サーバーからのデータには、それがサーバーから発信されたことを示す署名が含まれています。次の方法で署名の検証を行うことが出来ます。
地震情報はサーバーから発信されます。が、サーバーも「1ピア」として発信するため、実装で特に意識する必要はありません。地震情報は、コード551です。データは、コロン区切りで「データ署名」「有効期限」「地震情報概要」「地震情報詳細」と大きく4つに分かれています。クライアントで表示フォーマットを自由にデザインすることが出来ます。
↓ 551 5 ABCDEFG:2005/03/27 12-34-56:12時34分頃,3,1,4,紀伊半島沖,ごく浅く,3.2,1,N12.3,E45.6,仙台管区気象台:-奈良県,+2,*下北山村,+1,*十津川村,*奈良川上村
地震情報概要は、カンマ区切りで「発生時刻」「震度」「津波の有無(0=なし,1=あり,2=調査中,3=不明)」「地震情報種類(1=震度速報,2=震源情報,3=震源・震度情報,4=震源・詳細震度情報,5=遠地地震情報)」「震源」「深さ」「マグニチュード」「震度訂正(0=いいえ,1=はい)」「緯度(N=北緯,S=南緯)」「経度(E=東経,W=西経)」「発表管区」となっています。
(Ver0.38 一部変更) 地震情報詳細は、カンマ区切りです。先頭に「-」があれば都道府県名、「+」があれば震度、「*」があれば震度観測点名、「=」は自由付加文です。なお、今後他の記号を使って新たな情報を表現する場合があります。
注意:地震情報の種類により、震源または地震情報詳細が空である場合があります。震度は「5弱」等文字列が含まれることがあります。地震情報詳細の震度にはさらに「5弱以上(推定)」も含まれることがあります。
[表示例]
12時34分頃、震度3の地震がありました。津波の心配はありません。震源は紀伊半島沖、深さはごく浅く、マグニチュードは3.2と推定されます。震度が訂正されました。
【奈良県】震度2:下北山村 震度1:十津川村
奈良川上村
(Ver0.38 加筆) 「自由付加文」は、地震情報に含まれる自由付加文をそのまま設定します(気象庁の解説資料では「その他の付加的な情報を、自由付加文の形式で記載する」となっています)。遠地地震情報の中には、地震ではなく海外の火山噴火を発表するケースがあり(気象庁|地震や火山現象等に伴い発生する津波)、この区別を行うために配信しています。ただし、改行は「&newline;」に変換しています。
↓ 551 5 ABCDEFG:2023/12/03 18-21-16:3日17時40分,不明,2,5,インドネシア、スマトラ南部,-1km,-1.0,0,S0.4,E100.5,気象庁:=令和05年12月03日17時40分頃(日本時間)にマラピ火山で大規模な噴火が発生しました(ダーウィン航空路火山灰情報センター(VAAC)による)。&newline;海外の検潮所での津波の観測状況については、随時お知らせします。&newline;この噴火に伴って津波が発生して日本へ到達する場合、到達予想時刻は早いところ(沖縄県地方)で、3日21時00分頃です。予想される津波の最大波の高さは不明です。&newline;今後の情報に注意してください。&newline;次の遠地地震に関する情報は、3日21時30分頃に発表の予定です。&newline;なお、新たな観測結果が入った場合には随時お知らせします。&newline;(注1)本情報の冒頭に「海外で規模の大きな地震がありました。」や「震源地」とありますが、これは「遠地地震に関する情報」を作成する際に自動的に付与される文言です。実際には、規模の大きな地震は発生していない点に留意してください。&newline;(注2)早い場合の日本への到達予想時刻は、火山の大規模噴火により発生した気圧波が310m/sで伝播し津波が発生したと想定した時刻です。
地震情報と同じように、津波予報もサーバーから発信されます。サーバーが「1ピア」として発信する点も同じです。津波予報は、コード552です。データは、コロン区切りで「データ署名」「有効期限」「津波予報詳細」と大きく3つに分かれています。
↓ 552 6 ABCDEFG:2005/03/27 12-34-56:-大津波警報,*和歌山県,-津波警報,+淡路島南部,+徳島県,-津波注意報,+大阪府,+兵庫県瀬戸内海沿岸
津波予報詳細は、カンマ区切りです。先頭に「-」があれば予報種類(津波注意報・津波警報・大津波警報)、「+」または「*」があれば予報区名です。「*」は、その予報区に直ちに津波が来襲することを示します。ただし、解除された場合は、単に「解除」という文字列が入ります。
予報区は、気象庁の「地震・津波の資料」の「津波予報区について」に記載されています。
(Ver0.36 廃止)
なお、仮に津波予報が各管区気象台から別々に発表された場合、(Webサイトへの更新のタイミングから)その一部を取りこぼす可能性がある重大な問題を含んでいます。当プロトコルに準拠するソフトウェアを公開される場合は、ヘルプ等に必ずこれを明記してください。
「各地域ピア数」とは、ピアが通知した「地域コード」を元に、各地域のピア数を示したものです。各地域ピア数もサーバーが「1ピア」として発信します。各地域ピア数はコード561です。データは、コロン区切りで「データ署名」「有効期限」「地域ピア数」です。
↓561 25 ABCDEFG:2005/03/27 12-34-56:001,0;002,2;003,5;004,3
地域ピア数は、地域ごとに「セミコロン区切り」で分かれています。さらに、地域コードとその地域のピア数が「カンマ区切り」となっています。なお、地域ピア数が0である地域のデータは含まれません。
(Ver0.34 一部変更, Ver0.36 加筆, Ver0.37 一部変更) 「緊急地震速報 配信試験」は、緊急地震速報(警報)が発表されたことのみを伝えるものです。互換性を保つために各地域ピア数のデータに含む形で発信します。「地域ピア数」データ内に、地域コードが950・ピア数が0のデータがあるかどうかで判断します。なお、地域コードが951・ピア数が0の場合はテスト配信です。
↓561 25 ABCDEFG:2005/03/27 12-34-56:001,0;002,2;003,5;004,3;950,0
(Ver0.36,0.37 一部変更) 「緊急地震速報(警報) 部分配信」は、気象庁の緊急地震速報(警報)の内容の一部を、互換性を保つために各地域ピア数のデータに含む形で発信します。「地域ピア数」データ内に、以下の地域コードがピア数0のデータとして含まれています。
↓561 25 ABCDEFG:2005/03/27 12-34-56:001,0;002,2;003,5;004,3;952,0;779,0;169,0;170,0
本データは簡易的な伝達を目的としたもので、緊急地震速報(警報)としての利活用は推奨いたしません。
地震感知情報データは、ユーザーから発信されます。「正しい方法によって発信された」ことを示すために、発信時にデータの署名を行う必要があります。
このようにして出来た「データ署名」「公開鍵」「鍵署名」のBASE64エンコードデータは、「9.地震感知情報」発信に使用されます。
逆に、地震感知情報データが「正しい方法によって発信された」ことを確かめるには、次のようにして検証します。
これにより、「サーバーから割り当てられた鍵を用いて発信された」ことを確認することが出来ます。
悪意のあるなしに関わらず、1人によって地震感知情報が大量に発信されれば、地震感知情報は使い物にならなくなってしまいます。このようなことを防ぐために、受信側で何らかの対策が必要となります。
例えば、地震感知情報では「同じ公開鍵によるものは1分に1回しか受け付けない」ようにします。これにより、何者かが1分に100回の地震感知情報を発信しても、100回のうち99回は「無効」として処理されるため、機能に支障をきたすことがなくなります。実際には、5〜10分に1回しか受け付けないぐらいでも良いでしょう。
地震感知情報は、ユーザーによる「揺れた」という情報のことです。コード555で、(Ver0.30変更)データは「データ署名」「有効期限」「公開鍵」「鍵署名」「鍵期限」「感知情報データ」です。「感知情報データ」には、カンマ区切りで「ユニーク値」「地域コード」が入っています。なお、署名が出来ない場合は「有効期限」「感知情報データ」以外は空文字列とします。
↓ 555 13 ABCDEFG:2005/03/27 12-34-56:ABCEFFG:ABCDEFG:2005/03/14 12-34-56:2503151124,901
「ユニーク値」には、「ピアIDと日時」といった重複しない文字列を指定します。
この地震感知情報はユーザーによるものであり、誤報も多く含みます。そのため、受信した時点ですぐに表示はせず、「30秒間に一定件数以上を受信した場合」といった条件で表示することを推奨します。
伝言板は、地震発生時・地震感知情報表示時における情報交換に使用するものです。コード556で、(Ver0.30変更)データは「データ署名」「有効期限」「公開鍵」「鍵署名」「鍵期限」「伝言板データ」です。「伝言板データ」には、カンマ区切りで「名前」「地域コード」「メッセージ」「ID(予約)」「ID署名(予約)」が入っています。
↑ 556 1 ABCDEFG:2005/03/27 12-34-56:ABCDEFG:ABCDEFG:2005/03/14 12-34-56:ななし,901,めるぽ!,Reserved,Reserved
メッセージにコロン(:)・アンパサンド(&)・改行が含まれる場合、送信・受信時にそれぞれ置き換えを行う必要があります。コロンは「:」、アンパサンドは「&」、改行は「&newline;」です。