feat :init
This commit is contained in:
@@ -0,0 +1,14 @@
|
||||
package com.xiaozhi.communication.domain;
|
||||
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
public final class AbortMessage extends Message {
|
||||
public AbortMessage() {
|
||||
super("abort");
|
||||
}
|
||||
|
||||
private String reason;
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
package com.xiaozhi.communication.domain;
|
||||
|
||||
import com.fasterxml.jackson.databind.PropertyNamingStrategies;
|
||||
import com.fasterxml.jackson.databind.annotation.JsonNaming;
|
||||
|
||||
import lombok.Data;
|
||||
import lombok.experimental.Accessors;
|
||||
|
||||
@Data
|
||||
@Accessors(chain = true)
|
||||
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
|
||||
public class AudioParams {
|
||||
private int channels;
|
||||
private String format;
|
||||
private int sampleRate;
|
||||
private int frameDuration;
|
||||
|
||||
public static final AudioParams Opus = new AudioParams()
|
||||
.setChannels(1)
|
||||
.setFormat("opus")
|
||||
.setSampleRate(16000)
|
||||
.setFrameDuration(60);
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
package com.xiaozhi.communication.domain;
|
||||
|
||||
import com.xiaozhi.communication.domain.mcp.device.DeviceMcpPayload;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
|
||||
/**
|
||||
* MCP请求类,用于处理向设备发送相关的MCP请求
|
||||
*/
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
public final class DeviceMcpMessage extends Message {
|
||||
public DeviceMcpMessage() {
|
||||
super("mcp");
|
||||
}
|
||||
|
||||
private String sessionId;//会话id
|
||||
private String type = "mcp";
|
||||
private DeviceMcpPayload payload;
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
package com.xiaozhi.communication.domain;
|
||||
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
public final class GoodbyeMessage extends Message {
|
||||
public GoodbyeMessage() {
|
||||
super("goodbye");
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
package com.xiaozhi.communication.domain;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class HelloFeatures {
|
||||
/**
|
||||
* 设备是否启用mcp
|
||||
*/
|
||||
private Boolean mcp = false;
|
||||
/**
|
||||
* 设备是否启用服务端aec
|
||||
*/
|
||||
private Boolean aec = false;
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
package com.xiaozhi.communication.domain;
|
||||
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
public final class HelloMessage extends Message {
|
||||
public HelloMessage() {
|
||||
super("hello");
|
||||
}
|
||||
|
||||
private HelloFeatures features;
|
||||
private AudioParams audioParams;
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
package com.xiaozhi.communication.domain;
|
||||
|
||||
import com.fasterxml.jackson.databind.PropertyNamingStrategies;
|
||||
import com.fasterxml.jackson.databind.annotation.JsonNaming;
|
||||
import lombok.Data;
|
||||
import lombok.experimental.Accessors;
|
||||
|
||||
@Data
|
||||
@Accessors(chain = true)
|
||||
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
|
||||
public class HelloMessageResp {
|
||||
private String type = "hello";
|
||||
private String transport;
|
||||
private String sessionId;
|
||||
private AudioParams audioParams;
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
package com.xiaozhi.communication.domain;
|
||||
|
||||
import com.xiaozhi.communication.domain.iot.IotDescriptor;
|
||||
import com.xiaozhi.communication.domain.iot.IotState;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
public final class IotMessage extends Message {
|
||||
public IotMessage() {
|
||||
super("iot");
|
||||
}
|
||||
|
||||
private boolean update;
|
||||
private String sessionId;
|
||||
private List<IotState> states;
|
||||
private List<IotDescriptor> descriptors;
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
package com.xiaozhi.communication.domain;
|
||||
|
||||
import com.xiaozhi.enums.ListenMode;
|
||||
import com.xiaozhi.enums.ListenState;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
public final class ListenMessage extends Message {
|
||||
public ListenMessage(){
|
||||
super("listen");
|
||||
}
|
||||
|
||||
private ListenState state;
|
||||
private ListenMode mode;
|
||||
private String text;
|
||||
}
|
||||
38
src/main/java/com/xiaozhi/communication/domain/Message.java
Normal file
38
src/main/java/com/xiaozhi/communication/domain/Message.java
Normal file
@@ -0,0 +1,38 @@
|
||||
package com.xiaozhi.communication.domain;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonSubTypes;
|
||||
import com.fasterxml.jackson.annotation.JsonTypeInfo;
|
||||
import lombok.Data;
|
||||
|
||||
import javax.validation.constraints.NotNull;
|
||||
|
||||
@Data
|
||||
@JsonTypeInfo(
|
||||
use = JsonTypeInfo.Id.NAME,
|
||||
include = JsonTypeInfo.As.EXISTING_PROPERTY,
|
||||
property = "type",
|
||||
visible = true)
|
||||
@JsonSubTypes({
|
||||
@JsonSubTypes.Type(value = HelloMessage.class, name = "hello"),
|
||||
@JsonSubTypes.Type(value = DeviceMcpMessage.class, name = "mcp"),
|
||||
@JsonSubTypes.Type(value = ListenMessage.class, name = "listen"),
|
||||
@JsonSubTypes.Type(value = IotMessage.class, name = "iot"),
|
||||
@JsonSubTypes.Type(value = AbortMessage.class, name = "abort"),
|
||||
@JsonSubTypes.Type(value = GoodbyeMessage.class, name = "goodbye"),
|
||||
@JsonSubTypes.Type(value = UnknownMessage.class, name = "unknown")
|
||||
})
|
||||
public sealed abstract class Message
|
||||
permits AbortMessage, GoodbyeMessage, HelloMessage, IotMessage, ListenMessage, DeviceMcpMessage, UnknownMessage {
|
||||
|
||||
public Message() {
|
||||
this.type = "unknown";
|
||||
}
|
||||
|
||||
public Message(String type) {
|
||||
this.type = type;
|
||||
}
|
||||
|
||||
@NotNull(message = "消息类型不能为空")
|
||||
protected String type;
|
||||
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
package com.xiaozhi.communication.domain;
|
||||
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
public final class UnknownMessage extends Message {
|
||||
public UnknownMessage() {
|
||||
super("unknown");
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
package com.xiaozhi.communication.domain.iot;
|
||||
|
||||
import com.xiaozhi.utils.JsonUtil;
|
||||
import lombok.Data;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* Iot设备描述信息
|
||||
*/
|
||||
@Data
|
||||
public class IotDescriptor {
|
||||
private String name;
|
||||
private String description;
|
||||
private Map<String, IotProperty> properties;
|
||||
private Map<String, IotMethod> methods;
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return JsonUtil.toJson(this);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
package com.xiaozhi.communication.domain.iot;
|
||||
|
||||
import com.xiaozhi.utils.JsonUtil;
|
||||
import lombok.Data;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* function_call的方法定义
|
||||
*/
|
||||
@Data
|
||||
public class IotMethod {
|
||||
/**
|
||||
* 方法描述
|
||||
*/
|
||||
private String description;
|
||||
/**
|
||||
* 方法参数
|
||||
*/
|
||||
private Map<String, IotMethodParameter> parameters;
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return JsonUtil.toJson(this);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
package com.xiaozhi.communication.domain.iot;
|
||||
|
||||
import com.xiaozhi.utils.JsonUtil;
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
* function_call的参数定义
|
||||
*/
|
||||
@Data
|
||||
public class IotMethodParameter {
|
||||
/**
|
||||
* 参数描述
|
||||
*/
|
||||
private String description;
|
||||
/**
|
||||
* 参数类型
|
||||
*/
|
||||
private String type;
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return JsonUtil.toJson(this);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
package com.xiaozhi.communication.domain.iot;
|
||||
|
||||
import com.xiaozhi.utils.JsonUtil;
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
* function_call的参数定义
|
||||
*/
|
||||
@Data
|
||||
public class IotProperty {
|
||||
/**
|
||||
* 参数描述
|
||||
*/
|
||||
private String description;
|
||||
/**
|
||||
* 参数类型
|
||||
*/
|
||||
private String type;
|
||||
/**
|
||||
* 参数值
|
||||
*/
|
||||
private Object value;
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return JsonUtil.toJson(this);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
package com.xiaozhi.communication.domain.iot;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
@Data
|
||||
public class IotState {
|
||||
private String name;
|
||||
private Map<String, Object> state;
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
package com.xiaozhi.communication.domain.mcp.device;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
@Data
|
||||
public class DeviceMcpPayload {
|
||||
private String jsonrpc = "2.0";
|
||||
private String method;//方法名称
|
||||
private Object params;
|
||||
private Long id;//请求id
|
||||
private Map<String, Object> result;//请求结果
|
||||
private Map<String, Object> error;//请求失败信息
|
||||
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
package com.xiaozhi.communication.domain.mcp.device.initialize;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class DeviceMcpClientInfo {
|
||||
private String name = "xiaozhi-mqtt-client";
|
||||
private String version = "1.0.0";
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
package com.xiaozhi.communication.domain.mcp.device.initialize;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.Map;
|
||||
|
||||
@Data
|
||||
public class DeviceMcpInitialize {
|
||||
private String protocolVersion = "2024-11-05";
|
||||
private Map<String, Object> capabilities = Collections.emptyMap();
|
||||
private DeviceMcpClientInfo clientInfo = new DeviceMcpClientInfo();
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
package com.xiaozhi.communication.domain.mcp.device.initialize;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
* 摄像头视觉相关
|
||||
*/
|
||||
@Data
|
||||
public class DeviceMcpVision {
|
||||
private String url;//摄像头: 图片处理地址(必须是http地址, 不是websocket地址)
|
||||
private String token;// url toke
|
||||
}
|
||||
Reference in New Issue
Block a user