import asyncio import socket import subprocess import sys import logging from apis import send_battery_cell_to_server from tenacity import retry, stop_after_attempt, wait_exponential, retry_if_exception_type import httpx # 配置日志 logging.basicConfig( level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s', handlers=[ logging.FileHandler('transmission.log'), logging.StreamHandler() ] ) logger = logging.getLogger(__name__) async def check_network_connection(host: str, port: int, timeout: int = 5) -> bool: """检查网络连接是否可达""" try: # 使用 socket 检查端口是否开放 reader, writer = await asyncio.wait_for( asyncio.open_connection(host, port), timeout=timeout ) writer.close() await writer.wait_closed() logger.info(f"网络连接检查成功: {host}:{port}") return True except Exception as e: logger.error(f"网络连接检查失败 {host}:{port}: {str(e)}") return False async def data_transmission(data): print('接口数据', data) # 服务器配置 server_host = "192.168.114.60" server_port = 8080 url = f"http://{server_host}:{server_port}/api/v1/battery_cell_computeApi/battery_cell/OP010_battery_cell" try: logger.info(f"开始向服务器发送数据: {url}") # 1. 先检查网络连接 logger.info("检查网络连接...") is_connected = await check_network_connection(server_host, server_port) if not is_connected: error_msg = f"网络连接失败: 无法连接到服务器 {server_host}:{server_port}" logger.error(error_msg) return {"status": "error", "message": error_msg} logger.info("网络连接正常,开始发送数据...") # 2. 使用重试机制发送数据 @retry( stop=stop_after_attempt(3), wait=wait_exponential(multiplier=1, min=2, max=10), retry=retry_if_exception_type( (httpx.ConnectTimeout, httpx.ConnectError, httpx.ReadTimeout) ), reraise=True, before=lambda retry_state: logger.warning( f"第 {retry_state.attempt_number} 次重试..." ) ) async def send_with_retry(): result = await send_battery_cell_to_server(url, data) return result # 3. 发送数据(带重试) result = await send_with_retry() logger.info(f"发送成功: {result}") return result except httpx.ConnectTimeout as e: error_msg = f"连接超时:无法连接到服务器 {url},请检查网络或服务器状态" logger.error(error_msg) logger.exception(e) return {"status": "error", "message": error_msg} except httpx.ConnectError as e: error_msg = f"连接错误:{str(e)}" logger.error(error_msg) return {"status": "error", "message": error_msg} except httpx.ReadTimeout as e: error_msg = f"读取超时:服务器响应时间过长" logger.error(error_msg) return {"status": "error", "message": error_msg} except httpx.HTTPStatusError as e: error_msg = f"HTTP错误 {e.response.status_code}: {e.response.text}" logger.error(error_msg) return {"status": "error", "message": error_msg} except Exception as e: error_msg = f"未知错误:{str(e)}" logger.error(f"数据传输失败: {error_msg}") logger.exception(e) return {"status": "error", "message": error_msg}