南無ちゃんのブログ    https://namva.net

天下御免の夢中人=南無ちゃんは、今日も元気で明るく楽しく逞しく生きてゆく。

WSJT-X/JTDXのUDPメッセージを解読する

2020-07-04 12:27:14 | アマチュア無線
 最近は、アマチュア無線と言うとFT8で運用することが9割以上になりました。以前からJT-AlartやLogger-32などと連携して使用できることは知っていましたが、実際に利用したことはありません。6mのEsによるDXingをワッチしながら、UDPプロトコルについて調べてみました。私は主にJTDXを使用していますが、WSJT-Xから派生したアプリなので、UDPプロトコルはどちらも同じだと思われますので、文献を検索するにあたっては、主にWSJT-Xをキーワードにしました。
 WSJT-XのUDPプロトコルに関するドキュメントとしては、プログラムの一部であるヘッダーファイルのコメント(以下コメントと呼ぶ)のみのようです。
 ヘッダーファイル(NetworkMessage.hpp)は次のURLから閲覧できます。
      https://sourceforge.net/p/wsjt/wsjtx/ci/master/tree/Network/NetworkMessage.hpp

 プログラム=設計書という観点からみれば、コメントなどは当てにせず、ソースコードを解読するのが最良ですが、それはちょっと面倒なので、ヘッダーファイルの記述を見ながら、JTDXが送信するUDPメッセージを受信して表示するプログラムを作成して、プロトコルを解読しました。
 このプログラムは、VisualStudioCommunity2019のVBコンソールアプリとして作成しました。ソースコードを以下に示します。たった15行の短いプログラムです。

Module Module1
Sub Main()
Dim localIpString As String = "127.0.0.1"
Dim localAddress As System.Net.IPAddress=System.Net.IPAddress.Parse(localIpString)
Dim localPort As Integer = 2237
Dim localEP As New System.Net.IPEndPoint(localAddress, localPort)
Dim udp As New System.Net.Sockets.UdpClient(localEP)
While True
Dim remoteEP As System.Net.IPEndPoint = Nothing
Dim rcvBytes As Byte() = udp.Receive(remoteEP)
Dim rcvMsg As String = BitConverter.ToString(rcvBytes).Replace("-", "")
Console.WriteLine("received:" + rcvMsg)
End While
End Sub
End Module

 このプログラムを起動してモニターした例を示します。
received:AD-BC-CB-DA-00-00-00-02-00-00-00-00-00-00-00-04-4A-54-44-58-00-00-00-03-00-00-00-0B-32-2E-31-2E-30-2D-72-63-31-35-31

received:AD-BC-CB-DA-00-00-00-02-00-00-00-01-00-00-00-04-4A-54-44-58-00-00-00-00-02-FF-B7-28-00-00-00-03-46-54-38-00-00-00-00-00-00-00-03-2D-31-35-00-00-00-03-46-54-38-00-00-00-00-00-04-26-00-00-08-00-00-00-00-06-4A-48-34-41-44-4B-00-00-00-06-50-4D-36-34-75-75-00-00-00-00-00-FF-FF-FF-FF-00-00

received:AD-BC-CB-DA-00-00-00-02-00-00-00-02-00-00-00-04-4A-54-44-58-01-01-75-C3-98-FF-FF-FF-EF-BF-D3-33-33-40-00-00-00-00-00-01-82-00-00-00-01-7E-00-00-00-13-4A-53-36-50-58-42-2F-50-20-50-45-31-4E-53-51-20-2D-30-31-00- 00

 いずれのUDPパケットもADBCCBDAで始まっています。この部分は、コメントではmagic numberとされています。続く4バイト00000002は、schema numberです。その次の4バイトがMessage Typeを示しており、前述の3つのパケットは、それぞれ00000000と00000001と00000002になっています。
 Message Typeにより、それ以降の内容は異なります。0はHertbeat、1はStatus、2はDecodeです。興味深いのは2のDecodeメッセージです。この内容が、JTDXやWSJT-Xの左側の列(Band Activity)に表示されています。

 コメントを見ながら、前述のDecodeメッセージを解読してみましょう。
 Decodeメッセージは次のような構成です。
Id (unique key) utf8
New bool
Time QTime(quint32)
snr qint32
Delta time (S) float (serialized as double)
Delta frequency (Hz) quint32
Mode utf8
Message utf8
Low confidence bool
Off air bool

 qint32とかquint32などのように型を示す記述の頭文字にqが用いられているのは、WSJT-XがQtという開発環境で作成されているためでしょう。
 分かりにくかったのがutf8という型です。文字列を表していて、先頭の4バイトで文字数、残りの部分がASCIIコードという構造です。
-00-00-00-04-4A-54-44-58
 Id: 4文字"JTDX"

-01
 New: 真

-01-75-C3-98
 Time:

-FF-FF-FF-EF
snr: -17

-BF-D3-33-33-40-00-00-00
 DT: -0.3

-00-00-01-82
 DF: 386

-00-00-00-01-7E
Mode: 1文字"~"

-00-00-00-13-4A-53-36-50-58-42-2F-50-20-50-45-31-4E-53-51-20-2D-30-31
Message: 19文字"JS6PXB/P PE1NSQ -01"

-00
Low confidence: 偽

-00
Off air: 偽

 Message Typeが5のパケットはQSO Loggedメッセージですが、これは。Log QSOボタンを押してLog QSO代やログをひょうじさせ、OKボタンを押した時に送信されます。QSO Loggedメッセージを適切に処理するようなプログラムを書けば、自作ログソフトにデータを転送できるようになるでしょう。
 ReplyメッセージをWSJT-X/JTDXに送ると、送信できるようです。The action taken is exactly equivalent to the user double clicking the message in the "Band activity" window.との記述があります。送信は、Haltメッセージで停止できるようです。色々使い道があるようなので、もう少し研究してみたいと思います。


コメント