diff --git a/main/xiaozhi-server/config.yaml b/main/xiaozhi-server/config.yaml
index a946579c..9344711a 100644
--- a/main/xiaozhi-server/config.yaml
+++ b/main/xiaozhi-server/config.yaml
@@ -41,24 +41,12 @@ server:
# 可选:设备白名单,如果设置了白名单,那么白名单的机器无论是什么token都可以连接。
#allowed_devices:
# - "24:0A:C4:1D:3B:F0" # MAC地址列表
- # MQTT网关配置,用于通过OTA下发到设备
- mqtt_gateway:
- # MQTT服务器地址以及端口,根据mqtt_gateway的.env文件配置,为null或者不填写时使用websocket协议
- host: null
- port: null
- # group_id会从设备型号动态生成,格式为GID_设备型号
- # 此配置仅作为当获取设备型号失败时可以填写的回退值
- # group_id:
-
+ # MQTT网关配置,用于通过OTA下发到设备,根据mqtt_gateway的.env文件配置,格式为host:port
+ mqtt_gateway: null
# MQTT签名密钥,用于生成MQTT连接密码,根据mqtt_gateway的.env文件配置
mqtt_signature_key: null
-
- # UDP网关配置,根据mqtt_gateway的.env文件配置
- udp_gateway:
- # UDP服务器地址
- host: null
- # UDP服务器端口
- port: null
+ # UDP网关配置
+ udp_gateway: null
log:
# 设置控制台输出的日志格式,时间、日志级别、标签、消息
log_format: "{time:YYMMDD HH:mm:ss}[{version}_{selected_module}][{extra[tag]}]-{level}-{message}"
diff --git a/main/xiaozhi-server/config/assets/wakeup_words/ed76d459636c2481aec828516c1b4f54.wav b/main/xiaozhi-server/config/assets/wakeup_words/ed76d459636c2481aec828516c1b4f54.wav
new file mode 100644
index 00000000..1e7246be
Binary files /dev/null and b/main/xiaozhi-server/config/assets/wakeup_words/ed76d459636c2481aec828516c1b4f54.wav differ
diff --git a/main/xiaozhi-server/core/api/ota_handler.py b/main/xiaozhi-server/core/api/ota_handler.py
index f24c3f8f..b93a7ed3 100644
--- a/main/xiaozhi-server/core/api/ota_handler.py
+++ b/main/xiaozhi-server/core/api/ota_handler.py
@@ -81,38 +81,29 @@ class OTAHandler(BaseHandler):
},
}
- mqtt_gateway_config = server_config.get("mqtt_gateway", {})
- mqtt_gateway_host = mqtt_gateway_config.get("host", "")
- mqtt_gateway_port = mqtt_gateway_config.get("port", "")
+
+ mqtt_gateway_endpoint = server_config.get("mqtt_gateway")
-
- if mqtt_gateway_host: # 配置了mqtt_gateway,使用MQTT和UDP协议传输
- # 从设备型号获取group_id,与manager-api保持一致
- # 客户端ID格式:groupId@@@macAddress@@@macAddress
+ if mqtt_gateway_endpoint: # 如果配置了非空字符串
# 尝试从请求数据中获取设备型号
device_model = "default"
try:
- # 假设设备型号在request数据的某个字段中
if "device" in data_json and isinstance(data_json["device"], dict):
device_model = data_json["device"].get("model", "default")
elif "model" in data_json:
device_model = data_json["model"]
- # 为了保证格式一致性,进行与manager-api相同的处理
group_id = f"GID_{device_model}".replace(":", "_").replace(" ", "_")
except Exception as e:
self.logger.bind(tag=TAG).error(f"获取设备型号失败: {e}")
- # 如果获取失败,使用配置文件中的默认值
- group_id = mqtt_gateway_config.get("group_id", "GID_default").replace(":", "_")
-
+ group_id = "GID_default"
+
mac_address_safe = device_id.replace(":", "_")
mqtt_client_id = f"{group_id}@@@{mac_address_safe}@@@{mac_address_safe}"
- # 构建用户数据(包含IP等信息)
+ # 构建用户数据
user_data = {
"ip": "unknown"
}
-
- # 将用户数据编码为Base64 JSON
try:
user_data_json = json.dumps(user_data)
username = base64.b64encode(user_data_json.encode('utf-8')).decode('utf-8')
@@ -120,24 +111,19 @@ class OTAHandler(BaseHandler):
self.logger.bind(tag=TAG).error(f"生成用户名失败: {e}")
username = ""
- # 获取MQTT签名密钥
+ # 生成密码
password = ""
signature_key = server_config.get("mqtt_signature_key", "")
if signature_key:
- # 使用签名密钥生成密码
password = self.generate_password_signature(mqtt_client_id + "|" + username, signature_key)
if not password:
- # 如果签名生成失败,使用配置文件中的密码
- password = mqtt_gateway_config.get("password", "")
+ password = "" # 签名失败则留空,由设备决定是否允许无密码
else:
- # 如果没有签名密钥,使用配置文件中的密码
- password = mqtt_gateway_config.get("password", "")
- self.logger.bind(tag=TAG).warning("缺少MQTT签名密钥,使用配置文件中的密码")
+ self.logger.bind(tag=TAG).warning("缺少MQTT签名密钥,密码留空")
- # 构建MQTT配置
- endpoint = f"{mqtt_gateway_host}:{mqtt_gateway_port}"
+ # 构建MQTT配置(直接使用 mqtt_gateway 字符串)
return_json["mqtt_gateway"] = {
- "endpoint": endpoint,
+ "endpoint": mqtt_gateway_endpoint,
"client_id": mqtt_client_id,
"username": username,
"password": password,
@@ -146,19 +132,8 @@ class OTAHandler(BaseHandler):
}
self.logger.bind(tag=TAG).info(f"为设备 {device_id} 下发MQTT网关配置")
- # 添加UDP网关配置
- if "udp_gateway" in server_config:
- udp_config = server_config["udp_gateway"]
- udp_host = udp_config.get("host", "")
- udp_port = udp_config.get("port", "")
- if udp_host:
- return_json["udp_gateway"] = {
- "host": udp_host,
- "port": udp_port
- }
- self.logger.bind(tag=TAG).info(f"为设备 {device_id} 下发UDP网关配置")
- else: # 未配置mqtt_gateway,使用WebSocket协议传输
+ else: # 未配置 mqtt_gateway,下发 WebSocket
return_json["websocket"] = {
"url": self._get_websocket_url(local_ip, port),
}
@@ -192,4 +167,4 @@ class OTAHandler(BaseHandler):
response = web.Response(text="OTA接口异常", content_type="text/plain")
finally:
self._add_cors_headers(response)
- return response
+ return response
\ No newline at end of file