diff --git a/README.md b/README.md
index 2666b82..5149a78 100644
--- a/README.md
+++ b/README.md
@@ -54,3 +54,4 @@
* 一个信令服务多个媒体服务
* 会议调整为房间
* 反复测试推流拉流、拉人踢人、音频视频控制
+* 内外网/多网卡环境
diff --git a/docs/Deploy.md b/docs/Deploy.md
index 6e38523..ce1e09c 100644
--- a/docs/Deploy.md
+++ b/docs/Deploy.md
@@ -119,6 +119,11 @@ npm install -g pm2
# 连接
ln -sf /data/nodejs/node-v16.19.0-linux-x64/bin/pm2 /usr/local/bin/
+# 日志
+pm2 install pm2-logrotate
+pm2 set pm2-logrotate-ext:retain 14
+pm2 set pm2-logrotate-ext:max_size 256M
+
# 自启
pm2 startup
pm2 save
diff --git a/taoyao-client-web/README.md b/taoyao-client-web/README.md
index 01c457b..8586219 100644
--- a/taoyao-client-web/README.md
+++ b/taoyao-client-web/README.md
@@ -1,29 +1,3 @@
-# client
+# Web终端
-This template should help get you started developing with Vue 3 in Vite.
-
-## Recommended IDE Setup
-
-[VSCode](https://code.visualstudio.com/) + [Volar](https://marketplace.visualstudio.com/items?itemName=Vue.volar) (and disable Vetur) + [TypeScript Vue Plugin (Volar)](https://marketplace.visualstudio.com/items?itemName=Vue.vscode-typescript-vue-plugin).
-
-## Customize configuration
-
-See [Vite Configuration Reference](https://vitejs.dev/config/).
-
-## Project Setup
-
-```sh
-npm install
-```
-
-### Compile and Hot-Reload for Development
-
-```sh
-npm run dev
-```
-
-### Compile and Minify for Production
-
-```sh
-npm run build
-```
+注意部分`API`需要`localhost`或者`https`
diff --git a/taoyao-client-web/package.json b/taoyao-client-web/package.json
index b38ae5f..340399a 100644
--- a/taoyao-client-web/package.json
+++ b/taoyao-client-web/package.json
@@ -11,7 +11,9 @@
},
"dependencies": {
"vue": "^3.2.45",
- "moment": "^2.29.4"
+ "moment": "^2.29.4",
+ "element-plus": "^2.2.29",
+ "mediasoup-client": "^3.6.77"
},
"devDependencies": {
"vite": "^4.0.0",
diff --git a/taoyao-client-web/src/App.vue b/taoyao-client-web/src/App.vue
index bbfead7..7b3d2bc 100644
--- a/taoyao-client-web/src/App.vue
+++ b/taoyao-client-web/src/App.vue
@@ -1,26 +1,36 @@
-
+
+
+
+
+
diff --git a/taoyao-client-web/src/assets/font.taoyao.css b/taoyao-client-web/src/assets/font.css
similarity index 100%
rename from taoyao-client-web/src/assets/font.taoyao.css
rename to taoyao-client-web/src/assets/font.css
diff --git a/taoyao-client-web/src/assets/main.css b/taoyao-client-web/src/assets/main.css
index 7dd1f29..b199ae5 100644
--- a/taoyao-client-web/src/assets/main.css
+++ b/taoyao-client-web/src/assets/main.css
@@ -1,5 +1,5 @@
@import "./base.css";
-@import "./font.taoyao.css";
+@import "./font.css";
#app {
max-width: 1280px;
diff --git a/taoyao-client-web/src/components/Config.js b/taoyao-client-web/src/components/Config.js
index bd9766b..9b55777 100644
--- a/taoyao-client-web/src/components/Config.js
+++ b/taoyao-client-web/src/components/Config.js
@@ -7,19 +7,27 @@
*/
const config = {
// 终端标识
- sn: null,
+ sn: "taoyao",
+ // 信令服务地址
+ host: "localhost",
+ port: "8888",
// 终端名称
name: "taoyao-client-web",
// 终端版本
version: "1.0.0",
// 日志级别
logLevel: "DEBUG",
- // 信令服务地址
- host: "localhost",
- port: "8888",
+ // 帐号密码
+ username: "taoyao",
+ password: "taoyao",
signal: function () {
return `wss://${this.host}:${this.port}/websocket.signal`;
},
+ // 媒体配置
+ audio: {},
+ video: {},
+ // WebRTC配置
+ webrtc: {},
};
/**
@@ -44,13 +52,13 @@ const protocol = {
/**
* 生成信令消息
*
- * @param {*} id ID
- * @param {*} body 信令消息
* @param {*} signal 信令标识
+ * @param {*} body 信令消息
+ * @param {*} id ID
*
* @returns 信令消息
*/
- buildMessage: function (id, body, signal) {
+ buildMessage: function (signal, body = {}, id) {
let message = {
header: {
v: config.version,
diff --git a/taoyao-client-web/src/components/LocalClient.vue b/taoyao-client-web/src/components/LocalClient.vue
index dcf1f0a..4e17032 100644
--- a/taoyao-client-web/src/components/LocalClient.vue
+++ b/taoyao-client-web/src/components/LocalClient.vue
@@ -1,2 +1,23 @@
+
+
diff --git a/taoyao-client-web/src/components/SettingRoom.vue b/taoyao-client-web/src/components/SettingRoom.vue
new file mode 100644
index 0000000..8d4a0ce
--- /dev/null
+++ b/taoyao-client-web/src/components/SettingRoom.vue
@@ -0,0 +1,100 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 设置
+
+
+
+
+
diff --git a/taoyao-client-web/src/components/SettingSignal.vue b/taoyao-client-web/src/components/SettingSignal.vue
new file mode 100644
index 0000000..175cd0c
--- /dev/null
+++ b/taoyao-client-web/src/components/SettingSignal.vue
@@ -0,0 +1,53 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 设置
+
+
+
+
+
diff --git a/taoyao-client-web/src/components/Taoyao.js b/taoyao-client-web/src/components/Taoyao.js
index f828b8d..e860a2a 100644
--- a/taoyao-client-web/src/components/Taoyao.js
+++ b/taoyao-client-web/src/components/Taoyao.js
@@ -3,14 +3,19 @@
*/
import { Logger } from "./Logger.js";
import { TaoyaoClient } from "./TaoyaoClient.js";
-import { config, protocol, defaultAudioConfig, defaultVideoConfig } from "./Config.js";
+import * as mediasoupClient from 'mediasoup-client';
+import {
+ config,
+ protocol,
+ defaultAudioConfig,
+ defaultVideoConfig,
+} from "./Config.js";
// 日志
const logger = new Logger();
/**
* 信令通道
- * TODO:获取IP/MAC/信号强度
*/
const signalChannel = {
// 桃夭
@@ -27,6 +32,8 @@ const signalChannel = {
heartbeatTime: 30 * 1000,
// 心跳定时器
heartbeatTimer: null,
+ // 是否重连
+ reconnection: true,
// 重连定时器
reconnectTimer: null,
// 防止重复重连
@@ -72,10 +79,11 @@ const signalChannel = {
*
* @returns Promise
*/
- connect: function (address, callback, reconnection = true) {
+ connect: async function (address, callback, reconnection = true) {
let self = this;
self.address = address;
self.callback = callback;
+ self.reconnection = reconnection;
return new Promise((resolve, reject) => {
logger.debug("连接信令通道", address);
self.channel = new WebSocket(address);
@@ -85,8 +93,7 @@ const signalChannel = {
const battery = await navigator.getBattery();
self.push(
protocol.buildMessage("client::register", {
- ip: null,
- mac: null,
+ ip: 'localhost',
signal: 100,
battery: battery.level * 100,
charging: battery.charging,
@@ -103,14 +110,14 @@ const signalChannel = {
};
self.channel.onclose = function (e) {
logger.error("信令通道关闭", self.channel, e);
- if (reconnection) {
+ if (self.reconnection) {
self.reconnect();
}
reject(e);
};
self.channel.onerror = function (e) {
logger.error("信令通道异常", self.channel, e);
- if (reconnection) {
+ if (self.reconnection) {
self.reconnect();
}
reject(e);
@@ -122,7 +129,7 @@ const signalChannel = {
* 3. 如果前面所有回调没有返回true执行默认回调。
*/
self.channel.onmessage = function (e) {
- console.debug("信令通道消息", e.data);
+ logger.debug("信令通道消息", e.data);
let done = false;
let data = JSON.parse(e.data);
// 请求回调
@@ -134,7 +141,7 @@ const signalChannel = {
}
}
// 全局回调
- if (self.callback) {
+ if (!done && self.callback) {
done = self.callback(data);
}
// 默认回调
@@ -163,39 +170,67 @@ const signalChannel = {
}
// 打开定时重连
self.reconnectTimer = setTimeout(function () {
- console.info("信令通道重连", self.address);
+ logger.info("信令通道重连", self.address);
self.connect(self.address, self.callback, true);
self.lockReconnect = false;
}, self.connectionTimeout);
if (self.connectionTimeout >= self.maxReconnectionDelay) {
self.connectionTimeout = self.maxReconnectionDelay;
} else {
- self.connectionTimeout = self.connectionTimeout * self.reconnectionDelayGrowFactor;
+ self.connectionTimeout =
+ self.connectionTimeout * self.reconnectionDelayGrowFactor;
}
},
/**
- * 发送消息
- *
+ * 异步请求
+ *
* @param {*} data 消息内容
* @param {*} callback 注册回调
*/
push: function (data, callback) {
// 注册回调
- if (data && callback) {
- this.callbackMapping.set(data.header.id, callback);
+ let self = this;
+ if (callback) {
+ self.callbackMapping.set(data.header.id, callback);
}
// 发送消息
- if (data && data.header) {
- this.channel.send(JSON.stringify(data));
- } else {
- this.channel.send(data);
- }
+ self.channel.send(JSON.stringify(data));
+ },
+ /**
+ * 同步请求
+ *
+ * @param {*} data 消息内容
+ *
+ * @returns Promise
+ */
+ request: async function(data) {
+ let self = this;
+ return new Promise((resolve, reject) => {
+ let callback = false;
+ // 设置回调
+ self.callbackMapping.set(data.header.id, (response) => {
+ callback = true;
+ resolve(response);
+ return true;
+ });
+ // 发送请求
+ self.channel.send(JSON.stringify(data));
+ // 设置超时
+ setTimeout(() => {
+ if(!callback) {
+ reject("请求超时", data);
+ }
+ }, 5000);
+ });
},
/**
* 关闭通道
*/
close: function () {
- clearTimeout(this.heartbeatTimer);
+ let self = this;
+ self.reconnection = false;
+ self.channel.close();
+ clearTimeout(self.heartbeatTimer);
},
/**
* 默认回调
@@ -203,10 +238,17 @@ const signalChannel = {
* @param {*} data 消息内容
*/
defaultCallback: function (data) {
- console.debug("没有适配信令消息默认处理", data);
+ let self = this;
+ logger.debug("没有适配信令消息默认处理", data);
switch (data.header.signal) {
+ case "client::config":
+ self.defaultClientConfig(data);
+ break;
+ case "client::register":
+ logger.info("桃夭终端注册成功");
+ break;
case "platform::error":
- console.error("信令发生错误", data);
+ logger.error("信令发生错误", data);
break;
}
},
@@ -216,24 +258,10 @@ const signalChannel = {
* @param {*} data 消息内容
*/
defaultClientConfig: function (data) {
- let self = this;
- // 配置终端
- self.taoyao
- .configMedia(data.body.media.audio, data.body.media.video)
- .configWebrtc(data.body.webrtc);
- // 打开媒体通道
- let videoId = self.taoyao.videoId;
- if (videoId) {
- self.taoyao
- .buildLocalMedia()
- .then((stream) => {
- self.taoyao.buildMediaChannel(videoId, stream);
- })
- .catch((e) => console.error("打开终端媒体失败", e));
- console.debug("自动打开媒体通道", videoId);
- } else {
- console.debug("没有配置本地媒体信息跳过自动打开媒体通道");
- }
+ config.webrtc = data.body.webrtc;
+ config.audio = { ...config.defaultAudioConfig, ...data.body.media.audio };
+ config.video = { ...config.defaultVideoConfig, ...data.body.media.video };
+ logger.info("终端配置", config.audio, config.video, config.webrtc);
},
/**
* 默认终端重启回调
@@ -241,7 +269,7 @@ const signalChannel = {
* @param {*} data 消息内容
*/
defaultClientReboot: function (data) {
- console.info("重启终端");
+ logger.info("重启终端");
location.reload();
},
};
@@ -250,63 +278,89 @@ const signalChannel = {
* 桃夭
*/
class Taoyao {
+ // 发送信令
+ push = null;
+ // 请求信令
+ request = null;
+ // 本地视频
+ localVideo = null;
// 本地终端
localClient;
// 远程终端
remoteClientList;
- // 设备状态
- audioEnabled = true;
- videoEnabled = true;
- // 媒体配置
- audioConfig = defaultAudioConfig;
- videoConfig = defaultVideoConfig;
// 媒体通道
- transSend;
- transRecv;
- // 发送信令
- push = null;
- // 信令通道
- signalChannel = null;
+ sendTransport = null;
+ recvTransport = null;
+ // 信令通道
+ signalChannel = null;
+ // 媒体设备
+ mediasoupDevice = null;
+ // 是否消费
+ consume = true;
+ // 是否生产
+ produce = true;
+ // 是否生产音频
+ audioProduce = true && this.produce;
+ // 是否生成视频
+ videoProduce = true && this.produce;
+ // 音频生产者
+ audioProducer = null;
+ // 视频生产者
+ videoProducer = null;
+ // 消费者
+ consumers = new Map();
+ // 数据消费者
+ dataConsumers = new Map();
+
/**
- * 媒体配置
- *
- * @param {*} audio
- * @param {*} video
- *
- * @returns
- */
- configMedia = function(audio = {}, video = {}) {
- this.audioConfig = {...this.audioConfig, ...audio};
- this.videoConfig = {...this.videoConfig, ...video};
- console.debug('终端媒体配置', this.audioConfig, this.videoConfig);
- return this;
- };
- /**
- * WebRTC配置
- *
- * @param {*} config
- *
- * @returns
- */
- configWebrtc = function(config = {}) {
- return this;
- };
- /**
* 打开信令通道
- *
- * @param {*} callback
- *
- * @returns
+ *
+ * @param {*} callback
+ *
+ * @returns
*/
- buildChannel = function(callback) {
- signalChannel.taoyao = this;
- this.signalChannel = signalChannel;
- // 不能直接this.push = this.signalChannel.push这样导致this对象错误
- this.push = function(data, pushCallback) {
- this.signalChannel.push(data, pushCallback);
- };
- return this.signalChannel.connect(config.signal(), callback);
- };
+ buildChannel = async function (callback) {
+ signalChannel.taoyao = this;
+ this.signalChannel = signalChannel;
+ // 不能直接this.push = this.signalChannel.push这样导致this对象错误
+ this.push = function (data, pushCallback) {
+ this.signalChannel.push(data, pushCallback);
+ };
+ this.request = async function(data) {
+ return await this.signalChannel.request(data);
+ }
+ return this.signalChannel.connect(config.signal(), callback);
+ };
+ /**
+ * 设置本地媒体
+ */
+ buildLocal = function() {
+ new mediasoupClient.Device();
+ };
+ /**
+ * 打开媒体通道
+ */
+ buildMediaTransport = function() {
+ let self = this;
+ // 释放资源
+ self.close();
+
+ }
+ /**
+ * 关闭
+ */
+ close = function() {
+ let self = this;
+ if(self.sendTransport) {
+ self.sendTransport.close();
+ }
+ if(self.recvTransport) {
+ self.recvTransport.close();
+ }
+ if(self.signalChannel) {
+ self.signalChannel.close();
+ }
+ };
}
export { Taoyao };
diff --git a/taoyao-client-web/src/main.js b/taoyao-client-web/src/main.js
index 63efaab..478ee49 100644
--- a/taoyao-client-web/src/main.js
+++ b/taoyao-client-web/src/main.js
@@ -1,5 +1,9 @@
import { createApp } from "vue";
import App from "./App.vue";
import "./assets/main.css";
+import ElementPlus from "element-plus";
+import "element-plus/dist/index.css";
-createApp(App).mount("#app");
+const app = createApp(App);
+app.use(ElementPlus);
+app.mount("#app");
diff --git a/taoyao-client-web/vite.config.js b/taoyao-client-web/vite.config.js
index 91230d2..ad59863 100644
--- a/taoyao-client-web/vite.config.js
+++ b/taoyao-client-web/vite.config.js
@@ -1,7 +1,6 @@
-import { fileURLToPath, URL } from "node:url";
-
import { defineConfig } from "vite";
import vue from "@vitejs/plugin-vue";
+import { fileURLToPath, URL } from "node:url";
export default defineConfig({
plugins: [vue()],
diff --git a/taoyao-signal-server/README.md b/taoyao-signal-server/README.md
index e398d7e..4632977 100644
--- a/taoyao-signal-server/README.md
+++ b/taoyao-signal-server/README.md
@@ -6,7 +6,6 @@
|:--|:--|:--|
|taoyao|桃夭|桃之夭夭灼灼其华|
|taoyao-boot|基础|基础模块|
-|taoyao-node|集群|集群模块(可选)|
|taoyao-signal|信令|信令模块|
|taoyao-server|服务|启动模块|
@@ -31,17 +30,3 @@
### 本地视频模式
使用本地文件作为音频视频来源
-
-## 模块关系
-
-```
-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-| taoyao-server |
-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-| taoyao-node | Mediasoup |
-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-| taoyao-signal |
-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-| taoyao-boot |
-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-```
diff --git a/taoyao-signal-server/pom.xml b/taoyao-signal-server/pom.xml
index df97784..7e0677e 100644
--- a/taoyao-signal-server/pom.xml
+++ b/taoyao-signal-server/pom.xml
@@ -35,7 +35,6 @@
taoyao-boot
- taoyao-node
taoyao-signal
taoyao-server
@@ -104,11 +103,6 @@
taoyao-boot
${project.version}
-
- com.acgist
- taoyao-node
- ${project.version}
-
com.acgist
taoyao-signal
diff --git a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/annotation/Client.java b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/annotation/Client.java
index 3e22ca9..9752414 100644
--- a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/annotation/Client.java
+++ b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/annotation/Client.java
@@ -14,8 +14,8 @@ import org.springframework.stereotype.Component;
* @author acgist
*/
@Target(ElementType.TYPE)
-@Retention(RetentionPolicy.RUNTIME)
@Component
+@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Client {
diff --git a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/annotation/EventListener.java b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/annotation/EventListener.java
index 336536f..8cb8650 100644
--- a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/annotation/EventListener.java
+++ b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/annotation/EventListener.java
@@ -9,13 +9,13 @@ import java.lang.annotation.Target;
import org.springframework.stereotype.Component;
/**
- * 监听
+ * 事件监听
*
* @author acgist
*/
@Target(ElementType.TYPE)
-@Retention(RetentionPolicy.RUNTIME)
@Component
+@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface EventListener {
diff --git a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/annotation/Manager.java b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/annotation/Manager.java
index e4bed51..02c51a8 100644
--- a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/annotation/Manager.java
+++ b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/annotation/Manager.java
@@ -14,8 +14,8 @@ import org.springframework.stereotype.Component;
* @author acgist
*/
@Target(ElementType.TYPE)
-@Retention(RetentionPolicy.RUNTIME)
@Component
+@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Manager {
diff --git a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/annotation/Protocol.java b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/annotation/Protocol.java
index e6fa324..fc31c98 100644
--- a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/annotation/Protocol.java
+++ b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/annotation/Protocol.java
@@ -14,8 +14,8 @@ import org.springframework.stereotype.Component;
* @author acgist
*/
@Target(ElementType.TYPE)
-@Retention(RetentionPolicy.RUNTIME)
@Component
+@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Protocol {
diff --git a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/config/BootAutoConfiguration.java b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/config/BootAutoConfiguration.java
index b4465b1..2b8f93d 100644
--- a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/config/BootAutoConfiguration.java
+++ b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/config/BootAutoConfiguration.java
@@ -90,11 +90,9 @@ public class BootAutoConfiguration {
@Value("${spring.application.name:taoyao}")
private String name;
- @Value("${taoyao.webrtc.framework:MOON}")
- private String framework;
@Autowired
- private ApplicationContext context;
+ private ApplicationContext applicationContext;
@Bean
@ConditionalOnMissingBean
@@ -169,13 +167,12 @@ public class BootAutoConfiguration {
log.info("用户目录:{}", System.getProperty("user.home"));
log.info("临时目录:{}", System.getProperty("java.io.tmpdir"));
log.info("文件编码:{}", System.getProperty("file.encoding"));
- this.context.getBeansOfType(TaskExecutor.class).forEach((k, v) -> {
+ this.applicationContext.getBeansOfType(TaskExecutor.class).forEach((k, v) -> {
log.info("系统任务线程池:{}-{}", k, v);
});
- this.context.getBeansOfType(TaskScheduler.class).forEach((k, v) -> {
+ this.applicationContext.getBeansOfType(TaskScheduler.class).forEach((k, v) -> {
log.info("系统定时任务线程池:{}-{}", k, v);
});
- log.info("WebRTC架构:{}", this.framework);
this.registerException();
}
@@ -203,7 +200,6 @@ public class BootAutoConfiguration {
@PreDestroy
public void destroy() {
log.info("系统关闭:{}", this.name);
- // TODO:通知关闭
// 刷出日志缓存
final ILoggerFactory factory = LoggerFactory.getILoggerFactory();
if (factory instanceof LoggerContext context) {
diff --git a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/config/SpringDocAutoConfiguration.java b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/config/SpringDocAutoConfiguration.java
index d2f6aa5..5e1d004 100644
--- a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/config/SpringDocAutoConfiguration.java
+++ b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/config/SpringDocAutoConfiguration.java
@@ -11,7 +11,6 @@ import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
-import com.acgist.taoyao.boot.property.SecurityProperties;
import com.acgist.taoyao.boot.property.TaoyaoProperties;
import io.swagger.v3.oas.models.Components;
@@ -31,9 +30,15 @@ import io.swagger.v3.oas.models.security.SecurityScheme;
@Configuration
@ConditionalOnClass(OpenAPI.class)
public class SpringDocAutoConfiguration {
+
+ /**
+ * Basic认证
+ */
+ private static final String BASIC = "Basic";
@Value("${server.port:8888}")
private Integer port;
+
@Autowired
private TaoyaoProperties taoyaoProperties;
@@ -101,7 +106,7 @@ public class SpringDocAutoConfiguration {
private List buildSecurity() {
return List.of(
new SecurityRequirement()
- .addList(SecurityProperties.BASIC)
+ .addList(BASIC)
);
}
@@ -110,7 +115,7 @@ public class SpringDocAutoConfiguration {
*/
private Components buildComponents() {
return new Components()
- .addSecuritySchemes(SecurityProperties.BASIC, this.buildSecurityScheme());
+ .addSecuritySchemes(BASIC, this.buildSecurityScheme());
}
/**
@@ -118,8 +123,8 @@ public class SpringDocAutoConfiguration {
*/
private SecurityScheme buildSecurityScheme() {
return new SecurityScheme()
- .name(SecurityProperties.BASIC)
- .scheme(SecurityProperties.BASIC)
+ .name(BASIC)
+ .scheme(BASIC)
.in(SecurityScheme.In.HEADER)
.type(SecurityScheme.Type.HTTP);
}
diff --git a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/config/WebMvcConfigurerAutoConfiguration.java b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/config/WebMvcConfigurerAutoConfiguration.java
index d82d53a..cb0456a 100644
--- a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/config/WebMvcConfigurerAutoConfiguration.java
+++ b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/config/WebMvcConfigurerAutoConfiguration.java
@@ -20,15 +20,15 @@ import lombok.extern.slf4j.Slf4j;
public class WebMvcConfigurerAutoConfiguration implements WebMvcConfigurer {
@Autowired
- private ApplicationContext context;
+ private ApplicationContext applicationContext;
@Override
public void addInterceptors(InterceptorRegistry registry) {
- this.context.getBeansOfType(InterceptorAdapter.class).entrySet().stream()
+ this.applicationContext.getBeansOfType(InterceptorAdapter.class).entrySet().stream()
.sorted((a, z) -> a.getValue().compareTo(z.getValue()))
.forEach(entry -> {
final InterceptorAdapter value = entry.getValue();
- log.info("加载拦截器:{}-{}", entry.getKey(), value.name());
+ log.info("加载拦截器:{} - {}", String.format("%-32s", entry.getKey()), value.name());
registry.addInterceptor(value).addPathPatterns(value.pathPattern());
});
}
diff --git a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/model/Header.java b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/model/Header.java
index a41c9ea..f26c165 100644
--- a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/model/Header.java
+++ b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/model/Header.java
@@ -10,29 +10,29 @@ import lombok.NoArgsConstructor;
import lombok.Setter;
/**
- * 请求响应头部
+ * 消息头部
*
* @author acgist
*/
@Getter
@Setter
-@Schema( title = "请求响应头部", description = "请求响应头部")
+@Schema( title = "消息头部", description = "消息头部")
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Header implements Serializable {
private static final long serialVersionUID = 1L;
-
+
/**
- * 请求响应版本
+ * 消息版本
*/
- @Schema(title = "请求响应版本", description = "请求响应版本")
+ @Schema(title = "消息版本", description = "消息版本")
private String v;
/**
- * 请求响应标识
+ * 消息标识
*/
- @Schema(title = "请求响应标识", description = "请求响应标识")
+ @Schema(title = "消息标识", description = "消息标识")
private String id;
/**
* 终端标识
@@ -45,4 +45,9 @@ public class Header implements Serializable {
@Schema(title = "协议标识", description = "协议标识")
private String signal;
+ @Override
+ public Header clone() {
+ return new Header(this.v, this.id, this.sn, this.signal);
+ }
+
}
diff --git a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/model/Message.java b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/model/Message.java
index f4ada0c..7a74aa6 100644
--- a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/model/Message.java
+++ b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/model/Message.java
@@ -14,13 +14,13 @@ import lombok.NoArgsConstructor;
import lombok.Setter;
/**
- * 请求响应消息
+ * 消息
*
* @author acgist
*/
@Getter
@Setter
-@Schema(title = "请求响应消息", description = "请求响应消息")
+@Schema(title = "消息", description = "消息")
@Builder
@NoArgsConstructor
@AllArgsConstructor
@@ -29,28 +29,28 @@ public class Message implements Cloneable, Serializable {
private static final long serialVersionUID = 1L;
/**
- * 响应编码
+ * 状态编码
*/
- @Schema(title = "响应编码", description = "响应消息标识响应状态")
+ @Schema(title = "状态编码", description = "状态编码")
private String code;
/**
- * 响应描述
+ * 状态描述
*/
- @Schema(title = "响应描述", description = "响应消息描述响应编码")
+ @Schema(title = "状态描述", description = "状态描述")
private String message;
/**
- * 请求响应头部
+ * 消息头部
*/
- @Schema(title = "请求响应头部", description = "请求响应头部")
+ @Schema(title = "消息头部", description = "消息头部")
private Header header;
/**
- * 请求响应主体
+ * 消息主体
*/
- @Schema(title = "请求响应主体", description = "请求响应主体")
+ @Schema(title = "消息主体", description = "消息主体")
private Object body;
/**
- * 覆盖
+ * 重载方法
*
* @param code 状态编码
*/
@@ -60,27 +60,20 @@ public class Message implements Cloneable, Serializable {
/**
* @param code 状态编码
- *
- * @return this
*/
- public Message setCode(MessageCode code) {
- this.code = code.getCode();
- this.message = code.getMessage();
- return this;
+ public void setCode(MessageCode code) {
+ this.setCode(code, null);
}
/**
- * @param code 响应编码
- * @param message 响应描述
+ * @param code 状态编码
+ * @param message 状态描述
*
* @return this
*/
public Message setCode(MessageCode code, String message) {
- if(StringUtils.isEmpty(message)) {
- message = code.getMessage();
- }
this.code = code.getCode();
- this.message = message;
+ this.message = StringUtils.isEmpty(message) ? code.getMessage() : message;
return this;
}
@@ -92,14 +85,13 @@ public class Message implements Cloneable, Serializable {
}
/**
- * @param body 主体
+ * @param body 消息主体
*
* @return 成功消息
*/
public static final Message success(Object body) {
final Message message = new Message();
- message.code = MessageCode.CODE_0000.getCode();
- message.message = MessageCode.CODE_0000.getMessage();
+ message.setCode(MessageCode.CODE_0000, null);
message.body = body;
return message;
}
@@ -112,16 +104,7 @@ public class Message implements Cloneable, Serializable {
}
/**
- * @param message 主体
- *
- * @return 错误消息
- */
- public static final Message fail(String message) {
- return fail(null, message, null);
- }
-
- /**
- * @param code 响应编码
+ * @param code 状态编码
*
* @return 错误消息
*/
@@ -130,8 +113,37 @@ public class Message implements Cloneable, Serializable {
}
/**
- * @param code 响应编码
- * @param message 响应描述
+ * @param code 状态编码
+ * @param body 消息主体
+ *
+ * @return 错误消息
+ */
+ public static final Message fail(MessageCode code, Object body) {
+ return fail(code, null, body);
+ }
+
+ /**
+ * @param message 状态描述
+ *
+ * @return 错误消息
+ */
+ public static final Message fail(String message) {
+ return fail(null, message, null);
+ }
+
+ /**
+ * @param message 状态描述
+ * @param body 消息主体
+ *
+ * @return 错误消息
+ */
+ public static final Message fail(String message, Object body) {
+ return fail(null, message, body);
+ }
+
+ /**
+ * @param code 状态编码
+ * @param message 状态描述
*
* @return 错误消息
*/
@@ -140,58 +152,33 @@ public class Message implements Cloneable, Serializable {
}
/**
- * @param code 响应编码
- * @param body 主体
- *
- * @return 错误消息
- */
- public static final Message fail(MessageCode code, Object body) {
- return fail(code, null, body);
- }
-
- /**
- * @param code 响应编码
- * @param message 响应描述
- * @param body 主体
+ * @param code 状态编码
+ * @param message 状态描述
+ * @param body 消息主体
*
* @return 错误消息
*/
public static final Message fail(MessageCode code, String message, Object body) {
- if(code == null) {
- code = MessageCode.CODE_9999;
- }
- if (StringUtils.isEmpty(message)) {
- message = code.getMessage();
- }
final Message failMessage = new Message();
- failMessage.code = code.getCode();
- failMessage.message = message;
+ failMessage.setCode(code == null ? MessageCode.CODE_9999 : code, message);
failMessage.body = body;
return failMessage;
}
@Override
public Message clone() {
- try {
- return (Message) super.clone();
- } catch (CloneNotSupportedException e) {
- return new Message(this.code, this.message, this.header, this.body);
- }
+ return new Message(this.code, this.message, this.header.clone(), this.body);
}
/**
- * 克隆排除主体
+ * 克隆排除消息主体
*
- * @return 请求响应消息
+ * @return 克隆消息
*/
public Message cloneWidthoutBody() {
- try {
- final Message message = (Message) super.clone();
- message.setBody(null);
- return message;
- } catch (CloneNotSupportedException e) {
- return new Message(this.code, this.message, this.header, null);
- }
+ final Message message = this.clone();
+ message.setBody(null);
+ return message;
}
@Override
diff --git a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/model/MessageCode.java b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/model/MessageCode.java
index c337cd7..5f47d35 100644
--- a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/model/MessageCode.java
+++ b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/model/MessageCode.java
@@ -5,10 +5,10 @@ import lombok.Getter;
/**
* 状态编码
*
- * 1xxx=前置错误:数据校验
- * 2xxx=内部错误
- * 3xxx=请求错误:HTTP错误
- * 9999=未知错误
+ * 1xxx = 前置错误
+ * 2xxx = 内部错误
+ * 3xxx = 请求错误
+ * 9999 = 未知错误
*
* @author acgist
*/
@@ -43,8 +43,8 @@ public enum MessageCode {
/**
* HTTP状态编码前缀
*/
- public static final String HTTP_STATUS = "3";
-
+ private static final String HTTP_STATUS = "3";
+
/**
* 状态编码
*/
@@ -80,7 +80,7 @@ public enum MessageCode {
}
/**
- * @param status HTTPStatus
+ * @param status HTTP Status
*
* @return 状态编码
*/
diff --git a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/property/MediasoupProperties.java b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/property/MediasoupProperties.java
index 6e44eef..acaaac1 100644
--- a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/property/MediasoupProperties.java
+++ b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/property/MediasoupProperties.java
@@ -7,59 +7,59 @@ import lombok.Getter;
import lombok.Setter;
/**
- * 媒体终端配置
+ * 媒体服务配置
*
* @author acgist
*/
@Getter
@Setter
-@Schema(title = "Mediasoup配置", description = "Mediasoup配置")
+@Schema(title = "媒体服务配置", description = "媒体服务配置")
public class MediasoupProperties {
/**
- * Mediasoup名称
+ * 名称
*/
- @Schema(title = "Mediasoup名称", description = "Mediasoup名称")
+ @Schema(title = "名称", description = "名称")
private String name;
/**
- * Mediasoup主机
+ * 是否启用
*/
- @Schema(title = "Mediasoup主机", description = "Mediasoup主机")
+ @Schema(title = "是否启用", description = "是否启用")
+ private Boolean enabled;
+ /**
+ * 主机
+ */
+ @Schema(title = "主机", description = "主机")
private String host;
/**
- * Mediasoup端口
+ * 端口
*/
- @Schema(title = "Mediasoup端口", description = "Mediasoup端口")
+ @Schema(title = "端口", description = "端口")
private Integer port;
/**
- * Mediasoup协议
+ * 协议
*/
- @Schema(title = "Mediasoup协议", description = "Mediasoup协议")
+ @Schema(title = "协议", description = "协议")
private String schema;
/**
- * Mediasoup地址
+ * 用户
*/
- @Schema(title = "Mediasoup地址", description = "Mediasoup地址")
- private String websocket;
- /**
- * Mediasoup用户
- */
- @Schema(title = "Mediasoup用户", description = "Mediasoup用户")
+ @Schema(title = "用户", description = "用户")
@JsonIgnore
private String username;
/**
- * Mediasoup密码
+ * 密码
*/
- @Schema(title = "Mediasoup密码", description = "Mediasoup密码")
+ @Schema(title = "密码", description = "密码")
@JsonIgnore
private String password;
/**
- * @return 完整Mediasoup地址
+ * @return 完整地址
*/
- @Schema(title = "完整Mediasoup地址", description = "完整Mediasoup地址")
+ @Schema(title = "完整地址", description = "完整地址")
public String getAddress() {
- return this.schema + "://" + this.host + ":" + this.port + this.websocket;
+ return this.schema + "://" + this.host + ":" + this.port;
}
}
diff --git a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/property/NodeProperties.java b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/property/NodeProperties.java
index a6e73b9..02af6e9 100644
--- a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/property/NodeProperties.java
+++ b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/property/NodeProperties.java
@@ -17,25 +17,25 @@ import lombok.Setter;
public class NodeProperties {
/**
- * 节点主机
+ * 主机
*/
- @Schema(title = "节点主机", description = "节点主机")
+ @Schema(title = "主机", description = "主机")
private String host;
/**
- * 节点端口
+ * 端口
*/
- @Schema(title = "节点端口", description = "节点端口")
+ @Schema(title = "端口", description = "端口")
private Integer port;
/**
* 用户
*/
- @Schema(title = "节点用户", description = "节点用户")
+ @Schema(title = "用户", description = "用户")
@JsonIgnore
private String username;
/**
* 密码
*/
- @Schema(title = "节点密码", description = "节点密码")
+ @Schema(title = "密码", description = "密码")
@JsonIgnore
private String password;
/**
diff --git a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/property/SecurityProperties.java b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/property/SecurityProperties.java
index 475a065..ca99a1b 100644
--- a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/property/SecurityProperties.java
+++ b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/property/SecurityProperties.java
@@ -15,11 +15,6 @@ import lombok.Setter;
@ConfigurationProperties(prefix = "taoyao.security")
public class SecurityProperties {
- /**
- * Basic认证
- */
- public static final String BASIC = "Basic";
-
/**
* 是否启用
*/
diff --git a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/property/WebrtcProperties.java b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/property/WebrtcProperties.java
index 0f5a149..5346092 100644
--- a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/property/WebrtcProperties.java
+++ b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/property/WebrtcProperties.java
@@ -30,19 +30,19 @@ public class WebrtcProperties {
@Schema(title = "媒体最大端口", description = "媒体最大端口")
private Integer maxPort;
/**
- * stun服务器
+ * STUN服务器
*/
- @Schema(title = "stun服务器", description = "stun服务器")
+ @Schema(title = "STUN服务器", description = "STUN服务器")
private String[] stun;
/**
- * turn服务器
+ * TURN服务器
*/
- @Schema(title = "turn服务器", description = "turn服务器")
+ @Schema(title = "TURN服务器", description = "TURN服务器")
private String[] turn;
/**
- * Mediasoup配置
+ * 媒体服务配置
*/
- @Schema(title = "Mediasoup配置", description = "Mediasoup配置")
+ @Schema(title = "媒体服务配置", description = "媒体服务配置")
private List mediasoupList;
}
diff --git a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/utils/WebSocketUtils.java b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/utils/WebSocketUtils.java
new file mode 100644
index 0000000..ff25378
--- /dev/null
+++ b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/utils/WebSocketUtils.java
@@ -0,0 +1,65 @@
+package com.acgist.taoyao.boot.utils;
+
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.reflect.FieldUtils;
+
+import jakarta.websocket.Session;
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * WebSocket工具
+ *
+ * @author acgist
+ */
+@Slf4j
+public class WebSocketUtils {
+
+ private WebSocketUtils() {
+ }
+
+ /**
+ * @param session WebSocket
+ *
+ * @return 远程地址
+ */
+ public static final String getRemoteAddress(Session session) {
+ if (session == null) {
+ return null;
+ }
+ return (String) getField(session.getAsyncRemote(), "base.socketWrapper.remoteAddr");
+ }
+
+ /**
+ * @param object 对象
+ * @param fieldPath 属性路径
+ *
+ * @return 属性
+ */
+ private static final Object getField(Object object, String fieldPath) {
+ final String fields[] = StringUtils.split(fieldPath, '.');
+ for (String field : fields) {
+ object = getField(object, object.getClass(), field);
+ if (object == null) {
+ return null;
+ }
+ }
+ return object;
+ }
+
+ /**
+ * @param object 对象
+ * @param clazz 属性类型
+ * @param fieldName 属性名称
+ *
+ * @return 属性
+ */
+ private static final Object getField(Object object, Class> clazz, String fieldName) {
+ try {
+ return FieldUtils.getField(clazz, fieldName, true).get(object);
+ } catch (IllegalArgumentException | IllegalAccessException e) {
+ log.error("读取属性异常:{}-{}", clazz, fieldName, e);
+ }
+ return null;
+ }
+
+}
diff --git a/taoyao-signal-server/taoyao-node/README.md b/taoyao-signal-server/taoyao-node/README.md
deleted file mode 100644
index 876942c..0000000
--- a/taoyao-signal-server/taoyao-node/README.md
+++ /dev/null
@@ -1,6 +0,0 @@
-# 集群
-
-## 实现逻辑
-
-1. 集群启动时加载所有节点,同步节点信息,定时监测节点状态。
-2. 集群同步媒体节点,终端通过代理连接不同信令节点。
diff --git a/taoyao-signal-server/taoyao-node/pom.xml b/taoyao-signal-server/taoyao-node/pom.xml
deleted file mode 100644
index 9299546..0000000
--- a/taoyao-signal-server/taoyao-node/pom.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-
-
-
-
- 4.0.0
-
-
- com.acgist
- taoyao
- 1.0.0
-
-
- taoyao-node
- jar
-
- taoyao-node
- 集群服务:集群模块
-
-
-
- com.acgist
- taoyao-signal
-
-
-
-
\ No newline at end of file
diff --git a/taoyao-signal-server/taoyao-node/src/main/java/com/acgist/taoyao/node/config/NodeAutoConfiguration.java b/taoyao-signal-server/taoyao-node/src/main/java/com/acgist/taoyao/node/config/NodeAutoConfiguration.java
deleted file mode 100644
index ce2e85b..0000000
--- a/taoyao-signal-server/taoyao-node/src/main/java/com/acgist/taoyao/node/config/NodeAutoConfiguration.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package com.acgist.taoyao.node.config;
-
-import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-
-import com.acgist.taoyao.node.listener.platform.NodeShutdownListener;
-
-/**
- * 集群自动配置
- *
- * @author acgist
- */
-@Configuration
-@ConditionalOnProperty(prefix = "taoyao.node", name = "enabled", havingValue = "true", matchIfMissing = false)
-public class NodeAutoConfiguration {
-
- @Bean
- @ConditionalOnMissingBean
- public NodeShutdownListener nodeShutdownListener() {
- return new NodeShutdownListener();
- }
-
-}
diff --git a/taoyao-signal-server/taoyao-node/src/main/java/com/acgist/taoyao/node/listener/platform/NodeShutdownListener.java b/taoyao-signal-server/taoyao-node/src/main/java/com/acgist/taoyao/node/listener/platform/NodeShutdownListener.java
deleted file mode 100644
index 7a9a3be..0000000
--- a/taoyao-signal-server/taoyao-node/src/main/java/com/acgist/taoyao/node/listener/platform/NodeShutdownListener.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package com.acgist.taoyao.node.listener.platform;
-
-import com.acgist.taoyao.signal.event.platform.PlatformShutdownEvent;
-import com.acgist.taoyao.signal.listener.ApplicationListenerAdapter;
-
-/**
- * 关闭平台监听
- *
- * TODO:节点关闭
- *
- * @author acgist
- */
-public class NodeShutdownListener extends ApplicationListenerAdapter {
-
- @Override
- public void onApplicationEvent(PlatformShutdownEvent event) {
- // TODO:
- }
-
-}
diff --git a/taoyao-signal-server/taoyao-node/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/taoyao-signal-server/taoyao-node/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
deleted file mode 100644
index 6e84b07..0000000
--- a/taoyao-signal-server/taoyao-node/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
+++ /dev/null
@@ -1 +0,0 @@
-com.acgist.taoyao.node.config.NodeAutoConfiguration
\ No newline at end of file
diff --git a/taoyao-signal-server/taoyao-server/src/main/java/com/acgist/taoyao/interceptor/SecurityInterceptor.java b/taoyao-signal-server/taoyao-server/src/main/java/com/acgist/taoyao/interceptor/SecurityInterceptor.java
index 00b80e5..b75c8c2 100644
--- a/taoyao-signal-server/taoyao-server/src/main/java/com/acgist/taoyao/interceptor/SecurityInterceptor.java
+++ b/taoyao-signal-server/taoyao-server/src/main/java/com/acgist/taoyao/interceptor/SecurityInterceptor.java
@@ -25,6 +25,11 @@ import lombok.extern.slf4j.Slf4j;
@Slf4j
public class SecurityInterceptor extends InterceptorAdapter {
+ /**
+ * Basic认证
+ */
+ private static final String BASIC = "Basic";
+
private AntPathMatcher matcher = new AntPathMatcher();
@Autowired
@@ -89,10 +94,10 @@ public class SecurityInterceptor extends InterceptorAdapter {
if(StringUtils.isEmpty(authorization)) {
return false;
}
- if(!StringUtils.startsWithIgnoreCase(authorization, SecurityProperties.BASIC)) {
+ if(!StringUtils.startsWithIgnoreCase(authorization, BASIC)) {
return false;
}
- authorization = authorization.substring(SecurityProperties.BASIC.length()).strip();
+ authorization = authorization.substring(BASIC.length()).strip();
authorization = new String(Base64.getDecoder().decode(authorization));
final int index = authorization.indexOf(':');
if(index < 0) {
diff --git a/taoyao-signal-server/taoyao-server/src/main/java/com/acgist/taoyao/main/TaoyaoApplication.java b/taoyao-signal-server/taoyao-server/src/main/java/com/acgist/taoyao/main/TaoyaoApplication.java
index 80f28f7..6646dfa 100644
--- a/taoyao-signal-server/taoyao-server/src/main/java/com/acgist/taoyao/main/TaoyaoApplication.java
+++ b/taoyao-signal-server/taoyao-server/src/main/java/com/acgist/taoyao/main/TaoyaoApplication.java
@@ -9,6 +9,7 @@ import org.springframework.context.annotation.ComponentScan;
public class TaoyaoApplication {
public static void main(String[] args) {
+ System.getProperties().setProperty("jdk.internal.httpclient.disableHostnameVerification", Boolean.TRUE.toString());
SpringApplication.run(TaoyaoApplication.class, args);
}
diff --git a/taoyao-signal-server/taoyao-server/src/main/resources/application-dev.yml b/taoyao-signal-server/taoyao-server/src/main/resources/application-dev.yml
index 78ea350..6df83c7 100644
--- a/taoyao-signal-server/taoyao-server/src/main/resources/application-dev.yml
+++ b/taoyao-signal-server/taoyao-server/src/main/resources/application-dev.yml
@@ -1,4 +1,12 @@
taoyao:
+ webrtc:
+ mediasoup-list:
+ - name: mediasoup-local-a
+ enabled: true
+ host: 192.168.8.110
+ port: 4443
+ schema: wss
+ username: taoyao
+ password: taoyao
security:
- permit: /v3/api-docs/**,/swagger-ui/**,/swagger-ui.html,/,/error,/index.html,/favicon.ico
-
\ No newline at end of file
+ permit: /v3/api-docs/**,/swagger-ui/**,/swagger-ui.html,/,/error,/index.html,/favicon.ico
\ No newline at end of file
diff --git a/taoyao-signal-server/taoyao-server/src/main/resources/application.yml b/taoyao-signal-server/taoyao-server/src/main/resources/application.yml
index 9e78c50..0375040 100644
--- a/taoyao-signal-server/taoyao-server/src/main/resources/application.yml
+++ b/taoyao-signal-server/taoyao-server/src/main/resources/application.yml
@@ -111,19 +111,17 @@ taoyao:
# 媒体配置
mediasoup-list:
- name: mediasoup-local-a
+ enabled: true
host: localhost
- #host: 192.168.8.110
port: 4443
schema: wss
- websocket: /websocket.signal
username: taoyao
password: taoyao
- name: mediasoup-local-z
+ enabled: true
host: localhost
- #host: 192.168.8.110
port: 4443
schema: wss
- websocket: /websocket.signal
username: taoyao
password: taoyao
# 安全配置
@@ -135,7 +133,7 @@ taoyao:
password: taoyao
# 定时任务
scheduled:
- session: 0 * * * * ?
+ client: 0 * * * * ?
# 集群配置
node:
enabled: false
diff --git a/taoyao-signal-server/taoyao-server/src/test/java/com/acgist/taoyao/signal/WebSocketClient.java b/taoyao-signal-server/taoyao-server/src/test/java/com/acgist/taoyao/signal/WebSocketClient.java
index c1f66dd..d658546 100644
--- a/taoyao-signal-server/taoyao-server/src/test/java/com/acgist/taoyao/signal/WebSocketClient.java
+++ b/taoyao-signal-server/taoyao-server/src/test/java/com/acgist/taoyao/signal/WebSocketClient.java
@@ -37,7 +37,7 @@ public class WebSocketClient {
@Override
public void onOpen(WebSocket webSocket) {
webSocket.sendText(String.format("""
- {"header":{"pid":2000,"v":"1.0.0","id":"1","sn":"%s"},"body":{"username":"taoyao","password":"taoyao","ip":"127.0.0.1","mac":"00:00:00:00:00:00"}}
+ {"header":{"pid":2000,"v":"1.0.0","id":"1","sn":"%s"},"body":{"username":"taoyao","password":"taoyao","ip":"127.0.0.1"}}
""", sn), true);
Listener.super.onOpen(webSocket);
}
diff --git a/taoyao-signal-server/taoyao-server/src/test/java/com/acgist/taoyao/signal/protocol/PlatformScriptProtocolTest.java b/taoyao-signal-server/taoyao-server/src/test/java/com/acgist/taoyao/signal/protocol/PlatformScriptProtocolTest.java
index 81d2fdb..3712baf 100644
--- a/taoyao-signal-server/taoyao-server/src/test/java/com/acgist/taoyao/signal/protocol/PlatformScriptProtocolTest.java
+++ b/taoyao-signal-server/taoyao-server/src/test/java/com/acgist/taoyao/signal/protocol/PlatformScriptProtocolTest.java
@@ -21,7 +21,7 @@ class PlatformScriptProtocolTest {
@Test
void testScript() {
assertDoesNotThrow(() -> {
- this.platformScriptProtocol.execute("taoyao", Map.of("script", "netstat -ano"), Message.success(), null);
+ this.platformScriptProtocol.execute("taoyao", Map.of("script", "netstat -ano"), null, Message.success());
Thread.sleep(1000);
});
}
diff --git a/taoyao-signal-server/taoyao-server/src/test/java/com/acgist/taoyao/signal/protocol/PlatformShutdownProtocolTest.java b/taoyao-signal-server/taoyao-server/src/test/java/com/acgist/taoyao/signal/protocol/PlatformShutdownProtocolTest.java
index 6587b94..1a9574c 100644
--- a/taoyao-signal-server/taoyao-server/src/test/java/com/acgist/taoyao/signal/protocol/PlatformShutdownProtocolTest.java
+++ b/taoyao-signal-server/taoyao-server/src/test/java/com/acgist/taoyao/signal/protocol/PlatformShutdownProtocolTest.java
@@ -19,7 +19,7 @@ class PlatformShutdownProtocolTest {
@Test
void testShutdown() {
assertDoesNotThrow(() -> {
- this.platformShutdownProtocol.execute("taoyao", Message.success(), null);
+ this.platformShutdownProtocol.execute("taoyao", null, Message.success());
Thread.sleep(1000);
});
}
diff --git a/taoyao-signal-server/taoyao-signal/README.md b/taoyao-signal-server/taoyao-signal/README.md
index b794196..275b413 100644
--- a/taoyao-signal-server/taoyao-signal/README.md
+++ b/taoyao-signal-server/taoyao-signal/README.md
@@ -36,105 +36,153 @@
> 注意:没有消息类型表示请求类型
-## 终端信令(2000~2999)
+## 终端信令
-### 终端信息
-
-### 终端注册信令(client::register)
-
-终端注册成功响应以后[下发配置信令](#下发配置信令2004)同时广播[终端上线信令](#终端上线信令2002)。
+### 终端广播信令(client::broadcast)
```
# 请求主体
{
- "username": "信令用户",
- "password": "信令密码",
- "ip": "IP地址",
- "mac": "MAC地址",
- "signal": "信号强度",
- "battery": "电池电量",
- "mediasoup": "媒体服务名称"
+ // 主体
}
-# 响应主体
-{
-}
-# 消息流程:终端->服务端->终端
# 广播主体
{
- "sn": "终端标识",
- "ip": "IP地址",
- "mac": "MAC地址",
- "signal": "信号强度",
- "battery": "电池电量",
- "mediasoup": "媒体服务名称"
+ // 主体
}
-# 消息流程:终端->服务端-)终端
+# 消息流程:终端->信令服务-)终端
```
### 终端关闭信令(client::close)
-终端关闭以后广播[终端下线信令](#终端下线信令2003),同时释放所有相关资源(信令通道、媒体通道等等)
-
```
# 请求主体
{
}
# 响应主体
{
- "sn": "终端标识"
}
-# 消息流程:终端->服务端
+# 消息流程:终端->信令服务->终端
+# 消息流程:终端->信令服务-[终端下线])终端
```
-### 终端上线信令(client::online)
+### 终端配置信令(client::config)
```
# 响应主体
{
- "sn": "终端标识"
-}
-# 消息流程:服务端-)终端
-```
-
-参考[终端注册信令](#终端注册信令2000)
-
-### 终端下线信令(client::offline)
-
-```
-# 响应主体
-{
- "sn": "终端标识"
-}
-# 消息流程:服务端-)终端
-```
-
-参考[终端关闭信令](#终端关闭信令2001)
-
-### 下发配置信令(client::config)
-
-服务端收到[终端注册信令](#终端注册信令2000)后下发配置
-
-```
-# 响应主体
-{
- "time": "系统时间:yyyyMMddHHmmss",
+ "time": "系统时间(yyyyMMddHHmmss)",
"media": "媒体配置",
"webrtc": "WebRTC配置"
}
-# 消息流程:服务端->终端
-
+# 消息流程:终端-[终端注册]>信令服务->终端
+```
### 心跳信令(client::heartbeat)
-通过心跳维护连接,实时同步终端信息:信号、电量等等
-
```
# 请求主体
{
"signal": "信号强度",
"battery": "电池电量"
}
-# 消息流程:终端->服务端
+# 消息流程:终端->信令服务->终端
+```
+
+### 终端列表信令(client::list)
+
+```
+# 请求主体
+{
+}
+# 响应主体
+[
+ {
+ "sn": "终端标识",
+ "ip": "终端IP",
+ "signal": 信号强度(0~100),
+ "battery": 电池电量(0~100),
+ "charging": 是否充电(true|false),
+ "mediasoup": "媒体服务名称",
+ "lastHeartbeat": "最后心跳时间"
+ },
+ ...
+]
+# 消息流程:终端->信令服务->终端
+```
+
+### 终端下线信令(client::offline)
+
+```
+# 广播主体
+{
+ "sn": "下线终端标识"
+}
+# 消息流程:终端-[终端关闭]>信令服务-)终端
+```
+
+### 终端上线信令(client::online)
+
+```
+# 广播主体
+{
+ "sn": "终端标识",
+ "ip": "终端IP",
+ "signal": 信号强度(0~100),
+ "battery": 电池电量(0~100),
+ "charging": 是否充电(true|false),
+ "mediasoup": "媒体服务名称",
+ "lastHeartbeat": "最后心跳时间"
+}
+# 消息流程:终端-[终端注册]>信令服务-)终端
+```
+
+### 重启终端信令(client::reboot)
+
+```
+# 响应主体
+{
+}
+# 消息流程:信令服务->终端
+```
+
+### 终端注册信令(client::register)
+
+```
+# 请求主体
+{
+ "username": "信令用户",
+ "password": "信令密码",
+ "sn": "终端标识",
+ "ip": "终端IP",
+ "signal": 信号强度(0~100),
+ "battery": 电池电量(0~100),
+ "charging": 是否充电(true|false)
+}
+# 响应主体
+{
+}
+# 消息流程:终端->信令服务->终端
+# 消息流程:终端->信令服务-[终端上线])终端
+```
+
+### 终端状态信令(client::status)
+
+```
+# 请求主体
+{
+ "sn": "终端标识"
+}
+# 响应主体
+{
+ "sn": "终端标识",
+ "ip": "终端IP",
+ "signal": 信号强度(0~100),
+ "battery": 电池电量(0~100),
+ "charging": 是否充电(true|false),
+ "mediasoup": "媒体服务名称",
+ "lastHeartbeat": "最后心跳时间"
+}
+# 消息流程:终端->信令服务->终端
```
### 单播信令(client::unicast)
@@ -149,87 +197,32 @@
{
// 主体信息
}
-# 消息流程:终端->服务端->终端
+# 消息流程:终端->信令服务->终端
```
-终端转发信令到指定的终端
+## 媒体服务信令
-### 广播信令(client::broadcast)
+### 媒体服务列表信令(media::list)
```
-# 请求主体
-{
- // 主体信息
-}
-# 响应主体
-{
- // 主体信息
-}
-# 消息流程:终端->服务端-)终端
-```
-
-终端广播信令到所有的终端
-
-### 重启终端信令(client::reboot)
-
-```
-# 响应主体
+# 请求主体:
{
}
-# 消息流程:服务器->终端
-```
-
-重启终端
-
-### 终端状态信令(client::status)
-
-```
-# 请求主体
-{
- "sn": "终端标识"
-}
-# 响应主体
-{
- "sn": "终端标识",
- "ip": "IP地址",
- "mac": "MAC地址",
- "signal": "信号强度",
- "battery": "电池电量",
- "mediasoup": "媒体服务名称"
-}
-# 消息流程:终端->服务端->终端
-```
-
-响应指定终端状态(如果没有指定终端标识默认查询自己)
-
-### 终端列表信令(client::list)
-
-#### 消息主体
-
-```
-# 请求主体
-{
-}
-# 响应主体
+# 响应主体:
[
{
- "sn": "终端标识",
- "ip": "IP地址",
- "mac": "MAC地址",
- "signal": "信号强度",
- "battery": "电池电量",
- "mediasoup": "媒体服务名称"
- },
- ...
+ "name": "名称",
+ "enabled": "是否启用",
+ "host": "主机",
+ "port": "端口",
+ "schema": "协议",
+ "address": "完整地址"
+ }
]
-# 消息流程:终端->服务端->终端
+# 消息流程:终端->信令服务->终端
```
-响应所有终端状态列表
-
-## 媒体信令
-
-### 重启媒体信令(media::reboot)
+### 重启媒体服务信令(media::reboot)
```
# 请求主体:
@@ -241,7 +234,7 @@
# 消息流程:终端->信令服务+)终端
```
-### 媒体注册信令(media::register)
+### 媒体服务注册信令(media::register)
```
# 请求主体:
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/ClientSession.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/Client.java
similarity index 69%
rename from taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/ClientSession.java
rename to taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/Client.java
index a4b171f..6d48f22 100644
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/ClientSession.java
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/Client.java
@@ -10,17 +10,22 @@ import com.acgist.taoyao.signal.mediasoup.MediasoupClient;
*
* @param 会话类型
*/
-public interface ClientSession extends AutoCloseable {
+public interface Client extends AutoCloseable {
/**
* @return 终端标识
*/
String sn();
+ /**
+ * @return IP
+ */
+ String ip();
+
/**
* @return 终端状态
*/
- ClientSessionStatus status();
+ ClientStatus status();
/**
* 推送消息
@@ -28,6 +33,14 @@ public interface ClientSession extends AutoCloseable {
* @param message 消息
*/
void push(Message message);
+
+ /**
+ * 推送消息
+ *
+ * @param sn 终端标识
+ * @param message 消息
+ */
+ void push(String sn, Message message);
/**
* @param timeout 超时时间
@@ -36,6 +49,11 @@ public interface ClientSession extends AutoCloseable {
*/
boolean timeout(long timeout);
+ /**
+ * @return 终端实例
+ */
+ AutoCloseable instance();
+
/**
* 设置授权
*
@@ -48,27 +66,6 @@ public interface ClientSession extends AutoCloseable {
*/
boolean authorized();
- /**
- * @param sn 终端标识
- *
- * @return 终端标识是否匹配
- */
- boolean filterSn(String sn);
-
- /**
- * @param sn 终端标识
- *
- * @return 终端标识是否匹配失败
- */
- boolean filterNoneSn(String sn);
-
- /**
- * @param instance 会话实例
- *
- * @return 会话实例是否匹配
- */
- boolean matchInstance(M instance);
-
/**
* @return Mediasoup终端
*/
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/ClientSessionAdapter.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/ClientAdapter.java
similarity index 69%
rename from taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/ClientSessionAdapter.java
rename to taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/ClientAdapter.java
index e72f05e..4a2d295 100644
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/ClientSessionAdapter.java
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/ClientAdapter.java
@@ -1,7 +1,7 @@
package com.acgist.taoyao.signal.client;
-import org.apache.commons.lang3.StringUtils;
-
+import com.acgist.taoyao.boot.model.Header;
+import com.acgist.taoyao.boot.model.Message;
import com.acgist.taoyao.signal.mediasoup.MediasoupClient;
/**
@@ -9,12 +9,16 @@ import com.acgist.taoyao.signal.mediasoup.MediasoupClient;
*
* @author acgist
*/
-public abstract class ClientSessionAdapter implements ClientSession {
+public abstract class ClientAdapter implements Client {
/**
* 终端标识
*/
protected String sn;
+ /**
+ * IP
+ */
+ protected String ip;
/**
* 进入时间
*/
@@ -30,17 +34,17 @@ public abstract class ClientSessionAdapter implements C
/**
* 终端状态
*/
- protected ClientSessionStatus status;
+ protected ClientStatus status;
/**
- * Mediasoup终端
+ * 媒体服务终端
*/
protected MediasoupClient mediasoupClient;
- protected ClientSessionAdapter(T instance) {
+ protected ClientAdapter(T instance) {
this.time = System.currentTimeMillis();
this.instance = instance;
this.authorized = false;
- this.status = new ClientSessionStatus();
+ this.status = new ClientStatus();
}
@Override
@@ -49,15 +53,34 @@ public abstract class ClientSessionAdapter implements C
}
@Override
- public ClientSessionStatus status() {
+ public String ip() {
+ return this.ip;
+ }
+
+ @Override
+ public ClientStatus status() {
return this.status;
}
+ @Override
+ public void push(String sn, Message message) {
+ final Header header = message.getHeader();
+ if(header != null) {
+ header.setSn(sn);
+ }
+ this.push(message);
+ }
+
@Override
public boolean timeout(long timeout) {
return System.currentTimeMillis() - this.time > timeout;
}
+ @Override
+ public T instance() {
+ return this.instance;
+ }
+
@Override
public void authorize(String sn) {
this.sn = sn;
@@ -69,21 +92,6 @@ public abstract class ClientSessionAdapter implements C
return this.authorized;
}
- @Override
- public boolean filterSn(String sn) {
- return StringUtils.equals(sn, this.sn);
- }
-
- @Override
- public boolean filterNoneSn(String sn) {
- return !StringUtils.equals(sn, this.sn);
- }
-
- @Override
- public boolean matchInstance(I instance) {
- return instance == this.instance;
- }
-
@Override
public MediasoupClient mediasoupClient() {
return this.mediasoupClient;
@@ -92,6 +100,7 @@ public abstract class ClientSessionAdapter implements C
@Override
public void mediasoupClient(MediasoupClient mediasoupClient) {
this.mediasoupClient = mediasoupClient;
+ this.status.setMediasoup(mediasoupClient.name());
}
@Override
@@ -99,13 +108,6 @@ public abstract class ClientSessionAdapter implements C
this.instance.close();
}
- /**
- * @return 会话实例
- */
- public T instance() {
- return this.instance;
- }
-
@Override
public String toString() {
return this.getClass().getSimpleName() + " - " + this.sn;
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/ClientSessionManager.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/ClientManager.java
similarity index 58%
rename from taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/ClientSessionManager.java
rename to taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/ClientManager.java
index 2ba28c0..05d0b3d 100644
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/ClientSessionManager.java
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/ClientManager.java
@@ -22,40 +22,28 @@ import lombok.extern.slf4j.Slf4j;
*/
@Slf4j
@Manager
-public class ClientSessionManager {
+public class ClientManager {
- @Autowired
- private ApplicationContext context;
@Autowired
private TaoyaoProperties taoyaoProperties;
+ @Autowired
+ private ApplicationContext applicationContext;
/**
* 会话列表
*/
- private List sessions = new CopyOnWriteArrayList<>();
+ private List clients = new CopyOnWriteArrayList<>();
- @Scheduled(cron = "${taoyao.scheduled.session:0 * * * * ?}")
+ @Scheduled(cron = "${taoyao.scheduled.client:0 * * * * ?}")
public void scheduled() {
this.closeTimeout();
}
/**
- * @param session 会话
+ * @param client 终端
*/
- public void open(ClientSession session) {
- this.sessions.add(session);
- }
-
- /**
- * @param instance 会话实例
- *
- * @return 会话
- */
- public ClientSession session(AutoCloseable instance) {
- return this.sessions.stream()
- .filter(v -> v.matchInstance(instance))
- .findFirst()
- .orElse(null);
+ public void open(Client client) {
+ this.clients.add(client);
}
/**
@@ -65,12 +53,9 @@ public class ClientSessionManager {
* @param message 消息
*/
public void unicast(String to, Message message) {
- this.sessions().stream()
- .filter(v -> v.filterSn(to))
- .forEach(v -> {
- message.getHeader().setSn(v.sn());
- v.push(message);
- });
+ this.clients().stream()
+ .filter(v -> StringUtils.equals(to, v.sn()))
+ .forEach(v -> v.push(v.sn(), message));
}
/**
@@ -79,10 +64,7 @@ public class ClientSessionManager {
* @param message 消息
*/
public void broadcast(Message message) {
- this.sessions().forEach(v -> {
- message.getHeader().setSn(v.sn());
- v.push(message);
- });
+ this.clients().forEach(v -> v.push(v.sn(), message));
}
/**
@@ -92,12 +74,9 @@ public class ClientSessionManager {
* @param message 消息
*/
public void broadcast(String from, Message message) {
- this.sessions().stream().
- filter(v -> v.filterNoneSn(from))
- .forEach(v -> {
- message.getHeader().setSn(v.sn());
- v.push(message);
- });
+ this.clients().stream()
+ .filter(v -> !StringUtils.equals(from, v.sn()))
+ .forEach(v -> v.push(v.sn(), message));
}
/**
@@ -105,38 +84,50 @@ public class ClientSessionManager {
*
* @return 终端会话
*/
- public ClientSession session(String sn) {
- return this.sessions().stream()
+ public Client client(String sn) {
+ return this.clients().stream()
.filter(v -> StringUtils.equals(sn, v.sn()))
.findFirst()
.orElse(null);
}
+
+ /**
+ * @param instance 终端示例
+ *
+ * @return 终端
+ */
+ public Client client(AutoCloseable instance) {
+ return this.clients.stream()
+ .filter(v -> v.instance() == instance)
+ .findFirst()
+ .orElse(null);
+ }
/**
* @param sn 终端标识
*
* @return 终端状态
*/
- public ClientSessionStatus status(String sn) {
- final ClientSession session = this.session(sn);
- return session == null ? null : session.status();
+ public ClientStatus status(String sn) {
+ final Client client = this.client(sn);
+ return client == null ? null : client.status();
}
/**
* @return 所有终端会话
*/
- public List sessions() {
- return this.sessions.stream()
- .filter(ClientSession::authorized)
+ public List clients() {
+ return this.clients.stream()
+ .filter(Client::authorized)
.toList();
}
/**
* @return 所有终端状态
*/
- public List status() {
- return this.sessions().stream()
- .map(ClientSession::status)
+ public List status() {
+ return this.clients().stream()
+ .map(Client::status)
.toList();
}
@@ -146,22 +137,22 @@ public class ClientSessionManager {
* @param instance 会话实例
*/
public void close(AutoCloseable instance) {
- final ClientSession session = this.session(instance);
+ final Client client = this.client(instance);
// TODO:如果出现异常可以提前移除
try {
- if(session != null) {
- session.close();
+ if(client != null) {
+ client.close();
} else {
instance.close();
}
} catch (Exception e) {
log.error("关闭会话异常", e);
} finally {
- if(session != null) {
+ if(client != null) {
// 移除管理
- this.sessions.remove(session);
+ this.clients.remove(client);
// 关闭事件
- this.context.publishEvent(new ClientCloseEvent(null, session));
+ this.applicationContext.publishEvent(new ClientCloseEvent(client, null));
}
}
}
@@ -171,7 +162,7 @@ public class ClientSessionManager {
*/
private void closeTimeout() {
log.debug("定时关闭超时会话");
- this.sessions.stream()
+ this.clients.stream()
.filter(v -> !v.authorized())
.filter(v -> v.timeout(this.taoyaoProperties.getTimeout()))
.forEach(v -> {
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/ClientSessionStatus.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/ClientStatus.java
similarity index 65%
rename from taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/ClientSessionStatus.java
rename to taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/ClientStatus.java
index cd5225e..36fdd8e 100644
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/ClientSessionStatus.java
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/ClientStatus.java
@@ -16,48 +16,18 @@ import lombok.Setter;
@Getter
@Setter
@Schema(title = "终端状态", description = "终端状态")
-public class ClientSessionStatus {
+public class ClientStatus {
- /**
- * IP
- */
- public static final String IP = "ip";
- /**
- * MAC
- */
- public static final String MAC = "mac";
- /**
- * 信号强度(0~100)
- */
- public static final String SIGNAL = "signal";
- /**
- * 电池电量(0~100)
- */
- public static final String BATTERY = "battery";
- /**
- * 是否充电
- */
- public static final String CHARGING = "charging";
- /**
- * 媒体服务名称
- */
- public static final String MEDIASOUP = "mediasoup";
-
/**
* 终端标识
*/
@Schema(title = "终端标识", description = "终端标识")
private String sn;
/**
- * IP
+ * 终端IP
*/
- @Schema(title = "IP", description = "IP")
+ @Schema(title = "终端IP", description = "终端IP")
private String ip;
- /**
- * MAC
- */
- @Schema(title = "MAC", description = "MAC")
- private String mac;
/**
* 信号强度(0~100)
*/
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/socket/SocketClient.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/socket/SocketClient.java
new file mode 100644
index 0000000..5330f8a
--- /dev/null
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/socket/SocketClient.java
@@ -0,0 +1,51 @@
+package com.acgist.taoyao.signal.client.socket;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.net.Socket;
+
+import com.acgist.taoyao.boot.model.Message;
+import com.acgist.taoyao.signal.client.ClientAdapter;
+
+import lombok.Getter;
+import lombok.Setter;
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * Socket会话
+ *
+ * @author acgist
+ */
+@Slf4j
+@Getter
+@Setter
+public class SocketClient extends ClientAdapter {
+
+ /**
+ * 输出
+ */
+ private OutputStream outputStream;
+
+ public SocketClient(Socket instance) {
+ super(instance);
+ try {
+ this.outputStream = instance.getOutputStream();
+ } catch (IOException e) {
+ log.error("Socket终端输出异常:{}", instance, e);
+ }
+ }
+
+ @Override
+ public void push(Message message) {
+ try {
+ if(this.instance.isClosed()) {
+ log.error("会话已经关闭:{}", this.instance);
+ } else {
+ this.outputStream.write(message.toString().getBytes());
+ }
+ } catch (IOException e) {
+ log.error("Socket发送消息异常:{}", message, e);
+ }
+ }
+
+}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/socket/SocketSession.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/socket/SocketSession.java
deleted file mode 100644
index 5ade63f..0000000
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/socket/SocketSession.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package com.acgist.taoyao.signal.client.socket;
-
-import java.io.IOException;
-import java.net.Socket;
-
-import com.acgist.taoyao.boot.model.Message;
-import com.acgist.taoyao.signal.client.ClientSessionAdapter;
-
-import lombok.Getter;
-import lombok.Setter;
-import lombok.extern.slf4j.Slf4j;
-
-/**
- * Socket会话
- *
- * @author acgist
- */
-@Slf4j
-@Getter
-@Setter
-public class SocketSession extends ClientSessionAdapter {
-
- public SocketSession(Socket instance) {
- super(instance);
- }
-
- @Override
- public void push(Message message) {
- try {
- this.instance.getOutputStream().write(message.toString().getBytes());
- } catch (IOException e) {
- log.error("Socket发送消息异常:{}", message, e);
- }
- }
-
-}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/websocket/WebSocketSession.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/websocket/WebSocketClient.java
similarity index 57%
rename from taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/websocket/WebSocketSession.java
rename to taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/websocket/WebSocketClient.java
index e5249f7..0706bd3 100644
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/websocket/WebSocketSession.java
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/websocket/WebSocketClient.java
@@ -1,8 +1,10 @@
package com.acgist.taoyao.signal.client.websocket;
import com.acgist.taoyao.boot.model.Message;
-import com.acgist.taoyao.signal.client.ClientSessionAdapter;
+import com.acgist.taoyao.boot.utils.WebSocketUtils;
+import com.acgist.taoyao.signal.client.ClientAdapter;
+import jakarta.websocket.RemoteEndpoint;
import jakarta.websocket.Session;
import lombok.Getter;
import lombok.Setter;
@@ -16,10 +18,17 @@ import lombok.extern.slf4j.Slf4j;
@Slf4j
@Getter
@Setter
-public class WebSocketSession extends ClientSessionAdapter {
+public class WebSocketClient extends ClientAdapter {
- public WebSocketSession(Session instance) {
+ /**
+ * 输出
+ */
+ private RemoteEndpoint.Basic basic;
+
+ public WebSocketClient(Session instance) {
super(instance);
+ this.ip = WebSocketUtils.getRemoteAddress(instance);
+ this.basic = instance.getBasicRemote();
}
@Override
@@ -27,7 +36,7 @@ public class WebSocketSession extends ClientSessionAdapter {
synchronized (this.instance) {
try {
if(this.instance.isOpen()) {
- this.instance.getBasicRemote().sendText(message.toString());
+ this.basic.sendText(message.toString());
} else {
log.error("会话已经关闭:{}", this.instance);
}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/websocket/WebSocketSignal.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/websocket/WebSocketSignal.java
index 1a526c0..b79f579 100644
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/websocket/WebSocketSignal.java
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/websocket/WebSocketSignal.java
@@ -4,7 +4,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import com.acgist.taoyao.boot.model.Message;
import com.acgist.taoyao.boot.model.MessageCodeException;
-import com.acgist.taoyao.signal.client.ClientSessionManager;
+import com.acgist.taoyao.signal.client.ClientManager;
import com.acgist.taoyao.signal.protocol.ProtocolManager;
import com.acgist.taoyao.signal.protocol.platform.PlatformErrorProtocol;
@@ -25,14 +25,14 @@ import lombok.extern.slf4j.Slf4j;
@ServerEndpoint(value = "/websocket.signal")
public class WebSocketSignal {
+ private static ClientManager clientManager;
private static ProtocolManager protocolManager;
- private static ClientSessionManager clientSessionManager;
private static PlatformErrorProtocol platformErrorProtocol;
@OnOpen
public void open(Session session) {
log.debug("会话连接:{}", session);
- WebSocketSignal.clientSessionManager.open(new WebSocketSession(session));
+ WebSocketSignal.clientManager.open(new WebSocketClient(session));
}
@OnMessage
@@ -54,7 +54,7 @@ public class WebSocketSignal {
@OnClose
public void close(Session session) {
log.debug("会话关闭:{}", session);
- WebSocketSignal.clientSessionManager.close(session);
+ WebSocketSignal.clientManager.close(session);
}
@OnError
@@ -82,17 +82,17 @@ public class WebSocketSignal {
}
}
}
+
+ @Autowired
+ public void setClientManager(ClientManager clientManager) {
+ WebSocketSignal.clientManager = clientManager;
+ }
@Autowired
public void setProtocolManager(ProtocolManager protocolManager) {
WebSocketSignal.protocolManager = protocolManager;
}
- @Autowired
- public void setClientSessionManager(ClientSessionManager clientSessionManager) {
- WebSocketSignal.clientSessionManager = clientSessionManager;
- }
-
@Autowired
public void setPlatformErrorProtocol(PlatformErrorProtocol platformErrorProtocol) {
WebSocketSignal.platformErrorProtocol = platformErrorProtocol;
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/config/SignalAutoConfiguration.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/config/SignalAutoConfiguration.java
index b5ce4c8..2131a6f 100644
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/config/SignalAutoConfiguration.java
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/config/SignalAutoConfiguration.java
@@ -1,5 +1,7 @@
package com.acgist.taoyao.signal.config;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
@@ -8,6 +10,7 @@ import org.springframework.web.socket.config.annotation.EnableWebSocket;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;
import com.acgist.taoyao.signal.client.websocket.WebSocketSignal;
+import com.acgist.taoyao.signal.mediasoup.MediasoupClientManager;
import com.acgist.taoyao.signal.protocol.media.MediaRebootProtocol;
import com.acgist.taoyao.signal.protocol.media.MediaShutdownProtocol;
import com.acgist.taoyao.signal.protocol.platform.PlatformRebootProtocol;
@@ -27,6 +30,9 @@ import com.acgist.taoyao.signal.service.impl.SecurityServiceImpl;
@EnableWebSocket
public class SignalAutoConfiguration {
+ @Autowired
+ private MediasoupClientManager mediasoupClientManager;
+
@Bean
@ConditionalOnMissingBean
public WebSocketSignal webSocketSignal() {
@@ -45,6 +51,16 @@ public class SignalAutoConfiguration {
return new SecurityServiceImpl();
}
+ @Bean
+ public CommandLineRunner mediasoupCommandLineRunner() {
+ return new CommandLineRunner() {
+ @Override
+ public void run(String ... args) throws Exception {
+ SignalAutoConfiguration.this.mediasoupClientManager.init();
+ }
+ };
+ }
+
@Bean
@ConditionalOnProperty(prefix = "taoyao.script", name = "enabled", havingValue = "true", matchIfMissing = true)
@ConditionalOnMissingBean
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/controller/ClientController.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/controller/ClientController.java
index 523f41a..e782e93 100644
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/controller/ClientController.java
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/controller/ClientController.java
@@ -7,7 +7,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.acgist.taoyao.boot.model.Message;
-import com.acgist.taoyao.signal.client.ClientSessionManager;
+import com.acgist.taoyao.signal.client.ClientManager;
import com.acgist.taoyao.signal.protocol.client.ClientRebootProtocol;
import io.swagger.v3.oas.annotations.Operation;
@@ -24,26 +24,26 @@ import io.swagger.v3.oas.annotations.tags.Tag;
public class ClientController {
@Autowired
- private ClientSessionManager clientSessionManager;
+ private ClientManager clientManager;
@Autowired
private ClientRebootProtocol clientRebootProtocol;
@Operation(summary = "终端列表", description = "终端列表")
@GetMapping("/list")
public Message list() {
- return Message.success(this.clientSessionManager.status());
+ return Message.success(this.clientManager.status());
}
@Operation(summary = "终端状态", description = "终端状态")
@GetMapping("/status/{sn}")
public Message status(@PathVariable String sn) {
- return Message.success(this.clientSessionManager.status(sn));
+ return Message.success(this.clientManager.status(sn));
}
@Operation(summary = "重启终端", description = "重启终端")
@GetMapping("/reboot/{sn}")
public Message reboot(@PathVariable String sn) {
- this.clientSessionManager.unicast(sn, this.clientRebootProtocol.build());
+ this.clientManager.unicast(sn, this.clientRebootProtocol.build());
return Message.success();
}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/controller/RoomController.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/controller/RoomController.java
index 7dfdce7..edffbde 100644
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/controller/RoomController.java
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/controller/RoomController.java
@@ -1,5 +1,7 @@
package com.acgist.taoyao.signal.controller;
+import java.util.List;
+
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
@@ -33,19 +35,20 @@ public class RoomController {
@GetMapping("/list")
@ApiResponse(content = @Content(schema = @Schema(implementation = Room.class)))
public Message list() {
- return Message.success(this.roomManager.roomList());
+ return Message.success(this.roomManager.status());
}
@Operation(summary = "房间状态", description = "房间状态")
@GetMapping("/status/{id}")
- public Message status(@PathVariable String id) {
- return Message.success(this.roomManager.room(id));
+ public Message status(@PathVariable Long id) {
+ return Message.success(this.roomManager.status(id));
}
@Operation(summary = "房间终端列表", description = "房间终端列表")
@GetMapping("/list/client/{id}")
- public Message listClient(@PathVariable String id) {
- return Message.success(this.roomManager.snList(id));
+ public Message listClient(@PathVariable Long id) {
+ final Room room = this.roomManager.room(id);
+ return Message.success(room == null ? List.of() : room.clientStatus());
}
}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/event/ApplicationEventAdapter.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/event/ApplicationEventAdapter.java
index 111749f..be6cf52 100644
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/event/ApplicationEventAdapter.java
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/event/ApplicationEventAdapter.java
@@ -7,7 +7,7 @@ import java.util.Objects;
import org.springframework.context.ApplicationEvent;
import com.acgist.taoyao.boot.model.Message;
-import com.acgist.taoyao.signal.client.ClientSession;
+import com.acgist.taoyao.signal.client.Client;
import lombok.Getter;
import lombok.Setter;
@@ -31,25 +31,25 @@ public abstract class ApplicationEventAdapter extends ApplicationEvent {
* 主体
*/
private final Map, ?> body;
+ /**
+ * 终端
+ */
+ private final Client client;
/**
* 消息
*/
private final Message message;
- /**
- * 会话
- */
- private final ClientSession session;
- public ApplicationEventAdapter(Message message, ClientSession session) {
- this(null, message, session);
+ public ApplicationEventAdapter(Client client, Message message) {
+ this(null, client, message);
}
- public ApplicationEventAdapter(Map, ?> body, Message message, ClientSession session) {
- super(session);
- this.sn = session.sn();
+ public ApplicationEventAdapter(Map, ?> body, Client client, Message message) {
+ super(client);
+ this.sn = client.sn();
this.body = body;
+ this.client = client;
this.message = message;
- this.session = session;
}
/**
@@ -83,6 +83,24 @@ public abstract class ApplicationEventAdapter extends ApplicationEvent {
final T t = (T) this.body.get(key);
return t == null ? defaultValue : t;
}
+
+ /**
+ * @param key 参数名称
+ *
+ * @return 值
+ */
+ public Long getLong(String key) {
+ if(this.body == null) {
+ return null;
+ }
+ final Object object = this.body.get(key);
+ if(object == null) {
+ return null;
+ } else if(object instanceof Long value) {
+ return value;
+ }
+ return Long.valueOf(object.toString());
+ }
/**
* @return 新的主体
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/event/client/ClientCloseEvent.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/event/client/ClientCloseEvent.java
index 6bb8f3e..081740a 100644
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/event/client/ClientCloseEvent.java
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/event/client/ClientCloseEvent.java
@@ -1,7 +1,7 @@
package com.acgist.taoyao.signal.event.client;
import com.acgist.taoyao.boot.model.Message;
-import com.acgist.taoyao.signal.client.ClientSession;
+import com.acgist.taoyao.signal.client.Client;
import com.acgist.taoyao.signal.event.ApplicationEventAdapter;
import lombok.Getter;
@@ -18,8 +18,8 @@ public class ClientCloseEvent extends ApplicationEventAdapter {
private static final long serialVersionUID = 1L;
- public ClientCloseEvent(Message message, ClientSession session) {
- super(message, session);
+ public ClientCloseEvent(Client client, Message message) {
+ super(client, message);
}
}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/event/client/ClientRegisterEvent.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/event/client/ClientRegisterEvent.java
index 55d56a2..485b766 100644
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/event/client/ClientRegisterEvent.java
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/event/client/ClientRegisterEvent.java
@@ -3,9 +3,9 @@ package com.acgist.taoyao.signal.event.client;
import java.util.Map;
import com.acgist.taoyao.boot.model.Message;
-import com.acgist.taoyao.signal.client.ClientSession;
-import com.acgist.taoyao.signal.client.ClientSessionStatus;
+import com.acgist.taoyao.signal.client.Client;
import com.acgist.taoyao.signal.event.ApplicationEventAdapter;
+import com.acgist.taoyao.signal.protocol.Constant;
import lombok.Getter;
import lombok.Setter;
@@ -21,50 +21,36 @@ public class ClientRegisterEvent extends ApplicationEventAdapter {
private static final long serialVersionUID = 1L;
- public ClientRegisterEvent(Map, ?> body, Message message, ClientSession session) {
- super(body, message, session);
+ public ClientRegisterEvent(Map, ?> body, Client client, Message message) {
+ super(body, client, message);
}
/**
- * @return {@link ClientSessionStatus#IP}
+ * @return {@link Constant#IP}
*/
public String getIp() {
- return this.get(ClientSessionStatus.IP);
+ return this.get(Constant.IP);
}
/**
- * @return {@link ClientSessionStatus#MAC}
- */
- public String getMac() {
- return this.get(ClientSessionStatus.MAC);
- }
-
- /**
- * @return {@link ClientSessionStatus#SIGNAL}
+ * @return {@link Constant#SIGNAL}
*/
public Integer getSignal() {
- return this.get(ClientSessionStatus.SIGNAL);
+ return this.get(Constant.SIGNAL);
}
/**
- * @return {@link ClientSessionStatus#BATTERY}
+ * @return {@link Constant#BATTERY}
*/
public Integer getBattery() {
- return this.get(ClientSessionStatus.BATTERY);
+ return this.get(Constant.BATTERY);
}
/**
- * @return {@link ClientSessionStatus#CHARGING}
+ * @return {@link Constant#CHARGING}
*/
public Boolean getCharging() {
- return this.get(ClientSessionStatus.CHARGING);
- }
-
- /**
- * @return {@link ClientSessionStatus#MEDIASOUP}
- */
- public String getMediasoup() {
- return this.get(ClientSessionStatus.MEDIASOUP);
+ return this.get(Constant.CHARGING);
}
}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/event/platform/PlatformScriptEvent.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/event/platform/PlatformScriptEvent.java
index 123c2c7..e554302 100644
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/event/platform/PlatformScriptEvent.java
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/event/platform/PlatformScriptEvent.java
@@ -3,8 +3,9 @@ package com.acgist.taoyao.signal.event.platform;
import java.util.Map;
import com.acgist.taoyao.boot.model.Message;
-import com.acgist.taoyao.signal.client.ClientSession;
+import com.acgist.taoyao.signal.client.Client;
import com.acgist.taoyao.signal.event.ApplicationEventAdapter;
+import com.acgist.taoyao.signal.protocol.Constant;
import lombok.Getter;
import lombok.Setter;
@@ -20,28 +21,19 @@ public class PlatformScriptEvent extends ApplicationEventAdapter {
private static final long serialVersionUID = 1L;
- /**
- * 脚本
- */
- public static final String SCRIPT = "script";
- /**
- * 结果
- */
- public static final String RESULT = "result";
-
- public PlatformScriptEvent(String script, Message message, ClientSession session) {
- this(Map.of(SCRIPT, script), message, session);
+ public PlatformScriptEvent(String script, Client client, Message message) {
+ this(Map.of(Constant.SCRIPT, script), client, message);
}
- public PlatformScriptEvent(Map, ?> body, Message message, ClientSession session) {
- super(body, message, session);
+ public PlatformScriptEvent(Map, ?> body, Client client, Message message) {
+ super(body, client, message);
}
/**
- * @return {@link #SCRIPT}
+ * @return {@link Constant#SCRIPT}
*/
public String getScript() {
- return this.get(SCRIPT);
+ return this.get(Constant.SCRIPT);
}
}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/event/platform/PlatformShutdownEvent.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/event/platform/PlatformShutdownEvent.java
index ccfb0db..2bf6021 100644
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/event/platform/PlatformShutdownEvent.java
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/event/platform/PlatformShutdownEvent.java
@@ -1,7 +1,7 @@
package com.acgist.taoyao.signal.event.platform;
import com.acgist.taoyao.boot.model.Message;
-import com.acgist.taoyao.signal.client.ClientSession;
+import com.acgist.taoyao.signal.client.Client;
import com.acgist.taoyao.signal.event.ApplicationEventAdapter;
import lombok.Getter;
@@ -18,8 +18,8 @@ public class PlatformShutdownEvent extends ApplicationEventAdapter {
private static final long serialVersionUID = 1L;
- public PlatformShutdownEvent(Message message, ClientSession session) {
- super(message, session);
+ public PlatformShutdownEvent(Client client, Message message) {
+ super(client, message);
}
}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/event/room/RoomCreateEvent.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/event/room/RoomCreateEvent.java
index 5573feb..a64b4de 100644
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/event/room/RoomCreateEvent.java
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/event/room/RoomCreateEvent.java
@@ -3,8 +3,9 @@ package com.acgist.taoyao.signal.event.room;
import java.util.Map;
import com.acgist.taoyao.boot.model.Message;
-import com.acgist.taoyao.signal.client.ClientSession;
+import com.acgist.taoyao.signal.client.Client;
import com.acgist.taoyao.signal.event.ApplicationEventAdapter;
+import com.acgist.taoyao.signal.protocol.Constant;
import lombok.Getter;
import lombok.Setter;
@@ -20,8 +21,36 @@ public class RoomCreateEvent extends ApplicationEventAdapter {
private static final long serialVersionUID = 1L;
- public RoomCreateEvent(Map, ?> body, Message message, ClientSession session) {
- super(body, message, session);
+ public RoomCreateEvent(Map, ?> body, Client client, Message message) {
+ super(body, client, message);
+ }
+
+ /**
+ * @return {@link Constant#ID}
+ */
+ public Long getId() {
+ return this.getLong(Constant.ID);
+ }
+
+ /**
+ * @return {@link Constant#NAME}
+ */
+ public String getName() {
+ return this.get(Constant.NAME);
+ }
+
+ /**
+ * @return {@link Constant#PASSWORD}
+ */
+ public String getPassword() {
+ return this.get(Constant.PASSWORD);
+ }
+
+ /**
+ * @return {@link Constant#MEDIASOUP}
+ */
+ public String getMediasoup() {
+ return this.get(Constant.MEDIASOUP);
}
}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/event/room/RoomEnterEvent.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/event/room/RoomEnterEvent.java
index 2dd7b3f..60cb5d8 100644
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/event/room/RoomEnterEvent.java
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/event/room/RoomEnterEvent.java
@@ -3,8 +3,9 @@ package com.acgist.taoyao.signal.event.room;
import java.util.Map;
import com.acgist.taoyao.boot.model.Message;
-import com.acgist.taoyao.signal.client.ClientSession;
+import com.acgist.taoyao.signal.client.Client;
import com.acgist.taoyao.signal.event.ApplicationEventAdapter;
+import com.acgist.taoyao.signal.protocol.Constant;
import lombok.Getter;
import lombok.Setter;
@@ -20,8 +21,22 @@ public class RoomEnterEvent extends ApplicationEventAdapter {
private static final long serialVersionUID = 1L;
- public RoomEnterEvent(Map, ?> body, Message message, ClientSession session) {
- super(body, message, session);
+ public RoomEnterEvent(Map, ?> body, Client client, Message message) {
+ super(body, client, message);
+ }
+
+ /**
+ * @return {@link Constant#ID}
+ */
+ public Long getId() {
+ return this.getLong(Constant.ID);
+ }
+
+ /**
+ * @return {@link Constant#PASSWORD}
+ */
+ public String getPassword() {
+ return this.get(Constant.PASSWORD);
}
}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/listener/ApplicationListenerAdapter.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/listener/ApplicationListenerAdapter.java
index 6537c64..f78a9c0 100644
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/listener/ApplicationListenerAdapter.java
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/listener/ApplicationListenerAdapter.java
@@ -1,10 +1,13 @@
package com.acgist.taoyao.signal.listener;
import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationListener;
-import com.acgist.taoyao.signal.client.ClientSessionManager;
+import com.acgist.taoyao.signal.client.ClientManager;
import com.acgist.taoyao.signal.event.ApplicationEventAdapter;
+import com.acgist.taoyao.signal.mediasoup.MediasoupClientManager;
+import com.acgist.taoyao.signal.room.RoomManager;
/**
* 事件监听适配器
@@ -16,6 +19,12 @@ import com.acgist.taoyao.signal.event.ApplicationEventAdapter;
public abstract class ApplicationListenerAdapter implements ApplicationListener {
@Autowired
- protected ClientSessionManager clientSessionManager;
+ protected RoomManager roomManager;
+ @Autowired
+ protected ClientManager clientManager;
+ @Autowired
+ protected ApplicationContext applicationContext;
+ @Autowired
+ protected MediasoupClientManager mediasoupClientManager;
}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/listener/MediaListenerAdapter.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/listener/MediaListenerAdapter.java
deleted file mode 100644
index 9307f3b..0000000
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/listener/MediaListenerAdapter.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package com.acgist.taoyao.signal.listener;
-
-import com.acgist.taoyao.signal.event.ApplicationEventAdapter;
-
-/**
- * 媒体事件监听适配器
- *
- * @param 事件泛型
- *
- * @author acgist
- */
-public abstract class MediaListenerAdapter extends ApplicationListenerAdapter {
-
-}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/listener/RoomListenerAdapter.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/listener/RoomListenerAdapter.java
deleted file mode 100644
index deddcc6..0000000
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/listener/RoomListenerAdapter.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package com.acgist.taoyao.signal.listener;
-
-import org.springframework.beans.factory.annotation.Autowired;
-
-import com.acgist.taoyao.signal.event.ApplicationEventAdapter;
-import com.acgist.taoyao.signal.room.RoomManager;
-
-/**
- * 房间事件监听适配器
- *
- * @param 事件泛型
- *
- * @author acgist
- */
-public abstract class RoomListenerAdapter extends ApplicationListenerAdapter {
-
- @Autowired
- protected RoomManager roomManager;
-
-}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/listener/client/ClientCloseListener.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/listener/client/ClientCloseListener.java
index 46cd2e5..5fabe5f 100644
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/listener/client/ClientCloseListener.java
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/listener/client/ClientCloseListener.java
@@ -3,12 +3,14 @@ package com.acgist.taoyao.signal.listener.client;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Async;
import com.acgist.taoyao.boot.annotation.EventListener;
import com.acgist.taoyao.boot.model.Message;
-import com.acgist.taoyao.signal.client.ClientSession;
+import com.acgist.taoyao.signal.client.Client;
import com.acgist.taoyao.signal.event.client.ClientCloseEvent;
import com.acgist.taoyao.signal.listener.ApplicationListenerAdapter;
+import com.acgist.taoyao.signal.protocol.Constant;
import com.acgist.taoyao.signal.protocol.client.ClientOfflineProtocol;
import lombok.extern.slf4j.Slf4j;
@@ -25,20 +27,23 @@ public class ClientCloseListener extends ApplicationListenerAdapter {
@@ -30,37 +24,26 @@ public class ClientRegisterListener extends ApplicationListenerAdapter {
- @Autowired
- private ApplicationContext context;
@Autowired
private ScriptProperties scriptProperties;
+ @Autowired
+ private ApplicationContext applicationContext;
@Override
public void onApplicationEvent(PlatformShutdownEvent event) {
- if(this.context instanceof ConfigurableApplicationContext context) {
+ if(this.applicationContext instanceof ConfigurableApplicationContext context) {
// API关闭
if(context.isActive()) {
// 如果需要完整广播可以设置延时
@@ -34,10 +34,10 @@ public class PlatformShutdownListener extends ApplicationListenerAdapter {
+public class RoomCreateListener extends ApplicationListenerAdapter {
@Override
public void onApplicationEvent(RoomCreateEvent event) {
- final Room room = this.roomManager.create(event.getSn());
+ final Long id = event.getId();
+ if(id != null && this.roomManager.room(id) != null) {
+ // 房间已经存在
+ return;
+ }
+ final Room room = this.roomManager.create(
+ event.getSn(),
+ event.getName(),
+ event.getPassword(),
+ event.getMediasoup()
+ );
+ // 进入房间
+ room.enter(event.getClient());
final Message message = event.getMessage();
- message.setBody(Map.of("id", room.getId()));
- this.clientSessionManager.broadcast(message);
+ message.setBody(room.getStatus());
+ this.clientManager.broadcast(message);
}
}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/listener/room/RoomEnterListener.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/listener/room/RoomEnterListener.java
index a502f46..ccc32b8 100644
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/listener/room/RoomEnterListener.java
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/listener/room/RoomEnterListener.java
@@ -6,8 +6,11 @@ import com.acgist.taoyao.boot.annotation.EventListener;
import com.acgist.taoyao.boot.model.Message;
import com.acgist.taoyao.boot.model.MessageCode;
import com.acgist.taoyao.boot.model.MessageCodeException;
+import com.acgist.taoyao.signal.client.Client;
import com.acgist.taoyao.signal.event.room.RoomEnterEvent;
-import com.acgist.taoyao.signal.listener.RoomListenerAdapter;
+import com.acgist.taoyao.signal.listener.ApplicationListenerAdapter;
+import com.acgist.taoyao.signal.mediasoup.MediasoupClient;
+import com.acgist.taoyao.signal.protocol.Constant;
import com.acgist.taoyao.signal.room.Room;
/**
@@ -16,26 +19,39 @@ import com.acgist.taoyao.signal.room.Room;
* @author acgist
*/
@EventListener
-public class RoomEnterListener extends RoomListenerAdapter {
+public class RoomEnterListener extends ApplicationListenerAdapter {
@Override
public void onApplicationEvent(RoomEnterEvent event) {
+ final Long id = event.getId();
final String sn = event.getSn();
- final String id = event.get("id");
+ final String password = event.getPassword();
final Room room = this.roomManager.room(id);
if(room == null) {
throw MessageCodeException.of(MessageCode.CODE_3400, "无效房间");
}
- room.addSn(sn);
+ final String roomPassowrd = room.getPassword();
+ if(roomPassowrd != null && !roomPassowrd.equals(password)) {
+ throw MessageCodeException.of(MessageCode.CODE_3401, "密码错误");
+ }
+ final Client client = event.getClient();
+ final MediasoupClient mediasoupClient = room.getMediasoupClient();
+ if(client.mediasoupClient() == null) {
+ client.mediasoupClient(mediasoupClient);
+ } else if(client.mediasoupClient() == mediasoupClient) {
+ } else {
+ throw MessageCodeException.of("不在相同媒体服务:" + mediasoupClient.name());
+ }
+ // 进入房间
+ room.enter(client);
+ // 发送通知
final Message message = event.getMessage();
message.setBody(Map.of(
- "id", room.getId(),
- "sn", sn
+ Constant.ID, room.getId(),
+ Constant.SN, sn
));
- // TODO:返回房间列表
- room.getSnList().stream()
- .filter(v -> !sn.equals(v))
- .forEach(v -> this.clientSessionManager.unicast(v, message));
+ room.broadcast(client, message);
+ // TODO:推送流媒体列表
}
}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/mediasoup/MediasoupClient.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/mediasoup/MediasoupClient.java
index 231c2aa..54970c4 100644
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/mediasoup/MediasoupClient.java
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/mediasoup/MediasoupClient.java
@@ -29,6 +29,7 @@ import org.springframework.scheduling.TaskScheduler;
import com.acgist.taoyao.boot.annotation.Client;
import com.acgist.taoyao.boot.model.Header;
import com.acgist.taoyao.boot.model.Message;
+import com.acgist.taoyao.boot.model.MessageCode;
import com.acgist.taoyao.boot.property.MediasoupProperties;
import com.acgist.taoyao.boot.property.TaoyaoProperties;
import com.acgist.taoyao.boot.utils.JSONUtils;
@@ -36,11 +37,12 @@ import com.acgist.taoyao.signal.protocol.Protocol;
import com.acgist.taoyao.signal.protocol.ProtocolManager;
import com.acgist.taoyao.signal.protocol.ProtocolMediaAdapter;
import com.acgist.taoyao.signal.protocol.media.MediaRegisterProtocol;
+import com.acgist.taoyao.signal.protocol.platform.PlatformErrorProtocol;
import lombok.extern.slf4j.Slf4j;
/**
- * 媒体终端
+ * 媒体服务终端
*
* @author acgist
*/
@@ -50,37 +52,39 @@ import lombok.extern.slf4j.Slf4j;
public class MediasoupClient {
@Autowired
- private TaskScheduler taskSchedulerl;
+ private TaskScheduler taskScheduler;
@Autowired
private ProtocolManager protocolManager;
@Autowired
private TaoyaoProperties taoyaoProperties;
@Autowired
- private MediaRegisterProtocol authorizeProtocol;
+ private MediaRegisterProtocol mediaRegisterProtocol;
+ @Autowired
+ private PlatformErrorProtocol platformErrorProtocol;
/**
- * 媒体终端名称
+ * 名称
*/
private String name;
/**
- * 当前重试周期
+ * 重试周期
*/
private long duration;
/**
- * 媒体终端WebSocket通道
+ * 通道
*/
private WebSocket webSocket;
/**
- * 媒体终端配置
+ * 配置
*/
private MediasoupProperties mediasoupProperties;
/**
* 同步消息
*/
- private Map syncMessage = new ConcurrentHashMap<>();
+ private final Map syncMessage = new ConcurrentHashMap<>();
/**
- * 初始化客户端
+ * 加载终端
*
* @param mediasoupProperties 媒体终端配置
*/
@@ -92,18 +96,18 @@ public class MediasoupClient {
}
/**
- * @return Mediasoup名称
+ * @return 名称
*/
public String name() {
return this.name;
}
/**
- * 连接Mediasoup WebSocket通道
+ * 连接WebSocket通道
*/
public void buildClient() {
final URI uri = URI.create(this.mediasoupProperties.getAddress());
- log.info("开始连接Mediasoup:{}", uri);
+ log.info("连接媒体服务:{}", uri);
try {
HttpClient
.newBuilder()
@@ -114,10 +118,10 @@ public class MediasoupClient {
.buildAsync(uri, new MessageListener())
.get();
} catch (InterruptedException | ExecutionException e) {
- log.error("连接Mediasoup异常:{}", uri, e);
- this.taskSchedulerl.schedule(
+ log.error("连接媒体服务异常:{}", uri, e);
+ this.taskScheduler.schedule(
this::buildClient,
- Instant.now().plusSeconds(this.retryDuration())
+ Instant.now().plusMillis(this.retryDuration())
);
}
}
@@ -135,7 +139,7 @@ public class MediasoupClient {
}
/**
- * 同步发送消息
+ * 请求消息
*
* @param message 消息
*
@@ -145,21 +149,25 @@ public class MediasoupClient {
final String id = message.getHeader().getId();
this.syncMessage.put(id, message);
synchronized (message) {
+ this.send(message);
try {
message.wait(this.taoyaoProperties.getTimeout());
} catch (InterruptedException e) {
- log.error("等待同步消息异常:{}", message, e);
+ log.error("等待媒体服务响应异常:{}", message, e);
}
}
final Message response = this.syncMessage.remove(id);
if(response == null || message.equals(response)) {
- log.warn("消息没有响应:{}", message);
+ log.warn("媒体服务没有响应:{}", message);
+ return this.platformErrorProtocol.build(id, MessageCode.CODE_2001, "媒体服务没有响应", response);
}
return response;
}
/**
* 打开通道
+ *
+ * @param webSocket 通道
*/
private void open(WebSocket webSocket) {
// 关闭旧的通道
@@ -171,7 +179,7 @@ public class MediasoupClient {
// 设置新的通道
this.webSocket = webSocket;
// 发送授权消息
- this.send(this.authorizeProtocol.build(this.mediasoupProperties));
+ this.send(this.mediaRegisterProtocol.build(this.mediasoupProperties));
}
/**
@@ -190,8 +198,18 @@ public class MediasoupClient {
if(StringUtils.isNotEmpty(data)) {
final Message message = JSONUtils.toJava(data, Message.class);
final Header header = message.getHeader();
+ if(header == null) {
+ log.warn("消息格式错误(没有头部):{}", message);
+ return;
+ }
+ final String v = header.getV();
final String id = header.getId();
+ final String sn = header.getSn();
final String signal = header.getSignal();
+ if(v == null || id == null || sn == null || signal == null) {
+ log.warn("消息格式错误(缺失头部关键参数):{}", message);
+ return;
+ }
final Message request = this.syncMessage.get(id);
// 存在同步响应
if(request != null) {
@@ -206,7 +224,7 @@ public class MediasoupClient {
if(protocol instanceof ProtocolMediaAdapter mediasoupProtocol) {
mediasoupProtocol.execute(message, this.webSocket);
} else {
- log.warn("未知Mediasoup信令:{}", data);
+ log.warn("未知媒体服务信令:{}", data);
}
}
}
@@ -221,59 +239,63 @@ public class MediasoupClient {
@Override
public void onOpen(WebSocket webSocket) {
- log.info("Mediasoup通道打开:{}", webSocket);
+ log.info("媒体服务通道打开:{}", webSocket);
Listener.super.onOpen(webSocket);
MediasoupClient.this.open(webSocket);
}
@Override
public CompletionStage> onBinary(WebSocket webSocket, ByteBuffer data, boolean last) {
- log.debug("Mediasoup收到消息(binary):{}", webSocket);
+ log.debug("媒体服务收到消息(binary):{}", webSocket);
return Listener.super.onBinary(webSocket, data, last);
}
@Override
public CompletionStage> onText(WebSocket webSocket, CharSequence data, boolean last) {
- log.debug("Mediasoup收到消息(text):{}-{}", webSocket, data);
- MediasoupClient.this.execute(data.toString());
+ log.debug("媒体服务收到消息(text):{}-{}", webSocket, data);
+ try {
+ MediasoupClient.this.execute(data.toString());
+ } catch (Exception e) {
+ log.error("媒体服务处理异常:{}", data, e);
+ }
return Listener.super.onText(webSocket, data, last);
}
@Override
public CompletionStage> onClose(WebSocket webSocket, int statusCode, String reason) {
- log.warn("Mediasoup通道关闭:{}-{}-{}", webSocket, statusCode, reason);
+ log.warn("媒体服务通道关闭:{}-{}-{}", webSocket, statusCode, reason);
try {
return Listener.super.onClose(webSocket, statusCode, reason);
} finally {
- MediasoupClient.this.taskSchedulerl.schedule(
+ MediasoupClient.this.taskScheduler.schedule(
MediasoupClient.this::buildClient,
- Instant.now().plusSeconds(MediasoupClient.this.retryDuration())
+ Instant.now().plusMillis(MediasoupClient.this.retryDuration())
);
}
}
@Override
public void onError(WebSocket webSocket, Throwable error) {
- log.error("Mediasoup通道异常:{}", webSocket, error);
+ log.error("媒体服务通道异常:{}", webSocket, error);
try {
Listener.super.onError(webSocket, error);
} finally {
- MediasoupClient.this.taskSchedulerl.schedule(
+ MediasoupClient.this.taskScheduler.schedule(
MediasoupClient.this::buildClient,
- Instant.now().plusSeconds(MediasoupClient.this.retryDuration())
+ Instant.now().plusMillis(MediasoupClient.this.retryDuration())
);
}
}
@Override
public CompletionStage> onPing(WebSocket webSocket, ByteBuffer message) {
- log.debug("Mediasoup收到消息(ping):{}", webSocket);
+ log.debug("媒体服务收到消息(ping):{}", webSocket);
return Listener.super.onPing(webSocket, message);
}
@Override
public CompletionStage> onPong(WebSocket webSocket, ByteBuffer message) {
- log.debug("Mediasoup收到消息(pong):{}", webSocket);
+ log.debug("媒体服务收到消息(pong):{}", webSocket);
return Listener.super.onPong(webSocket, message);
}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/mediasoup/MediasoupClientManager.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/mediasoup/MediasoupClientManager.java
index 33be49b..afbffb1 100644
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/mediasoup/MediasoupClientManager.java
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/mediasoup/MediasoupClientManager.java
@@ -9,11 +9,10 @@ import org.springframework.context.ApplicationContext;
import com.acgist.taoyao.boot.annotation.Manager;
import com.acgist.taoyao.boot.property.WebrtcProperties;
-import jakarta.annotation.PostConstruct;
import lombok.extern.slf4j.Slf4j;
/**
- * 媒体终端管理
+ * 媒体服务终端管理
*
* @author acgist
*/
@@ -27,24 +26,28 @@ public class MediasoupClientManager {
private ApplicationContext applicationContext;
/**
- * 媒体终端列表
+ * 媒体服务终端列表
*/
private Map clientMap = new ConcurrentHashMap<>();
- @PostConstruct
+ /**
+ * 加载媒体服务终端
+ */
public void init() {
- this.webrtcProperties.getMediasoupList().forEach(v -> {
+ this.webrtcProperties.getMediasoupList().stream()
+ .filter(v -> Boolean.TRUE.equals(v.getEnabled()))
+ .forEach(v -> {
final MediasoupClient client = this.applicationContext.getBean(MediasoupClient.class);
client.init(v);
this.clientMap.put(client.name(), client);
- log.info("新建媒体终端(MediasoupClient):{}-{}", v.getAddress(), client);
+ log.info("注册媒体服务终端:{}-{}", v.getAddress(), client);
});
}
/**
- * @param name 媒体终端名称
+ * @param name 媒体服务终端名称
*
- * @return 媒体终端
+ * @return 媒体服务终端
*/
public MediasoupClient mediasoupClient(String name) {
return this.clientMap.get(name);
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/mediasoup/Peer.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/mediasoup/Peer.java
new file mode 100644
index 0000000..5fb5d56
--- /dev/null
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/mediasoup/Peer.java
@@ -0,0 +1,34 @@
+package com.acgist.taoyao.signal.mediasoup;
+
+import java.util.Map;
+
+import com.acgist.taoyao.signal.client.Client;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * Peer
+ *
+ * @author acgist
+ */
+@Getter
+@Setter
+public class Peer {
+
+ /**
+ * 终端会话
+ */
+ private Client client;
+ private String produce;
+ private String consume;
+ private String device;
+ private String rtpCapabilities;
+ private String sctpCapabilities;
+ private Map transports;
+ private Map producers;
+ private Map consumers;
+ private Map dataProducers;
+ private Map dataConsumers;
+
+}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/mediasoup/Router.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/mediasoup/Router.java
index b0ec6be..2877ba0 100644
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/mediasoup/Router.java
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/mediasoup/Router.java
@@ -22,12 +22,12 @@ public class Router implements Closeable {
/**
* 传输通道列表
*/
- private List transportList;
+ private List transports;
@Override
public void close() {
log.info("关闭路由:{}", this.room.getId());
- this.transportList.forEach(Transport::close);
+ this.transports.forEach(Transport::close);
}
}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/mediasoup/Stream.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/mediasoup/Stream.java
index b7582b9..61b08ec 100644
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/mediasoup/Stream.java
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/mediasoup/Stream.java
@@ -17,7 +17,7 @@ import lombok.extern.slf4j.Slf4j;
public class Stream implements Closeable {
/**
- * 类型
+ * 媒体类型
*
* @author acgist
*/
@@ -34,8 +34,38 @@ public class Stream implements Closeable {
}
+ /**
+ * 收发类型
+ *
+ * @author acgist
+ */
+ public enum Type {
+
+ /**
+ * 发送
+ */
+ SEND,
+ /**
+ * 接收
+ */
+ RECV;
+
+ }
+
+ /**
+ * 媒体终端标识
+ */
+ private String sn;
/**
* 媒体流ID
+ *
+ * 媒体类型.发送终端标识.发送.房间ID:
+ * 音频:audio.sn.sn.1000
+ * 视频:video.sn.sn.1000
+ *
+ * 媒体类型.接收终端标识.接收.发送终端标识.房间ID:
+ * 音频:audio.sn.recv.sn.1000
+ * 视频:video.sn.recv.sn.1000
*/
private String streamId;
/**
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/mediasoup/Transport.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/mediasoup/Transport.java
index b2d8973..26dfdcc 100644
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/mediasoup/Transport.java
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/mediasoup/Transport.java
@@ -3,7 +3,7 @@ package com.acgist.taoyao.signal.mediasoup;
import java.io.Closeable;
import java.util.List;
-import com.acgist.taoyao.signal.client.ClientSession;
+import com.acgist.taoyao.signal.client.Client;
/**
* 传输通道
@@ -15,20 +15,20 @@ public class Transport implements Closeable {
/**
* 终端
*/
- private ClientSession clientSession;
+ private Client client;
/**
* 生产者列表
*/
- private List producerList;
+ private List producers;
/**
* 消费者列表
*/
- private List consumerList;
+ private List consumers;
@Override
public void close() {
- this.producerList.forEach(Stream::close);
- this.consumerList.forEach(Stream::close);
+ this.producers.forEach(Stream::close);
+ this.consumers.forEach(Stream::close);
}
}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/mediasoup/listener/Listener.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/mediasoup/listener/Listener.java
deleted file mode 100644
index dbcd4c8..0000000
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/mediasoup/listener/Listener.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package com.acgist.taoyao.signal.mediasoup.listener;
-
-/**
- * Mediasoup事件监听
- *
- * @author acgist
- */
-public abstract class Listener {
-
-}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/Constant.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/Constant.java
new file mode 100644
index 0000000..e067f5c
--- /dev/null
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/Constant.java
@@ -0,0 +1,79 @@
+package com.acgist.taoyao.signal.protocol;
+
+/**
+ * 字符常量
+ *
+ * @author acgist
+ */
+public interface Constant {
+
+ /**
+ * ID
+ */
+ String ID = "id";
+ /**
+ * IP
+ */
+ String IP = "ip";
+ /**
+ * 终端标识
+ */
+ String SN = "sn";
+ /**
+ * 接收方
+ */
+ String TO = "to";
+ /**
+ * 发送方
+ */
+ String FROM = "from";
+ /**
+ * 信号强度(0~100)
+ */
+ String SIGNAL = "signal";
+ /**
+ * 电池电量(0~100)
+ */
+ String BATTERY = "battery";
+ /**
+ * 是否充电
+ */
+ String CHARGING = "charging";
+ /**
+ * 媒体服务名称
+ */
+ String MEDIASOUP = "mediasoup";
+ /**
+ * 名称
+ */
+ String NAME = "name";
+ /**
+ * 脚本
+ */
+ String SCRIPT = "script";
+ /**
+ * 结果
+ */
+ String RESULT = "result";
+ /**
+ * 帐号
+ */
+ String USERNAME = "username";
+ /**
+ * 密码
+ */
+ String PASSWORD = "password";
+ /**
+ * 时间
+ */
+ String TIME = "time";
+ /**
+ * 媒体
+ */
+ String MEDIA = "media";
+ /**
+ * WebRTC
+ */
+ String WEBRTC = "webrtc";
+
+}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/Protocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/Protocol.java
index 2f183a7..e3d053b 100644
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/Protocol.java
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/Protocol.java
@@ -2,7 +2,7 @@ package com.acgist.taoyao.signal.protocol;
import com.acgist.taoyao.boot.model.Message;
import com.acgist.taoyao.boot.model.MessageCode;
-import com.acgist.taoyao.signal.client.ClientSession;
+import com.acgist.taoyao.signal.client.Client;
import com.acgist.taoyao.signal.event.ApplicationEventAdapter;
/**
@@ -43,10 +43,10 @@ public interface Protocol {
* 处理信令消息
*
* @param sn 终端标识
+ * @param client 终端
* @param message 信令消息
- * @param session 会话
*/
- void execute(String sn, Message message, ClientSession session);
+ void execute(String sn, Client client, Message message);
/**
* 发布事件
@@ -67,7 +67,7 @@ public interface Protocol {
/**
* 创建信令消息
*
- * @param body 请求响应主体
+ * @param body 消息主体
*
* @return 信令消息
*/
@@ -76,8 +76,8 @@ public interface Protocol {
/**
* 创建信令消息
*
- * @param code 响应编码
- * @param body 请求响应主体
+ * @param code 状态编码
+ * @param body 消息主体
*
* @return 信令消息
*/
@@ -86,9 +86,20 @@ public interface Protocol {
/**
* 创建信令消息
*
- * @param code 响应编码
- * @param message 响应描述
- * @param body 请求响应主体
+ * @param code 状态编码
+ * @param message 状态描述
+ * @param body 消息主体
+ *
+ * @return 信令消息
+ */
+ Message build(String message, Object body);
+
+ /**
+ * 创建信令消息
+ *
+ * @param code 状态编码
+ * @param message 状态描述
+ * @param body 消息主体
*
* @return 信令消息
*/
@@ -97,10 +108,10 @@ public interface Protocol {
/**
* 创建信令消息
*
- * @param id 请求响应标识
- * @param code 响应编码
- * @param message 响应描述
- * @param body 请求响应主体
+ * @param id 消息标识
+ * @param code 状态编码
+ * @param message 状态描述
+ * @param body 消息主体
*
* @return 信令消息
*/
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/ProtocolAdapter.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/ProtocolAdapter.java
index cb0e0d8..e4e4468 100644
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/ProtocolAdapter.java
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/ProtocolAdapter.java
@@ -9,8 +9,10 @@ import com.acgist.taoyao.boot.model.Message;
import com.acgist.taoyao.boot.model.MessageCode;
import com.acgist.taoyao.boot.property.TaoyaoProperties;
import com.acgist.taoyao.boot.service.IdService;
-import com.acgist.taoyao.signal.client.ClientSessionManager;
+import com.acgist.taoyao.signal.client.ClientManager;
import com.acgist.taoyao.signal.event.ApplicationEventAdapter;
+import com.acgist.taoyao.signal.mediasoup.MediasoupClientManager;
+import com.acgist.taoyao.signal.room.RoomManager;
/**
* 信令适配器
@@ -22,11 +24,15 @@ public abstract class ProtocolAdapter implements Protocol {
@Autowired
protected IdService idService;
@Autowired
- protected ApplicationContext context;
+ protected RoomManager roomManager;
+ @Autowired
+ protected ClientManager clientManager;
@Autowired
protected TaoyaoProperties taoyaoProperties;
@Autowired
- protected ClientSessionManager clientSessionManager;
+ protected ApplicationContext applicationContext;
+ @Autowired
+ protected MediasoupClientManager mediasoupClientManager;
/**
* 信令名称
@@ -54,7 +60,7 @@ public abstract class ProtocolAdapter implements Protocol {
@Override
public void publishEvent(E event) {
- this.context.publishEvent(event);
+ this.applicationContext.publishEvent(event);
}
@Override
@@ -72,6 +78,11 @@ public abstract class ProtocolAdapter implements Protocol {
return this.build(null, code, null, body);
}
+ @Override
+ public Message build(String message, Object body) {
+ return this.build(null, null, message, body);
+ }
+
@Override
public Message build(MessageCode code, String message, Object body) {
return this.build(null, code, message, body);
@@ -87,18 +98,15 @@ public abstract class ProtocolAdapter implements Protocol {
.id(id)
.signal(this.signal)
.build();
- final Message build = Message.builder()
- .header(header)
- .build();
- if(code != null) {
- build.setCode(code);
- }
- if(StringUtils.isNotEmpty(message)) {
- build.setMessage(message);
- }
- if(body != null) {
- build.setBody(body);
- }
+ final Message build = Message.builder().build();
+ // 设置状态编码
+ // 设置状态描述
+ // 默认状态设置成功
+ build.setCode(code == null ? MessageCode.CODE_0000 : code, message);
+ // 设置消息头部
+ build.setHeader(header);
+ // 设置消息主体
+ build.setBody(body);
return build;
}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/ProtocolManager.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/ProtocolManager.java
index 26f0732..9256e61 100644
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/ProtocolManager.java
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/ProtocolManager.java
@@ -12,8 +12,8 @@ import com.acgist.taoyao.boot.model.Message;
import com.acgist.taoyao.boot.model.MessageCode;
import com.acgist.taoyao.boot.model.MessageCodeException;
import com.acgist.taoyao.boot.utils.JSONUtils;
-import com.acgist.taoyao.signal.client.ClientSession;
-import com.acgist.taoyao.signal.client.ClientSessionManager;
+import com.acgist.taoyao.signal.client.Client;
+import com.acgist.taoyao.signal.client.ClientManager;
import com.acgist.taoyao.signal.protocol.client.ClientRegisterProtocol;
import com.acgist.taoyao.signal.protocol.platform.PlatformErrorProtocol;
import com.acgist.taoyao.signal.service.SecurityService;
@@ -36,17 +36,17 @@ public class ProtocolManager {
private Map protocolMapping = new ConcurrentHashMap<>();
@Autowired
- private ApplicationContext context;
+ private ClientManager clientManager;
@Autowired
private SecurityService securityService;
@Autowired
- private ClientSessionManager clientSessionManager;
+ private ApplicationContext applicationContext;
@Autowired
private PlatformErrorProtocol platformErrorProtocol;
@PostConstruct
public void init() {
- final Map map = this.context.getBeansOfType(Protocol.class);
+ final Map map = this.applicationContext.getBeansOfType(Protocol.class);
map.entrySet().stream()
.sorted((a, z) -> a.getValue().signal().compareTo(z.getValue().signal()))
.forEach(e -> {
@@ -74,50 +74,50 @@ public class ProtocolManager {
/**
* 执行信令消息
*
- * @param message 信令消息
+ * @param content 信令消息
* @param instance 会话实例
*/
- public void execute(String message, AutoCloseable instance) {
- log.debug("执行信令消息:{}", message);
- final ClientSession session = this.clientSessionManager.session(instance);
+ public void execute(String content, AutoCloseable instance) {
+ log.debug("执行信令消息:{}", content);
+ final Client client = this.clientManager.client(instance);
// 验证请求
- final Message value = JSONUtils.toJava(message, Message.class);
- if(value == null) {
- log.warn("消息格式错误(解析失败):{}", message);
- session.push(this.platformErrorProtocol.build("消息格式错误(解析失败)"));
+ final Message message = JSONUtils.toJava(content, Message.class);
+ if(message == null) {
+ log.warn("消息格式错误(解析失败):{}", content);
+ client.push(this.platformErrorProtocol.build("消息格式错误(解析失败)"));
return;
}
- final Header header = value.getHeader();
+ final Header header = message.getHeader();
if(header == null) {
- log.warn("消息格式错误(没有头部):{}", message);
- session.push(this.platformErrorProtocol.build("消息格式错误(没有头部)"));
+ log.warn("消息格式错误(没有头部):{}", content);
+ client.push(this.platformErrorProtocol.build("消息格式错误(没有头部)"));
return;
}
final String v = header.getV();
final String id = header.getId();
final String sn = header.getSn();
final String signal = header.getSignal();
- if(v == null || id == null || sn == null || signal == null) {
- log.warn("消息格式错误(缺失头部关键参数):{}", message);
- session.push(this.platformErrorProtocol.build("消息格式错误(缺失头部关键参数)"));
- return;
- }
// 设置缓存ID
this.platformErrorProtocol.set(id);
+ if(v == null || id == null || sn == null || signal == null) {
+ log.warn("消息格式错误(缺失头部关键参数):{}", content);
+ client.push(this.platformErrorProtocol.build("消息格式错误(缺失头部关键参数)"));
+ return;
+ }
// 开始处理协议
final Protocol protocol = this.protocolMapping.get(signal);
if(protocol == null) {
- log.warn("不支持的信令协议:{}", message);
- session.push(this.platformErrorProtocol.build("不支持的信令协议:" + signal));
+ log.warn("不支持的信令协议:{}", content);
+ client.push(this.platformErrorProtocol.build("不支持的信令协议:" + signal));
return;
}
if(protocol instanceof ClientRegisterProtocol) {
- protocol.execute(sn, value, session);
- } else if(this.securityService.authenticate(value, session, protocol)) {
- protocol.execute(sn, value, session);
+ protocol.execute(sn, client, message);
+ } else if(this.securityService.authenticate(message, client, protocol)) {
+ protocol.execute(sn, client, message);
} else {
- log.warn("终端会话没有授权:{}", message);
- session.push(this.platformErrorProtocol.build(MessageCode.CODE_3401, "终端会话没有授权"));
+ log.warn("终端会话没有授权:{}", content);
+ client.push(this.platformErrorProtocol.build(MessageCode.CODE_3401, "终端会话没有授权"));
}
}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/ProtocolMapAdapter.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/ProtocolMapAdapter.java
index 252b2d3..7ba27cd 100644
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/ProtocolMapAdapter.java
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/ProtocolMapAdapter.java
@@ -4,10 +4,10 @@ import java.util.Map;
import com.acgist.taoyao.boot.model.Message;
import com.acgist.taoyao.boot.model.MessageCodeException;
-import com.acgist.taoyao.signal.client.ClientSession;
+import com.acgist.taoyao.signal.client.Client;
/**
- * Map主体信令适配器
+ * Map消息主体信令适配器
*
* @author acgist
*/
@@ -18,12 +18,12 @@ public abstract class ProtocolMapAdapter extends ProtocolAdapter {
}
@Override
- public void execute(String sn, Message message, ClientSession session) {
+ public void execute(String sn, Client client, Message message) {
final Object body = message.getBody();
if(body instanceof Map, ?> map) {
- this.execute(sn, map, message, session);
+ this.execute(sn, map, client, message);
} else if(body == null) {
- this.execute(sn, Map.of(), message, session);
+ this.execute(sn, Map.of(), client, message);
} else {
throw MessageCodeException.of("信令主体类型错误:" + message);
}
@@ -34,9 +34,9 @@ public abstract class ProtocolMapAdapter extends ProtocolAdapter {
*
* @param sn 终端标识
* @param body 消息主体
+ * @param client 终端
* @param message 信令消息
- * @param session 会话
*/
- public abstract void execute(String sn, Map, ?> body, Message message, ClientSession session);
+ public abstract void execute(String sn, Map, ?> body, Client client, Message message);
}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/ProtocolMediaAdapter.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/ProtocolMediaAdapter.java
index 7cc8db4..9cb8a30 100644
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/ProtocolMediaAdapter.java
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/ProtocolMediaAdapter.java
@@ -3,10 +3,9 @@ package com.acgist.taoyao.signal.protocol;
import java.net.http.WebSocket;
import com.acgist.taoyao.boot.model.Message;
-import com.acgist.taoyao.signal.client.ClientSession;
/**
- * 媒体信令适配器
+ * 媒体服务信令适配器
*
* @author acgist
*/
@@ -16,12 +15,8 @@ public abstract class ProtocolMediaAdapter extends ProtocolAdapter {
super(name, signal);
}
- @Override
- public void execute(String sn, Message message, ClientSession session) {
- }
-
/**
- * 处理媒体信令
+ * 处理媒体服务信令
*
* @param message 信令消息
* @param webSocket WebSocket
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/client/ClientBroadcastProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/client/ClientBroadcastProtocol.java
index 630d238..42bc6ca 100644
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/client/ClientBroadcastProtocol.java
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/client/ClientBroadcastProtocol.java
@@ -1,15 +1,12 @@
package com.acgist.taoyao.signal.protocol.client;
-import org.springframework.beans.factory.annotation.Autowired;
-
import com.acgist.taoyao.boot.annotation.Protocol;
import com.acgist.taoyao.boot.model.Message;
-import com.acgist.taoyao.signal.client.ClientSession;
-import com.acgist.taoyao.signal.client.ClientSessionManager;
+import com.acgist.taoyao.signal.client.Client;
import com.acgist.taoyao.signal.protocol.ProtocolAdapter;
/**
- * 广播信令
+ * 终端广播信令
*
* @author acgist
*/
@@ -18,16 +15,13 @@ public class ClientBroadcastProtocol extends ProtocolAdapter {
public static final String SIGNAL = "client::broadcast";
- @Autowired
- private ClientSessionManager clientSessionManager;
-
public ClientBroadcastProtocol() {
super("广播信令", SIGNAL);
}
@Override
- public void execute(String sn, Message message, ClientSession session) {
- this.clientSessionManager.broadcast(sn, message);
+ public void execute(String sn, Client client, Message message) {
+ this.clientManager.broadcast(sn, message);
}
}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/client/ClientCloseProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/client/ClientCloseProtocol.java
index d597e33..6d4ea6b 100644
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/client/ClientCloseProtocol.java
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/client/ClientCloseProtocol.java
@@ -2,7 +2,7 @@ package com.acgist.taoyao.signal.protocol.client;
import com.acgist.taoyao.boot.annotation.Protocol;
import com.acgist.taoyao.boot.model.Message;
-import com.acgist.taoyao.signal.client.ClientSession;
+import com.acgist.taoyao.signal.client.Client;
import com.acgist.taoyao.signal.protocol.ProtocolAdapter;
import lombok.extern.slf4j.Slf4j;
@@ -23,14 +23,15 @@ public class ClientCloseProtocol extends ProtocolAdapter {
}
@Override
- public void execute(String sn, Message message, ClientSession session) {
- // 关闭不会响应
+ public void execute(String sn, Client client, Message message) {
+ // 响应消息
+ client.push(message.cloneWidthoutBody());
+ // 不用发布事件:关闭连接后会发布事件
try {
- session.close();
+ client.close();
} catch (Exception e) {
log.error("关闭终端异常", e);
}
- // 不用发布事件:关闭连接后会发布事件
}
}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/client/ClientConfigProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/client/ClientConfigProtocol.java
index 2985e03..bf03095 100644
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/client/ClientConfigProtocol.java
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/client/ClientConfigProtocol.java
@@ -9,13 +9,13 @@ import com.acgist.taoyao.boot.annotation.Protocol;
import com.acgist.taoyao.boot.model.Message;
import com.acgist.taoyao.boot.property.MediaProperties;
import com.acgist.taoyao.boot.property.WebrtcProperties;
-import com.acgist.taoyao.boot.utils.DateUtils;
import com.acgist.taoyao.boot.utils.DateUtils.DateTimeStyle;
-import com.acgist.taoyao.signal.client.ClientSession;
+import com.acgist.taoyao.signal.client.Client;
+import com.acgist.taoyao.signal.protocol.Constant;
import com.acgist.taoyao.signal.protocol.ProtocolAdapter;
/**
- * 下发配置信令
+ * 终端配置信令
*
* @author acgist
*/
@@ -30,11 +30,11 @@ public class ClientConfigProtocol extends ProtocolAdapter {
private WebrtcProperties webrtcProperties;
public ClientConfigProtocol() {
- super("下发配置信令", SIGNAL);
+ super("终端配置信令", SIGNAL);
}
@Override
- public void execute(String sn, Message message, ClientSession session) {
+ public void execute(String sn, Client client, Message message) {
// 忽略
}
@@ -42,9 +42,10 @@ public class ClientConfigProtocol extends ProtocolAdapter {
public Message build() {
final Message message = super.build();
message.setBody(Map.of(
- "time", DateUtils.format(LocalDateTime.now(), DateTimeStyle.YYYYMMDDHH24MMSS),
- "media", this.mediaProperties,
- "webrtc", this.webrtcProperties
+ // 系统时间
+ Constant.TIME, DateTimeStyle.YYYYMMDDHH24MMSS.getDateTimeFormatter().format(LocalDateTime.now()),
+ Constant.MEDIA, this.mediaProperties,
+ Constant.WEBRTC, this.webrtcProperties
));
return message;
}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/client/ClientHeartbeatProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/client/ClientHeartbeatProtocol.java
index e2b9ea7..e3489bf 100644
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/client/ClientHeartbeatProtocol.java
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/client/ClientHeartbeatProtocol.java
@@ -5,12 +5,13 @@ import java.util.Map;
import com.acgist.taoyao.boot.annotation.Protocol;
import com.acgist.taoyao.boot.model.Message;
-import com.acgist.taoyao.signal.client.ClientSession;
-import com.acgist.taoyao.signal.client.ClientSessionStatus;
+import com.acgist.taoyao.signal.client.Client;
+import com.acgist.taoyao.signal.client.ClientStatus;
+import com.acgist.taoyao.signal.protocol.Constant;
import com.acgist.taoyao.signal.protocol.ProtocolMapAdapter;
/**
- * 心跳信令
+ * 终端心跳信令
*
* @author acgist
*/
@@ -20,19 +21,19 @@ public class ClientHeartbeatProtocol extends ProtocolMapAdapter {
public static final String SIGNAL = "client::heartbeat";
public ClientHeartbeatProtocol() {
- super("心跳信令", SIGNAL);
+ super("终端心跳信令", SIGNAL);
}
@Override
- public void execute(String sn, Map, ?> body, Message message, ClientSession session) {
+ public void execute(String sn, Map, ?> body, Client client, Message message) {
// 响应心跳
- session.push(message.cloneWidthoutBody());
+ client.push(message.cloneWidthoutBody());
// 设置状态
- final ClientSessionStatus status = session.status();
- status.setSignal((Integer) body.get(ClientSessionStatus.SIGNAL));
- status.setBattery((Integer) body.get(ClientSessionStatus.BATTERY));
- status.setCharging((Boolean) body.get(ClientSessionStatus.CHARGING));
+ final ClientStatus status = client.status();
+ status.setSignal((Integer) body.get(Constant.SIGNAL));
+ status.setBattery((Integer) body.get(Constant.BATTERY));
+ status.setCharging((Boolean) body.get(Constant.CHARGING));
status.setLastHeartbeat(LocalDateTime.now());
}
-
+
}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/client/ClientListProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/client/ClientListProtocol.java
index 3228d48..326fa58 100644
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/client/ClientListProtocol.java
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/client/ClientListProtocol.java
@@ -1,11 +1,8 @@
package com.acgist.taoyao.signal.protocol.client;
-import org.springframework.beans.factory.annotation.Autowired;
-
import com.acgist.taoyao.boot.annotation.Protocol;
import com.acgist.taoyao.boot.model.Message;
-import com.acgist.taoyao.signal.client.ClientSession;
-import com.acgist.taoyao.signal.client.ClientSessionManager;
+import com.acgist.taoyao.signal.client.Client;
import com.acgist.taoyao.signal.protocol.ProtocolAdapter;
/**
@@ -18,17 +15,14 @@ public class ClientListProtocol extends ProtocolAdapter {
public static final String SIGNAL = "client::list";
- @Autowired
- private ClientSessionManager clientSessionManager;
-
public ClientListProtocol() {
super("终端列表信令", SIGNAL);
}
@Override
- public void execute(String sn, Message message, ClientSession session) {
- message.setBody(this.clientSessionManager.status());
- session.push(message);
+ public void execute(String sn, Client client, Message message) {
+ message.setBody(this.clientManager.status());
+ client.push(message);
}
}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/client/ClientOfflineProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/client/ClientOfflineProtocol.java
index d1b20a4..558f760 100644
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/client/ClientOfflineProtocol.java
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/client/ClientOfflineProtocol.java
@@ -2,7 +2,7 @@ package com.acgist.taoyao.signal.protocol.client;
import com.acgist.taoyao.boot.annotation.Protocol;
import com.acgist.taoyao.boot.model.Message;
-import com.acgist.taoyao.signal.client.ClientSession;
+import com.acgist.taoyao.signal.client.Client;
import com.acgist.taoyao.signal.protocol.ProtocolAdapter;
/**
@@ -20,7 +20,7 @@ public class ClientOfflineProtocol extends ProtocolAdapter {
}
@Override
- public void execute(String sn, Message message, ClientSession session) {
+ public void execute(String sn, Client client, Message message) {
// 忽略
}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/client/ClientOnlineProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/client/ClientOnlineProtocol.java
index cdcc715..5554d26 100644
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/client/ClientOnlineProtocol.java
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/client/ClientOnlineProtocol.java
@@ -2,7 +2,7 @@ package com.acgist.taoyao.signal.protocol.client;
import com.acgist.taoyao.boot.annotation.Protocol;
import com.acgist.taoyao.boot.model.Message;
-import com.acgist.taoyao.signal.client.ClientSession;
+import com.acgist.taoyao.signal.client.Client;
import com.acgist.taoyao.signal.protocol.ProtocolAdapter;
/**
@@ -20,7 +20,7 @@ public class ClientOnlineProtocol extends ProtocolAdapter {
}
@Override
- public void execute(String sn, Message message, ClientSession session) {
+ public void execute(String sn, Client client, Message message) {
// 忽略
}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/client/ClientRebootProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/client/ClientRebootProtocol.java
index 40170ac..a8ac1eb 100644
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/client/ClientRebootProtocol.java
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/client/ClientRebootProtocol.java
@@ -2,7 +2,7 @@ package com.acgist.taoyao.signal.protocol.client;
import com.acgist.taoyao.boot.annotation.Protocol;
import com.acgist.taoyao.boot.model.Message;
-import com.acgist.taoyao.signal.client.ClientSession;
+import com.acgist.taoyao.signal.client.Client;
import com.acgist.taoyao.signal.protocol.ProtocolAdapter;
/**
@@ -20,7 +20,8 @@ public class ClientRebootProtocol extends ProtocolAdapter {
}
@Override
- public void execute(String sn, Message message, ClientSession session) {
+ public void execute(String sn, Client client, Message message) {
+ // 忽略
}
}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/client/ClientRegisterProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/client/ClientRegisterProtocol.java
index 8de855a..7687c99 100644
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/client/ClientRegisterProtocol.java
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/client/ClientRegisterProtocol.java
@@ -7,8 +7,9 @@ import org.springframework.beans.factory.annotation.Autowired;
import com.acgist.taoyao.boot.annotation.Protocol;
import com.acgist.taoyao.boot.model.Message;
import com.acgist.taoyao.boot.model.MessageCode;
-import com.acgist.taoyao.signal.client.ClientSession;
+import com.acgist.taoyao.signal.client.Client;
import com.acgist.taoyao.signal.event.client.ClientRegisterEvent;
+import com.acgist.taoyao.signal.protocol.Constant;
import com.acgist.taoyao.signal.protocol.ProtocolMapAdapter;
import com.acgist.taoyao.signal.service.SecurityService;
@@ -33,21 +34,21 @@ public class ClientRegisterProtocol extends ProtocolMapAdapter {
}
@Override
- public void execute(String sn, Map, ?> body, Message message, ClientSession session) {
- final String username = (String) body.get("username");
- final String password = (String) body.get("password");
+ public void execute(String sn, Map, ?> body, Client client, Message message) {
+ final String username = (String) body.get(Constant.USERNAME);
+ final String password = (String) body.get(Constant.PASSWORD);
// 如果需要终端鉴权在此实现
if(this.securityService.authenticate(username, password)) {
log.info("终端注册:{}", sn);
- session.authorize(sn);
+ client.authorize(sn);
message.setCode(MessageCode.CODE_0000);
} else {
message.setCode(MessageCode.CODE_3401);
}
// 推送消息
- session.push(message.cloneWidthoutBody());
+ client.push(message.cloneWidthoutBody());
// 发送事件
- this.publishEvent(new ClientRegisterEvent(body, message, session));
+ this.publishEvent(new ClientRegisterEvent(body, client, message));
}
-
+
}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/client/ClientStatusProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/client/ClientStatusProtocol.java
index 752dec1..00bbfdf 100644
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/client/ClientStatusProtocol.java
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/client/ClientStatusProtocol.java
@@ -3,12 +3,11 @@ package com.acgist.taoyao.signal.protocol.client;
import java.util.Map;
import org.apache.commons.lang3.StringUtils;
-import org.springframework.beans.factory.annotation.Autowired;
import com.acgist.taoyao.boot.annotation.Protocol;
import com.acgist.taoyao.boot.model.Message;
-import com.acgist.taoyao.signal.client.ClientSession;
-import com.acgist.taoyao.signal.client.ClientSessionManager;
+import com.acgist.taoyao.signal.client.Client;
+import com.acgist.taoyao.signal.protocol.Constant;
import com.acgist.taoyao.signal.protocol.ProtocolMapAdapter;
/**
@@ -21,22 +20,19 @@ public class ClientStatusProtocol extends ProtocolMapAdapter {
public static final String SIGNAL = "client::status";
- @Autowired
- private ClientSessionManager clientSessionManager;
-
public ClientStatusProtocol() {
super("终端状态信令", SIGNAL);
}
@Override
- public void execute(String sn, Map, ?> body, Message message, ClientSession session) {
+ public void execute(String sn, Map, ?> body, Client client, Message message) {
// 如果没有指定终端标识默认查询自己
- String querySn = (String) body.get("sn");
+ String querySn = (String) body.get(Constant.SN);
if(StringUtils.isEmpty(querySn)) {
querySn = sn;
}
- message.setBody(this.clientSessionManager.status(querySn));
- session.push(message);
+ message.setBody(this.clientManager.status(querySn));
+ client.push(message);
}
}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/client/ClientUnicastProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/client/ClientUnicastProtocol.java
index 4829f4b..691bcbd 100644
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/client/ClientUnicastProtocol.java
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/client/ClientUnicastProtocol.java
@@ -3,18 +3,17 @@ package com.acgist.taoyao.signal.protocol.client;
import java.util.Map;
import org.apache.commons.lang3.StringUtils;
-import org.springframework.beans.factory.annotation.Autowired;
import com.acgist.taoyao.boot.annotation.Protocol;
import com.acgist.taoyao.boot.model.Message;
-import com.acgist.taoyao.signal.client.ClientSession;
-import com.acgist.taoyao.signal.client.ClientSessionManager;
+import com.acgist.taoyao.signal.client.Client;
+import com.acgist.taoyao.signal.protocol.Constant;
import com.acgist.taoyao.signal.protocol.ProtocolMapAdapter;
import lombok.extern.slf4j.Slf4j;
/**
- * 单播信令
+ * 终端单播信令
*
* @author acgist
*/
@@ -24,20 +23,17 @@ public class ClientUnicastProtocol extends ProtocolMapAdapter {
public static final String SIGNAL = "client::unicast";
- @Autowired
- private ClientSessionManager clientSessionManager;
-
public ClientUnicastProtocol() {
- super("单播信令", SIGNAL);
+ super("终端单播信令", SIGNAL);
}
@Override
- public void execute(String sn, Map, ?> body, Message message, ClientSession session) {
- final String to = (String) body.remove("to");
+ public void execute(String sn, Map, ?> body, Client client, Message message) {
+ final String to = (String) body.remove(Constant.TO);
if(StringUtils.isNotEmpty(to)) {
- this.clientSessionManager.unicast(to, message);
+ this.clientManager.unicast(to, message);
} else {
- log.warn("单播消息没有接收终端标识:{}", to);
+ log.warn("终端单播消息没有接收终端标识:{}", to);
}
}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/MediaListProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/MediaListProtocol.java
new file mode 100644
index 0000000..a177c34
--- /dev/null
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/MediaListProtocol.java
@@ -0,0 +1,36 @@
+package com.acgist.taoyao.signal.protocol.media;
+
+import java.util.Map;
+
+import org.springframework.beans.factory.annotation.Autowired;
+
+import com.acgist.taoyao.boot.annotation.Protocol;
+import com.acgist.taoyao.boot.model.Message;
+import com.acgist.taoyao.boot.property.WebrtcProperties;
+import com.acgist.taoyao.signal.client.Client;
+import com.acgist.taoyao.signal.protocol.ProtocolMapAdapter;
+
+/**
+ * 媒体服务列表信令
+ *
+ * @author acgist
+ */
+@Protocol
+public class MediaListProtocol extends ProtocolMapAdapter {
+
+ public static final String SIGNAL = "media::list";
+
+ @Autowired
+ private WebrtcProperties webrtcProperties;
+
+ public MediaListProtocol() {
+ super("媒体服务列表信令", SIGNAL);
+ }
+
+ @Override
+ public void execute(String sn, Map, ?> body, Client client, Message message) {
+ message.setBody(this.webrtcProperties.getMediasoupList());
+ client.push(message);
+ }
+
+}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/MediaRebootProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/MediaRebootProtocol.java
index ec407fe..f61de5d 100644
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/MediaRebootProtocol.java
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/MediaRebootProtocol.java
@@ -4,14 +4,14 @@ import org.springframework.beans.factory.annotation.Autowired;
import com.acgist.taoyao.boot.model.Message;
import com.acgist.taoyao.boot.property.ScriptProperties;
-import com.acgist.taoyao.signal.client.ClientSession;
+import com.acgist.taoyao.signal.client.Client;
import com.acgist.taoyao.signal.event.platform.PlatformScriptEvent;
import com.acgist.taoyao.signal.protocol.ProtocolAdapter;
import lombok.extern.slf4j.Slf4j;
/**
- * 重启媒体信令
+ * 重启媒体服务信令
*
* @author acgist
*/
@@ -24,16 +24,16 @@ public class MediaRebootProtocol extends ProtocolAdapter {
private ScriptProperties scriptProperties;
public MediaRebootProtocol() {
- super("重启媒体信令", SIGNAL);
+ super("重启媒体服务信令", SIGNAL);
}
@Override
- public void execute(String sn, Message message, ClientSession session) {
- log.info("重启媒体:{}", sn);
+ public void execute(String sn, Client client, Message message) {
+ log.info("重启媒体服务:{}", sn);
// 全员广播
- this.clientSessionManager.broadcast(message);
+ this.clientManager.broadcast(message);
// 推送事件
- this.publishEvent(new PlatformScriptEvent(this.scriptProperties.getMediaReboot(), message, session));
+ this.publishEvent(new PlatformScriptEvent(this.scriptProperties.getMediaReboot(), client, message));
}
}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/MediaRegisterProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/MediaRegisterProtocol.java
index 527fb46..5c91988 100644
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/MediaRegisterProtocol.java
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/MediaRegisterProtocol.java
@@ -6,12 +6,14 @@ import java.util.Map;
import com.acgist.taoyao.boot.annotation.Protocol;
import com.acgist.taoyao.boot.model.Message;
import com.acgist.taoyao.boot.property.MediasoupProperties;
+import com.acgist.taoyao.signal.client.Client;
+import com.acgist.taoyao.signal.protocol.Constant;
import com.acgist.taoyao.signal.protocol.ProtocolMediaAdapter;
import lombok.extern.slf4j.Slf4j;
/**
- * 媒体终端注册信令
+ * 媒体服务注册信令
*
* @author acgist
*/
@@ -22,7 +24,7 @@ public class MediaRegisterProtocol extends ProtocolMediaAdapter {
public static final String SIGNAL = "media::register";
public MediaRegisterProtocol() {
- super("媒体终端注册信令", SIGNAL);
+ super("媒体服务注册信令", SIGNAL);
}
/**
@@ -34,8 +36,8 @@ public class MediaRegisterProtocol extends ProtocolMediaAdapter {
*/
public Message build(MediasoupProperties mediasoup) {
return super.build(Map.of(
- "username", mediasoup.getUsername(),
- "password", mediasoup.getPassword()
+ Constant.USERNAME, mediasoup.getUsername(),
+ Constant.PASSWORD, mediasoup.getPassword()
));
}
@@ -43,5 +45,9 @@ public class MediaRegisterProtocol extends ProtocolMediaAdapter {
public void execute(Message message, WebSocket webSocket) {
log.info("媒体终端注册结果:{}", message);
}
+
+ @Override
+ public void execute(String sn, Client client, Message message) {
+ }
}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/platform/PlatformErrorProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/platform/PlatformErrorProtocol.java
index 3b9a8f4..a684c9c 100644
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/platform/PlatformErrorProtocol.java
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/platform/PlatformErrorProtocol.java
@@ -3,7 +3,7 @@ package com.acgist.taoyao.signal.protocol.platform;
import com.acgist.taoyao.boot.annotation.Protocol;
import com.acgist.taoyao.boot.model.Message;
import com.acgist.taoyao.boot.model.MessageCode;
-import com.acgist.taoyao.signal.client.ClientSession;
+import com.acgist.taoyao.signal.client.Client;
import com.acgist.taoyao.signal.protocol.ProtocolAdapter;
/**
@@ -33,7 +33,7 @@ public class PlatformErrorProtocol extends ProtocolAdapter {
}
@Override
- public void execute(String sn, Message message, ClientSession session) {
+ public void execute(String sn, Client client, Message message) {
}
@Override
@@ -45,7 +45,8 @@ public class PlatformErrorProtocol extends ProtocolAdapter {
id = oldId;
this.idLocal.remove();
}
- return super.build(id, code, message, body);
+ // 默认设置失败状态
+ return super.build(id, code == null ? MessageCode.CODE_9999 : code, message, body);
}
}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/platform/PlatformRebootProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/platform/PlatformRebootProtocol.java
index ae3f29c..9ce0e95 100644
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/platform/PlatformRebootProtocol.java
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/platform/PlatformRebootProtocol.java
@@ -4,7 +4,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import com.acgist.taoyao.boot.model.Message;
import com.acgist.taoyao.boot.property.ScriptProperties;
-import com.acgist.taoyao.signal.client.ClientSession;
+import com.acgist.taoyao.signal.client.Client;
import com.acgist.taoyao.signal.event.platform.PlatformScriptEvent;
import com.acgist.taoyao.signal.protocol.ProtocolAdapter;
@@ -28,12 +28,12 @@ public class PlatformRebootProtocol extends ProtocolAdapter {
}
@Override
- public void execute(String sn, Message message, ClientSession session) {
+ public void execute(String sn, Client client, Message message) {
log.info("重启平台:{}", sn);
// 全员广播
- this.clientSessionManager.broadcast(message);
+ this.clientManager.broadcast(message);
// 推送事件
- this.publishEvent(new PlatformScriptEvent(this.scriptProperties.getPlatformReboot(), message, session));
+ this.publishEvent(new PlatformScriptEvent(this.scriptProperties.getPlatformReboot(), client, message));
}
}
\ No newline at end of file
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/platform/PlatformScriptProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/platform/PlatformScriptProtocol.java
index d382637..5949056 100644
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/platform/PlatformScriptProtocol.java
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/platform/PlatformScriptProtocol.java
@@ -3,7 +3,7 @@ package com.acgist.taoyao.signal.protocol.platform;
import java.util.Map;
import com.acgist.taoyao.boot.model.Message;
-import com.acgist.taoyao.signal.client.ClientSession;
+import com.acgist.taoyao.signal.client.Client;
import com.acgist.taoyao.signal.event.platform.PlatformScriptEvent;
import com.acgist.taoyao.signal.protocol.ProtocolMapAdapter;
@@ -21,8 +21,8 @@ public class PlatformScriptProtocol extends ProtocolMapAdapter {
}
@Override
- public void execute(String sn, Map, ?> body, Message message, ClientSession session) {
- this.publishEvent(new PlatformScriptEvent(body, message, session));
+ public void execute(String sn, Map, ?> body, Client client, Message message) {
+ this.publishEvent(new PlatformScriptEvent(body, client, message));
}
}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/platform/PlatformShutdownProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/platform/PlatformShutdownProtocol.java
index df68260..a299bac 100644
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/platform/PlatformShutdownProtocol.java
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/platform/PlatformShutdownProtocol.java
@@ -1,7 +1,7 @@
package com.acgist.taoyao.signal.protocol.platform;
import com.acgist.taoyao.boot.model.Message;
-import com.acgist.taoyao.signal.client.ClientSession;
+import com.acgist.taoyao.signal.client.Client;
import com.acgist.taoyao.signal.event.platform.PlatformShutdownEvent;
import com.acgist.taoyao.signal.protocol.ProtocolAdapter;
@@ -22,12 +22,12 @@ public class PlatformShutdownProtocol extends ProtocolAdapter {
}
@Override
- public void execute(String sn, Message message, ClientSession session) {
+ public void execute(String sn, Client client, Message message) {
log.info("关闭平台:{}", sn);
// 全员广播
- this.clientSessionManager.broadcast(message);
+ this.clientManager.broadcast(message);
// 推送事件
- this.publishEvent(new PlatformShutdownEvent(message, session));
+ this.publishEvent(new PlatformShutdownEvent(client, message));
}
}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/room/RoomCreateProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/room/RoomCreateProtocol.java
index 511683e..aed0c77 100644
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/room/RoomCreateProtocol.java
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/room/RoomCreateProtocol.java
@@ -4,7 +4,7 @@ import java.util.Map;
import com.acgist.taoyao.boot.annotation.Protocol;
import com.acgist.taoyao.boot.model.Message;
-import com.acgist.taoyao.signal.client.ClientSession;
+import com.acgist.taoyao.signal.client.Client;
import com.acgist.taoyao.signal.event.room.RoomCreateEvent;
import com.acgist.taoyao.signal.protocol.ProtocolMapAdapter;
@@ -23,8 +23,8 @@ public class RoomCreateProtocol extends ProtocolMapAdapter {
}
@Override
- public void execute(String sn, Map, ?> body, Message message, ClientSession session) {
- this.publishEvent(new RoomCreateEvent(body, message, session));
+ public void execute(String sn, Map, ?> body, Client client, Message message) {
+ this.publishEvent(new RoomCreateEvent(body, client, message));
}
}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/room/RoomEnterProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/room/RoomEnterProtocol.java
index 5b3416d..5f54931 100644
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/room/RoomEnterProtocol.java
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/room/RoomEnterProtocol.java
@@ -4,7 +4,7 @@ import java.util.Map;
import com.acgist.taoyao.boot.annotation.Protocol;
import com.acgist.taoyao.boot.model.Message;
-import com.acgist.taoyao.signal.client.ClientSession;
+import com.acgist.taoyao.signal.client.Client;
import com.acgist.taoyao.signal.event.room.RoomEnterEvent;
import com.acgist.taoyao.signal.protocol.ProtocolMapAdapter;
@@ -23,8 +23,8 @@ public class RoomEnterProtocol extends ProtocolMapAdapter {
}
@Override
- public void execute(String sn, Map, ?> body, Message message, ClientSession session) {
- this.publishEvent(new RoomEnterEvent(body, message, session));
+ public void execute(String sn, Map, ?> body, Client client, Message message) {
+ this.publishEvent(new RoomEnterEvent(body, client, message));
}
}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/room/RoomListProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/room/RoomListProtocol.java
index e80a6c5..919ae19 100644
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/room/RoomListProtocol.java
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/room/RoomListProtocol.java
@@ -1,5 +1,34 @@
package com.acgist.taoyao.signal.protocol.room;
-public class RoomListProtocol {
+import org.springframework.beans.factory.annotation.Autowired;
+
+import com.acgist.taoyao.boot.annotation.Protocol;
+import com.acgist.taoyao.boot.model.Message;
+import com.acgist.taoyao.signal.client.Client;
+import com.acgist.taoyao.signal.protocol.ProtocolAdapter;
+import com.acgist.taoyao.signal.room.RoomManager;
+
+/**
+ * 房间列表信令
+ *
+ * @author acgist
+ */
+@Protocol
+public class RoomListProtocol extends ProtocolAdapter {
+
+ public static final String SIGNAL = "room::list";
+
+ @Autowired
+ private RoomManager roomManager;
+
+ public RoomListProtocol() {
+ super("房间列表信令", SIGNAL);
+ }
+
+ @Override
+ public void execute(String sn, Client client, Message message) {
+ message.setBody(this.roomManager.status());
+ client.push(message);
+ }
}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/system/SystemRebootProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/system/SystemRebootProtocol.java
index 67370b5..862e880 100644
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/system/SystemRebootProtocol.java
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/system/SystemRebootProtocol.java
@@ -4,7 +4,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import com.acgist.taoyao.boot.model.Message;
import com.acgist.taoyao.boot.property.ScriptProperties;
-import com.acgist.taoyao.signal.client.ClientSession;
+import com.acgist.taoyao.signal.client.Client;
import com.acgist.taoyao.signal.event.platform.PlatformScriptEvent;
import com.acgist.taoyao.signal.protocol.ProtocolAdapter;
@@ -28,10 +28,10 @@ public class SystemRebootProtocol extends ProtocolAdapter {
}
@Override
- public void execute(String sn, Message message, ClientSession session) {
+ public void execute(String sn, Client client, Message message) {
log.info("重启系统:{}", sn);
- this.clientSessionManager.broadcast(message);
- this.publishEvent(new PlatformScriptEvent(this.scriptProperties.getSystemReboot(), message, session));
+ this.clientManager.broadcast(message);
+ this.publishEvent(new PlatformScriptEvent(this.scriptProperties.getSystemReboot(), client, message));
}
}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/system/SystemShutdownProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/system/SystemShutdownProtocol.java
index 4562696..79f4c63 100644
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/system/SystemShutdownProtocol.java
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/system/SystemShutdownProtocol.java
@@ -4,7 +4,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import com.acgist.taoyao.boot.model.Message;
import com.acgist.taoyao.boot.property.ScriptProperties;
-import com.acgist.taoyao.signal.client.ClientSession;
+import com.acgist.taoyao.signal.client.Client;
import com.acgist.taoyao.signal.event.platform.PlatformScriptEvent;
import com.acgist.taoyao.signal.protocol.ProtocolAdapter;
@@ -28,10 +28,10 @@ public class SystemShutdownProtocol extends ProtocolAdapter {
}
@Override
- public void execute(String sn, Message message, ClientSession session) {
+ public void execute(String sn, Client client, Message message) {
log.info("关闭系统:{}", sn);
- this.clientSessionManager.broadcast(message);
- this.publishEvent(new PlatformScriptEvent(this.scriptProperties.getSystemShutdown(), message, session));
+ this.clientManager.broadcast(message);
+ this.publishEvent(new PlatformScriptEvent(this.scriptProperties.getSystemShutdown(), client, message));
}
}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/room/Room.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/room/Room.java
index a9b4775..037c49f 100644
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/room/Room.java
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/room/Room.java
@@ -2,6 +2,11 @@ package com.acgist.taoyao.signal.room;
import java.util.List;
+import com.acgist.taoyao.boot.model.Message;
+import com.acgist.taoyao.signal.client.Client;
+import com.acgist.taoyao.signal.client.ClientStatus;
+import com.acgist.taoyao.signal.mediasoup.MediasoupClient;
+
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Getter;
import lombok.Setter;
@@ -17,43 +22,83 @@ import lombok.Setter;
public class Room {
/**
- * 房间标识
+ * ID
*/
- @Schema(title = "房间标识", description = "房间标识")
- private String id;
+ private Long id;
/**
- * 房间名称
+ * 密码
*/
- @Schema(title = "房间名称", description = "房间名称")
- private String name;
- /**
- * 房间密码
- */
- @Schema(title = "房间密码", description = "房间密码")
private String password;
/**
- * 终端会话标识列表
+ * 状态
*/
- @Schema(title = "终端会话标识列表", description = "终端会话标识列表")
- private List snList;
+ private RoomStatus status;
/**
- * 创建终端标识
+ * 媒体服务
*/
- @Schema(title = "创建终端标识", description = "创建终端标识")
- private String creator;
+ private MediasoupClient mediasoupClient;
+ /**
+ * 终端列表
+ */
+ private List clients;
/**
- * 新增终端会话标识
- *
- * @param sn 终端会话标识
+ * @return 终端状态列表
*/
- public void addSn(String sn) {
- synchronized (this.snList) {
- if(this.snList.contains(sn)) {
+ public List clientStatus() {
+ return this.clients.stream()
+ .map(Client::status)
+ .toList();
+ }
+
+ /**
+ * 终端进入
+ *
+ * @param client 终端
+ */
+ public void enter(Client client) {
+ synchronized (this.clients) {
+ if(this.clients.contains(client)) {
return;
}
- this.snList.add(sn);
+ if(this.clients.add(client)) {
+ this.status.setSnSize(this.status.getSnSize() + 1);
+ }
}
}
-
+
+ /**
+ * 终端离开
+ *
+ * @param sn 终端
+ */
+ public void leave(Client client) {
+ synchronized (this.clients) {
+ if(this.clients.remove(client)) {
+ this.status.setSnSize(this.status.getSnSize() - 1);
+ }
+ }
+ }
+
+ /**
+ * 广播消息
+ *
+ * @param message 消息
+ */
+ public void broadcast(Message message) {
+ this.clients.forEach(v -> v.push(v.sn(), message));
+ }
+
+ /**
+ * 广播消息
+ *
+ * @param from 发送终端
+ * @param message 消息
+ */
+ public void broadcast(Client from, Message message) {
+ this.clients.stream()
+ .filter(v -> v != from)
+ .forEach(v -> v.push(v.sn(), message));
+ }
+
}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/room/RoomManager.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/room/RoomManager.java
index 772771b..c5c2a38 100644
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/room/RoomManager.java
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/room/RoomManager.java
@@ -6,7 +6,11 @@ import java.util.concurrent.CopyOnWriteArrayList;
import org.springframework.beans.factory.annotation.Autowired;
import com.acgist.taoyao.boot.annotation.Manager;
+import com.acgist.taoyao.boot.model.MessageCodeException;
import com.acgist.taoyao.boot.service.IdService;
+import com.acgist.taoyao.signal.client.Client;
+import com.acgist.taoyao.signal.mediasoup.MediasoupClient;
+import com.acgist.taoyao.signal.mediasoup.MediasoupClientManager;
import lombok.extern.slf4j.Slf4j;
@@ -21,57 +25,111 @@ public class RoomManager {
@Autowired
private IdService idService;
+ @Autowired
+ private MediasoupClientManager mediasoupClientManager;
/**
* 房间列表
*/
- private List roomList = new CopyOnWriteArrayList<>();
+ private List rooms = new CopyOnWriteArrayList<>();
/**
- * @return 所有房间列表
- */
- public List roomList() {
- return this.roomList;
- }
-
- /**
- * @param id 房间标识
+ * @param id ID
*
* @return 房间信息
*/
- public Room room(String id) {
- return this.roomList.stream()
+ public Room room(Long id) {
+ return this.rooms.stream()
.filter(v -> v.getId().equals(id))
.findFirst()
.orElse(null);
}
-
+
/**
- * @param id 房间标识
+ * @param id ID
*
- * @return 房间所有终端标识
+ * @return 房间信息
*/
- public List snList(String id) {
+ public RoomStatus status(Long id) {
final Room room = this.room(id);
- return room == null ? List.of() : room.getSnList();
+ return room == null ? null : room.getStatus();
+ }
+
+ /**
+ * @return 所有房间列表
+ */
+ public List rooms() {
+ return this.rooms;
+ }
+
+ /**
+ * @return 所有房间状态
+ */
+ public List status() {
+ return this.rooms().stream()
+ .map(Room::getStatus)
+ .toList();
}
/**
* 创建房间
*
- * @param sn 创建房间终端标识
+ * @param sn 创建终端标识
+ * @param name 名称
+ * @param password 密码
+ * @param mediasoup 媒体服务名称
*
* @return 房间信息
*/
- public Room create(String sn) {
+ public Room create(String sn, String name, String password, String mediasoup) {
+ final MediasoupClient mediasoupClient = this.mediasoupClientManager.mediasoupClient(mediasoup);
+ if(mediasoupClient == null) {
+ throw MessageCodeException.of("无效媒体服务:" + mediasoup);
+ }
+ final Long id = this.idService.buildId();
+ // 状态
+ final RoomStatus roomStatus = new RoomStatus();
+ roomStatus.setId(id);
+ roomStatus.setName(name);
+ roomStatus.setSnSize(0L);
+ roomStatus.setMediasoup(mediasoup);
+ // 房间
final Room room = new Room();
- room.setId(this.idService.buildIdToString());
- room.setSnList(new CopyOnWriteArrayList<>());
- room.setCreator(sn);
- room.addSn(sn);
- this.roomList.add(room);
- log.info("创建房间:{}", room.getId());
+ room.setId(id);
+ room.setPassword(password);
+ room.setStatus(roomStatus);
+ room.setMediasoupClient(mediasoupClient);
+ room.setClients(new CopyOnWriteArrayList<>());
+ // 加入
+ this.rooms.add(room);
+ // TODO:媒体服务
+ log.info("创建房间:{}-{}", id, name);
return room;
}
+ /**
+ * 关闭房间
+ *
+ * @param id ID
+ */
+ public void close(Long id) {
+ final Room room = this.room(id);
+ if(room == null) {
+ log.warn("房间无效:{}", id);
+ return;
+ }
+ if(this.rooms.remove(room)) {
+ // TODO:媒体服务
+ }
+ }
+
+ /**
+ * 释放房间
+ *
+ * @param client 终端
+ */
+ public void leave(Client client) {
+ this.rooms.forEach(v -> v.leave(client));
+ }
+
}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/room/RoomStatus.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/room/RoomStatus.java
index 0a55092..2738384 100644
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/room/RoomStatus.java
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/room/RoomStatus.java
@@ -1,7 +1,5 @@
package com.acgist.taoyao.signal.room;
-import java.util.List;
-
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Getter;
import lombok.Setter;
@@ -14,27 +12,22 @@ import lombok.Setter;
@Getter
@Setter
public class RoomStatus {
-
+
/**
- * 房间ID
+ * ID
*/
- @Schema(title = "房间ID", description = "房间ID")
+ @Schema(title = "ID", description = "ID")
private Long id;
/**
- * 房间终端数量
+ * 名称
*/
- @Schema(title = "房间终端数量", description = "房间终端数量")
+ @Schema(title = "名称", description = "名称")
+ private String name;
+ /**
+ * 终端数量
+ */
+ @Schema(title = "终端数量", description = "终端数量")
private Long snSize;
- /**
- * 房间在线终端数量
- */
- @Schema(title = "房间在线终端数量", description = "房间在线终端数量")
- private Long onlineSnSize;
- /**
- * 房间终端列表
- */
- @Schema(title = "房间终端列表", description = "房间终端列表")
- private List snList;
/**
* 媒体服务名称
*/
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/service/SecurityService.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/service/SecurityService.java
index a6dc928..f9b6f7b 100644
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/service/SecurityService.java
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/service/SecurityService.java
@@ -1,7 +1,7 @@
package com.acgist.taoyao.signal.service;
import com.acgist.taoyao.boot.model.Message;
-import com.acgist.taoyao.signal.client.ClientSession;
+import com.acgist.taoyao.signal.client.Client;
import com.acgist.taoyao.signal.protocol.Protocol;
/**
@@ -30,6 +30,6 @@ public interface SecurityService {
*
* @return 是否成功
*/
- boolean authenticate(Message message, ClientSession session, Protocol protocol);
+ boolean authenticate(Message message, Client session, Protocol protocol);
}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/service/impl/SecurityServiceImpl.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/service/impl/SecurityServiceImpl.java
index de0038f..dd613cf 100644
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/service/impl/SecurityServiceImpl.java
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/service/impl/SecurityServiceImpl.java
@@ -3,10 +3,9 @@ package com.acgist.taoyao.signal.service.impl;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
-import com.acgist.taoyao.boot.model.Header;
import com.acgist.taoyao.boot.model.Message;
import com.acgist.taoyao.boot.property.SecurityProperties;
-import com.acgist.taoyao.signal.client.ClientSession;
+import com.acgist.taoyao.signal.client.Client;
import com.acgist.taoyao.signal.protocol.Protocol;
import com.acgist.taoyao.signal.service.SecurityService;
@@ -28,14 +27,12 @@ public class SecurityServiceImpl implements SecurityService {
}
@Override
- public boolean authenticate(Message message, ClientSession session, Protocol protocol) {
+ public boolean authenticate(Message message, Client session, Protocol protocol) {
if(!session.authorized()) {
return false;
}
- final Header header = message.getHeader();
- final String sn = header.getSn();
- // 验证信令终端
- if(!sn.equals(session.sn())) {
+ // 信令终端鉴定
+ if(!session.sn().equals(message.getHeader().getSn())) {
return false;
}
// 信令权限鉴定