修改音频保存逻辑,后续再完善,添加设备信息保存到数据库
This commit is contained in:
@@ -2,10 +2,13 @@ import json
|
||||
import time
|
||||
import asyncio
|
||||
from typing import Optional, Dict, Callable, Awaitable
|
||||
from banban.service.device_setting import device_setting_service
|
||||
from config import settings
|
||||
from services.card_service import card_service
|
||||
from services.offline_audio_cache import offline_audio_cache
|
||||
import aiomqtt
|
||||
from banban.service.location import location_service
|
||||
from database.models import ChildLocationCurrent
|
||||
|
||||
from services.device_target_cache import device_target_cache
|
||||
from utils.logger import session_logger as logger
|
||||
@@ -97,6 +100,8 @@ class TalkingQMQTTService:
|
||||
version = data.get("version")
|
||||
voice = data.get("voice")
|
||||
logger.info(device_id, "", f"[设备信息] 设备 {d_id} 信息: 电量={power}, 信号强度={signal}, 版本号={version}, 音量={voice}")
|
||||
# 插入到数据库
|
||||
await device_setting_service.insert_or_update(device_id=device_id, power=power, signal_strength=signal, version_str=version, volume=voice)
|
||||
# else:
|
||||
# logger.warning(device_id, "", f"[设备信息] 设备 {device_id} 查询失败: {payload}")
|
||||
await self._publish(f"device/{device_id}/event_resp", {"msg_id": "000", "status": "success"})
|
||||
@@ -108,6 +113,9 @@ class TalkingQMQTTService:
|
||||
lat = data.get("latitude")
|
||||
lon = data.get("longitude")
|
||||
logger.info(device_id, "", f"[GPS] 设备 {device_id} 位置: 纬度={lat}, 经度={lon}")
|
||||
# 插入到数据库
|
||||
location = ChildLocationCurrent(device_id=device_id, lat=lat, lon=lon)
|
||||
await location_service.insert_or_update(device_id=device_id, location=location)
|
||||
else:
|
||||
logger.warning(device_id, "", f"[GPS] 设备 {device_id} 查询失败: {payload}")
|
||||
|
||||
@@ -117,6 +125,9 @@ class TalkingQMQTTService:
|
||||
if status == "success":
|
||||
level = data.get("current_level")
|
||||
logger.info(device_id, "", f"[音量] 设备 {device_id} 当前音量: {level}")
|
||||
# 更新设备音量
|
||||
await device_setting_service.insert_or_update(device_id=device_id, volume=level)
|
||||
|
||||
else:
|
||||
logger.warning(device_id, "", f"[音量] 设备 {device_id} 调节失败: {payload}")
|
||||
|
||||
@@ -130,6 +141,8 @@ class TalkingQMQTTService:
|
||||
elif status == "success":
|
||||
new_ver = data.get("new_version")
|
||||
logger.info(device_id, "", f"[OTA] 设备 {device_id} 升级完成: {new_ver}")
|
||||
# 更新设备版本号
|
||||
await device_setting_service.insert_or_update(device_id=device_id, version_str=new_ver)
|
||||
else:
|
||||
logger.warning(device_id, "", f"[OTA] 设备 {device_id} 升级异常: {payload}")
|
||||
|
||||
|
||||
@@ -17,6 +17,7 @@ async def authenticate_websocket(websocket: WebSocket):
|
||||
tuple: (认证状态, 设备ID) - (是否认证成功, 设备ID)
|
||||
"""
|
||||
device_id = None
|
||||
serial_number = None
|
||||
authenticated = False
|
||||
|
||||
auth_timeout = 10 # 10秒认证超时
|
||||
@@ -63,4 +64,4 @@ async def authenticate_websocket(websocket: WebSocket):
|
||||
session_logger.warning("unknown", "auth", "WebSocket认证超时")
|
||||
break
|
||||
|
||||
return authenticated, device_id
|
||||
return authenticated, device_id, serial_number
|
||||
|
||||
@@ -21,7 +21,7 @@ async def websocket_endpoint(websocket: WebSocket):
|
||||
device_id = None
|
||||
|
||||
try:
|
||||
authenticated, device_id = await authenticate_websocket(websocket)
|
||||
authenticated, device_id, serial_number = await authenticate_websocket(websocket)
|
||||
|
||||
if not authenticated:
|
||||
session_logger.warning(
|
||||
@@ -44,7 +44,7 @@ async def websocket_endpoint(websocket: WebSocket):
|
||||
# await offline_audio_cache.clear_audio_urls(device_id)
|
||||
# session_logger.info(device_id, "offline", f"已清空设备的离线音频URL缓存,共 {len(audio_urls)} 个")
|
||||
|
||||
await handle_websocket_messages(websocket, device_id)
|
||||
await handle_websocket_messages(websocket, device_id, serial_number)
|
||||
|
||||
except WebSocketDisconnect:
|
||||
session_logger.info(
|
||||
|
||||
@@ -17,8 +17,9 @@ from utils.logger import session_logger
|
||||
from handlers.prompt_sound_handler import handle_prompt_sound_request
|
||||
from handlers.session_cleanup_handler import handle_old_session_cleanup
|
||||
from config import settings
|
||||
from banban.service.im import im_service as im_conversation_service
|
||||
|
||||
async def handle_websocket_messages(websocket: WebSocket, device_id: str):
|
||||
async def handle_websocket_messages(websocket: WebSocket, device_id: str, serial_number: str):
|
||||
"""
|
||||
处理WebSocket连接中的所有消息
|
||||
|
||||
@@ -49,6 +50,7 @@ async def handle_websocket_messages(websocket: WebSocket, device_id: str):
|
||||
current_active_session, first_audio_received_time = await handle_binary_message(
|
||||
websocket,
|
||||
device_id,
|
||||
serial_number,
|
||||
data,
|
||||
current_active_session,
|
||||
first_audio_received_time
|
||||
@@ -134,7 +136,7 @@ async def handle_text_message(websocket: WebSocket, device_id: str, text_data: s
|
||||
)
|
||||
|
||||
|
||||
async def handle_binary_message(websocket: WebSocket, device_id: str, binary_data, current_active_session, first_audio_received_time):
|
||||
async def handle_binary_message(websocket: WebSocket, device_id: str, serial_number: str, binary_data, current_active_session, first_audio_received_time):
|
||||
"""处理二进制音频消息"""
|
||||
session_key, session, packet_type, audio_data, sample_rate = await parse_packet(binary_data, websocket)
|
||||
|
||||
@@ -163,7 +165,7 @@ async def handle_binary_message(websocket: WebSocket, device_id: str, binary_dat
|
||||
if target_device_id:
|
||||
# 处理缓存的音频数据
|
||||
session_logger.info(device_id, session_id, f"收到结束包,开始处理缓存音频数据")
|
||||
await process_cached_audio(device_id, target_device_id)
|
||||
await process_cached_audio(device_id, target_device_id, serial_number)
|
||||
|
||||
# 移除目标设备关联
|
||||
await device_target_cache.remove_target(device_id)
|
||||
@@ -253,7 +255,7 @@ async def handle_target_audio_packet(device_id: str, audio_data: bytes):
|
||||
session_logger.error(device_id, "target", f"处理目标音频包时出错: {e}", exc_info=True)
|
||||
|
||||
|
||||
async def process_cached_audio(device_id: str, target_device_id: str):
|
||||
async def process_cached_audio(device_id: str, target_device_id: str, serial_number: str):
|
||||
"""处理缓存的音频数据并发送音频URL"""
|
||||
try:
|
||||
# 获取缓存的音频数据
|
||||
@@ -265,6 +267,8 @@ async def process_cached_audio(device_id: str, target_device_id: str):
|
||||
# 保存音频文件
|
||||
audio_path = await save_audio_file(cached_audio, device_id)
|
||||
audio_url = f"http://{settings.server_host}:{settings.server_port}/{audio_path}"
|
||||
# 将音频URL保存到数据库 im_conversation和im_message
|
||||
await im_conversation_service.create_device_message(device_id=device_id, serial_number=serial_number, target_device_id=target_device_id, audio_url=audio_url)
|
||||
|
||||
# 发送URL给目标设备
|
||||
# target_websocket = await connection_manager.get_connection(target_device_id)
|
||||
|
||||
Reference in New Issue
Block a user