Skip to content

Commit 33d46a6

Browse files
eded
authored andcommitted
fix: IoT消息优化&非hello消息处理逻辑调整到MessageHandler中
1 parent 70d7669 commit 33d46a6

18 files changed

+256
-435
lines changed

pom.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@
7272
<version>1.18.32</version>
7373
<scope>provided</scope>
7474
</dependency>
75+
7576
<!--
7677
<dependency>
7778
<groupId>org.springframework.ai</groupId>
@@ -282,6 +283,7 @@
282283
<configuration>
283284
<source>${java.version}</source>
284285
<target>${java.version}</target>
286+
<compilerArgs>--enable-preview</compilerArgs>
285287
</configuration>
286288
</plugin>
287289
<!-- 添加 Surefire 插件配置 -->

src/main/java/com/xiaozhi/communication/common/ChatSession.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package com.xiaozhi.communication.common;
22

3-
import com.xiaozhi.dialogue.iot.IotDescriptor;
3+
import com.xiaozhi.communication.domain.IotDescriptor;
44
import com.xiaozhi.dialogue.llm.tool.ToolsSessionHolder;
55
import com.xiaozhi.entity.SysDevice;
66
import com.xiaozhi.entity.SysRole;

src/main/java/com/xiaozhi/communication/common/MessageHandler.java

Lines changed: 30 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,6 @@
11
package com.xiaozhi.communication.common;
22

3-
import com.fasterxml.jackson.databind.JsonNode;
4-
import com.xiaozhi.communication.domain.AbortMessage;
5-
import com.xiaozhi.communication.domain.GoodbyeMessage;
6-
import com.xiaozhi.communication.domain.ListenMessage;
3+
import com.xiaozhi.communication.domain.*;
74
import com.xiaozhi.dialogue.llm.ChatService;
85
import com.xiaozhi.dialogue.llm.factory.ChatModelFactory;
96
import com.xiaozhi.dialogue.llm.tool.ToolsGlobalRegistry;
@@ -69,7 +66,7 @@ public class MessageHandler {
6966
private ChatService chatService;
7067

7168
@Resource
72-
private ChatModelFactory chatModelFactory;
69+
private ChatModelFactory chatModelFactory;
7370

7471
@Resource
7572
private ToolsGlobalRegistry toolsGlobalRegistry;
@@ -82,6 +79,7 @@ public class MessageHandler {
8279

8380
/**
8481
* 处理连接建立事件.
82+
*
8583
* @param chatSession
8684
* @param deviceIdAuth
8785
*/
@@ -145,11 +143,12 @@ public void afterConnection(ChatSession chatSession, String deviceIdAuth) {
145143

146144
/**
147145
* 处理连接关闭事件.
146+
*
148147
* @param sessionId
149148
*/
150149
public void afterConnectionClosed(String sessionId) {
151150
ChatSession chatSession = sessionManager.getSession(sessionId);
152-
if(chatSession == null || !chatSession.isOpen()){
151+
if (chatSession == null || !chatSession.isOpen()) {
153152
return;
154153
}
155154
// 连接关闭时清理资源
@@ -179,12 +178,13 @@ public void afterConnectionClosed(String sessionId) {
179178

180179
/**
181180
* 处理音频数据
181+
*
182182
* @param sessionId
183183
* @param opusData
184184
*/
185185
public void handleBinaryMessage(String sessionId, byte[] opusData) {
186186
ChatSession chatSession = sessionManager.getSession(sessionId);
187-
if((chatSession == null || !chatSession.isOpen()) && !vadService.isSessionInitialized(sessionId)){
187+
if ((chatSession == null || !chatSession.isOpen()) && !vadService.isSessionInitialized(sessionId)) {
188188
return;
189189
}
190190
// 委托给DialogueService处理音频数据
@@ -195,7 +195,7 @@ public void handleBinaryMessage(String sessionId, byte[] opusData) {
195195
public void handleUnboundDevice(String sessionId, SysDevice device) {
196196
String deviceId = device.getDeviceId();
197197
ChatSession chatSession = sessionManager.getSession(sessionId);
198-
if(chatSession == null || !chatSession.isOpen()){
198+
if (chatSession == null || !chatSession.isOpen()) {
199199
return;
200200
}
201201
// 检查是否已经在处理中,使用CAS操作保证线程安全
@@ -257,7 +257,7 @@ public void handleUnboundDevice(String sessionId, SysDevice device) {
257257
});
258258
}
259259

260-
public void handleListenMessage(ChatSession chatSession, ListenMessage message) {
260+
private void handleListenMessage(ChatSession chatSession, ListenMessage message) {
261261
String sessionId = chatSession.getSessionId();
262262
logger.info("收到listen消息 - SessionId: {}, State: {}, Mode: {}", sessionId, message.getState(), message.getMode());
263263
chatSession.setMode(message.getMode());
@@ -301,32 +301,42 @@ public void handleListenMessage(ChatSession chatSession, ListenMessage message)
301301
}
302302
}
303303

304-
public void handleAbortMessage(ChatSession session, AbortMessage message) {
304+
private void handleAbortMessage(ChatSession session, AbortMessage message) {
305305
dialogueService.abortDialogue(session, message.getReason());
306306
}
307307

308-
public void handleIotMessage(ChatSession chatSession, JsonNode jsonNode) {
308+
private void handleIotMessage(ChatSession chatSession, IotMessage message) {
309309
String sessionId = chatSession.getSessionId();
310310
logger.info("收到IoT消息 - SessionId: {}", sessionId);
311311

312312
// 处理设备描述信息
313-
if (jsonNode.has("descriptors")) {
314-
JsonNode descriptors = jsonNode.path("descriptors");
315-
logger.info("收到设备描述信息: {}", descriptors);
313+
if (message.getDescriptors() != null) {
314+
logger.info("收到设备描述信息: {}", message.getDescriptors());
316315
// 处理设备描述信息的逻辑
317-
iotService.handleDeviceDescriptors(sessionId, descriptors);
316+
iotService.handleDeviceDescriptors(sessionId, message.getDescriptors());
318317
}
319318

320319
// 处理设备状态更新
321-
if (jsonNode.has("states")) {
322-
JsonNode states = jsonNode.path("states");
323-
logger.info("收到设备状态更新: {}", states);
320+
if (message.getStates() != null) {
321+
logger.info("收到设备状态更新: {}", message.getStates());
324322
// 处理设备状态更新的逻辑
325-
iotService.handleDeviceStates(sessionId, states);
323+
iotService.handleDeviceStates(sessionId, message.getStates());
326324
}
327325
}
328326

329-
public void handleGoodbyeMessage(ChatSession session, GoodbyeMessage message) {
327+
private void handleGoodbyeMessage(ChatSession session, GoodbyeMessage message) {
330328
sessionManager.closeSession(session);
331329
}
330+
331+
public void handleMessage(Message msg, String sessionId) {
332+
var chatSession = sessionManager.getSession(sessionId);
333+
switch (msg) {
334+
case ListenMessage m -> handleListenMessage(chatSession, m);
335+
case IotMessage m -> handleIotMessage(chatSession, m);
336+
case AbortMessage m -> handleAbortMessage(chatSession, m);
337+
case GoodbyeMessage m -> handleGoodbyeMessage(chatSession, m);
338+
default -> {
339+
}
340+
}
341+
}
332342
}

src/main/java/com/xiaozhi/communication/common/SessionManager.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package com.xiaozhi.communication.common;
22

3-
import com.xiaozhi.dialogue.iot.IotDescriptor;
3+
import com.xiaozhi.communication.domain.IotDescriptor;
44
import com.xiaozhi.dialogue.llm.tool.ToolsSessionHolder;
55
import com.xiaozhi.entity.SysDevice;
66
import com.xiaozhi.entity.SysRole;

src/main/java/com/xiaozhi/communication/domain/AbortMessage.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
@Data
77
@EqualsAndHashCode(callSuper = true)
8-
public final class AbortMessage extends Message{
8+
public final class AbortMessage extends Message {
99
public AbortMessage() {
1010
super("abort");
1111
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package com.xiaozhi.communication.domain;
2+
3+
import com.xiaozhi.utils.JsonUtil;
4+
import lombok.Data;
5+
6+
import java.util.Map;
7+
8+
/**
9+
* Iot设备描述信息
10+
*/
11+
@Data
12+
public class IotDescriptor {
13+
private String name;
14+
private String description;
15+
private Map<String, IotProperty> properties;
16+
private Map<String, IotMethod> methods;
17+
18+
@Override
19+
public String toString() {
20+
return JsonUtil.toJson(this);
21+
}
22+
}
Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.xiaozhi.communication.domain;
22

33
import java.util.List;
4+
import java.util.Map;
45

56
import lombok.Data;
67
import lombok.EqualsAndHashCode;
@@ -12,15 +13,14 @@ public IotMessage() {
1213
super("iot");
1314
}
1415

15-
private List<IotDescriptor> descriptors;
16+
private boolean update;
17+
private String sessionId;
1618
private List<IotState> states;
19+
private List<IotDescriptor> descriptors;
1720

18-
public static class IotDescriptor {
19-
// properties
20-
// private List<IotMethod> methods;
21-
}
22-
21+
@Data
2322
public static class IotState {
24-
23+
private String name;
24+
private Map<String, Object> state;
2525
}
2626
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package com.xiaozhi.communication.domain;
2+
3+
import com.xiaozhi.utils.JsonUtil;
4+
import lombok.Data;
5+
6+
import java.util.Map;
7+
8+
/**
9+
* function_call的方法定义
10+
*/
11+
@Data
12+
public class IotMethod {
13+
/**
14+
* 方法描述
15+
*/
16+
private String description;
17+
/**
18+
* 方法参数
19+
*/
20+
private Map<String, IotMethodParameter> parameters;
21+
22+
@Override
23+
public String toString() {
24+
return JsonUtil.toJson(this);
25+
}
26+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package com.xiaozhi.communication.domain;
2+
3+
import com.xiaozhi.utils.JsonUtil;
4+
import lombok.Data;
5+
6+
/**
7+
* function_call的参数定义
8+
*/
9+
@Data
10+
public class IotMethodParameter {
11+
/**
12+
* 参数描述
13+
*/
14+
private String description;
15+
/**
16+
* 参数类型
17+
*/
18+
private String type;
19+
20+
@Override
21+
public String toString() {
22+
return JsonUtil.toJson(this);
23+
}
24+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package com.xiaozhi.communication.domain;
2+
3+
import com.xiaozhi.utils.JsonUtil;
4+
import lombok.Data;
5+
6+
/**
7+
* function_call的参数定义
8+
*/
9+
@Data
10+
public class IotProperty {
11+
/**
12+
* 参数描述
13+
*/
14+
private String description;
15+
/**
16+
* 参数类型
17+
*/
18+
private String type;
19+
/**
20+
* 参数值
21+
*/
22+
private Object value;
23+
24+
@Override
25+
public String toString() {
26+
return JsonUtil.toJson(this);
27+
}
28+
}

0 commit comments

Comments
 (0)