From adff8ffb8ac14d9206bd8f749747267866da8604 Mon Sep 17 00:00:00 2001 From: Tian jianyong <11429339@qq.com> Date: Mon, 20 Oct 2025 19:37:25 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=20WebsocketConfig=20?= =?UTF-8?q?=E7=9A=84=E9=87=8D=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...etConfig.java => ADXPWebSocketConfig.java} | 2 +- tools/generate_flight_messages.py | 201 ++++++++++++++++++ tools/test_adxp_websocket_direct.py | 86 ++++++++ 3 files changed, 288 insertions(+), 1 deletion(-) rename qaup-collision/src/main/java/com/qaup/collision/datacollector/config/{WebSocketConfig.java => ADXPWebSocketConfig.java} (95%) create mode 100644 tools/generate_flight_messages.py create mode 100644 tools/test_adxp_websocket_direct.py diff --git a/qaup-collision/src/main/java/com/qaup/collision/datacollector/config/WebSocketConfig.java b/qaup-collision/src/main/java/com/qaup/collision/datacollector/config/ADXPWebSocketConfig.java similarity index 95% rename from qaup-collision/src/main/java/com/qaup/collision/datacollector/config/WebSocketConfig.java rename to qaup-collision/src/main/java/com/qaup/collision/datacollector/config/ADXPWebSocketConfig.java index 80c9256c..7fdc9e66 100644 --- a/qaup-collision/src/main/java/com/qaup/collision/datacollector/config/WebSocketConfig.java +++ b/qaup-collision/src/main/java/com/qaup/collision/datacollector/config/ADXPWebSocketConfig.java @@ -7,7 +7,7 @@ import org.springframework.web.socket.client.WebSocketClient; import org.springframework.web.socket.client.standard.StandardWebSocketClient; @Configuration -public class WebSocketConfig { +public class ADXPWebSocketConfig { @Bean public WebSocketClient webSocketClient() { diff --git a/tools/generate_flight_messages.py b/tools/generate_flight_messages.py new file mode 100644 index 00000000..dfb4c634 --- /dev/null +++ b/tools/generate_flight_messages.py @@ -0,0 +1,201 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +ADXP WebSocket消息生成器 +用于模拟ADXP适配器向WebSocket客户端发送航班消息 +""" + +import json +import time +import random +from datetime import datetime + +try: + # 尝试导入websocket-client库 + from websocket import WebSocketApp + print("✅ 成功导入websocket库") +except ImportError: + try: + # 备用导入方式 + import websocket + from websocket import WebSocketApp + print("✅ 通过备用方式导入websocket库") + except ImportError: + print("❌ 未找到websocket库,请安装: pip install websocket-client") + exit(1) + +class AdxpFlightMessageGenerator: + def __init__(self, ws_url): + self.ws_url = ws_url + self.ws = None + self.connected = False + + # 航班号前缀列表 + self.flight_prefixes = ['CA', 'MU', 'CZ', 'HU', 'FM', 'HO', 'JD', 'SC'] + + # 跑道和机位列表 + self.runways = ['01', '02', '03', '04', '05', '06', '07', '08'] + self.gates = ['A1', 'A2', 'A3', 'A4', 'B1', 'B2', 'B3', 'B4', 'C1', 'C2', 'C3', 'C4'] + + def generate_random_flight_number(self): + """生成随机航班号""" + prefix = random.choice(self.flight_prefixes) + number = random.randint(1000, 9999) + return f"{prefix}{number}" + + def generate_arrival_message(self): + """生成进港航班消息""" + flight_no = self.generate_random_flight_number() + service_code = "ADXP_NAOMS_O_DYN_ARR" + + # 生成XML内容 + xml_content = f""" + + {flight_no} + {datetime.now().strftime('%Y%m%d%H%M%S')} + {random.choice(self.runways)} + {random.choice(self.gates)} +""" + + return { + "serviceCode": service_code, + "content": xml_content + } + + def generate_pushback_message(self): + """生成出港航班消息""" + flight_no = self.generate_random_flight_number() + service_code = "ADXP_NAOMS_O_CDM_AXOT" + + # 生成XML内容 + xml_content = f""" + + {flight_no} + {datetime.now().strftime('%Y%m%d%H%M%S')} + {random.choice(self.runways)} + {random.choice(self.gates)} +""" + + return { + "serviceCode": service_code, + "content": xml_content + } + + def generate_test_messages(self): + """生成测试消息列表""" + messages = [] + + # 生成几条进港消息 + for _ in range(2): + messages.append(self.generate_arrival_message()) + + # 生成几条出港消息 + for _ in range(2): + messages.append(self.generate_pushback_message()) + + return messages + + def on_message(self, ws, message): + """处理接收到的消息""" + print(f"📥 收到消息: {message}") + + # 如果收到ping,回复pong + if message == "ping": + try: + ws.send("pong") + print("📤 发送心跳响应: pong") + except Exception as e: + print(f"❌ 发送心跳响应失败: {e}") + + def on_error(self, ws, error): + """处理错误""" + print(f"❌ WebSocket错误: {error}") + self.connected = False + + def on_close(self, ws, close_status_code, close_msg): + """处理连接关闭""" + print(f"🔒 连接已关闭: 状态码={close_status_code}, 消息={close_msg}") + self.connected = False + + def on_open(self, ws): + """处理连接打开""" + self.connected = True + print("✅ WebSocket连接已建立") + print(f"🔗 连接地址: {self.ws_url}") + + # 启动消息发送循环 + self.send_test_messages() + + def send_test_messages(self): + """发送测试消息""" + if not self.connected: + print("❌ WebSocket未连接,无法发送消息") + return + + try: + print("🚀 开始发送测试消息...") + + # 发送几轮测试消息 + for i in range(3): + print(f"\n--- 第 {i+1} 轮消息 ---") + + # 生成并发送消息 + messages = self.generate_test_messages() + json_message = json.dumps(messages, ensure_ascii=False) + + print(f"📤 发送 {len(messages)} 条消息") + self.ws.send(json_message) + + # 等待一段时间再发送下一轮 + time.sleep(5) + + print("\n✅ 所有测试消息发送完成") + + except Exception as e: + print(f"❌ 发送测试消息时发生错误: {e}") + finally: + self.disconnect() + + def connect(self): + """连接到WebSocket服务器""" + print(f"🚀 正在连接到WebSocket服务: {self.ws_url}") + + # 创建WebSocket连接 + self.ws = WebSocketApp(self.ws_url, + on_open=self.on_open, + on_message=self.on_message, + on_error=self.on_error, + on_close=self.on_close) + + # 启动连接(阻塞) + self.ws.run_forever() + + def disconnect(self): + """断开连接""" + if self.ws: + self.ws.close() + print("🚫 主动断开连接") + self.connected = False + +def main(): + """主函数""" + # WebSocket URL (模拟ADXP适配器的WebSocket端点) + ws_url = "ws://localhost:8086/ws/flight-notifications" + + # 创建消息生成器 + generator = AdxpFlightMessageGenerator(ws_url) + + try: + # 连接并开始发送消息 + generator.connect() + except KeyboardInterrupt: + print("\n⚠️ 用户中断") + generator.disconnect() + except Exception as e: + print(f"❌ 测试过程中发生错误: {e}") + import traceback + traceback.print_exc() + generator.disconnect() + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/tools/test_adxp_websocket_direct.py b/tools/test_adxp_websocket_direct.py new file mode 100644 index 00000000..14389ee0 --- /dev/null +++ b/tools/test_adxp_websocket_direct.py @@ -0,0 +1,86 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +ADXP WebSocket连接测试脚本 +直接测试WebSocket连接,不进行登录认证 +""" + +import json +import time + +try: + # 尝试导入websocket-client库 + from websocket import WebSocketApp + print("✅ 成功导入websocket库") +except ImportError: + try: + # 备用导入方式 + import websocket + from websocket import WebSocketApp + print("✅ 通过备用方式导入websocket库") + except ImportError: + print("❌ 未找到websocket库,请安装: pip install websocket-client") + exit(1) + +def on_message(ws, message): + """处理接收到的消息""" + print(f"📥 收到消息: {message[:100]}...") + + try: + # 尝试解析JSON消息 + data = json.loads(message) + if isinstance(data, list): + print(f" 解析到 {len(data)} 条航班消息") + for i, msg in enumerate(data): + service_code = msg.get('serviceCode', 'N/A') + print(f" [{i+1}] 服务代码: {service_code}") + # 显示部分消息内容 + content = msg.get('content', '') + if content: + print(f" 内容预览: {content[:50]}...") + else: + print(f" 消息内容: {data}") + except json.JSONDecodeError: + print(f" 非JSON消息: {message}") + +def on_error(ws, error): + """处理错误""" + print(f"❌ WebSocket错误: {error}") + +def on_close(ws, close_status_code, close_msg): + """处理连接关闭""" + print(f"🔒 连接已关闭: 状态码={close_status_code}, 消息={close_msg}") + +def on_open(ws): + """处理连接打开""" + print("✅ WebSocket连接已建立") + print("🚀 开始监听消息...") + +def main(): + """主函数""" + # WebSocket URL + ws_url = "ws://localhost:8086/ws/flight-notifications" + + print(f"🚀 正在连接到ADXP适配器WebSocket服务: {ws_url}") + + # 创建WebSocket连接 + ws = WebSocketApp(ws_url, + on_open=on_open, + on_message=on_message, + on_error=on_error, + on_close=on_close) + + try: + # 启动连接(阻塞) + ws.run_forever() + except KeyboardInterrupt: + print("\n⚠️ 用户中断") + ws.close() + except Exception as e: + print(f"❌ 测试过程中发生错误: {e}") + import traceback + traceback.print_exc() + ws.close() + +if __name__ == "__main__": + main() \ No newline at end of file