108 lines
3.6 KiB
Python
108 lines
3.6 KiB
Python
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} |