問題概要#
ポート番号・起動順序は正しく設定しているのに、FlightGearとJSBSim間でUDPデータが送受信されない問題が発生します。JSBSim側では正常にシミュレーションが進行しているが、FlightGearには何も表示されません。
原因#
WindowsファイアウォールがUDPポート5550の通信をブロックしています。
詳細な原因#
- 初回実行時の選択ミス: Windowsセキュリティの警告ダイアログで「ブロックする」を選択してしまった
- ルールの不在: Python.exeとfgfs.exeの受信・送信ルールが存在しない
- デフォルトのブロック: Windowsファイアウォールはデフォルトでインバウンド接続をブロック
よくあるケース:
- 初回実行時に警告ダイアログを閉じてしまい、ブロック状態のまま
- Python仮想環境を変更した際、新しいpython.exeにルールが適用されていない
- FlightGearを再インストールした後、ルールが削除された
解決方法#
Windows Firewall設定手順#
ステップ1: ファイアウォール詳細設定を開く
- 「Windowsセキュリティ」を開く(Windowsキー → 「Windowsセキュリティ」で検索)
- 「ファイアウォールとネットワーク保護」をクリック
- 「詳細設定」をクリック(管理者権限が必要)
ステップ2: 受信の規則を作成(Python.exe用)
- 左側メニューから「受信の規則」を選択
- 右側メニューから「新しい規則…」をクリック
- 規則の種類: プログラム を選択 → 次へ
- プログラムパス: このプログラムのパス を選択
- パス例:
C:\Users\<ユーザー名>\AppData\Local\Programs\Python\Python310\python.exe - 仮想環境使用時:
C:\Users\<ユーザー名>\project\.venv\Scripts\python.exe
- パス例:
- 操作: 接続を許可する → 次へ
- プロファイル: すべてチェック → 次へ
- 名前:
Python JSBSim UDP→ 完了
ステップ3: 受信の規則を作成(fgfs.exe用)
- 同様の手順で fgfs.exe のルールを作成
- プログラムパス:
C:\Program Files\FlightGear 2020.3\bin\fgfs.exe - 名前:
FlightGear UDP
ステップ4: 送信の規則も作成
左側メニューから「送信の規則」を選択し、同様の手順でPython.exeとfgfs.exeのルールを作成。
確認方法#
ポート5550の使用状況を確認:
netstat -ano | findstr 5550出力例:
UDP 0.0.0.0:5550 *:* 12345
UDP [::]:5550 *:* 12345これが表示されれば、ポート5550がリッスン中です。
予防策#
1. README.mdにファイアウォール設定を記載#
初回実行時にファイアウォール設定が必要であることを明記:
## 初回セットアップ
### Windows Firewall設定(Windows環境のみ)
初回実行時にWindowsファイアウォールの警告が表示されたら、
**必ず「アクセスを許可する」を選択**してください。
手動設定が必要な場合は、docs/firewall_setup.mdを参照してください。2. 起動スクリプトにファイアウォール確認機能を追加#
ポート5550がブロックされていないかチェック:
import socket
def check_firewall():
"""ファイアウォールがポート5550をブロックしていないか確認"""
try:
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind(('localhost', 5550))
sock.close()
print("✅ ポート5550: 使用可能")
return True
except OSError as e:
if "Address already in use" in str(e):
print("⚠️ ポート5550: 既に使用中(別プロセスが使用)")
return False
elif "Permission denied" in str(e):
print("❌ ポート5550: ファイアウォールでブロックされている可能性")
print(" → Windowsファイアウォール設定を確認してください")
return False
else:
print(f"❌ ポート5550: エラー - {e}")
return False
# 起動前にチェック
if not check_firewall():
print("ファイアウォール設定を確認してください。")
input("Enterキーを押して終了...")
exit(1)3. ネットワーク疎通テストの実装#
UDP送信前に接続性を確認:
import socket
import time
def test_udp_connection(host='localhost', port=5550):
"""UDP接続のテスト"""
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.settimeout(1.0)
try:
# テストメッセージ送信
sock.sendto(b"TEST", (host, port))
print(f"✅ UDP送信成功: {host}:{port}")
return True
except Exception as e:
print(f"❌ UDP送信失敗: {e}")
print(" → ファイアウォール設定を確認してください")
return False
finally:
sock.close()まとめ#
Windows Firewall UDP通信ブロック問題は、ファイアウォールルールの不在が原因です。
原因:
- 初回実行時にブロックを選択
- Python.exeとfgfs.exeの受信・送信ルールが存在しない
- Windowsファイアウォールのデフォルトブロック
解決策:
- Windows Firewall詳細設定で受信・送信ルールを作成
- Python.exeとfgfs.exeの両方にルールを適用
- netstatでポート使用状況を確認
予防策:
- READMEにファイアウォール設定手順を記載
- 起動スクリプトにポート確認機能を追加
- UDP送信前にネットワーク疎通テストを実施
ファイアウォール設定を正しく行うことで、FlightGear連携が確実に動作します。
関連記事#
- 【トラブル備忘】FlightGearに機体が表示されない - UDP通信ポート番号不一致(記事E-3)
- 【トラブル備忘】Socket bind error: Address already in use - ポート重複使用(記事E-18)
© 2025 Yaaasoh. All Rights Reserved.