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