DPlusインターフェース情報
DVAR HotSpotの機能をPIC32MXに移植する為に、DPlusとの間で情報をやり取りする内容を確認していたのですが、
今後DPlusとのインターフェース(プログラム)を作成される方のために、現時点で判明している情報を列挙して
おきます。(解釈に間違いがあるかもしれませんので注意してください。)
生存確認パケットの扱いに間違いがありましたので、修正しました。(2012/01/09)
ゲートのリスト取得方法について、追記しました。(2012/01/13)
例として示してあるパケットの例は、Wiresharkでキャプチャーしたものです。この関係で、各パケットの始めにTCPまたはUDPのヘッダーが表示されています。
ゲートウエイ及びリフレクターのIPアドレスの取得
リストを取得するには、opendstar.orgに対してポート20001でTCPで接続要求を、その後56バイトのリスト要求をしますと、リスト情報が得られます。
リストの内容は、1ゲート/リフレクターに対して26バイトです。最初の16バイトがIPアドレスです。xx.xx.xx.xxの書式で得られます。16バイトに満たない
場合は、ヌル(0x00)がセットされています。その後にゲート/リフレクターの名前がセットされています。8文字に満たない場合は、ヌルがセットされます。
ただし、取得したリストのIPアドレスの欄の最初に0x39(数字の9)より大きな値がセットされている場合は、8バイトスキップします。なお、このフィールドの
7バイト目と8バイト目は、全体の登録数が入っています。(上位バイトと下位バイトが逆になっています。)また、5バイトと6バイトで、以後のリストが何番目
にあたるかの位置が入っています。(上位バイトと下位バイトが逆になっています。)
下記に、opendstar.orgに対してリスト要求したバケットの内容を示しておきます。16進数で最初の35バイトまでは、TCPのヘッダー情報です。
36バイト以降が要求したパケットの内容です。16進で3Aから、D-STARに登録されたコールサインを指定します。これ以外は、このまま使用
すれば、リストが得られます。
0000 00 26 87 04 3e 34 00 00 e2 75 d0 a0 08 00 45 00 .&..>4.. .u....E.
0010 00 60 01 cf 40 00 80 06 bc 78 c0 a8 00 50 41 fe .`..@... .x...PA.
0020 39 5a 04 2f 4e 21 5f 50 57 02 de 07 26 e8 50 18 9Z./N!_P W...&.P.
0030 ff ff 3a d0 00 00 38 c0 01 00 37 4d 33 54 4a 5a ..:...8. ..7M3TJZ
0040 20 41 44 56 30 31 39 39 39 39 20 20 20 20 20 20 ADV0199 99
0050 20 20 57 58 49 42 32 20 20 20 20 20 20 20 44 48 WXIB2 DH
0060 53 30 32 35 37 20 20 20 20 20 20 20 20 20 S0257
リストを取得するプログラムの例です
DPlusへの接続要求
DPlusとの情報のやり取りは、ポート20001のUDPで行います。まず最初、クライアント側から上記手順で得られたIPアドレスに対して
ポート20001のUDPで接続を行います。(通常は、ソケットと設定するだけです。)接続が完了したところで、DPlusに対して、接続要求の
パケットを出します。下記にその手順を示します。
クライアント側からDPlusへの接続要求。16進で最初の29バイトは、UDPのヘッダー情報です。2Aバイト目以降が、情報です。以下同様です。
0x05 0x00 0x18 0x00 0x01 の5バイトを送信して接続要求を行います。
0000 00 26 87 04 3e 34 00 00 e2 75 d0 a0 08 00 45 00 .&..>4.. .u....E.
0010 00 21 02 65 00 00 80 11 49 c5 c0 a8 00 50 3a 01 .!.e.... I....P:.
0020 f3 a8 3c 9d 4e 21 00 0d 68 73 05 00 18 00 01 ..<.N!.. hs.....
DPlusからクライアントへの応答
0000 00 00 e2 75 d0 a0 00 26 87 04 3e 34 08 00 45 00 ...u...& ..>4..E.
0010 00 21 00 00 40 00 32 11 5a 2a 3a 01 f3 a8 c0 a8 .!..@.2. Z*:.....
0020 00 50 4e 21 3c 9d 00 0d 68 73 05 00 18 00 01 00 .PN!<... hs......
0030 00 00 00 00 00 00 00 00 00 00 00 00 ........ ....
0x05 0x00 0x18 0x00 0x01 の5バイトが返ってきます。
クライアント側からDPlusへD-STAR網の登録情報の送信します。16進で2Eから35でコールサインを、もしPIN番号があれば36から3DでPIN番号を指定します。無い場合は、ヌルを指定します。
0000 00 26 87 04 3e 34 00 00 e2 75 d0 a0 08 00 45 00 .&..>4.. .u....E.
0010 00 38 02 66 00 00 80 11 49 ad c0 a8 00 50 3a 01 .8.f.... I....P:.
0020 f3 a8 3c 9d 4e 21 00 24 a9 4e 1c c0 04 00 37 4d ..<.N!.$ .N....7M
0030 33 54 4a 5a 20 41 00 00 00 00 00 00 00 00 44 56 3TJZ A.. ......DV
0040 30 31 39 39 39 39 019999
DPlusからクライアントへの応答
0000 00 00 e2 75 d0 a0 00 26 87 04 3e 34 08 00 45 00 ...u...& ..>4..E.
0010 00 24 00 00 40 00 32 11 5a 27 3a 01 f3 a8 c0 a8 .$..@.2. Z':.....
0020 00 50 4e 21 3c 9d 00 10 d8 0a 08 c0 04 00 4f 4b .PN!<... ......OK
0030 52 57 00 00 00 00 00 00 00 00 00 00 RW...... ....
最後のRWがROの場合は、コールサインが登録されていませんので送信ができません。受信は、可能です。
DVモードのデータのやり取り
DPlusからの情報
ヘッダー情報
DPlusから送られてきたヘッダー情報です。全体で58バイトです。最初の2バイトは0x3A,0X80でヘッダー情報であることを示しています。
次の4バイトは、DSVTで固定です。以下、フラッグ2バイト、予備領域2バイト、そして7バイトの幹線へダー、そして41バイトのヘッダー情報です。
幹線ヘッダーは、
です。通常は、送り先レピータIDは、0x00、送り元レピータIDは、0x01、そして送り元端末IDは、0x02をセットすれば大丈夫です。また、通話IDは、無線部へダー
から音声データが終わるまで、同じ番号を付加します。通常は、シーケンスでかまいません。管理情報は、同期信号が含まれている音声パケットを0として
順次20までの数字が割り当てられます。なお、ヘッダー情報の場合は、0x80を割り当てます。また、音声パケットの最後の場合は、通常の順次20まで割り当てられた番号に
対して5ビット目(0x40)をオンにします。
0000 00 00 e2 75 d0 a0 00 26 87 04 3e 34 08 00 45 00 ...u...& ..>4..E.
0010 00 56 00 00 40 00 33 11 58 f5 3a 01 f3 a8 c0 a8 .V..@.3. X.:.....
0020 00 50 4e 21 3c 9d 00 42 31 27 3a 80 44 53 56 54 .PN!<..B 1':.DSVT
0030 10 00 00 00 20 00 01 02 43 e4 80 00 00 00 52 45 .... ... C.....RE
0040 46 30 34 37 20 42 4a 45 33 48 43 5a 20 4e 2f 4a F047 BJE 3HCZ N/J
0050 50 31 59 4a 51 20 4a 50 33 42 47 46 20 20 20 20 P1YJQ JP 3BGF
0060 20 20 6d 8f m.
音声情報
DPlusから送られてきた音声情報です。全体で29バイトです。最初の2バイトは0x1D、0X80で音声情報であることを示しています。
次の4バイトは、DSVTで固定です。以下、フラッグ2バイト、予備領域2バイト、そして7バイトの幹線へッダー、そして12バイトの音声
情報です。幹線へッダーは、へッダーの場合と同じです。
0000 00 00 e2 75 d0 a0 00 26 87 04 3e 34 08 00 45 00 ...u...& ..>4..E.
0010 00 39 00 00 40 00 33 11 59 12 3a 01 f3 a8 c0 a8 .9..@.3. Y.:.....
0020 00 50 4e 21 3c 9d 00 25 e1 fc 1d 80 44 53 56 54 .PN!<..% ....DSVT
0030 20 00 00 00 20 00 01 02 43 e4 00 a2 29 ac 5b 2d ... ... C...).[-
0040 1c 40 5a 4f 55 2d 16 .@ZOU-.
音声情報の最後
音声情報の最後を示すラストフレームの 0x55 0x55 0x55 0x55 0xC8 0x7Aを最初の3バイトを
簡易データフィールドに納め、まず送信します。
0000 00 00 e2 75 d0 a0 00 26 87 04 3e 34 08 00 45 00 ...u...& ..>4..E.
0010 00 39 00 00 40 00 33 11 59 12 3a 01 f3 a8 c0 a8 .9..@.3. Y.:.....
0020 00 50 4e 21 3c 9d 00 25 bd 7e 1d 80 44 53 56 54 .PN!<..% .~..DSVT
0030 20 00 00 00 20 00 01 02 43 e4 0d fb 2e a6 62 49 ... ... C.....bI
0040 1a 97 27 df 55 55 55 ..'.UUU
次に、残りの3バイトを音声パケットの最初に、残りの9バイトに0x55を、そして最後に
0x25 0x1A 0xC6の3バイトを足し合計で32バイトにして、他の音声情報とは区別して送ります。なお、音声
パケットの最初の2バイトで音声パケットを識別している 0x1D 0x80 の代わりに、 0x20 0x80 をセットします。
また、パケットの順序を示す番号には、本来の番号に64(10進数)を足します。
0000 00 00 e2 75 d0 a0 00 26 87 04 3e 34 08 00 45 00 ...u...& ..>4..E.
0010 00 3c 00 00 40 00 33 11 59 0f 3a 01 f3 a8 c0 a8 .<..@.3. Y.:.....
0020 00 50 4e 21 3c 9d 00 28 6a 1e 20 80 44 53 56 54 .PN!<..( j. .DSVT
0030 20 00 00 00 20 00 01 02 43 e4 4e 55 c8 7a 55 55 ... ... C.NU.zUU
0040 55 55 55 55 55 55 55 25 1a c6 UUUUUUU% ..
一連の情報の最後
この後、ヘッダー情報から音声パケットの一連の送信(PTTが押されている間、DVモードの無線機から送信される
情報)の終わりを示す下記パケットが送られてきます。16進数で2Aの位置から始まる0x0A 0xC0 で始まる10バイトです。
0000 00 00 e2 75 d0 a0 00 26 87 04 3e 34 08 00 45 00 ...u...& ..>4..E.
0010 00 26 00 00 40 00 33 11 59 25 3a 01 f3 a8 c0 a8 .&..@.3. Y%:.....
0020 00 50 4e 21 3c 9d 00 12 b3 c3 0a c0 0b 01 43 e4 .PN!<... ......C.
0030 79 00 00 00 00 00 00 00 00 00 00 00 y....... ....
DPlusへの情報
「DPlusからの情報」と同じ情報を組み立てて、DPlus側に送れば、接続している先に送られます。
生存確認パケット
クライアント側から生存している旨のパケットをDPlus側に送信します。接続が完了した後は、接続が切れるまで定期的にクライアントからDPlusへ、生存確認のパケットを送ります。以下がその例です。
0000 00 26 87 04 3e 34 00 00 e2 75 d0 a0 08 00 45 00 .&..>4.. .u....E.
0010 00 1f 02 67 00 00 80 11 49 c5 c0 a8 00 50 3a 01 ...g.... I....P:.
0020 f3 a8 3c 9d 4e 21 00 0b 83 17 03 60 00 ..<.N!.. ...`.
03 60 00 の3バイトがそうです。
上記パケットに対してDPlusから下記パケットが返ってきます。03 60 00 の3バイトがそうです。この応答が数秒間の間に無い場合は、
DPlus側で取りこぼしている可能性がありますので再度送ってください。この処理がなされないと、
DPlus側でリンクが切れたとして処理します。
0000 00 00 e2 75 d0 a0 00 26 87 04 3e 34 08 00 45 00 ...u...& ..>4..E.
0010 00 1f 00 00 40 00 32 11 5a 2c 3a 01 f3 a8 c0 a8 ....@.2. Z,:.....
0020 00 50 4e 21 3c 9d 00 0b 83 17 03 60 00 00 00 00 .PN!<... ...`....
0030 00 00 00 00 00 00 00 00 00 00 00 00 ........ ....
DPlusへの切断要求
クライアント側からDPlusへの切断要求。16進で最初の29バイトは、UDPのヘッダー情報です。2Aバイト目以降が、情報です。
0x05 0x00 0x18 0x00 0x00 の5バイトを送信して切断要求を行います。
0000 00 26 87 04 3e 34 00 00 e2 75 d0 a0 08 00 45 00 .&..>4.. .u....E.
0010 00 21 02 65 00 00 80 11 49 c5 c0 a8 00 50 3a 01 .!.e.... I....P:.
0020 f3 a8 3c 9d 4e 21 00 0d 68 73 05 00 18 00 00 ..<.N!.. hs.....
DPlusからクライアントへの応答
0000 00 00 e2 75 d0 a0 00 26 87 04 3e 34 08 00 45 00 ...u...& ..>4..E.
0010 00 21 00 00 40 00 32 11 5a 2a 3a 01 f3 a8 c0 a8 .!..@.2. Z*:.....
0020 00 50 4e 21 3c 9d 00 0d 68 73 05 00 18 00 00 00 .PN!<... hs......
0030 00 00 00 00 00 00 00 00 00 00 00 00 ........ ....
0x05 0x00 0x18 0x00 0x00 の5バイトが返ってきます。
複数モジュールからの転送
DPlusは、DPlusがサポートしている全モジュールの情報をクライアント側に転送してきます。このため、クライアント側では、
特定のモジュールからの情報だけを選択して処理するようにする必要があります。この方法は、無線部ヘッダーのRPT2の情報
から(最後の8文字目)必要としているもモジュールからの情報かどうかを判別します。この情報が必要としている情報の場合、
このパケットの通話IDを記憶し、以後、この通話IDと同じパケットだけをラストパケットを受信するまで処理します。ラストパケット
が受信された場合は、通話IDをクリアーし、次のヘッダーが来るまで待ちます。
2012年08月15日更新
CopyRight(c) 2012 All Rights Reserved.
安田 聖(やすだ さとし)7M3TJZ
E-mail: 7m3tjz@jk1zrw.org