JTDXから1ヶ月分のADIFファイルを作るプログラム (2024/12/02) |
QSLマネージャーからTurboHamlogのADIFファイルのFT4の記述が仕様違反だという指摘を受けました
FT4のADIFでの正しい扱いは、 <MODE:4>MFSK <SUBMODE:3>FT4 です
JTDX、WSJTXのADIFファイルを調べたところ仕様通りであることが分かりました。
そこでJTDXから月ごとのADIFファイルを自動的に作るプログラムを作りました。 log_reciver_Ver2.1に小さなバグが見つかったのでlog_reciver_Ver2.2にバージョンアップしました
log_reciver_Ver2.2.zipのダウンロードはこちら
ZIPファイルがウイルスチェックで読めない方は こちら と こちら
ダウンロード回数:
10
|
プログラムはPython(パイソン)というプログラミング言語で書いています。
動作確認をしたのはWindows11のパソコンですがpython-3.13.0-amd64をダウンロードしてインストールしておく必要があります。 |
プログラムの動作はJTDXからUDPで受け取ったADIFデーターをそのまま指定したフォルダーに書きだすだけです。
月単位のファイルの書き出しのタイミングは0時UTCまたはJSTです。
|
# ------ (log_receiver_Ver2.1.py)
# JI1FGX/DU9 Kouichi Ueno
# 2024/12/02
# ディレクトリは C:\Logs
import os
import socket
import time
from datetime import datetime, timedelta
# UDPの設定
UDP_IP = "127.0.0.1" # JTDXが送信するIPアドレス
UDP_PORT = 2333 # JTDXが使用するポート番号
# ADIFファイルの保存先
LOGS_FOLDER = "C:\\Logs" # Logsフォルダのパス
# Logsフォルダが存在しない場合は作成
if not os.path.exists(LOGS_FOLDER):
os.makedirs(LOGS_FOLDER)
# タイムゾーンの設定
TIMEZONE = "UTC" # "UTC" または "JST" を指定
UTC_OFFSET = timedelta(hours=9) if TIMEZONE == "JST" else timedelta(hours=0)
# 現在の月に基づいてファイル名を生成
def get_adif_filename():
"""現在の月に基づいてADIFファイル名を取得"""
now = datetime.utcnow() + UTC_OFFSET # タイムゾーンを考慮した現在時刻
return os.path.join(LOGS_FOLDER, f"real_time_log_{now.year}_{now.month:02d}.adi")
# UDPソケットを作成
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind((UDP_IP, UDP_PORT))
def write_to_adif(data, file):
"""ADIFファイルにデータを書き込む"""
with open(file, 'a') as f:
f.write(data)
f.write("\n") # 各QSOを新しい行で区切り
def process_qso(data):
"""受け取ったデータをADIFフォーマットに変換する"""
# ここでは仮にJSON形式のデータが送られてくると仮定しています
# GridTracker2が送信するデータ形式に合わせて修正する必要があります
qso_data = data.decode('utf-8') # 文字列としてデコード
adif_data = f"<QSO>{qso_data}</QSO>" # 簡単なADIF形式に変換
return adif_data
print(f"Listening for UDP packets on {UDP_IP}:{UDP_PORT}...")
current_file = get_adif_filename() # 初期ファイル名を設定
last_checked_month = (datetime.utcnow() + UTC_OFFSET).month # 最後にチェックした月を保持
while True:
data, addr = sock.recvfrom(1024) # データを受信
if data:
print(f"Received message from {addr}: {data}")
adif_data = process_qso(data)
# 現在の月が変わった場合、ファイル名を更新
current_month = (datetime.utcnow() + UTC_OFFSET).month
if current_month != last_checked_month:
last_checked_month = current_month # 月を更新
current_file = get_adif_filename() # 新しい月のファイル名を取得
print(f"Switched to new file: {current_file}")
# ADIFファイルにデータを書き込む
write_to_adif(adif_data, current_file)
time.sleep(1) # 少し待ってから次のデータを受信
|
ファイルはlog receiver_Ver2.1.pyとして保存します。
私はC:\Users\kueno\log_receiver_Ver2.1.pyに保存しました
|
以下のvbsスクリプトはWindowsを起動したときにバックグラウンドでlog_receiver_Ver2.1.pyが
起動するようにするものです。出来たファイルtart_log_receiver.vbsまたはショートカットをスタートアップフォルダーに置きます。スタートアップフォルダーは WindowsKey+Rに「shell:startup」と入力するとフォルダーが開きます
|
' プログラムをWindowsを起動したときにバックグラウンドで動かすためのスクリプト
'----------(start_log_receiver.vbs)
' start_log_receiver.vbsまたはショートカットをスタートアップフォルダーに置く
' スタートアップフォルダーは WindowsKey+Rに「shell:startup」と入力するとフォルダーが開きます
Set objShell = CreateObject("WScript.Shell")
objShell.Run """C:\Users\kueno\AppData\Local\Programs\Python\Python313\pythonw.exe""
_
""C:\Users\kueno\log_receiver_Ver2.1.py""", 0,
False |
私はstart_log_receiver.vbsとしてvbsファイルを保存しました。
|
スタートアップフォルダーは WindowsKey+Rに「shell:startup」と入力するとフォルダーが開きます
start_log_receiver.vbsのショートカットを入れておきました
|
最後にJTDXの設定のレポーティングを開きます
第2UDPサーバーは 127.0.0.1
UDPポートを2333
に設定します
|
パソコンを再起動してタスクマネージャーでpyhtonwを探します
これでpyhtonwが有れば正常に起動できています。
|
実際にFT8とFT4で交信すると更新日時が変わりサイズが増えていきます
これがFT4で交信した時のADIFファイルの内容
仕様書通りになっています
<QSO><BAND:3>15m <STATION_CALLSIGN:10>JI1FGX/DU9
<MY_GRIDSQUARE:6>PJ18wf <CALL:6>JA1JAN <FREQ:9>21.142200
<MODE:4>MFSK<SUBMODE:3>FT4 <QSO_DATE:8>20241202 <TIME_ON:6>092615 <QSO_DATE_OFF:8>20241202
<TIME_OFF:6>092639 <RST_SENT:3>-15 <RST_RCVD:3>-15 <GRIDSQUARE:4>PM95
<EOR></QSO>
<QSO><BAND:3>15m <STATION_CALLSIGN:10>JI1FGX/DU9 <MY_GRIDSQUARE:6>PJ18wf <CALL:6>JA2ATE <FREQ:9>21.142200 <MODE:4>MFSK <SUBMODE:3>FT4 <QSO_DATE:8>20241202 <TIME_ON:6>093100 <QSO_DATE_OFF:8>20241202 <TIME_OFF:6>093129 <RST_SENT:3>+07 <RST_RCVD:3>-01 <GRIDSQUARE:4>PM85 <EOR></QSO>
|
|
ちなみにChatGPTが沢山手助けしてくれたことは内緒
|