From 5f85dfcccac2120382800664d7ae8d1994cb3dba Mon Sep 17 00:00:00 2001 From: acgist <289547414@qq.com> Date: Sat, 11 Feb 2023 22:11:51 +0800 Subject: [PATCH] [+] --- README.md | 1 + docs/Deploy.md | 5 + taoyao-client-web/README.md | 30 +-- taoyao-client-web/package.json | 4 +- taoyao-client-web/src/App.vue | 40 ++- .../src/assets/{font.taoyao.css => font.css} | 0 taoyao-client-web/src/assets/main.css | 2 +- taoyao-client-web/src/components/Config.js | 22 +- .../src/components/LocalClient.vue | 21 ++ .../src/components/SettingRoom.vue | 100 +++++++ .../src/components/SettingSignal.vue | 53 ++++ taoyao-client-web/src/components/Taoyao.js | 236 +++++++++------- taoyao-client-web/src/main.js | 6 +- taoyao-client-web/vite.config.js | 3 +- taoyao-signal-server/README.md | 15 -- taoyao-signal-server/pom.xml | 6 - .../acgist/taoyao/boot/annotation/Client.java | 2 +- .../taoyao/boot/annotation/EventListener.java | 4 +- .../taoyao/boot/annotation/Manager.java | 2 +- .../taoyao/boot/annotation/Protocol.java | 2 +- .../boot/config/BootAutoConfiguration.java | 10 +- .../config/SpringDocAutoConfiguration.java | 15 +- .../WebMvcConfigurerAutoConfiguration.java | 6 +- .../com/acgist/taoyao/boot/model/Header.java | 19 +- .../com/acgist/taoyao/boot/model/Message.java | 133 +++++---- .../acgist/taoyao/boot/model/MessageCode.java | 14 +- .../boot/property/MediasoupProperties.java | 44 +-- .../taoyao/boot/property/NodeProperties.java | 12 +- .../boot/property/SecurityProperties.java | 5 - .../boot/property/WebrtcProperties.java | 12 +- .../taoyao/boot/utils/WebSocketUtils.java | 65 +++++ taoyao-signal-server/taoyao-node/README.md | 6 - taoyao-signal-server/taoyao-node/pom.xml | 26 -- .../node/config/NodeAutoConfiguration.java | 25 -- .../platform/NodeShutdownListener.java | 20 -- ...ot.autoconfigure.AutoConfiguration.imports | 1 - .../interceptor/SecurityInterceptor.java | 9 +- .../acgist/taoyao/main/TaoyaoApplication.java | 1 + .../src/main/resources/application-dev.yml | 12 +- .../src/main/resources/application.yml | 8 +- .../acgist/taoyao/signal/WebSocketClient.java | 2 +- .../protocol/PlatformScriptProtocolTest.java | 2 +- .../PlatformShutdownProtocolTest.java | 2 +- taoyao-signal-server/taoyao-signal/README.md | 255 +++++++++--------- .../{ClientSession.java => Client.java} | 43 ++- ...SessionAdapter.java => ClientAdapter.java} | 62 ++--- ...SessionManager.java => ClientManager.java} | 99 ++++--- ...ntSessionStatus.java => ClientStatus.java} | 36 +-- .../signal/client/socket/SocketClient.java | 51 ++++ .../signal/client/socket/SocketSession.java | 36 --- ...ocketSession.java => WebSocketClient.java} | 17 +- .../client/websocket/WebSocketSignal.java | 18 +- .../config/SignalAutoConfiguration.java | 16 ++ .../signal/controller/ClientController.java | 10 +- .../signal/controller/RoomController.java | 13 +- .../signal/event/ApplicationEventAdapter.java | 40 ++- .../signal/event/client/ClientCloseEvent.java | 6 +- .../event/client/ClientRegisterEvent.java | 38 +-- .../event/platform/PlatformScriptEvent.java | 24 +- .../event/platform/PlatformShutdownEvent.java | 6 +- .../signal/event/room/RoomCreateEvent.java | 35 ++- .../signal/event/room/RoomEnterEvent.java | 21 +- .../listener/ApplicationListenerAdapter.java | 13 +- .../signal/listener/MediaListenerAdapter.java | 14 - .../signal/listener/RoomListenerAdapter.java | 20 -- .../listener/client/ClientCloseListener.java | 15 +- .../client/ClientRegisterListener.java | 39 +-- .../platform/PlatformScriptListener.java | 11 +- .../platform/PlatformShutdownListener.java | 12 +- .../listener/room/RoomCreateListener.java | 24 +- .../listener/room/RoomEnterListener.java | 36 ++- .../signal/mediasoup/MediasoupClient.java | 86 +++--- .../mediasoup/MediasoupClientManager.java | 19 +- .../acgist/taoyao/signal/mediasoup/Peer.java | 34 +++ .../taoyao/signal/mediasoup/Router.java | 4 +- .../taoyao/signal/mediasoup/Stream.java | 32 ++- .../taoyao/signal/mediasoup/Transport.java | 12 +- .../signal/mediasoup/listener/Listener.java | 10 - .../taoyao/signal/protocol/Constant.java | 79 ++++++ .../taoyao/signal/protocol/Protocol.java | 37 ++- .../signal/protocol/ProtocolAdapter.java | 40 +-- .../signal/protocol/ProtocolManager.java | 56 ++-- .../signal/protocol/ProtocolMapAdapter.java | 14 +- .../signal/protocol/ProtocolMediaAdapter.java | 9 +- .../client/ClientBroadcastProtocol.java | 14 +- .../protocol/client/ClientCloseProtocol.java | 11 +- .../protocol/client/ClientConfigProtocol.java | 17 +- .../client/ClientHeartbeatProtocol.java | 23 +- .../protocol/client/ClientListProtocol.java | 14 +- .../client/ClientOfflineProtocol.java | 4 +- .../protocol/client/ClientOnlineProtocol.java | 4 +- .../protocol/client/ClientRebootProtocol.java | 5 +- .../client/ClientRegisterProtocol.java | 17 +- .../protocol/client/ClientStatusProtocol.java | 16 +- .../client/ClientUnicastProtocol.java | 20 +- .../protocol/media/MediaListProtocol.java | 36 +++ .../protocol/media/MediaRebootProtocol.java | 14 +- .../protocol/media/MediaRegisterProtocol.java | 14 +- .../platform/PlatformErrorProtocol.java | 7 +- .../platform/PlatformRebootProtocol.java | 8 +- .../platform/PlatformScriptProtocol.java | 6 +- .../platform/PlatformShutdownProtocol.java | 8 +- .../protocol/room/RoomCreateProtocol.java | 6 +- .../protocol/room/RoomEnterProtocol.java | 6 +- .../protocol/room/RoomListProtocol.java | 31 ++- .../protocol/system/SystemRebootProtocol.java | 8 +- .../system/SystemShutdownProtocol.java | 8 +- .../com/acgist/taoyao/signal/room/Room.java | 93 +++++-- .../taoyao/signal/room/RoomManager.java | 106 ++++++-- .../acgist/taoyao/signal/room/RoomStatus.java | 27 +- .../signal/service/SecurityService.java | 4 +- .../service/impl/SecurityServiceImpl.java | 11 +- 112 files changed, 1770 insertions(+), 1213 deletions(-) rename taoyao-client-web/src/assets/{font.taoyao.css => font.css} (100%) create mode 100644 taoyao-client-web/src/components/SettingRoom.vue create mode 100644 taoyao-client-web/src/components/SettingSignal.vue create mode 100644 taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/utils/WebSocketUtils.java delete mode 100644 taoyao-signal-server/taoyao-node/README.md delete mode 100644 taoyao-signal-server/taoyao-node/pom.xml delete mode 100644 taoyao-signal-server/taoyao-node/src/main/java/com/acgist/taoyao/node/config/NodeAutoConfiguration.java delete mode 100644 taoyao-signal-server/taoyao-node/src/main/java/com/acgist/taoyao/node/listener/platform/NodeShutdownListener.java delete mode 100644 taoyao-signal-server/taoyao-node/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports rename taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/{ClientSession.java => Client.java} (69%) rename taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/{ClientSessionAdapter.java => ClientAdapter.java} (69%) rename taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/{ClientSessionManager.java => ClientManager.java} (58%) rename taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/{ClientSessionStatus.java => ClientStatus.java} (65%) create mode 100644 taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/socket/SocketClient.java delete mode 100644 taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/socket/SocketSession.java rename taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/websocket/{WebSocketSession.java => WebSocketClient.java} (57%) delete mode 100644 taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/listener/MediaListenerAdapter.java delete mode 100644 taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/listener/RoomListenerAdapter.java create mode 100644 taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/mediasoup/Peer.java delete mode 100644 taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/mediasoup/listener/Listener.java create mode 100644 taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/Constant.java create mode 100644 taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/MediaListProtocol.java 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; } // 信令权限鉴定