feat :init

This commit is contained in:
2025-11-02 19:34:16 +08:00
commit b767041311
617 changed files with 124099 additions and 0 deletions

View File

@@ -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;
}

View File

@@ -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);
}

View File

@@ -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;
}

View File

@@ -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");
}
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View 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;
}

View File

@@ -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");
}
}

View File

@@ -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);
}
}

View File

@@ -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);
}
}

View File

@@ -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);
}
}

View File

@@ -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);
}
}

View File

@@ -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;
}

View File

@@ -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;//请求失败信息
}

View File

@@ -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";
}

View File

@@ -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();
}

View File

@@ -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
}