battery/dataTransmission.py

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}