diff --git a/README.md b/README.md index b28ec56..2666b82 100644 --- a/README.md +++ b/README.md @@ -53,3 +53,4 @@ * 媒体交互式启动 * 一个信令服务多个媒体服务 * 会议调整为房间 +* 反复测试推流拉流、拉人踢人、音频视频控制 diff --git a/docs/sequence/Client.iuml b/docs/Client.iuml similarity index 100% rename from docs/sequence/Client.iuml rename to docs/Client.iuml diff --git a/docs/sequence/Client.png b/docs/Client.png similarity index 100% rename from docs/sequence/Client.png rename to docs/Client.png diff --git a/docs/sequence/WebRTC.iuml b/docs/WebRTC.iuml similarity index 100% rename from docs/sequence/WebRTC.iuml rename to docs/WebRTC.iuml diff --git a/docs/sequence/WebRTC.png b/docs/WebRTC.png similarity index 100% rename from docs/sequence/WebRTC.png rename to docs/WebRTC.png diff --git a/docs/sequence/Meeting.iuml b/docs/sequence/Meeting.iuml deleted file mode 100644 index 556c90c..0000000 --- a/docs/sequence/Meeting.iuml +++ /dev/null @@ -1,29 +0,0 @@ -@startuml - -title Meeting - -actor ClientA as ClientA -participant "Signal" as Signal -participant "Media" as Media -actor ClientB as ClientB -actor ClientC as ClientC - -autonumber - -ClientA -> Signal: 创建会议 -activate Signal -activate ClientA -Signal -> ClientA: 创建会议 -deactivate ClientA -Signal -> ClientB: 创建会议 -Signal -> ClientC: 创建会议 -deactivate Signal - -ClientA -> Signal: 进入会议 -activate Signal -Signal -> ClientB: ClientA进入会议 -Signal -> ClientC: ClientA进入会议 -deactivate Signal - - -@enduml \ No newline at end of file diff --git a/taoyao-client-web/index.html b/taoyao-client-web/index.html index cfbe37c..a62791f 100644 --- a/taoyao-client-web/index.html +++ b/taoyao-client-web/index.html @@ -1,5 +1,5 @@ - + diff --git a/taoyao-client-web/package.json b/taoyao-client-web/package.json index 43b92f2..b38ae5f 100644 --- a/taoyao-client-web/package.json +++ b/taoyao-client-web/package.json @@ -10,10 +10,11 @@ "preview": "vite preview" }, "dependencies": { - "vue": "^3.2.45" + "vue": "^3.2.45", + "moment": "^2.29.4" }, "devDependencies": { - "@vitejs/plugin-vue": "^4.0.0", - "vite": "^4.0.0" + "vite": "^4.0.0", + "@vitejs/plugin-vue": "^4.0.0" } } diff --git a/taoyao-client-web/src/App.vue b/taoyao-client-web/src/App.vue index 7bf5905..bbfead7 100644 --- a/taoyao-client-web/src/App.vue +++ b/taoyao-client-web/src/App.vue @@ -1,11 +1,39 @@ - - - - - diff --git a/taoyao-client-web/src/assets/base.css b/taoyao-client-web/src/assets/base.css index 2fd3009..2ce1869 100644 --- a/taoyao-client-web/src/assets/base.css +++ b/taoyao-client-web/src/assets/base.css @@ -1,4 +1,3 @@ -/* color palette from */ :root { --vt-c-white: #ffffff; --vt-c-white-soft: #f8f8f8; diff --git a/taoyao-client-web/src/assets/font.taoyao.css b/taoyao-client-web/src/assets/font.taoyao.css index 4b25797..77881b6 100644 --- a/taoyao-client-web/src/assets/font.taoyao.css +++ b/taoyao-client-web/src/assets/font.taoyao.css @@ -1,6 +1,9 @@ @font-face { font-family: taoyao; - src: url(./taoyao.ttf?oc7k8r) format("truetype"), url(./taoyao.woff?oc7k8r) format("woff"), url(./taoyao.svg?oc7k8r#taoyao) format("svg"); + src: + url(./taoyao.ttf?oc7k8r) format("truetype"), + url(./taoyao.woff?oc7k8r) format("woff"), + url(./taoyao.svg?oc7k8r#taoyao) format("svg"); font-weight: 400; font-style: normal; font-display: block; diff --git a/taoyao-client-web/src/components/Config.js b/taoyao-client-web/src/components/Config.js index e69de29..bd9766b 100644 --- a/taoyao-client-web/src/components/Config.js +++ b/taoyao-client-web/src/components/Config.js @@ -0,0 +1,131 @@ +/** + * 桃夭配置 + */ + +/** + * 信令配置 + */ +const config = { + // 终端标识 + sn: null, + // 终端名称 + name: "taoyao-client-web", + // 终端版本 + version: "1.0.0", + // 日志级别 + logLevel: "DEBUG", + // 信令服务地址 + host: "localhost", + port: "8888", + signal: function () { + return `wss://${this.host}:${this.port}/websocket.signal`; + }, +}; + +/** + * 信令协议 + */ +const protocol = { + // 当前索引 + index: 100000, + // 最小索引 + minIndex: 100000, + // 最大索引 + maxIndex: 999999, + /** + * @returns 索引 + */ + buildId: function () { + if (this.index++ >= this.maxIndex) { + this.index = this.minIndex; + } + return Date.now() + "" + this.index; + }, + /** + * 生成信令消息 + * + * @param {*} id ID + * @param {*} body 信令消息 + * @param {*} signal 信令标识 + * + * @returns 信令消息 + */ + buildMessage: function (id, body, signal) { + let message = { + header: { + v: config.version, + id: id || this.buildId(), + sn: config.sn, + signal: signal, + }, + body: body, + }; + return message; + }, +}; + +/** + * 默认音频配置 + */ +const defaultAudioConfig = { + // 设备 + // deviceId : '', + // 音量:0~1 + volume: 0.5, + // 延迟大小(单位毫秒):500毫秒以内较好 + latency: 0.4, + // 采样数:16 + sampleSize: 16, + // 采样率:8000|16000|32000|48000 + sampleRate: 32000, + // 声道数量:1|2 + channelCount: 1, + // 是否开启自动增益:true|false + autoGainControl: false, + // 是否开启降噪功能:true|false + noiseSuppression: true, + // 是否开启回音消除:true|false + echoCancellation: true, + // 消除回音方式:system|browser + echoCancellationType: "system", +}; + +/** + * 默认视频配置 + */ +const defaultVideoConfig = { + // 设备 + // deviceId: '', + // 宽度 + width: 1280, + // 高度 + height: 720, + // 帧率 + frameRate: 24, + // 选摄像头:user|left|right|environment + facingMode: "environment", +}; + +/** + * 默认RTCPeerConnection配置 + */ +const defaultRTCPeerConnectionConfig = { + // ICE代理的服务器 + iceServers: null, + // 传输通道绑定策略:balanced|max-compat|max-bundle + bundlePolicy: "balanced", + // RTCP多路复用策略:require|negotiate + rtcpMuxPolicy: "require", + // ICE传输策略:all|relay + iceTransportPolicy: "all", + // ICE候选个数 + iceCandidatePoolSize: 8, +}; + +export { + config, + protocol, + defaultAudioConfig, + defaultVideoConfig, + defaultRTCPeerConnectionConfig, +}; diff --git a/taoyao-client-web/src/components/LocalClient.vue b/taoyao-client-web/src/components/LocalClient.vue index 84d30f5..dcf1f0a 100644 --- a/taoyao-client-web/src/components/LocalClient.vue +++ b/taoyao-client-web/src/components/LocalClient.vue @@ -1,7 +1,2 @@ - - - + diff --git a/taoyao-client-web/src/components/Logger.js b/taoyao-client-web/src/components/Logger.js new file mode 100644 index 0000000..ba5876a --- /dev/null +++ b/taoyao-client-web/src/components/Logger.js @@ -0,0 +1,94 @@ +/** + * 日志 + */ +import moment from "moment"; +import { config } from "./Config.js"; + +/** + * 日志 + */ +class Logger { + constructor(prefix = "") { + if (prefix) { + this.name = this.name + " : " + prefix; + } + } + + // 名称 + name = config.name; + // 级别 + level = ["DEBUG", "INFO", "WARN", "ERROR", "OFF"]; + // 级别索引 + levelIndex = this.level.indexOf(config.logLevel.toUpperCase()); + + /** + * debug + * + * @param {...any} args 参数 + * + * @returns this + */ + debug(...args) { + return this.log(console.debug, "37m", "DEBUG", args); + } + + /** + * info + * + * @param {...any} args 参数 + * + * @returns this + */ + info(...args) { + return this.log(console.info, "32m", "INFO", args); + } + + /** + * warn + * + * @param {...any} args 参数 + * + * @returns this + */ + warn(...args) { + return this.log(console.warn, "33m", "WARN", args); + } + + /** + * error + * + * @param {...any} args 参数 + * + * @returns this + */ + error(...args) { + return this.log(console.error, "31m", "ERROR", args); + } + + /** + * 日志 + * + * @param {*} out 输出 + * @param {*} color 颜色 + * @param {*} level 级别 + * @param {*} args 参数 + * + * @returns this + */ + log(out, color, level, args) { + if (!args || this.level.indexOf(level) < this.levelIndex) { + return this; + } + if (args.length > 1 && args[0].length > 0) { + out(`\x1B[${color}${this.name} ${moment().format("yyyy-MM-DD HH:mm:ss")} : [${level.padEnd(5, " ")}] :\x1B[0m`, args); + } else if (args.length === 1 && args[0].length > 0) { + out(`\x1B[${color}${this.name} ${moment().format("yyyy-MM-DD HH:mm:ss")} : [${level.padEnd(5, " ")}] :\x1B[0m`, args); + } else { + // 其他情况直接输出换行 + out(""); + } + return this; + } +} + +export { Logger }; diff --git a/taoyao-client-web/src/components/RemoteClient.vue b/taoyao-client-web/src/components/RemoteClient.vue index d84bf19..9bc74de 100644 --- a/taoyao-client-web/src/components/RemoteClient.vue +++ b/taoyao-client-web/src/components/RemoteClient.vue @@ -1,7 +1,2 @@ - - - + diff --git a/taoyao-client-web/src/components/Taoyao.js b/taoyao-client-web/src/components/Taoyao.js index e69de29..f828b8d 100644 --- a/taoyao-client-web/src/components/Taoyao.js +++ b/taoyao-client-web/src/components/Taoyao.js @@ -0,0 +1,312 @@ +/** + * 桃夭 + */ +import { Logger } from "./Logger.js"; +import { TaoyaoClient } from "./TaoyaoClient.js"; +import { config, protocol, defaultAudioConfig, defaultVideoConfig } from "./Config.js"; + +// 日志 +const logger = new Logger(); + +/** + * 信令通道 + * TODO:获取IP/MAC/信号强度 + */ +const signalChannel = { + // 桃夭 + taoyao: null, + // 通道 + channel: null, + // 地址 + address: null, + // 回调 + callback: null, + // 回调事件 + callbackMapping: new Map(), + // 心跳时间 + heartbeatTime: 30 * 1000, + // 心跳定时器 + heartbeatTimer: null, + // 重连定时器 + reconnectTimer: null, + // 防止重复重连 + lockReconnect: false, + // 当前重连时间 + connectionTimeout: 5 * 1000, + // 最小重连时间 + minReconnectionDelay: 5 * 1000, + // 最大重连时间 + maxReconnectionDelay: 60 * 1000, + // 重连失败时间增长倍数 + reconnectionDelayGrowFactor: 2, + /** + * 心跳 + */ + heartbeat: function () { + let self = this; + if (self.heartbeatTimer) { + clearTimeout(self.heartbeatTimer); + } + self.heartbeatTimer = setTimeout(async function () { + if (self.channel && self.channel.readyState === WebSocket.OPEN) { + const battery = await navigator.getBattery(); + self.push( + protocol.buildMessage("client::heartbeat", { + signal: 100, + battery: battery.level * 100, + charging: battery.charging, + }) + ); + self.heartbeat(); + } else { + logger.warn("发送心跳失败", self.channel); + } + }, self.heartbeatTime); + }, + /** + * 连接 + * + * @param {*} address 地址 + * @param {*} callback 回调 + * @param {*} reconnection 是否重连 + * + * @returns Promise + */ + connect: function (address, callback, reconnection = true) { + let self = this; + self.address = address; + self.callback = callback; + return new Promise((resolve, reject) => { + logger.debug("连接信令通道", address); + self.channel = new WebSocket(address); + self.channel.onopen = async function (e) { + logger.debug("打开信令通道", e); + // 注册终端 + const battery = await navigator.getBattery(); + self.push( + protocol.buildMessage("client::register", { + ip: null, + mac: null, + signal: 100, + battery: battery.level * 100, + charging: battery.charging, + username: config.username, + password: config.password, + }) + ); + // 重置时间 + self.connectionTimeout = self.minReconnectionDelay; + // 开始心跳 + self.heartbeat(); + // 成功回调 + resolve(e); + }; + self.channel.onclose = function (e) { + logger.error("信令通道关闭", self.channel, e); + if (reconnection) { + self.reconnect(); + } + reject(e); + }; + self.channel.onerror = function (e) { + logger.error("信令通道异常", self.channel, e); + if (reconnection) { + self.reconnect(); + } + reject(e); + }; + /** + * 回调策略: + * 1. 如果注册请求回调,同时执行结果返回true不再执行后面所有回调。 + * 2. 如果注册全局回调,同时执行结果返回true不再执行后面所有回调。 + * 3. 如果前面所有回调没有返回true执行默认回调。 + */ + self.channel.onmessage = function (e) { + console.debug("信令通道消息", e.data); + let done = false; + let data = JSON.parse(e.data); + // 请求回调 + if (self.callbackMapping.has(data.header.id)) { + try { + done = self.callbackMapping.get(data.header.id)(data); + } finally { + self.callbackMapping.delete(data.header.id); + } + } + // 全局回调 + if (self.callback) { + done = self.callback(data); + } + // 默认回调 + if (!done) { + self.defaultCallback(data); + } + }; + }); + }, + /** + * 重连 + */ + reconnect: function () { + let self = this; + if (self.lockReconnect) { + return; + } + self.lockReconnect = true; + // 关闭旧的通道 + if (self.channel && self.channel.readyState === WebSocket.OPEN) { + self.channel.close(); + self.channel = null; + } + if (self.reconnectTimer) { + clearTimeout(self.reconnectTimer); + } + // 打开定时重连 + self.reconnectTimer = setTimeout(function () { + console.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; + } + }, + /** + * 发送消息 + * + * @param {*} data 消息内容 + * @param {*} callback 注册回调 + */ + push: function (data, callback) { + // 注册回调 + if (data && callback) { + this.callbackMapping.set(data.header.id, callback); + } + // 发送消息 + if (data && data.header) { + this.channel.send(JSON.stringify(data)); + } else { + this.channel.send(data); + } + }, + /** + * 关闭通道 + */ + close: function () { + clearTimeout(this.heartbeatTimer); + }, + /** + * 默认回调 + * + * @param {*} data 消息内容 + */ + defaultCallback: function (data) { + console.debug("没有适配信令消息默认处理", data); + switch (data.header.signal) { + case "platform::error": + console.error("信令发生错误", data); + break; + } + }, + /** + * 默认配置回调 + * + * @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("没有配置本地媒体信息跳过自动打开媒体通道"); + } + }, + /** + * 默认终端重启回调 + * + * @param {*} data 消息内容 + */ + defaultClientReboot: function (data) { + console.info("重启终端"); + location.reload(); + }, +}; + +/** + * 桃夭 + */ +class Taoyao { + // 本地终端 + localClient; + // 远程终端 + remoteClientList; + // 设备状态 + audioEnabled = true; + videoEnabled = true; + // 媒体配置 + audioConfig = defaultAudioConfig; + videoConfig = defaultVideoConfig; + // 媒体通道 + transSend; + transRecv; + // 发送信令 + push = null; + // 信令通道 + signalChannel = null; + /** + * 媒体配置 + * + * @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 + */ + 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); + }; +} + +export { Taoyao }; diff --git a/taoyao-client-web/src/components/TaoyaoClient.js b/taoyao-client-web/src/components/TaoyaoClient.js new file mode 100644 index 0000000..ed81688 --- /dev/null +++ b/taoyao-client-web/src/components/TaoyaoClient.js @@ -0,0 +1,6 @@ +/** + * 桃夭终端 + */ +class TaoyaoClient {} + +export { TaoyaoClient }; diff --git a/taoyao-client-web/src/main.js b/taoyao-client-web/src/main.js index 90e6400..63efaab 100644 --- a/taoyao-client-web/src/main.js +++ b/taoyao-client-web/src/main.js @@ -1,6 +1,5 @@ -import { createApp } from 'vue' -import App from './App.vue' +import { createApp } from "vue"; +import App from "./App.vue"; +import "./assets/main.css"; -import './assets/main.css' - -createApp(App).mount('#app') +createApp(App).mount("#app"); diff --git a/taoyao-client-web/src/static/css/font.min.css b/taoyao-client-web/src/static/css/font.min.css deleted file mode 100644 index a656ebe..0000000 --- a/taoyao-client-web/src/static/css/font.min.css +++ /dev/null @@ -1 +0,0 @@ -@font-face{font-family:taoyao;src:url(../fonts/taoyao.ttf?oc7k8r) format("truetype"),url(../fonts/taoyao.woff?oc7k8r) format("woff"),url(../fonts/taoyao.svg?oc7k8r#taoyao) format("svg");font-weight:400;font-style:normal;font-display:block}[class*=" icon-"],[class^=icon-]{font-family:taoyao!important;speak:never;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.icon-home:before{content:"\e900"}.icon-home2:before{content:"\e901"}.icon-home3:before{content:"\e902"}.icon-office:before{content:"\e903"}.icon-newspaper:before{content:"\e904"}.icon-pencil:before{content:"\e905"}.icon-pencil2:before{content:"\e906"}.icon-quill:before{content:"\e907"}.icon-pen:before{content:"\e908"}.icon-blog:before{content:"\e909"}.icon-eyedropper:before{content:"\e90a"}.icon-droplet:before{content:"\e90b"}.icon-paint-format:before{content:"\e90c"}.icon-image:before{content:"\e90d"}.icon-images:before{content:"\e90e"}.icon-camera:before{content:"\e90f"}.icon-headphones:before{content:"\e910"}.icon-music:before{content:"\e911"}.icon-play:before{content:"\e912"}.icon-film:before{content:"\e913"}.icon-video-camera:before{content:"\e914"}.icon-dice:before{content:"\e915"}.icon-pacman:before{content:"\e916"}.icon-spades:before{content:"\e917"}.icon-clubs:before{content:"\e918"}.icon-diamonds:before{content:"\e919"}.icon-bullhorn:before{content:"\e91a"}.icon-connection:before{content:"\e91b"}.icon-podcast:before{content:"\e91c"}.icon-feed:before{content:"\e91d"}.icon-mic:before{content:"\e91e"}.icon-book:before{content:"\e91f"}.icon-books:before{content:"\e920"}.icon-library:before{content:"\e921"}.icon-file-text:before{content:"\e922"}.icon-profile:before{content:"\e923"}.icon-file-empty:before{content:"\e924"}.icon-files-empty:before{content:"\e925"}.icon-file-text2:before{content:"\e926"}.icon-file-picture:before{content:"\e927"}.icon-file-music:before{content:"\e928"}.icon-file-play:before{content:"\e929"}.icon-file-video:before{content:"\e92a"}.icon-file-zip:before{content:"\e92b"}.icon-copy:before{content:"\e92c"}.icon-paste:before{content:"\e92d"}.icon-stack:before{content:"\e92e"}.icon-folder:before{content:"\e92f"}.icon-folder-open:before{content:"\e930"}.icon-folder-plus:before{content:"\e931"}.icon-folder-minus:before{content:"\e932"}.icon-folder-download:before{content:"\e933"}.icon-folder-upload:before{content:"\e934"}.icon-price-tag:before{content:"\e935"}.icon-price-tags:before{content:"\e936"}.icon-barcode:before{content:"\e937"}.icon-qrcode:before{content:"\e938"}.icon-ticket:before{content:"\e939"}.icon-cart:before{content:"\e93a"}.icon-coin-dollar:before{content:"\e93b"}.icon-coin-euro:before{content:"\e93c"}.icon-coin-pound:before{content:"\e93d"}.icon-coin-yen:before{content:"\e93e"}.icon-credit-card:before{content:"\e93f"}.icon-calculator:before{content:"\e940"}.icon-lifebuoy:before{content:"\e941"}.icon-phone:before{content:"\e942"}.icon-phone-hang-up:before{content:"\e943"}.icon-address-book:before{content:"\e944"}.icon-envelop:before{content:"\e945"}.icon-pushpin:before{content:"\e946"}.icon-location:before{content:"\e947"}.icon-location2:before{content:"\e948"}.icon-compass:before{content:"\e949"}.icon-compass2:before{content:"\e94a"}.icon-map:before{content:"\e94b"}.icon-map2:before{content:"\e94c"}.icon-history:before{content:"\e94d"}.icon-clock:before{content:"\e94e"}.icon-clock2:before{content:"\e94f"}.icon-alarm:before{content:"\e950"}.icon-bell:before{content:"\e951"}.icon-stopwatch:before{content:"\e952"}.icon-calendar:before{content:"\e953"}.icon-printer:before{content:"\e954"}.icon-keyboard:before{content:"\e955"}.icon-display:before{content:"\e956"}.icon-laptop:before{content:"\e957"}.icon-mobile:before{content:"\e958"}.icon-mobile2:before{content:"\e959"}.icon-tablet:before{content:"\e95a"}.icon-tv:before{content:"\e95b"}.icon-drawer:before{content:"\e95c"}.icon-drawer2:before{content:"\e95d"}.icon-box-add:before{content:"\e95e"}.icon-box-remove:before{content:"\e95f"}.icon-download:before{content:"\e960"}.icon-upload:before{content:"\e961"}.icon-floppy-disk:before{content:"\e962"}.icon-drive:before{content:"\e963"}.icon-database:before{content:"\e964"}.icon-undo:before{content:"\e965"}.icon-redo:before{content:"\e966"}.icon-undo2:before{content:"\e967"}.icon-redo2:before{content:"\e968"}.icon-forward:before{content:"\e969"}.icon-reply:before{content:"\e96a"}.icon-bubble:before{content:"\e96b"}.icon-bubbles:before{content:"\e96c"}.icon-bubbles2:before{content:"\e96d"}.icon-bubble2:before{content:"\e96e"}.icon-bubbles3:before{content:"\e96f"}.icon-bubbles4:before{content:"\e970"}.icon-user:before{content:"\e971"}.icon-users:before{content:"\e972"}.icon-user-plus:before{content:"\e973"}.icon-user-minus:before{content:"\e974"}.icon-user-check:before{content:"\e975"}.icon-user-tie:before{content:"\e976"}.icon-quotes-left:before{content:"\e977"}.icon-quotes-right:before{content:"\e978"}.icon-hour-glass:before{content:"\e979"}.icon-spinner:before{content:"\e97a"}.icon-spinner2:before{content:"\e97b"}.icon-spinner3:before{content:"\e97c"}.icon-spinner4:before{content:"\e97d"}.icon-spinner5:before{content:"\e97e"}.icon-spinner6:before{content:"\e97f"}.icon-spinner7:before{content:"\e980"}.icon-spinner8:before{content:"\e981"}.icon-spinner9:before{content:"\e982"}.icon-spinner10:before{content:"\e983"}.icon-spinner11:before{content:"\e984"}.icon-binoculars:before{content:"\e985"}.icon-search:before{content:"\e986"}.icon-zoom-in:before{content:"\e987"}.icon-zoom-out:before{content:"\e988"}.icon-enlarge:before{content:"\e989"}.icon-shrink:before{content:"\e98a"}.icon-enlarge2:before{content:"\e98b"}.icon-shrink2:before{content:"\e98c"}.icon-key:before{content:"\e98d"}.icon-key2:before{content:"\e98e"}.icon-lock:before{content:"\e98f"}.icon-unlocked:before{content:"\e990"}.icon-wrench:before{content:"\e991"}.icon-equalizer:before{content:"\e992"}.icon-equalizer2:before{content:"\e993"}.icon-cog:before{content:"\e994"}.icon-cogs:before{content:"\e995"}.icon-hammer:before{content:"\e996"}.icon-magic-wand:before{content:"\e997"}.icon-aid-kit:before{content:"\e998"}.icon-bug:before{content:"\e999"}.icon-pie-chart:before{content:"\e99a"}.icon-stats-dots:before{content:"\e99b"}.icon-stats-bars:before{content:"\e99c"}.icon-stats-bars2:before{content:"\e99d"}.icon-trophy:before{content:"\e99e"}.icon-gift:before{content:"\e99f"}.icon-glass:before{content:"\e9a0"}.icon-glass2:before{content:"\e9a1"}.icon-mug:before{content:"\e9a2"}.icon-spoon-knife:before{content:"\e9a3"}.icon-leaf:before{content:"\e9a4"}.icon-rocket:before{content:"\e9a5"}.icon-meter:before{content:"\e9a6"}.icon-meter2:before{content:"\e9a7"}.icon-hammer2:before{content:"\e9a8"}.icon-fire:before{content:"\e9a9"}.icon-lab:before{content:"\e9aa"}.icon-magnet:before{content:"\e9ab"}.icon-bin:before{content:"\e9ac"}.icon-bin2:before{content:"\e9ad"}.icon-briefcase:before{content:"\e9ae"}.icon-airplane:before{content:"\e9af"}.icon-truck:before{content:"\e9b0"}.icon-road:before{content:"\e9b1"}.icon-accessibility:before{content:"\e9b2"}.icon-target:before{content:"\e9b3"}.icon-shield:before{content:"\e9b4"}.icon-power:before{content:"\e9b5"}.icon-switch:before{content:"\e9b6"}.icon-power-cord:before{content:"\e9b7"}.icon-clipboard:before{content:"\e9b8"}.icon-list-numbered:before{content:"\e9b9"}.icon-list:before{content:"\e9ba"}.icon-list2:before{content:"\e9bb"}.icon-tree:before{content:"\e9bc"}.icon-menu:before{content:"\e9bd"}.icon-menu2:before{content:"\e9be"}.icon-menu3:before{content:"\e9bf"}.icon-menu4:before{content:"\e9c0"}.icon-cloud:before{content:"\e9c1"}.icon-cloud-download:before{content:"\e9c2"}.icon-cloud-upload:before{content:"\e9c3"}.icon-cloud-check:before{content:"\e9c4"}.icon-download2:before{content:"\e9c5"}.icon-upload2:before{content:"\e9c6"}.icon-download3:before{content:"\e9c7"}.icon-upload3:before{content:"\e9c8"}.icon-sphere:before{content:"\e9c9"}.icon-earth:before{content:"\e9ca"}.icon-link:before{content:"\e9cb"}.icon-flag:before{content:"\e9cc"}.icon-attachment:before{content:"\e9cd"}.icon-eye:before{content:"\e9ce"}.icon-eye-plus:before{content:"\e9cf"}.icon-eye-minus:before{content:"\e9d0"}.icon-eye-blocked:before{content:"\e9d1"}.icon-bookmark:before{content:"\e9d2"}.icon-bookmarks:before{content:"\e9d3"}.icon-sun:before{content:"\e9d4"}.icon-contrast:before{content:"\e9d5"}.icon-brightness-contrast:before{content:"\e9d6"}.icon-star-empty:before{content:"\e9d7"}.icon-star-half:before{content:"\e9d8"}.icon-star-full:before{content:"\e9d9"}.icon-heart:before{content:"\e9da"}.icon-heart-broken:before{content:"\e9db"}.icon-man:before{content:"\e9dc"}.icon-woman:before{content:"\e9dd"}.icon-man-woman:before{content:"\e9de"}.icon-happy:before{content:"\e9df"}.icon-happy2:before{content:"\e9e0"}.icon-smile:before{content:"\e9e1"}.icon-smile2:before{content:"\e9e2"}.icon-tongue:before{content:"\e9e3"}.icon-tongue2:before{content:"\e9e4"}.icon-sad:before{content:"\e9e5"}.icon-sad2:before{content:"\e9e6"}.icon-wink:before{content:"\e9e7"}.icon-wink2:before{content:"\e9e8"}.icon-grin:before{content:"\e9e9"}.icon-grin2:before{content:"\e9ea"}.icon-cool:before{content:"\e9eb"}.icon-cool2:before{content:"\e9ec"}.icon-angry:before{content:"\e9ed"}.icon-angry2:before{content:"\e9ee"}.icon-evil:before{content:"\e9ef"}.icon-evil2:before{content:"\e9f0"}.icon-shocked:before{content:"\e9f1"}.icon-shocked2:before{content:"\e9f2"}.icon-baffled:before{content:"\e9f3"}.icon-baffled2:before{content:"\e9f4"}.icon-confused:before{content:"\e9f5"}.icon-confused2:before{content:"\e9f6"}.icon-neutral:before{content:"\e9f7"}.icon-neutral2:before{content:"\e9f8"}.icon-hipster:before{content:"\e9f9"}.icon-hipster2:before{content:"\e9fa"}.icon-wondering:before{content:"\e9fb"}.icon-wondering2:before{content:"\e9fc"}.icon-sleepy:before{content:"\e9fd"}.icon-sleepy2:before{content:"\e9fe"}.icon-frustrated:before{content:"\e9ff"}.icon-frustrated2:before{content:"\ea00"}.icon-crying:before{content:"\ea01"}.icon-crying2:before{content:"\ea02"}.icon-point-up:before{content:"\ea03"}.icon-point-right:before{content:"\ea04"}.icon-point-down:before{content:"\ea05"}.icon-point-left:before{content:"\ea06"}.icon-warning:before{content:"\ea07"}.icon-notification:before{content:"\ea08"}.icon-question:before{content:"\ea09"}.icon-plus:before{content:"\ea0a"}.icon-minus:before{content:"\ea0b"}.icon-info:before{content:"\ea0c"}.icon-cancel-circle:before{content:"\ea0d"}.icon-blocked:before{content:"\ea0e"}.icon-cross:before{content:"\ea0f"}.icon-checkmark:before{content:"\ea10"}.icon-checkmark2:before{content:"\ea11"}.icon-spell-check:before{content:"\ea12"}.icon-enter:before{content:"\ea13"}.icon-exit:before{content:"\ea14"}.icon-play2:before{content:"\ea15"}.icon-pause:before{content:"\ea16"}.icon-stop:before{content:"\ea17"}.icon-previous:before{content:"\ea18"}.icon-next:before{content:"\ea19"}.icon-backward:before{content:"\ea1a"}.icon-forward2:before{content:"\ea1b"}.icon-play3:before{content:"\ea1c"}.icon-pause2:before{content:"\ea1d"}.icon-stop2:before{content:"\ea1e"}.icon-backward2:before{content:"\ea1f"}.icon-forward3:before{content:"\ea20"}.icon-first:before{content:"\ea21"}.icon-last:before{content:"\ea22"}.icon-previous2:before{content:"\ea23"}.icon-next2:before{content:"\ea24"}.icon-eject:before{content:"\ea25"}.icon-volume-high:before{content:"\ea26"}.icon-volume-medium:before{content:"\ea27"}.icon-volume-low:before{content:"\ea28"}.icon-volume-mute:before{content:"\ea29"}.icon-volume-mute2:before{content:"\ea2a"}.icon-volume-increase:before{content:"\ea2b"}.icon-volume-decrease:before{content:"\ea2c"}.icon-loop:before{content:"\ea2d"}.icon-loop2:before{content:"\ea2e"}.icon-infinite:before{content:"\ea2f"}.icon-shuffle:before{content:"\ea30"}.icon-arrow-up-left:before{content:"\ea31"}.icon-arrow-up:before{content:"\ea32"}.icon-arrow-up-right:before{content:"\ea33"}.icon-arrow-right:before{content:"\ea34"}.icon-arrow-down-right:before{content:"\ea35"}.icon-arrow-down:before{content:"\ea36"}.icon-arrow-down-left:before{content:"\ea37"}.icon-arrow-left:before{content:"\ea38"}.icon-arrow-up-left2:before{content:"\ea39"}.icon-arrow-up2:before{content:"\ea3a"}.icon-arrow-up-right2:before{content:"\ea3b"}.icon-arrow-right2:before{content:"\ea3c"}.icon-arrow-down-right2:before{content:"\ea3d"}.icon-arrow-down2:before{content:"\ea3e"}.icon-arrow-down-left2:before{content:"\ea3f"}.icon-arrow-left2:before{content:"\ea40"}.icon-circle-up:before{content:"\ea41"}.icon-circle-right:before{content:"\ea42"}.icon-circle-down:before{content:"\ea43"}.icon-circle-left:before{content:"\ea44"}.icon-tab:before{content:"\ea45"}.icon-move-up:before{content:"\ea46"}.icon-move-down:before{content:"\ea47"}.icon-sort-alpha-asc:before{content:"\ea48"}.icon-sort-alpha-desc:before{content:"\ea49"}.icon-sort-numeric-asc:before{content:"\ea4a"}.icon-sort-numberic-desc:before{content:"\ea4b"}.icon-sort-amount-asc:before{content:"\ea4c"}.icon-sort-amount-desc:before{content:"\ea4d"}.icon-command:before{content:"\ea4e"}.icon-shift:before{content:"\ea4f"}.icon-ctrl:before{content:"\ea50"}.icon-opt:before{content:"\ea51"}.icon-checkbox-checked:before{content:"\ea52"}.icon-checkbox-unchecked:before{content:"\ea53"}.icon-radio-checked:before{content:"\ea54"}.icon-radio-checked2:before{content:"\ea55"}.icon-radio-unchecked:before{content:"\ea56"}.icon-crop:before{content:"\ea57"}.icon-make-group:before{content:"\ea58"}.icon-ungroup:before{content:"\ea59"}.icon-scissors:before{content:"\ea5a"}.icon-filter:before{content:"\ea5b"}.icon-font:before{content:"\ea5c"}.icon-ligature:before{content:"\ea5d"}.icon-ligature2:before{content:"\ea5e"}.icon-text-height:before{content:"\ea5f"}.icon-text-width:before{content:"\ea60"}.icon-font-size:before{content:"\ea61"}.icon-bold:before{content:"\ea62"}.icon-underline:before{content:"\ea63"}.icon-italic:before{content:"\ea64"}.icon-strikethrough:before{content:"\ea65"}.icon-omega:before{content:"\ea66"}.icon-sigma:before{content:"\ea67"}.icon-page-break:before{content:"\ea68"}.icon-superscript:before{content:"\ea69"}.icon-subscript:before{content:"\ea6a"}.icon-superscript2:before{content:"\ea6b"}.icon-subscript2:before{content:"\ea6c"}.icon-text-color:before{content:"\ea6d"}.icon-pagebreak:before{content:"\ea6e"}.icon-clear-formatting:before{content:"\ea6f"}.icon-table:before{content:"\ea70"}.icon-table2:before{content:"\ea71"}.icon-insert-template:before{content:"\ea72"}.icon-pilcrow:before{content:"\ea73"}.icon-ltr:before{content:"\ea74"}.icon-rtl:before{content:"\ea75"}.icon-section:before{content:"\ea76"}.icon-paragraph-left:before{content:"\ea77"}.icon-paragraph-center:before{content:"\ea78"}.icon-paragraph-right:before{content:"\ea79"}.icon-paragraph-justify:before{content:"\ea7a"}.icon-indent-increase:before{content:"\ea7b"}.icon-indent-decrease:before{content:"\ea7c"}.icon-share:before{content:"\ea7d"}.icon-new-tab:before{content:"\ea7e"}.icon-embed:before{content:"\ea7f"}.icon-embed2:before{content:"\ea80"}.icon-terminal:before{content:"\ea81"}.icon-share2:before{content:"\ea82"}.icon-mail:before{content:"\ea83"}.icon-mail2:before{content:"\ea84"}.icon-mail3:before{content:"\ea85"}.icon-mail4:before{content:"\ea86"}.icon-amazon:before{content:"\ea87"}.icon-google:before{content:"\ea88"}.icon-google2:before{content:"\ea89"}.icon-google3:before{content:"\ea8a"}.icon-google-plus:before{content:"\ea8b"}.icon-google-plus2:before{content:"\ea8c"}.icon-google-plus3:before{content:"\ea8d"}.icon-hangouts:before{content:"\ea8e"}.icon-google-drive:before{content:"\ea8f"}.icon-facebook:before{content:"\ea90"}.icon-facebook2:before{content:"\ea91"}.icon-instagram:before{content:"\ea92"}.icon-whatsapp:before{content:"\ea93"}.icon-spotify:before{content:"\ea94"}.icon-telegram:before{content:"\ea95"}.icon-twitter:before{content:"\ea96"}.icon-vine:before{content:"\ea97"}.icon-vk:before{content:"\ea98"}.icon-renren:before{content:"\ea99"}.icon-sina-weibo:before{content:"\ea9a"}.icon-rss:before{content:"\ea9b"}.icon-rss2:before{content:"\ea9c"}.icon-youtube:before{content:"\ea9d"}.icon-youtube2:before{content:"\ea9e"}.icon-twitch:before{content:"\ea9f"}.icon-vimeo:before{content:"\eaa0"}.icon-vimeo2:before{content:"\eaa1"}.icon-lanyrd:before{content:"\eaa2"}.icon-flickr:before{content:"\eaa3"}.icon-flickr2:before{content:"\eaa4"}.icon-flickr3:before{content:"\eaa5"}.icon-flickr4:before{content:"\eaa6"}.icon-dribbble:before{content:"\eaa7"}.icon-behance:before{content:"\eaa8"}.icon-behance2:before{content:"\eaa9"}.icon-deviantart:before{content:"\eaaa"}.icon-500px:before{content:"\eaab"}.icon-steam:before{content:"\eaac"}.icon-steam2:before{content:"\eaad"}.icon-dropbox:before{content:"\eaae"}.icon-onedrive:before{content:"\eaaf"}.icon-github:before{content:"\eab0"}.icon-npm:before{content:"\eab1"}.icon-basecamp:before{content:"\eab2"}.icon-trello:before{content:"\eab3"}.icon-wordpress:before{content:"\eab4"}.icon-joomla:before{content:"\eab5"}.icon-ello:before{content:"\eab6"}.icon-blogger:before{content:"\eab7"}.icon-blogger2:before{content:"\eab8"}.icon-tumblr:before{content:"\eab9"}.icon-tumblr2:before{content:"\eaba"}.icon-yahoo:before{content:"\eabb"}.icon-yahoo2:before{content:"\eabc"}.icon-tux:before{content:"\eabd"}.icon-appleinc:before{content:"\eabe"}.icon-finder:before{content:"\eabf"}.icon-android:before{content:"\eac0"}.icon-windows:before{content:"\eac1"}.icon-windows8:before{content:"\eac2"}.icon-soundcloud:before{content:"\eac3"}.icon-soundcloud2:before{content:"\eac4"}.icon-skype:before{content:"\eac5"}.icon-reddit:before{content:"\eac6"}.icon-hackernews:before{content:"\eac7"}.icon-wikipedia:before{content:"\eac8"}.icon-linkedin:before{content:"\eac9"}.icon-linkedin2:before{content:"\eaca"}.icon-lastfm:before{content:"\eacb"}.icon-lastfm2:before{content:"\eacc"}.icon-delicious:before{content:"\eacd"}.icon-stumbleupon:before{content:"\eace"}.icon-stumbleupon2:before{content:"\eacf"}.icon-stackoverflow:before{content:"\ead0"}.icon-pinterest:before{content:"\ead1"}.icon-pinterest2:before{content:"\ead2"}.icon-xing:before{content:"\ead3"}.icon-xing2:before{content:"\ead4"}.icon-flattr:before{content:"\ead5"}.icon-foursquare:before{content:"\ead6"}.icon-yelp:before{content:"\ead7"}.icon-paypal:before{content:"\ead8"}.icon-chrome:before{content:"\ead9"}.icon-firefox:before{content:"\eada"}.icon-IE:before{content:"\eadb"}.icon-edge:before{content:"\eadc"}.icon-safari:before{content:"\eadd"}.icon-opera:before{content:"\eade"}.icon-file-pdf:before{content:"\eadf"}.icon-file-openoffice:before{content:"\eae0"}.icon-file-word:before{content:"\eae1"}.icon-file-excel:before{content:"\eae2"}.icon-libreoffice:before{content:"\eae3"}.icon-html-five:before{content:"\eae4"}.icon-html-five2:before{content:"\eae5"}.icon-css3:before{content:"\eae6"}.icon-git:before{content:"\eae7"}.icon-codepen:before{content:"\eae8"}.icon-svg:before{content:"\eae9"}.icon-IcoMoon:before{content:"\eaea"} \ No newline at end of file diff --git a/taoyao-client-web/src/static/css/style.css b/taoyao-client-web/src/static/css/style.css deleted file mode 100644 index f2ce5c2..0000000 --- a/taoyao-client-web/src/static/css/style.css +++ /dev/null @@ -1,36 +0,0 @@ -@charset "UTF-8"; -/**文本选择*/ -::selection{background:#222;color:#fff;} -/**字体大小*/ -@media screen and (min-width:800px){html{font-size:16px;}} -@media screen and (min-width:1200px){html{font-size:18px;}} -@media screen and (min-width:1600px){html{font-size:20px;}} -/**默认样式*/ -*{margin:0;padding:0;border:none;outline:none;box-sizing:content-box;} -html{background:#EBEBEB;} -html,body{font-family:Arial,Consolas,SimSun,"宋体";color:#222;font-weight:normal;} -body{width:100%;height:100%;-webkit-tap-highlight-color:rgba(0,0,0,0);font-size:1rem;line-height:1.4em;} -a{color:#1155AA;text-decoration:none;} -a:link{text-decoration:none;} -a:hover{color:#4477EE;text-decoration:none;} -a:visited{text-decoration:none;} -img{border:0;} -ol,ul,li{list-style:none;} -input[type=text],textarea{box-shadow:0px 0px 3px 0px rgba(0,0,0,0.1) inset;border:1px solid rgba(0,0,0,0.1)!important;} -input[type=text]:focus,textarea:focus,input[type=text]:hover,textarea:hover{border:1px solid #1155AA!important;} -input::-webkit-calendar-picker-indicator{color:#1155AA;background:none;} -/**容器*/ -.taoyao{text-align:center;} -/**会议*/ -.taoyao .handler a{cursor:pointer;} -.taoyao > .handler{font-size:2rem;padding:1rem 0;width:100%;} -.taoyao .list{width:90vw;margin:auto;} -.taoyao .meeting{float:left;overflow:hidden;position:relative;width:calc(25% - 2rem);border:1rem solid #fff;} -.taoyao .me,.taoyao .meeting:hover{border-color:#060;} -.taoyao .meeting > .video{height:15vw;} -.taoyao .meeting > .video video{width:100%;height:100%;} -.taoyao .meeting .handler{position:absolute;bottom:0rem;text-align:center;width:100%;background:rgba(0,0,0,0.2);padding:0.2rem 0;} -.taoyao .meeting .handler a{color:#fff;} -.taoyao .meeting .handler a:hover{color:#060!important;} -.taoyao .meeting .handler a.expel:hover{color:#C00!important;} -.taoyao .meeting .handler a.record.active{color:#C00;} diff --git a/taoyao-client-web/src/static/favicon.ico b/taoyao-client-web/src/static/favicon.ico deleted file mode 100644 index e7cf988..0000000 Binary files a/taoyao-client-web/src/static/favicon.ico and /dev/null differ diff --git a/taoyao-client-web/src/static/index.html b/taoyao-client-web/src/static/index.html deleted file mode 100644 index a0352b8..0000000 --- a/taoyao-client-web/src/static/index.html +++ /dev/null @@ -1,128 +0,0 @@ - - - - -会议 - - - - - - -
-
- - - - - -
-
-
-
- -
-
- - - -
-
-
-
- -
-
- - - - -
-
-
-
- - - \ No newline at end of file diff --git a/taoyao-client-web/src/static/javascript/taoyao.js b/taoyao-client-web/src/taoyao.js similarity index 100% rename from taoyao-client-web/src/static/javascript/taoyao.js rename to taoyao-client-web/src/taoyao.js diff --git a/taoyao-client-web/vite.config.js b/taoyao-client-web/vite.config.js index 7486105..91230d2 100644 --- a/taoyao-client-web/vite.config.js +++ b/taoyao-client-web/vite.config.js @@ -3,7 +3,6 @@ import { fileURLToPath, URL } from "node:url"; import { defineConfig } from "vite"; import vue from "@vitejs/plugin-vue"; -// https://vitejs.dev/config/ export default defineConfig({ plugins: [vue()], server: { @@ -13,5 +12,5 @@ export default defineConfig({ alias: { "@": fileURLToPath(new URL("./src", import.meta.url)), }, - } + }, }); diff --git a/taoyao-media-server/README.md b/taoyao-media-server/README.md index 31c611b..d107103 100644 --- a/taoyao-media-server/README.md +++ b/taoyao-media-server/README.md @@ -20,6 +20,12 @@ make -C worker 默认媒体服务只要暴露媒体`UDP`端口,信令接口不用暴露,所以使用简单鉴权。 +## 动态调节码率 + +``` +参考配置`mediaCodecs` +``` + ## WebRTC协议栈 ``` diff --git a/taoyao-media-server/src/Config.js b/taoyao-media-server/src/Config.js index e0c2699..38703e2 100644 --- a/taoyao-media-server/src/Config.js +++ b/taoyao-media-server/src/Config.js @@ -1,31 +1,33 @@ -/** - * 服务配置 - */ const os = require("os"); +/** + * 配置 + */ module.exports = { // 服务名称 name: "taoyao-media-server", // 交互式命令行 command: true, // 日志级别 - logLevel: 'DEBUG', + logLevel: "DEBUG", // 信令服务 https: { + // 信令服务地址端口 listenIp: process.env.MEDIASOUP_LISTEN_IP || "0.0.0.0", listenPort: process.env.HTTPS_LISTEN_PORT || 4443, - // WebSocket连接密码 + // 信令服务安全配置 username: "taoyao", password: "taoyao", + // 信令服务证书配置 tls: { cert: process.env.HTTPS_CERT_PUBLIC_KEY || `${__dirname}/certs/publicKey.pem`, key: process.env.HTTPS_CERT_PRIVATE_KEY || `${__dirname}/certs/privateKey.pem`, - } + }, }, // Mediasoup mediasoup: { - // 按照CPU数量配置进程数量 - numWorkers: Object.keys(os.cpus()).length, + // 配置Worker进程数量 + workerSize: Object.keys(os.cpus()).length, // Worker:https://mediasoup.org/documentation/v3/mediasoup/api/#WorkerSettings workerSettings: { logLevel: "info", @@ -42,10 +44,10 @@ module.exports = { "srtp", "score", "message", - "simulcast" + "simulcast", ], rtcMinPort: process.env.MEDIASOUP_MIN_PORT || 40000, - rtcMaxPort: process.env.MEDIASOUP_MAX_PORT || 49999 + rtcMaxPort: process.env.MEDIASOUP_MAX_PORT || 49999, }, // Router:https://mediasoup.org/documentation/v3/mediasoup/api/#RouterOptions routerOptions: { @@ -54,7 +56,7 @@ module.exports = { kind: "audio", mimeType: "audio/opus", clockRate: 48000, - channels: 2 + channels: 2, }, { kind: "video", @@ -62,7 +64,7 @@ module.exports = { clockRate: 90000, parameters: { "x-google-start-bitrate": 1000, - } + }, }, { kind: "video", @@ -70,8 +72,8 @@ module.exports = { clockRate: 90000, parameters: { "profile-id": 2, - "x-google-start-bitrate": 1000 - } + "x-google-start-bitrate": 1000, + }, }, { kind: "video", @@ -81,8 +83,8 @@ module.exports = { "packetization-mode": 1, "profile-level-id": "4d0032", "level-asymmetry-allowed": 1, - "x-google-start-bitrate": 1000 - } + "x-google-start-bitrate": 1000, + }, }, { kind: "video", @@ -92,10 +94,10 @@ module.exports = { "packetization-mode": 1, "profile-level-id": "42e01f", "level-asymmetry-allowed": 1, - "x-google-start-bitrate": 1000 - } - } - ] + "x-google-start-bitrate": 1000, + }, + }, + ], }, // WebRtcServer:https://mediasoup.org/documentation/v3/mediasoup/api/#WebRtcServerOptions webRtcServerOptions: { @@ -105,16 +107,16 @@ module.exports = { ip: process.env.MEDIASOUP_LISTEN_IP || "0.0.0.0", port: 44444, // 公网地址 - announcedIp: process.env.MEDIASOUP_ANNOUNCED_IP + announcedIp: process.env.MEDIASOUP_ANNOUNCED_IP, }, { protocol: "tcp", ip: process.env.MEDIASOUP_LISTEN_IP || "0.0.0.0", port: 44444, // 公网地址 - announcedIp: process.env.MEDIASOUP_ANNOUNCED_IP - } - ] + announcedIp: process.env.MEDIASOUP_ANNOUNCED_IP, + }, + ], }, // WebRtcTransport:https://mediasoup.org/documentation/v3/mediasoup/api/#WebRtcTransportOptions webRtcTransportOptions: { @@ -122,13 +124,13 @@ module.exports = { { ip: process.env.MEDIASOUP_LISTEN_IP || "0.0.0.0", // 公网地址 - announcedIp: process.env.MEDIASOUP_ANNOUNCED_IP - } + announcedIp: process.env.MEDIASOUP_ANNOUNCED_IP, + }, ], initialAvailableOutgoingBitrate: 1000000, minimumAvailableOutgoingBitrate: 600000, maxSctpMessageSize: 262144, - maxIncomingBitrate: 1500000 + maxIncomingBitrate: 1500000, }, // PlainTransport:https://mediasoup.org/documentation/v3/mediasoup/api/#PlainTransportOptions plainTransportOptions: { @@ -137,8 +139,8 @@ module.exports = { // 公网地址 announcedIp: process.env.MEDIASOUP_ANNOUNCED_IP, }, - maxSctpMessageSize: 262144 - } + maxSctpMessageSize: 262144, + }, }, wellcome: ` @@ -154,5 +156,5 @@ module.exports = {

taoyao-media-server

acgist

- ` + `, }; diff --git a/taoyao-media-server/src/Logger.js b/taoyao-media-server/src/Logger.js index 98d6ede..de09982 100644 --- a/taoyao-media-server/src/Logger.js +++ b/taoyao-media-server/src/Logger.js @@ -1,93 +1,93 @@ +const moment = require("moment"); +const config = require("./Config"); + /** * 日志 */ -const moment = require('moment') -const config = require("./Config"); - class Logger { // 名称 name = config.name; // 级别 - level = [ "DEBUG", "INFO", "WARN", "ERROR", "OFF" ]; + level = ["DEBUG", "INFO", "WARN", "ERROR", "OFF"]; // 级别索引 levelIndex = this.level.indexOf(config.logLevel.toUpperCase()); constructor(prefix) { if (prefix) { - this.name = this.name + ':' + prefix; + this.name = this.name + " : " + prefix; } } /** * debug - * + * * @param {...any} args 参数 - * + * * @returns this */ debug(...args) { - return this.log(console.debug, '37m', 'DEBUG', args); + return this.log(console.debug, "37m", "DEBUG", args); } - + /** * info - * + * * @param {...any} args 参数 - * + * * @returns this */ info(...args) { - return this.log(console.info, '32m', 'INFO', args); + return this.log(console.info, "32m", "INFO", args); } /** * warn - * + * * @param {...any} args 参数 - * + * * @returns this */ warn(...args) { - return this.log(console.warn, '33m', 'WARN', args); + return this.log(console.warn, "33m", "WARN", args); } /** * error - * + * * @param {...any} args 参数 - * + * * @returns this */ error(...args) { - return this.log(console.error, '31m', 'ERROR', args); + return this.log(console.error, "31m", "ERROR", args); } /** * 日志 - * - * @param {*} out 输出位置 + * + * @param {*} out 输出 * @param {*} color 颜色 * @param {*} level 级别 * @param {*} args 参数 - * + * * @returns this */ log(out, color, level, args) { - if(!args || this.level.indexOf(level) < this.levelIndex) { + if (!args || this.level.indexOf(level) < this.levelIndex) { return this; } - if(args.length > 1 && args[0].length > 0) { - out(`\x1B[${color}${this.name} ${moment().format('yyyy-MM-DD HH:mm:ss')} : [${level.padEnd(5, ' ')}] : ${args[0]}\x1B[0m`, ...args.slice(1)); - } else if(args.length === 1 && args[0].length > 0) { - out(`\x1B[${color}${this.name} ${moment().format('yyyy-MM-DD HH:mm:ss')} : [${level.padEnd(5, ' ')}] : ${args[0]}\x1B[0m`); + if (args.length > 1 && args[0].length > 0) { + out(`\x1B[${color}${this.name} ${moment().format("yyyy-MM-DD HH:mm:ss")} : [${level.padEnd(5, " ")}] :\x1B[0m`, args); + } else if (args.length === 1 && args[0].length > 0) { + out(`\x1B[${color}${this.name} ${moment().format("yyyy-MM-DD HH:mm:ss")} : [${level.padEnd(5, " ")}] :\x1B[0m`, args); } else { // 其他情况直接输出换行 out(""); } return this; } - + } module.exports = Logger; diff --git a/taoyao-media-server/src/Server.js b/taoyao-media-server/src/Server.js index 63eddfa..e50e6e1 100644 --- a/taoyao-media-server/src/Server.js +++ b/taoyao-media-server/src/Server.js @@ -1,11 +1,9 @@ #!/usr/bin/env node -/** - * 服务 - */ + const fs = require("fs"); const ws = require("ws"); const https = require("https"); -const mediasoup = require("mediasoup"); +// const mediasoup = require("mediasoup"); const config = require("./Config"); const Logger = require("./Logger"); const Signal = require("./Signal"); @@ -22,16 +20,16 @@ const signal = new Signal(); const client = []; // Mediasoup Worker列表 const mediasoupWorker = []; - +// 配置名称 process.title = config.name; /** * 启动Mediasoup Worker */ async function buildMediasoupWorker() { - const { numWorkers } = config.mediasoup; - logger.info("启动Mediasoup Worker(%d)...", numWorkers); - for (let i = 0; i < numWorkers; i++) { + const { workerSize } = config.mediasoup; + logger.info("启动Mediasoup Worker", workerSize); + for (let i = 0; i < workerSize; i++) { // 新建Worker const worker = await mediasoup.createWorker({ logLevel: config.mediasoup.workerSettings.logLevel, @@ -41,10 +39,7 @@ async function buildMediasoupWorker() { }); // 监听Worker事件 worker.on("died", () => { - logger.error( - "Mediasoup Worker停止服务(两秒之后自动退出)... [PID:%d]", - worker.pid - ); + logger.warn("Mediasoup Worker停止服务", worker.pid); setTimeout(() => process.exit(1), 2000); }); // 加入Worker队列 @@ -53,7 +48,9 @@ async function buildMediasoupWorker() { if (process.env.MEDIASOUP_USE_WEBRTC_SERVER !== "false") { // 配置Worker端口 const portIncrement = mediasoupWorker.length - 1; - const webRtcServerOptions = JSON.parse(JSON.stringify(config.mediasoup.webRtcServerOptions)); + const webRtcServerOptions = JSON.parse( + JSON.stringify(config.mediasoup.webRtcServerOptions) + ); for (const listenInfo of webRtcServerOptions.listenInfos) { listenInfo.port += portIncrement; } @@ -64,7 +61,7 @@ async function buildMediasoupWorker() { // 定时记录使用日志 setInterval(async () => { const usage = await worker.getResourceUsage(); - logger.info("Mediasoup Worker使用情况 [pid:%d]: %o", worker.pid, usage); + logger.info("Mediasoup Worker使用情况", worker.pid, usage); }, 120 * 1000); } } @@ -75,28 +72,33 @@ async function buildMediasoupWorker() { async function buildSignalServer() { const tls = { cert: fs.readFileSync(config.https.tls.cert), - key: fs.readFileSync(config.https.tls.key), + key: fs.readFileSync(config.https.tls.key), }; - logger.info("配置HTTPS服务..."); + // 配置HTTPS httpsServer = https.createServer(tls, (request, response) => { response.writeHead(200); response.end(config.wellcome); }); - logger.info("配置WebSocket服务..."); + // 配置WebSocket webSocketServer = new ws.Server({ server: httpsServer }); webSocketServer.on("connection", (session) => { - logger.info("打开信令通道: %s", session._socket.remoteAddress); - session.datetime = new Date().getTime(); + logger.info("打开信令通道", session._socket.remoteAddress); + session.datetime = Date.now(); session.authorize = false; client.push(session); session.on("close", (code) => { - logger.info("关闭信令通道: %o", code); + logger.info("关闭信令通道", session._socket.remoteAddress, code); }); session.on("error", (error) => { - logger.error("信令通道异常: %o", error); + logger.error("信令通道异常", session._socket.remoteAddress, error); }); session.on("message", (message) => { - onmessage(message, session); + logger.debug("处理信令消息", message); + try { + signal.on(JSON.parse(message), session); + } catch (error) { + logger.error("处理信令消息异常", message, error); + } }); }); // 打开监听 @@ -109,11 +111,32 @@ async function buildSignalServer() { ); } +/** + * 定时清理无效信令终端 + */ +async function buildClientInterval() { + setInterval(() => { + const datetime = Date.now(); + const oldLength = client.length; + for (let i = 0; i < client.length; i++) { + const session = client[i]; + // 超过五秒自动关闭 + if (datetime - session.datetime >= 5000) { + client.splice(i, 1); + session.close(); + i--; + } + } + const newLength = client.length; + logger.info("定时清理无效信令终端", oldLength - newLength); + }, 60 * 1000); +} + /** * 交互式控制台 */ - async function buildCommandConsole() { - if(!config.command) { +async function buildCommandConsole() { + if (!config.command) { return; } process.stdin.setEncoding("UTF-8"); @@ -132,7 +155,7 @@ async function buildSignalServer() { case "": default: { logger.warn(`未知命令:'${command}'`); - logger.info("查询命令:`h` | `help`"); + logger.info("查询命令:'h' | 'help'"); break; } } @@ -141,82 +164,17 @@ async function buildSignalServer() { }); } -/** - * 定时清理无效信令终端 - */ -async function buildClientInterval() { - setInterval(() => { - const datetime = new Date().getTime(); - const oldLength = client.length; - for (let i = 0; i < client.length; i++) { - const session = client[i]; - // 超过五秒自动关闭 - if (datetime - session.datetime >= 5000) { - client.splice(i, 1); - session.close(); - i--; - } - } - const newLength = client.length; - logger.info("定时清理无效信令终端:%d", oldLength - newLength); - }, 60 * 1000); -} - -/** - * 处理信令消息 - * - * @param {*} message 消息 - * @param {*} session websocket - */ -async function onmessage(message, session) { - try { - const data = JSON.parse(message); - // 授权验证 - if (!session.authorize) { - if ( - data.body.username === config.https.username && - data.body.password === config.https.password - ) { - logger.debug("授权成功:%s", session._socket.remoteAddress); - session.authorize = true; - data.code = "0000"; - data.message = "授权成功"; - data.body.username = null; - data.body.password = null; - session.send(JSON.stringify(data)); - } else { - logger.warn("授权失败:%s", session._socket.remoteAddress); - data.code = "3401"; - data.message = "授权失败"; - session.send(JSON.stringify(data)); - } - return; - } - // 处理信令 - logger.debug("处理信令消息: %s", message); - signal.on(data, session); - } catch (error) { - logger.error( - `处理信令消息异常: - %s - %o`, - message, - error - ); - } -} - /** * 启动方法 */ async function main() { logger.debug("DEBUG").info("INFO").warn("WARN").error("ERROR"); - logger.info("开始启动:%s", config.name); - await buildMediasoupWorker(); + logger.info("开始启动", config.name); + // await buildMediasoupWorker(); await buildSignalServer(); - await buildCommandConsole(); await buildClientInterval(); - logger.info("启动完成:%s", config.name); + await buildCommandConsole(); + logger.info("启动完成", config.name); } // 启动服务 diff --git a/taoyao-media-server/src/Signal.js b/taoyao-media-server/src/Signal.js index fdc623c..a857f2a 100644 --- a/taoyao-media-server/src/Signal.js +++ b/taoyao-media-server/src/Signal.js @@ -1,10 +1,14 @@ +const Logger = require("./Logger"); + /** * 信令 - * 1. 终端媒体流向 - * 2. 处理音频视频:降噪、水印等等 */ class Signal { + // 信令终端列表 + client = []; + // 日志 + logger = new Logger(); // Mediasoup Worker列表 mediasoupWorker = []; // Mediasoup Worker索引 @@ -21,7 +25,59 @@ class Signal { * @param {*} session websocket */ on(message, session) { + // 授权验证 + if (!session.authorize) { + if ( + message?.header?.signal === "media::register" && + message?.body?.username === config.https.username && + message?.body?.password === config.https.password + ) { + this.logger.debug("授权成功", session._socket.remoteAddress); + client.push(session); + session.authorize = true; + message.code = "0000"; + message.message = "授权成功"; + message.body.username = null; + message.body.password = null; + } else { + this.logger.warn("授权失败", session._socket.remoteAddress); + message.code = "3401"; + message.message = "授权失败"; + } + this.push(message, session); + return; + } + // 处理信令 + switch (message.header.signal) { + } + } + /** + * 通知信令 + * + * @param {*} message 消息 + * @param {*} session websocket + */ + push(message, session) { + try { + session.send(JSON.stringify(message)); + } catch (error) { + logger.error( + "通知信令失败", + session._socket.remoteAddress, + message, + error + ); + } + } + + /** + * 通知信令 + * + * @param {*} message 消息 + */ + push(message) { + this.client.forEach((session) => this.push(message, session)); } } diff --git a/taoyao-signal-server/README.md b/taoyao-signal-server/README.md index 8a5f76a..e398d7e 100644 --- a/taoyao-signal-server/README.md +++ b/taoyao-signal-server/README.md @@ -7,8 +7,8 @@ |taoyao|桃夭|桃之夭夭灼灼其华| |taoyao-boot|基础|基础模块| |taoyao-node|集群|集群模块(可选)| -|taoyao-signal|信令|信令服务| -|taoyao-server|服务|启动服务| +|taoyao-signal|信令|信令模块| +|taoyao-server|服务|启动模块| ## 模式 diff --git a/taoyao-signal-server/pom.xml b/taoyao-signal-server/pom.xml index 46e8ffb..df97784 100644 --- a/taoyao-signal-server/pom.xml +++ b/taoyao-signal-server/pom.xml @@ -23,9 +23,9 @@ 17 - 1.18.24 - 2.0.0 - 1.5.3.Final + 1.18.26 + 2.0.2 + 1.5.2.Final 4.4 ${project.basedir} @@ -88,7 +88,8 @@ org.springframework.boot spring-boot-starter-logging - + + org.springframework.boot spring-boot-starter-test diff --git a/taoyao-signal-server/taoyao-boot/pom.xml b/taoyao-signal-server/taoyao-boot/pom.xml index 2a9513c..cdb56c6 100644 --- a/taoyao-signal-server/taoyao-boot/pom.xml +++ b/taoyao-signal-server/taoyao-boot/pom.xml @@ -14,7 +14,7 @@ jar taoyao-boot - 启动模块:启动模块 + 启动模块:基础模块 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 new file mode 100644 index 0000000..3e22ca9 --- /dev/null +++ b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/annotation/Client.java @@ -0,0 +1,22 @@ +package com.acgist.taoyao.boot.annotation; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +import org.springframework.stereotype.Component; + +/** + * 终端 + * + * @author acgist + */ +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.RUNTIME) +@Component +@Documented +public @interface Client { + +} 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 cd23fe1..b4465b1 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 @@ -50,6 +50,7 @@ import com.acgist.taoyao.boot.controller.TaoyaoErrorController; import com.acgist.taoyao.boot.model.MessageCode; import com.acgist.taoyao.boot.property.IdProperties; import com.acgist.taoyao.boot.property.MediaProperties; +import com.acgist.taoyao.boot.property.ScriptProperties; import com.acgist.taoyao.boot.property.SecurityProperties; import com.acgist.taoyao.boot.property.TaoyaoProperties; import com.acgist.taoyao.boot.property.WebrtcProperties; @@ -77,7 +78,14 @@ import lombok.extern.slf4j.Slf4j; @Configuration @EnableScheduling @EnableAspectJAutoProxy(exposeProxy = false) -@EnableConfigurationProperties({ IdProperties.class, MediaProperties.class, TaoyaoProperties.class, WebrtcProperties.class, SecurityProperties.class }) +@EnableConfigurationProperties({ + IdProperties.class, + MediaProperties.class, + ScriptProperties.class, + TaoyaoProperties.class, + WebrtcProperties.class, + SecurityProperties.class +}) public class BootAutoConfiguration { @Value("${spring.application.name:taoyao}") @@ -195,6 +203,7 @@ 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/model/Header.java b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/model/Header.java index 73d52fb..a41c9ea 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 @@ -43,6 +43,6 @@ public class Header implements Serializable { * 协议标识 */ @Schema(title = "协议标识", description = "协议标识") - private Integer pid; + private String signal; } diff --git a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/property/MediaProperties.java b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/property/MediaProperties.java index 1f34570..7981055 100644 --- a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/property/MediaProperties.java +++ b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/property/MediaProperties.java @@ -47,5 +47,10 @@ public class MediaProperties { */ @Schema(title = "流畅视频", description = "流畅视频") private MediaVideoProperties flowVideo; + /** + * 录像存放路径 + */ + @Schema(title = "录像存放路径", description = "录像存放路径") + private String recordStoragePath; } 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 d1bfcf8..6e44eef 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,7 +7,7 @@ import lombok.Getter; import lombok.Setter; /** - * Mediasoup配置 + * 媒体终端配置 * * @author acgist */ @@ -16,6 +16,11 @@ import lombok.Setter; @Schema(title = "Mediasoup配置", description = "Mediasoup配置") public class MediasoupProperties { + /** + * Mediasoup名称 + */ + @Schema(title = "Mediasoup名称", description = "Mediasoup名称") + private String name; /** * Mediasoup主机 */ diff --git a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/property/ScriptProperties.java b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/property/ScriptProperties.java new file mode 100644 index 0000000..7161edf --- /dev/null +++ b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/property/ScriptProperties.java @@ -0,0 +1,135 @@ +package com.acgist.taoyao.boot.property; + +import java.util.Map; + +import org.apache.commons.lang3.ArrayUtils; +import org.springframework.boot.context.properties.ConfigurationProperties; + +import jakarta.annotation.PostConstruct; +import lombok.Getter; +import lombok.Setter; +import lombok.extern.slf4j.Slf4j; + +/** + * 脚本配置 + * + * @author acgist + */ +@Slf4j +@Getter +@Setter +@ConfigurationProperties(prefix = "taoyao.script") +public class ScriptProperties { + + /** + * 系统类型 + * + * @author acgist + */ + public enum SystemType { + + /** + * Mac + */ + MAC("Mac OS", "Mac OS X"), + /** + * Linux + */ + LINUX("Linux"), + /** + * Windows + */ + WINDOWS("Windows XP", "Windows Vista", "Windows 7", "Windows 10", "Windows 11"), + /** + * Android + */ + ANDROID("Android"); + + /** + * 系统名称 + */ + private final String[] osNames; + + /** + * @param osNames 系统名称 + */ + private SystemType(String ... osNames) { + this.osNames = osNames; + } + + /** + * @param osName 系统名称 + * + * @return 系统类型 + */ + private static final SystemType of(String osName) { + final SystemType[] values = SystemType.values(); + for (SystemType value : values) { + if(ArrayUtils.contains(value.osNames, osName)) { + return value; + } + } + return SystemType.LINUX; + } + + } + + /** + * Linux脚本 + */ + private Map linux; + /** + * Windows脚本 + */ + private Map windows; + /** + * 重启媒体服务 + */ + private String mediaReboot; + /** + * 关闭媒体服务 + */ + private String mediaShutdown; + /** + * 重启系统 + */ + private String systemReboot; + /** + * 关闭系统 + */ + private String systemShutdown; + /** + * 重启平台 + */ + private String platformReboot; + /** + * 关闭平台 + */ + private String platformShutdown; + + @PostConstruct + public void init() { + final String osName = System.getProperty("os.name"); + final SystemType type = SystemType.of(osName); + switch (type) { + case LINUX -> this.set(this.linux); + case WINDOWS -> this.set(this.windows); + default -> log.error("没有配置系统脚本:{}", type); + } + } + + /** + * 配置脚本 + * + * @param map 脚本 + */ + private void set(Map map) { + this.mediaReboot = map.get("media-reboot"); + this.mediaShutdown = map.get("media-shutdown"); + this.systemReboot = map.get("system-reboot"); + this.systemShutdown = map.get("system-shutdown"); + this.platformReboot = map.get("platform-reboot"); + this.platformShutdown = map.get("platform-shutdown"); + } + +} diff --git a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/property/SignalProperties.java b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/property/SignalProperties.java deleted file mode 100644 index 1824c73..0000000 --- a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/property/SignalProperties.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.acgist.taoyao.boot.property; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Getter; -import lombok.Setter; - -/** - * 信令配置 - * - * @author acgist - */ -@Getter -@Setter -@Schema(title = "信令配置", description = "信令配置") -public class SignalProperties { - - /** - * 信令主机 - */ - @Schema(title = "信令主机", description = "信令主机") - private String host; - /** - * 信令端口 - */ - @Schema(title = "信令端口", description = "信令端口") - private Integer port; - /** - * 信令协议 - */ - @Schema(title = "信令协议", description = "信令协议") - private String schema; - /** - * 信令地址 - */ - @Schema(title = "信令地址", description = "信令地址") - private String websocket; - - /** - * @return 完整信令地址 - */ - @Schema(title = "完整信令地址", description = "完整信令地址") - public String getAddress() { - return this.schema + "://" + this.host + ":" + this.port + this.websocket; - } - -} diff --git a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/property/TaoyaoProperties.java b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/property/TaoyaoProperties.java index 9666856..cc77751 100644 --- a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/property/TaoyaoProperties.java +++ b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/property/TaoyaoProperties.java @@ -26,11 +26,22 @@ public class TaoyaoProperties { */ @Schema(title = "项目名称", description = "项目名称") private String name; + /** + * 服务节点ID + * 集群使用 + */ + @Schema(title = "服务节点ID", description = "服务节点ID") + private String nodeId; /** * 超时时间 */ @Schema(title = "超时时间", description = "超时时间") private Long timeout; + /** + * 最大超时时间 + */ + @Schema(title = "最大超时时间", description = "最大超时时间") + private Long maxTimeout; /** * 项目版本 */ @@ -41,11 +52,5 @@ public class TaoyaoProperties { */ @Schema(title = "项目描述", description = "项目描述") private String description; - /** - * 服务节点ID - * 集群使用 - */ - @Schema(title = "服务节点ID", description = "服务节点ID") - private String serverId; } 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 0c491b8..0f5a149 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 @@ -19,29 +19,6 @@ import lombok.Setter; @ConfigurationProperties(prefix = "taoyao.webrtc") public class WebrtcProperties { - /** - * 架构模型 - * - * @author acgist - */ - public enum Framework { - - /** - * MESH架构 - */ - MESH, - /** - * MOON架构 - */ - MOON; - - } - - /** - * 模型 - */ - @Schema(title = "架构模型", description = "WebRTC架构模型") - private Framework framework; /** * 媒体最小端口 */ @@ -62,11 +39,6 @@ public class WebrtcProperties { */ @Schema(title = "turn服务器", description = "turn服务器") private String[] turn; - /** - * 信令配置 - */ - @Schema(title = "信令配置", description = "信令配置") - private SignalProperties signal; /** * Mediasoup配置 */ diff --git a/taoyao-signal-server/taoyao-node/README.md b/taoyao-signal-server/taoyao-node/README.md index c63cbcf..876942c 100644 --- a/taoyao-signal-server/taoyao-node/README.md +++ b/taoyao-signal-server/taoyao-node/README.md @@ -3,4 +3,4 @@ ## 实现逻辑 1. 集群启动时加载所有节点,同步节点信息,定时监测节点状态。 -2. 设备注册同步设备信息到直连节点,其他信令处理完成以后在发送设备时分发。 +2. 集群同步媒体节点,终端通过代理连接不同信令节点。 diff --git a/taoyao-signal-server/taoyao-node/pom.xml b/taoyao-signal-server/taoyao-node/pom.xml index d15f648..9299546 100644 --- a/taoyao-signal-server/taoyao-node/pom.xml +++ b/taoyao-signal-server/taoyao-node/pom.xml @@ -14,7 +14,7 @@ jar taoyao-node - 集群服务:集群服务 + 集群服务:集群模块 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 index fdcab9f..ce2e85b 100644 --- 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 @@ -5,7 +5,7 @@ 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.ShutdownListener; +import com.acgist.taoyao.node.listener.platform.NodeShutdownListener; /** * 集群自动配置 @@ -18,9 +18,8 @@ public class NodeAutoConfiguration { @Bean @ConditionalOnMissingBean - public ShutdownListener shutdownListener() { - return new ShutdownListener(); + 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 new file mode 100644 index 0000000..7a9a3be --- /dev/null +++ b/taoyao-signal-server/taoyao-node/src/main/java/com/acgist/taoyao/node/listener/platform/NodeShutdownListener.java @@ -0,0 +1,20 @@ +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/java/com/acgist/taoyao/node/listener/platform/ShutdownListener.java b/taoyao-signal-server/taoyao-node/src/main/java/com/acgist/taoyao/node/listener/platform/ShutdownListener.java deleted file mode 100644 index 83802a9..0000000 --- a/taoyao-signal-server/taoyao-node/src/main/java/com/acgist/taoyao/node/listener/platform/ShutdownListener.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.acgist.taoyao.node.listener.platform; - -import com.acgist.taoyao.signal.event.platform.ShutdownEvent; -import com.acgist.taoyao.signal.listener.ApplicationListenerAdapter; - -/** - * 关闭服务监听 - * - * @author acgist - */ -public class ShutdownListener extends ApplicationListenerAdapter { - - @Override - public void onApplicationEvent(ShutdownEvent event) { - // TODO:关闭 - } - -} diff --git a/taoyao-signal-server/taoyao-server/pom.xml b/taoyao-signal-server/taoyao-server/pom.xml index 6e3605b..d4851c6 100644 --- a/taoyao-signal-server/taoyao-server/pom.xml +++ b/taoyao-signal-server/taoyao-server/pom.xml @@ -14,7 +14,7 @@ jar taoyao-server - 启动服务:启动服务 + 启动服务:启动模块 ${project.parent.basedir} diff --git a/taoyao-signal-server/taoyao-server/src/main/resources/application-release.yml b/taoyao-signal-server/taoyao-server/src/main/resources/application-release.yml index e69de29..c0d2200 100644 --- a/taoyao-signal-server/taoyao-server/src/main/resources/application-release.yml +++ b/taoyao-signal-server/taoyao-server/src/main/resources/application-release.yml @@ -0,0 +1,4 @@ +taoyao: + script: + enabled: false + \ 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 28ed0fd..9e78c50 100644 --- a/taoyao-signal-server/taoyao-server/src/main/resources/application.yml +++ b/taoyao-signal-server/taoyao-server/src/main/resources/application.yml @@ -22,7 +22,7 @@ spring: profiles: active: dev application: - name: taoyao-server + name: taoyao-signal-server servlet: multipart: max-file-size: 256MB @@ -48,11 +48,12 @@ spring: thread-name-prefix: ${spring.application.name}-scheduling- taoyao: url: https://gitee.com/acgist/taoyao - name: 桃夭 + name: 桃夭信令服务 + node-id: 1 timeout: 5000 + max-timeout: 120000 version: 1.0.0 - description: WebRTC信令服务 - server-id: 1 + description: 桃夭WebRTC信令服务 id: sn: 0 max-index: 999999 @@ -91,6 +92,8 @@ taoyao: bitrate: 600 frame-rate: 16 resolution: 640*480 + # 录像配置 + record-storage-path: /data/record # WebRTC配置 webrtc: # STUN服务 @@ -99,37 +102,30 @@ taoyao: - stun:stun2.l.google.com:19302 - stun:stun3.l.google.com:19302 - stun:stun4.l.google.com:19302 - # TURN服务:coturn + # TURN服务 turn: - turn:127.0.0.1:8888 - turn:127.0.0.1:8888 - turn:127.0.0.1:8888 - turn:127.0.0.1:8888 - # 信令服务配置 - signal: - host: 192.168.1.100 - port: ${server.port:8888} - schema: wss - websocket: /websocket.signal - # Mediasoup服务配置:可以部署多个简单实现负载均衡 + # 媒体配置 mediasoup-list: - - host: 127.0.0.1 + - name: mediasoup-local-a + host: localhost #host: 192.168.8.110 port: 4443 schema: wss websocket: /websocket.signal username: taoyao password: taoyao - - host: 127.0.0.1 + - name: mediasoup-local-z + host: localhost #host: 192.168.8.110 port: 4443 schema: wss websocket: /websocket.signal username: taoyao password: taoyao - # 录像配置 - record: - storage: /data/record # 安全配置 security: enabled: true @@ -140,10 +136,30 @@ taoyao: # 定时任务 scheduled: session: 0 * * * * ? - # 集群节点 - node-list: - - host: localhost - port: 8888 - username: ${taoyao.security.username:taoyao} - password: ${taoyao.security.username:taoyao} - \ No newline at end of file + # 集群配置 + node: + enabled: false + # 节点列表 + node-list: + - host: localhost + port: 8888 + username: ${taoyao.security.username:taoyao} + password: ${taoyao.security.username:taoyao} + # 脚本配置 + script: + # Linux + linux: + media-reboot: pm2 restart taoyao-media-server + media-shutdown: pm2 stop taoyao-media-server + system-reboot: reboot + system-shutdown: shutdown now + platform-reboot: systemctl restart taoyao-signal-server + platform-shutdown: systemctl stop taoyao-signal-server + # Windows + windows: + media-reboot: pm2 restart taoyao-media-server + media-shutdown: pm2 stop taoyao-media-server + system-reboot: shutdown -s -t 0 + system-shutdown: shutdown -r -t 0 + platform-reboot: net restart taoyao-signal-server + platform-shutdown: net stop taoyao-signal-server diff --git a/taoyao-signal-server/taoyao-server/src/test/java/com/acgist/taoyao/signal/protocol/ScriptProtocolTest.java b/taoyao-signal-server/taoyao-server/src/test/java/com/acgist/taoyao/signal/protocol/PlatformScriptProtocolTest.java similarity index 57% rename from taoyao-signal-server/taoyao-server/src/test/java/com/acgist/taoyao/signal/protocol/ScriptProtocolTest.java rename to taoyao-signal-server/taoyao-server/src/test/java/com/acgist/taoyao/signal/protocol/PlatformScriptProtocolTest.java index 7a62826..81d2fdb 100644 --- a/taoyao-signal-server/taoyao-server/src/test/java/com/acgist/taoyao/signal/protocol/ScriptProtocolTest.java +++ b/taoyao-signal-server/taoyao-server/src/test/java/com/acgist/taoyao/signal/protocol/PlatformScriptProtocolTest.java @@ -8,19 +8,21 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import com.acgist.taoyao.annotation.TaoyaoTest; +import com.acgist.taoyao.boot.model.Message; import com.acgist.taoyao.main.TaoyaoApplication; -import com.acgist.taoyao.signal.protocol.platform.ScriptProtocol; +import com.acgist.taoyao.signal.protocol.platform.PlatformScriptProtocol; @TaoyaoTest(classes = TaoyaoApplication.class) -class ScriptProtocolTest { +class PlatformScriptProtocolTest { @Autowired - private ScriptProtocol scriptProtocol; + private PlatformScriptProtocol platformScriptProtocol; @Test void testScript() { assertDoesNotThrow(() -> { - this.scriptProtocol.execute(null, Map.of("script", "netstat -ano"), null, null); + this.platformScriptProtocol.execute("taoyao", Map.of("script", "netstat -ano"), Message.success(), null); + Thread.sleep(1000); }); } diff --git a/taoyao-signal-server/taoyao-server/src/test/java/com/acgist/taoyao/signal/protocol/ShutdownProtocolTest.java b/taoyao-signal-server/taoyao-server/src/test/java/com/acgist/taoyao/signal/protocol/PlatformShutdownProtocolTest.java similarity index 58% rename from taoyao-signal-server/taoyao-server/src/test/java/com/acgist/taoyao/signal/protocol/ShutdownProtocolTest.java rename to taoyao-signal-server/taoyao-server/src/test/java/com/acgist/taoyao/signal/protocol/PlatformShutdownProtocolTest.java index 1a17b53..6587b94 100644 --- a/taoyao-signal-server/taoyao-server/src/test/java/com/acgist/taoyao/signal/protocol/ShutdownProtocolTest.java +++ b/taoyao-signal-server/taoyao-server/src/test/java/com/acgist/taoyao/signal/protocol/PlatformShutdownProtocolTest.java @@ -6,19 +6,21 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import com.acgist.taoyao.annotation.TaoyaoTest; +import com.acgist.taoyao.boot.model.Message; import com.acgist.taoyao.main.TaoyaoApplication; -import com.acgist.taoyao.signal.protocol.platform.ShutdownProtocol; +import com.acgist.taoyao.signal.protocol.platform.PlatformShutdownProtocol; @TaoyaoTest(classes = TaoyaoApplication.class) -class ShutdownProtocolTest { +class PlatformShutdownProtocolTest { @Autowired - private ShutdownProtocol shutdownProtocol; + private PlatformShutdownProtocol platformShutdownProtocol; @Test void testShutdown() { assertDoesNotThrow(() -> { - this.shutdownProtocol.execute("taoyao", null, null); + this.platformShutdownProtocol.execute("taoyao", Message.success(), null); + Thread.sleep(1000); }); } diff --git a/taoyao-signal-server/taoyao-signal/README.md b/taoyao-signal-server/taoyao-signal/README.md index 6e15dee..b794196 100644 --- a/taoyao-signal-server/taoyao-signal/README.md +++ b/taoyao-signal-server/taoyao-signal/README.md @@ -8,7 +8,7 @@ "v": "版本", "id": 请求标识, "sn": "设备标识" - "pid": 信令标识, + "signal": "信令标识", }, "code": "响应编码", "message": "响应描述", @@ -18,269 +18,294 @@ } ``` +### 术语解释 + +``` +请求:终端->信令服务 || 信令服务->媒体服务 +响应:信令服务->终端 || 服务媒体->信令服务 +广播:信令服务-)终端 || 信令服务+)终端 +``` + ### 符号解释 ``` --> 单播:定向传播信令 --) 广播:广播信令(排除自己) -+) 全员广播:广播信令(包含自己) +-[消息类型]> 请求(单播):定向请求(单播)信令 +-[消息类型]) 全员广播:对所有的终端广播信令(排除自己) ++[消息类型]) 全员广播:对所有的终端广播信令(包含自己) ``` -## 平台信令(1000~1999) - -### 关闭服务信令(1000) - -#### 消息主体 - -``` -# 请求 -{} -# 广播 -{} -``` - -#### 消息流程:终端->服务端+)终端 - -全员广播[关闭服务信令](#关闭服务信令1000),然后关闭信令服务。 - -### 执行命令信令(1001) - -#### 消息主体 - -``` -# 请求 -{ - "script": "命令" -} -# 响应 -{ - "result": "结果" -} -``` - -#### 消息流程:终端->服务端->终端 - -执行命令同时响应结果 - -### 异常信令(1999) - -#### 消息主体 - -``` -{} -``` +> 注意:没有消息类型表示请求类型 ## 终端信令(2000~2999) ### 终端信息 -### 终端注册信令(2000) +### 终端注册信令(client::register) -#### 消息主体 +终端注册成功响应以后[下发配置信令](#下发配置信令2004)同时广播[终端上线信令](#终端上线信令2002)。 ``` -# 请求 +# 请求主体 { - "username": "信令授权用户", - "password": "信令授权密码", + "username": "信令用户", + "password": "信令密码", "ip": "IP地址", "mac": "MAC地址", "signal": "信号强度", - "battery": "电池电量" + "battery": "电池电量", + "mediasoup": "媒体服务名称" } -# 响应 -{} -# 广播 +# 响应主体 +{ +} +# 消息流程:终端->服务端->终端 +# 广播主体 { "sn": "终端标识", "ip": "IP地址", "mac": "MAC地址", "signal": "信号强度", - "battery": "电池电量" + "battery": "电池电量", + "mediasoup": "媒体服务名称" } +# 消息流程:终端->服务端-)终端 ``` -#### 消息流程:终端->服务端-)终端 - -终端注册成功以后响应同时[下发配置信令](#下发配置信令2004),并且广播[终端上线信令](#终端上线信令2002)。 - -### 终端关闭信令(2001) - -#### 消息主体 - -``` -# 请求 -{} -# 广播 -{ - "sn": "终端标识" -} -``` - -#### 消息流程:终端-)服务端 +### 终端关闭信令(client::close) 终端关闭以后广播[终端下线信令](#终端下线信令2003),同时释放所有相关资源(信令通道、媒体通道等等) -### 终端上线信令(2002) - -#### 消息主体 - ``` +# 请求主体 +{ +} +# 响应主体 { "sn": "终端标识" } +# 消息流程:终端->服务端 ``` -#### 消息流程:服务端->终端 +### 终端上线信令(client::online) + +``` +# 响应主体 +{ + "sn": "终端标识" +} +# 消息流程:服务端-)终端 +``` 参考[终端注册信令](#终端注册信令2000) -### 终端下线信令(2003) - -#### 消息主体 +### 终端下线信令(client::offline) ``` +# 响应主体 { "sn": "终端标识" } +# 消息流程:服务端-)终端 ``` -#### 消息流程:服务端->终端 - 参考[终端关闭信令](#终端关闭信令2001) -### 下发配置信令(2004) +### 下发配置信令(client::config) -#### 消息主体 +服务端收到[终端注册信令](#终端注册信令2000)后下发配置 ``` +# 响应主体 { "time": "系统时间:yyyyMMddHHmmss", "media": "媒体配置", "webrtc": "WebRTC配置" } -``` +# 消息流程:服务端->终端 -#### 消息流程:服务端->终端 -参考[终端注册信令](#终端注册信令2000) +### 心跳信令(client::heartbeat) -### 心跳信令(2005) - -#### 消息主体 +通过心跳维护连接,实时同步终端信息:信号、电量等等 ``` -# 请求 +# 请求主体 { "signal": "信号强度", "battery": "电池电量" } -# 响应 -{} +# 消息流程:终端->服务端 ``` -#### 消息流程:终端->服务端->终端 - -### 单播信令(2006) - -#### 消息主体 +### 单播信令(client::unicast) ``` -# 请求 +# 请求主体 { "to": "接收终端标识", // 主体信息 } -# 转发 +# 响应主体 { // 主体信息 } +# 消息流程:终端->服务端->终端 ``` -#### 消息流程:终端->服务端->终端 - 终端转发信令到指定的终端 -### 广播信令(2007) - -#### 消息主体 +### 广播信令(client::broadcast) ``` -# 请求 +# 请求主体 { // 主体信息 } -# 广播 +# 响应主体 { // 主体信息 } +# 消息流程:终端->服务端-)终端 ``` -#### 消息流程:终端->服务端-)终端 - 终端广播信令到所有的终端 -### 重启终端信令(2997) - -#### 消息主体 +### 重启终端信令(client::reboot) ``` -# 请求 +# 响应主体 { } +# 消息流程:服务器->终端 ``` -#### 消息流程:服务器->终端 - 重启终端 -### 终端状态信令(2998) - -#### 消息主体 +### 终端状态信令(client::status) ``` -# 请求 +# 请求主体 { "sn": "终端标识" } -# 响应 +# 响应主体 { "sn": "终端标识", "ip": "IP地址", "mac": "MAC地址", "signal": "信号强度", - "battery": "电池电量" + "battery": "电池电量", + "mediasoup": "媒体服务名称" } +# 消息流程:终端->服务端->终端 ``` -#### 消息流程:终端->服务端->终端 - 响应指定终端状态(如果没有指定终端标识默认查询自己) -### 终端列表信令(2999) +### 终端列表信令(client::list) #### 消息主体 ``` -# 请求 -{} -# 响应 +# 请求主体 +{ +} +# 响应主体 [ { "sn": "终端标识", "ip": "IP地址", "mac": "MAC地址", "signal": "信号强度", - "battery": "电池电量" + "battery": "电池电量", + "mediasoup": "媒体服务名称" }, ... ] +# 消息流程:终端->服务端->终端 ``` -#### 消息流程:终端->服务端->终端 - 响应所有终端状态列表 +## 媒体信令 + +### 重启媒体信令(media::reboot) + +``` +# 请求主体: +{ +} +# 响应主体: +{ +} +# 消息流程:终端->信令服务+)终端 +``` + +### 媒体注册信令(media::register) + +``` +# 请求主体: +{ + "username": "媒体用户", + "password": "媒体密码" +} +# 响应主体: +{ +} +# 消息流程:信令服务->媒体服务->信令服务 +``` + +## 平台信令 + +### 异常信令(platform::error) + +通知执行信令时发生的异常 + +``` +# 响应主体: +{ +} +# 消息流程:终端->信令服务->终端 +``` + +### 关闭平台信令(platform::reboot) + +``` +# 请求主体: +{ +} +# 广播主体: +{ +} +# 消息流程:终端->信令服务+)终端 +``` + +### 执行命令信令(platform::script) + +``` +# 请求主体 +{ + "script": "命令" +} +# 响应主体 +{ + "result": "结果" +} +# 消息流程:终端->服务端->终端 +``` + +### 关闭平台信令(platform::shutdown) + +``` +# 请求主体: +{ +} +# 广播主体: +{ +} +# 消息流程:终端->信令服务+)终端 +``` + ## 房间信令(4000~4999) ### 创建房间信令(4000) @@ -341,55 +366,31 @@ ### 房间列表信令(4999) -## 媒体信令(5000~5999) +## 系统信令 -### 发布信令(5000) - -控制终端推流(服务端拉流) - -### 取消发布指令(5001) - -控制终端暂停推流(服务端取消拉流) - -### 订阅指令(5002) - -订阅终端媒体流(终端拉流) - -### 取消订阅指令(5003) - -取消订阅终端媒体流(终端取消拉流) - -### 暂停信令(5004) - -终端->服务端 -暂停发布、订阅(不关媒体流通道) -Moon模式有效 - -### 恢复信令(5005) - -终端->服务端 -暂停发布、订阅(不关媒体流通道) -Moon模式有效 - -### 开启录像信令(5006) - -### 停止录像信令(5007) - -### 配置媒体信令(5008) - -配置订阅媒体:码率、帧率、分辨率等等 - -### 终端 - -#### 授权信息(6000) +### 重启系统信令(system::reboot) ``` +# 请求主体: +{ +} +# 广播主体: +{ +} +# 消息流程:终端->信令服务+)终端 ``` -### 路由 - -### 传输 +### 关闭系统信令(system::shutdown) +``` +# 请求主体: +{ +} +# 广播主体: +{ +} +# 消息流程:终端->信令服务+)终端 +``` ## 测试 diff --git a/taoyao-signal-server/taoyao-signal/pom.xml b/taoyao-signal-server/taoyao-signal/pom.xml index 49d3adb..07794aa 100644 --- a/taoyao-signal-server/taoyao-signal/pom.xml +++ b/taoyao-signal-server/taoyao-signal/pom.xml @@ -14,7 +14,7 @@ jar taoyao-signal - 信令:信令服务 + 信令:信令模块 diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/ApplyNetworkThrottleProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/ApplyNetworkThrottleProtocol.java deleted file mode 100644 index 3e7be30..0000000 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/ApplyNetworkThrottleProtocol.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.acgist.taoyao.mediasoup.protocol; - -public class ApplyNetworkThrottleProtocol { - -} diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/ChangeDisplayNameProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/ChangeDisplayNameProtocol.java deleted file mode 100644 index 2709281..0000000 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/ChangeDisplayNameProtocol.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.acgist.taoyao.mediasoup.protocol; - -public class ChangeDisplayNameProtocol { - -} diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/CloseProducerProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/CloseProducerProtocol.java deleted file mode 100644 index a9c7ce8..0000000 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/CloseProducerProtocol.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.acgist.taoyao.mediasoup.protocol; - -public class CloseProducerProtocol { - -} diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/ConnectWebRtcTransportProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/ConnectWebRtcTransportProtocol.java deleted file mode 100644 index 528fed5..0000000 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/ConnectWebRtcTransportProtocol.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.acgist.taoyao.mediasoup.protocol; - -public class ConnectWebRtcTransportProtocol { - -} diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/CreateWebRtcTransportProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/CreateWebRtcTransportProtocol.java deleted file mode 100644 index 4361b75..0000000 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/CreateWebRtcTransportProtocol.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.acgist.taoyao.mediasoup.protocol; - -public class CreateWebRtcTransportProtocol { - -} diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/GetConsumerStatsProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/GetConsumerStatsProtocol.java deleted file mode 100644 index 4ffb921..0000000 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/GetConsumerStatsProtocol.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.acgist.taoyao.mediasoup.protocol; - -public class GetConsumerStatsProtocol { - -} diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/GetDataConsumerStatsProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/GetDataConsumerStatsProtocol.java deleted file mode 100644 index fc42014..0000000 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/GetDataConsumerStatsProtocol.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.acgist.taoyao.mediasoup.protocol; - -public class GetDataConsumerStatsProtocol { - -} diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/GetDataProducerStatsProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/GetDataProducerStatsProtocol.java deleted file mode 100644 index e417781..0000000 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/GetDataProducerStatsProtocol.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.acgist.taoyao.mediasoup.protocol; - -public class GetDataProducerStatsProtocol { - -} diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/GetProducerStatsProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/GetProducerStatsProtocol.java deleted file mode 100644 index e4a634c..0000000 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/GetProducerStatsProtocol.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.acgist.taoyao.mediasoup.protocol; - -public class GetProducerStatsProtocol { - -} diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/GetTransportStatsProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/GetTransportStatsProtocol.java deleted file mode 100644 index 9266934..0000000 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/GetTransportStatsProtocol.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.acgist.taoyao.mediasoup.protocol; - -public class GetTransportStatsProtocol { - -} diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/NewPeerProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/NewPeerProtocol.java deleted file mode 100644 index b77f3d0..0000000 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/NewPeerProtocol.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.acgist.taoyao.mediasoup.protocol; - -public class NewPeerProtocol { - -} diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/PauseConsumerProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/PauseConsumerProtocol.java deleted file mode 100644 index 85468da..0000000 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/PauseConsumerProtocol.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.acgist.taoyao.mediasoup.protocol; - -public class PauseConsumerProtocol { - -} diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/PauseProducerProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/PauseProducerProtocol.java deleted file mode 100644 index 2d04561..0000000 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/PauseProducerProtocol.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.acgist.taoyao.mediasoup.protocol; - -public class PauseProducerProtocol { - -} diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/ProduceDataProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/ProduceDataProtocol.java deleted file mode 100644 index 0b6edbc..0000000 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/ProduceDataProtocol.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.acgist.taoyao.mediasoup.protocol; - -public class ProduceDataProtocol { - -} diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/ProduceProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/ProduceProtocol.java deleted file mode 100644 index e542bd7..0000000 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/ProduceProtocol.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.acgist.taoyao.mediasoup.protocol; - -public class ProduceProtocol { - -} diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/ProducerScoreProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/ProducerScoreProtocol.java deleted file mode 100644 index 8dc8c69..0000000 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/ProducerScoreProtocol.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.acgist.taoyao.mediasoup.protocol; - -public class ProducerScoreProtocol { - -} diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/RequestConsumerKeyFrameProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/RequestConsumerKeyFrameProtocol.java deleted file mode 100644 index d858452..0000000 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/RequestConsumerKeyFrameProtocol.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.acgist.taoyao.mediasoup.protocol; - -public class RequestConsumerKeyFrameProtocol { - -} diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/ResetNetworkThrottleProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/ResetNetworkThrottleProtocol.java deleted file mode 100644 index 78a6a3a..0000000 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/ResetNetworkThrottleProtocol.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.acgist.taoyao.mediasoup.protocol; - -public class ResetNetworkThrottleProtocol { - -} diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/RestartIceProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/RestartIceProtocol.java deleted file mode 100644 index b917f5e..0000000 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/RestartIceProtocol.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.acgist.taoyao.mediasoup.protocol; - -public class RestartIceProtocol { - -} diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/ResumeConsumerProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/ResumeConsumerProtocol.java deleted file mode 100644 index 65d7953..0000000 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/ResumeConsumerProtocol.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.acgist.taoyao.mediasoup.protocol; - -public class ResumeConsumerProtocol { - -} diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/ResumeProducerProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/ResumeProducerProtocol.java deleted file mode 100644 index c308e52..0000000 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/ResumeProducerProtocol.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.acgist.taoyao.mediasoup.protocol; - -public class ResumeProducerProtocol { - -} diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/SetConsumerPreferredLayersProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/SetConsumerPreferredLayersProtocol.java deleted file mode 100644 index 87c59be..0000000 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/SetConsumerPreferredLayersProtocol.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.acgist.taoyao.mediasoup.protocol; - -public class SetConsumerPreferredLayersProtocol { - -} diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/SetConsumerPriorityProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/SetConsumerPriorityProtocol.java deleted file mode 100644 index 618d9cc..0000000 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/SetConsumerPriorityProtocol.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.acgist.taoyao.mediasoup.protocol; - -public class SetConsumerPriorityProtocol { - -} diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/VideoorientationchangeProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/VideoorientationchangeProtocol.java deleted file mode 100644 index 0e8bb45..0000000 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/VideoorientationchangeProtocol.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.acgist.taoyao.mediasoup.protocol; - -public class VideoorientationchangeProtocol { - -} 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/ClientSession.java index c5d90a0..a4b171f 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/ClientSession.java @@ -1,6 +1,7 @@ package com.acgist.taoyao.signal.client; import com.acgist.taoyao.boot.model.Message; +import com.acgist.taoyao.signal.mediasoup.MediasoupClient; /** * 终端会话 @@ -68,4 +69,14 @@ public interface ClientSession extends AutoCloseable { */ boolean matchInstance(M instance); + /** + * @return Mediasoup终端 + */ + MediasoupClient mediasoupClient(); + + /** + * @param mediasoupClient Mediasoup终端 + */ + void mediasoupClient(MediasoupClient mediasoupClient); + } 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/ClientSessionAdapter.java index a851ff4..e72f05e 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/ClientSessionAdapter.java @@ -2,6 +2,8 @@ package com.acgist.taoyao.signal.client; import org.apache.commons.lang3.StringUtils; +import com.acgist.taoyao.signal.mediasoup.MediasoupClient; + /** * 会话适配器 * @@ -29,6 +31,10 @@ public abstract class ClientSessionAdapter implements C * 终端状态 */ protected ClientSessionStatus status; + /** + * Mediasoup终端 + */ + protected MediasoupClient mediasoupClient; protected ClientSessionAdapter(T instance) { this.time = System.currentTimeMillis(); @@ -78,6 +84,16 @@ public abstract class ClientSessionAdapter implements C return instance == this.instance; } + @Override + public MediasoupClient mediasoupClient() { + return this.mediasoupClient; + } + + @Override + public void mediasoupClient(MediasoupClient mediasoupClient) { + this.mediasoupClient = mediasoupClient; + } + @Override public void close() throws Exception { this.instance.close(); @@ -90,4 +106,9 @@ public abstract class ClientSessionAdapter implements C 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/ClientSessionStatus.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/ClientSessionStatus.java index d6a0fb3..cd5225e 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/ClientSessionStatus.java @@ -2,8 +2,6 @@ package com.acgist.taoyao.signal.client; import java.time.LocalDateTime; -import com.fasterxml.jackson.annotation.JsonIgnore; - import io.swagger.v3.oas.annotations.media.Schema; import lombok.Getter; import lombok.Setter; @@ -11,6 +9,8 @@ import lombok.Setter; /** * 终端状态 * + * TODO:统计拉流数量 + * * @author acgist */ @Getter @@ -18,10 +18,30 @@ import lombok.Setter; @Schema(title = "终端状态", description = "终端状态") public class ClientSessionStatus { + /** + * 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"; /** * 终端标识 @@ -44,14 +64,24 @@ public class ClientSessionStatus { @Schema(title = "信号强度(0~100)", description = "信号强度(0~100)") private Integer signal = 0; /** - * 电量(0~100) + * 电池电量(0~100) */ - @Schema(title = "电量(0~100)", description = "电量(0~100)") + @Schema(title = "电池电量(0~100)", description = "电池电量(0~100)") private Integer battery = 0; + /** + * 是否充电 + */ + @Schema(title = "是否充电", description = "是否充电") + private Boolean charging = false; + /** + * 媒体服务名称 + */ + @Schema(title = "媒体服务名称", description = "媒体服务名称") + private String mediasoup; /** * 最后心跳时间 */ - @JsonIgnore + @Schema(title = "最后心跳时间", description = "最后心跳时间") private LocalDateTime lastHeartbeat = LocalDateTime.now(); } 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/WebSocketSession.java index ac7495b..e5249f7 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/WebSocketSession.java @@ -21,7 +21,7 @@ public class WebSocketSession extends ClientSessionAdapter { public WebSocketSession(Session instance) { super(instance); } - + @Override public void push(Message message) { synchronized (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 a1c135c..1a526c0 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 @@ -6,7 +6,7 @@ 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.protocol.ProtocolManager; -import com.acgist.taoyao.signal.protocol.platform.ErrorProtocol; +import com.acgist.taoyao.signal.protocol.platform.PlatformErrorProtocol; import jakarta.websocket.OnClose; import jakarta.websocket.OnError; @@ -25,9 +25,9 @@ import lombok.extern.slf4j.Slf4j; @ServerEndpoint(value = "/websocket.signal") public class WebSocketSignal { - private static ErrorProtocol errorProtocol; private static ProtocolManager protocolManager; private static ClientSessionManager clientSessionManager; + private static PlatformErrorProtocol platformErrorProtocol; @OnOpen public void open(Session session) { @@ -42,7 +42,7 @@ public class WebSocketSignal { WebSocketSignal.protocolManager.execute(message.strip(), session); } catch (Exception e) { log.error("处理会话消息异常", e); - final Message errorMessage = WebSocketSignal.errorProtocol.build(); + final Message errorMessage = WebSocketSignal.platformErrorProtocol.build(); if(e instanceof MessageCodeException code) { errorMessage.setCode(code.getCode(), code.getMessage()); } @@ -83,11 +83,6 @@ public class WebSocketSignal { } } - @Autowired - public void setErrorProtocol(ErrorProtocol errorProtocol) { - WebSocketSignal.errorProtocol = errorProtocol; - } - @Autowired public void setProtocolManager(ProtocolManager protocolManager) { WebSocketSignal.protocolManager = protocolManager; @@ -98,4 +93,9 @@ public class WebSocketSignal { 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 22f7850..b5ce4c8 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 @@ -8,9 +8,13 @@ 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.listener.platform.ScriptListener; -import com.acgist.taoyao.signal.protocol.platform.ScriptProtocol; -import com.acgist.taoyao.signal.protocol.platform.ShutdownProtocol; +import com.acgist.taoyao.signal.protocol.media.MediaRebootProtocol; +import com.acgist.taoyao.signal.protocol.media.MediaShutdownProtocol; +import com.acgist.taoyao.signal.protocol.platform.PlatformRebootProtocol; +import com.acgist.taoyao.signal.protocol.platform.PlatformScriptProtocol; +import com.acgist.taoyao.signal.protocol.platform.PlatformShutdownProtocol; +import com.acgist.taoyao.signal.protocol.system.SystemRebootProtocol; +import com.acgist.taoyao.signal.protocol.system.SystemShutdownProtocol; import com.acgist.taoyao.signal.service.SecurityService; import com.acgist.taoyao.signal.service.impl.SecurityServiceImpl; @@ -42,24 +46,52 @@ public class SignalAutoConfiguration { } @Bean - @ConditionalOnProperty(prefix = "taoyao.signal.platform.script", name = "enabled", havingValue = "true", matchIfMissing = true) + @ConditionalOnProperty(prefix = "taoyao.script", name = "enabled", havingValue = "true", matchIfMissing = true) @ConditionalOnMissingBean - public ScriptProtocol scriptProtocol() { - return new ScriptProtocol(); + public MediaRebootProtocol mediaRebootProtocol() { + return new MediaRebootProtocol(); } @Bean - @ConditionalOnProperty(prefix = "taoyao.signal.platform.script", name = "enabled", havingValue = "true", matchIfMissing = true) + @ConditionalOnProperty(prefix = "taoyao.script", name = "enabled", havingValue = "true", matchIfMissing = true) @ConditionalOnMissingBean - public ScriptListener scriptListener() { - return new ScriptListener(); + public MediaShutdownProtocol mediaShutdownProtocol() { + return new MediaShutdownProtocol(); } @Bean - @ConditionalOnProperty(prefix = "taoyao.signal.platform.shutdown", name = "enabled", havingValue = "true", matchIfMissing = true) + @ConditionalOnProperty(prefix = "taoyao.script", name = "enabled", havingValue = "true", matchIfMissing = true) @ConditionalOnMissingBean - public ShutdownProtocol shutdownProtocol() { - return new ShutdownProtocol(); + public SystemRebootProtocol systemRebootProtocol() { + return new SystemRebootProtocol(); + } + + @Bean + @ConditionalOnProperty(prefix = "taoyao.script", name = "enabled", havingValue = "true", matchIfMissing = true) + @ConditionalOnMissingBean + public SystemShutdownProtocol systemShutdownProtocol() { + return new SystemShutdownProtocol(); + } + + @Bean + @ConditionalOnProperty(prefix = "taoyao.script", name = "enabled", havingValue = "true", matchIfMissing = true) + @ConditionalOnMissingBean + public PlatformRebootProtocol platformRebootProtocol() { + return new PlatformRebootProtocol(); + } + + @Bean + @ConditionalOnProperty(prefix = "taoyao.script", name = "enabled", havingValue = "true", matchIfMissing = true) + @ConditionalOnMissingBean + public PlatformScriptProtocol platformScriptProtocol() { + return new PlatformScriptProtocol(); + } + + @Bean + @ConditionalOnProperty(prefix = "taoyao.script", name = "enabled", havingValue = "true", matchIfMissing = true) + @ConditionalOnMissingBean + public PlatformShutdownProtocol platformShutdownProtocol() { + return new PlatformShutdownProtocol(); } } 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 f4fdb9b..111749f 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 @@ -41,16 +41,12 @@ public abstract class ApplicationEventAdapter extends ApplicationEvent { private final ClientSession session; public ApplicationEventAdapter(Message message, ClientSession session) { - this(session.sn(), null, message, session); + this(null, message, session); } public ApplicationEventAdapter(Map body, Message message, ClientSession session) { - this(session.sn(), body, message, session); - } - - public ApplicationEventAdapter(String sn, Map body, Message message, ClientSession session) { super(session); - this.sn = sn; + this.sn = session.sn(); this.body = body; this.message = message; this.session = session; 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 fc04c64..55d56a2 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 @@ -21,36 +21,50 @@ public class ClientRegisterEvent extends ApplicationEventAdapter { private static final long serialVersionUID = 1L; - public ClientRegisterEvent(String sn, Map body, Message message, ClientSession session) { - super(sn, body, message, session); + public ClientRegisterEvent(Map body, Message message, ClientSession session) { + super(body, message, session); } /** - * @return IP + * @return {@link ClientSessionStatus#IP} */ public String getIp() { return this.get(ClientSessionStatus.IP); } /** - * @return Mac + * @return {@link ClientSessionStatus#MAC} */ public String getMac() { return this.get(ClientSessionStatus.MAC); } /** - * @return Signal + * @return {@link ClientSessionStatus#SIGNAL} */ public Integer getSignal() { return this.get(ClientSessionStatus.SIGNAL); } /** - * @return Battery + * @return {@link ClientSessionStatus#BATTERY} */ public Integer getBattery() { return this.get(ClientSessionStatus.BATTERY); } + + /** + * @return {@link ClientSessionStatus#CHARGING} + */ + public Boolean getCharging() { + return this.get(ClientSessionStatus.CHARGING); + } + + /** + * @return {@link ClientSessionStatus#MEDIASOUP} + */ + public String getMediasoup() { + return this.get(ClientSessionStatus.MEDIASOUP); + } } diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/event/media/MediaAnswerEvent.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/event/media/MediaAnswerEvent.java deleted file mode 100644 index 96429d9..0000000 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/event/media/MediaAnswerEvent.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.acgist.taoyao.signal.event.media; - -import java.util.Map; - -import com.acgist.taoyao.boot.model.Message; -import com.acgist.taoyao.signal.client.ClientSession; -import com.acgist.taoyao.signal.event.ApplicationEventAdapter; - -import lombok.Getter; -import lombok.Setter; - -/** - * Answer事件 - * - * @author acgist - */ -@Getter -@Setter -public class MediaAnswerEvent extends ApplicationEventAdapter { - - private static final long serialVersionUID = 1L; - - public MediaAnswerEvent(String sn, Map body, Message message, ClientSession session) { - super(sn, body, message, session); - } - - /** - * @return 接收终端标识 - */ - public String getTo() { - return this.get("to"); - } - -} diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/event/media/MediaCandidateEvent.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/event/media/MediaCandidateEvent.java deleted file mode 100644 index 6d3a1b3..0000000 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/event/media/MediaCandidateEvent.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.acgist.taoyao.signal.event.media; - -import java.util.Map; - -import com.acgist.taoyao.boot.model.Message; -import com.acgist.taoyao.signal.client.ClientSession; -import com.acgist.taoyao.signal.event.ApplicationEventAdapter; - -import lombok.Getter; -import lombok.Setter; - -/** - * 候选事件 - * - * @author acgist - */ -@Getter -@Setter -public class MediaCandidateEvent extends ApplicationEventAdapter { - - private static final long serialVersionUID = 1L; - - public MediaCandidateEvent(String sn, Map body, Message message, ClientSession session) { - super(sn, body, message, session); - } - - /** - * @return 接收终端标识 - */ - public String getTo() { - return this.get("to"); - } - -} diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/event/media/MediaOfferEvent.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/event/media/MediaOfferEvent.java deleted file mode 100644 index e746320..0000000 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/event/media/MediaOfferEvent.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.acgist.taoyao.signal.event.media; - -import java.util.Map; - -import com.acgist.taoyao.boot.model.Message; -import com.acgist.taoyao.signal.client.ClientSession; -import com.acgist.taoyao.signal.event.ApplicationEventAdapter; - -import lombok.Getter; -import lombok.Setter; - -/** - * Offer事件 - * - * @author acgist - */ -@Getter -@Setter -public class MediaOfferEvent extends ApplicationEventAdapter { - - private static final long serialVersionUID = 1L; - - public MediaOfferEvent(String sn, Map body, Message message, ClientSession session) { - super(sn, body, message, session); - } - - /** - * @return 接收终端标识 - */ - public String getTo() { - return this.get("to"); - } - -} diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/event/media/MediaPublishEvent.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/event/media/MediaPublishEvent.java deleted file mode 100644 index 415cc3d..0000000 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/event/media/MediaPublishEvent.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.acgist.taoyao.signal.event.media; - -import java.util.Map; - -import com.acgist.taoyao.boot.model.Message; -import com.acgist.taoyao.signal.client.ClientSession; -import com.acgist.taoyao.signal.event.ApplicationEventAdapter; - -import lombok.Getter; -import lombok.Setter; - -/** - * 发布事件 - * - * @author acgist - */ -@Getter -@Setter -public class MediaPublishEvent extends ApplicationEventAdapter { - - private static final long serialVersionUID = 1L; - - public MediaPublishEvent(String sn, Map body, Message message, ClientSession session) { - super(sn, body, message, session); - } - - /** - * @return 接收终端标识 - */ - public String getTo() { - return this.get("to"); - } - -} diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/event/media/MediaSubscribeEvent.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/event/media/MediaSubscribeEvent.java deleted file mode 100644 index 24e832b..0000000 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/event/media/MediaSubscribeEvent.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.acgist.taoyao.signal.event.media; - -import java.util.Map; - -import com.acgist.taoyao.boot.model.Message; -import com.acgist.taoyao.signal.client.ClientSession; -import com.acgist.taoyao.signal.event.ApplicationEventAdapter; - -import lombok.Getter; -import lombok.Setter; - -/** - * 订阅事件 - * - * @author acgist - */ -@Getter -@Setter -public class MediaSubscribeEvent extends ApplicationEventAdapter { - - private static final long serialVersionUID = 1L; - - public MediaSubscribeEvent(String sn, Map body, Message message, ClientSession session) { - super(sn, body, message, session); - } - - /** - * @return 接收终端标识 - */ - public String getTo() { - return this.get("to"); - } - -} 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 new file mode 100644 index 0000000..123c2c7 --- /dev/null +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/event/platform/PlatformScriptEvent.java @@ -0,0 +1,47 @@ +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.event.ApplicationEventAdapter; + +import lombok.Getter; +import lombok.Setter; + +/** + * 执行命令事件 + * + * @author acgist + */ +@Getter +@Setter +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(Map body, Message message, ClientSession session) { + super(body, message, session); + } + + /** + * @return {@link #SCRIPT} + */ + public String getScript() { + return this.get(SCRIPT); + } + +} diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/event/platform/ScriptEvent.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/event/platform/PlatformShutdownEvent.java similarity index 61% rename from taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/event/platform/ScriptEvent.java rename to taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/event/platform/PlatformShutdownEvent.java index 7521508..ccfb0db 100644 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/event/platform/ScriptEvent.java +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/event/platform/PlatformShutdownEvent.java @@ -1,7 +1,5 @@ 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.event.ApplicationEventAdapter; @@ -10,18 +8,18 @@ import lombok.Getter; import lombok.Setter; /** - * 执行命令事件 + * 关闭平台事件 * * @author acgist */ @Getter @Setter -public class ScriptEvent extends ApplicationEventAdapter { +public class PlatformShutdownEvent extends ApplicationEventAdapter { private static final long serialVersionUID = 1L; - public ScriptEvent(String sn, Map body, Message message, ClientSession session) { - super(sn, body, message, session); + public PlatformShutdownEvent(Message message, ClientSession session) { + super(message, session); } } diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/event/platform/ShutdownEvent.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/event/platform/ShutdownEvent.java deleted file mode 100644 index df68fb8..0000000 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/event/platform/ShutdownEvent.java +++ /dev/null @@ -1,27 +0,0 @@ -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.event.ApplicationEventAdapter; - -import lombok.Getter; -import lombok.Setter; - -/** - * 关闭服务事件 - * - * @author acgist - */ -@Getter -@Setter -public class ShutdownEvent extends ApplicationEventAdapter { - - private static final long serialVersionUID = 1L; - - public ShutdownEvent(String sn, Map body, Message message, ClientSession session) { - super(sn, body, message, session); - } - -} 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 9e24eeb..5573feb 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 @@ -20,8 +20,8 @@ public class RoomCreateEvent extends ApplicationEventAdapter { private static final long serialVersionUID = 1L; - public RoomCreateEvent(String sn, Map body, Message message, ClientSession session) { - super(sn, body, message, session); + public RoomCreateEvent(Map body, Message message, ClientSession session) { + super(body, message, session); } } 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 2f06a77..2dd7b3f 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 @@ -20,8 +20,8 @@ public class RoomEnterEvent extends ApplicationEventAdapter { private static final long serialVersionUID = 1L; - public RoomEnterEvent(String sn, Map body, Message message, ClientSession session) { - super(sn, body, message, session); + public RoomEnterEvent(Map body, Message message, ClientSession session) { + super(body, message, session); } } diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/listener/client/ClientRegisterListener.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/listener/client/ClientRegisterListener.java index 0991b5e..979ba50 100644 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/listener/client/ClientRegisterListener.java +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/listener/client/ClientRegisterListener.java @@ -8,9 +8,13 @@ import com.acgist.taoyao.signal.client.ClientSession; import com.acgist.taoyao.signal.client.ClientSessionStatus; import com.acgist.taoyao.signal.event.client.ClientRegisterEvent; import com.acgist.taoyao.signal.listener.ApplicationListenerAdapter; +import com.acgist.taoyao.signal.mediasoup.MediasoupClient; +import com.acgist.taoyao.signal.mediasoup.MediasoupClientManager; import com.acgist.taoyao.signal.protocol.client.ClientConfigProtocol; import com.acgist.taoyao.signal.protocol.client.ClientOnlineProtocol; +import lombok.extern.slf4j.Slf4j; + /** * 终端注册监听 * @@ -18,6 +22,7 @@ import com.acgist.taoyao.signal.protocol.client.ClientOnlineProtocol; * * @author acgist */ +@Slf4j @EventListener public class ClientRegisterListener extends ApplicationListenerAdapter { @@ -25,7 +30,9 @@ public class ClientRegisterListener extends ApplicationListenerAdapter { - - @Override - public void onApplicationEvent(MediaAnswerEvent event) { - final String sn = event.getSn(); - final String to = event.getTo(); - if(sn.equals(to)) { - log.debug("忽略Answer消息(相同终端):{}-{}", sn, to); - return; - } - final Message message = event.getMessage(); - final Map mergeBody = event.mergeBody(); - mergeBody.put("from", sn); - this.clientSessionManager.unicast(to, message); - } - -} diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/listener/media/MediaCandidateListener.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/listener/media/MediaCandidateListener.java deleted file mode 100644 index b607440..0000000 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/listener/media/MediaCandidateListener.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.acgist.taoyao.signal.listener.media; - -import java.util.Map; - -import com.acgist.taoyao.boot.annotation.EventListener; -import com.acgist.taoyao.boot.model.Message; -import com.acgist.taoyao.signal.event.media.MediaCandidateEvent; -import com.acgist.taoyao.signal.listener.MediaListenerAdapter; - -import lombok.extern.slf4j.Slf4j; - -/** - * 候选监听 - * - * @author acgist - */ -@Slf4j -@EventListener -public class MediaCandidateListener extends MediaListenerAdapter { - - @Override - public void onApplicationEvent(MediaCandidateEvent event) { - final String sn = event.getSn(); - final String to = event.getTo(); - if(sn.equals(to)) { - log.debug("忽略候选消息(相同终端):{}-{}", sn, to); - return; - } - final Message message = event.getMessage(); - final Map mergeBody = event.mergeBody(); - mergeBody.put("from", sn); - this.clientSessionManager.unicast(to, message); - } - -} diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/listener/media/MediaOfferListener.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/listener/media/MediaOfferListener.java deleted file mode 100644 index 6f6133a..0000000 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/listener/media/MediaOfferListener.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.acgist.taoyao.signal.listener.media; - -import java.util.Map; - -import com.acgist.taoyao.boot.annotation.EventListener; -import com.acgist.taoyao.boot.model.Message; -import com.acgist.taoyao.signal.event.media.MediaOfferEvent; -import com.acgist.taoyao.signal.listener.MediaListenerAdapter; - -import lombok.extern.slf4j.Slf4j; - -/** - * Offer监听 - * - * @author acgist - */ -@Slf4j -@EventListener -public class MediaOfferListener extends MediaListenerAdapter { - - @Override - public void onApplicationEvent(MediaOfferEvent event) { - final String sn = event.getSn(); - final String to = event.getTo(); - if(sn.equals(to)) { - log.debug("忽略Offer消息(相同终端):{}-{}", sn, to); - return; - } - final Message message = event.getMessage(); - final Map mergeBody = event.mergeBody(); - mergeBody.put("from", sn); - this.clientSessionManager.unicast(to, message); - } - -} diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/listener/media/MediaPublishListener.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/listener/media/MediaPublishListener.java deleted file mode 100644 index ca86c60..0000000 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/listener/media/MediaPublishListener.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.acgist.taoyao.signal.listener.media; - -import java.util.Map; - -import com.acgist.taoyao.boot.annotation.EventListener; -import com.acgist.taoyao.boot.model.Message; -import com.acgist.taoyao.signal.event.media.MediaPublishEvent; -import com.acgist.taoyao.signal.listener.MediaListenerAdapter; - -import lombok.extern.slf4j.Slf4j; - -/** - * 发布监听 - * - * @author acgist - */ -@Slf4j -@EventListener -public class MediaPublishListener extends MediaListenerAdapter { - - @Override - public void onApplicationEvent(MediaPublishEvent event) { - final String sn = event.getSn(); - final String to = event.getTo(); - if(sn.equals(to)) { - log.debug("忽略发布消息(相同终端):{}-{}", sn, to); - return; - } - final Message message = event.getMessage(); - final Map mergeBody = event.mergeBody(); - mergeBody.put("from", sn); - this.clientSessionManager.unicast(to, message); - } - -} diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/listener/media/MediaSubscribeListener.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/listener/media/MediaSubscribeListener.java deleted file mode 100644 index 16078ff..0000000 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/listener/media/MediaSubscribeListener.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.acgist.taoyao.signal.listener.media; - -import java.util.Map; - -import com.acgist.taoyao.boot.annotation.EventListener; -import com.acgist.taoyao.boot.model.Message; -import com.acgist.taoyao.signal.event.media.MediaSubscribeEvent; -import com.acgist.taoyao.signal.listener.MediaListenerAdapter; - -import lombok.extern.slf4j.Slf4j; - -/** - * 订阅监听 - * - * @author acgist - */ -@Slf4j -@EventListener -public class MediaSubscribeListener extends MediaListenerAdapter { - - @Override - public void onApplicationEvent(MediaSubscribeEvent event) { - final String sn = event.getSn(); - final String to = event.getTo(); - if(sn.equals(to)) { - log.debug("忽略订阅消息(相同终端):{}-{}", sn, to); - return; - } - final Message message = event.getMessage(); - final Map mergeBody = event.mergeBody(); - mergeBody.put("from", sn); - this.clientSessionManager.unicast(to, message); - } - -} diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/listener/platform/ScriptListener.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/listener/platform/PlatformScriptListener.java similarity index 82% rename from taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/listener/platform/ScriptListener.java rename to taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/listener/platform/PlatformScriptListener.java index 594c2f1..2234f1a 100644 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/listener/platform/ScriptListener.java +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/listener/platform/PlatformScriptListener.java @@ -6,9 +6,10 @@ import java.util.Map; import org.apache.commons.lang3.StringUtils; 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.event.platform.ScriptEvent; +import com.acgist.taoyao.signal.event.platform.PlatformScriptEvent; import com.acgist.taoyao.signal.listener.ApplicationListenerAdapter; import lombok.extern.slf4j.Slf4j; @@ -19,18 +20,19 @@ import lombok.extern.slf4j.Slf4j; * @author acgist */ @Slf4j -public class ScriptListener extends ApplicationListenerAdapter { +@EventListener +public class PlatformScriptListener extends ApplicationListenerAdapter { @Async @Override - public void onApplicationEvent(ScriptEvent event) { + public void onApplicationEvent(PlatformScriptEvent event) { final String sn = event.getSn(); final Message message = event.getMessage(); final ClientSession session = event.getSession(); - final String script = event.get("script"); + final String script = event.getScript(); log.debug("执行命令:{}-{}", sn, script); final String result = this.execute(script); - message.setBody(Map.of("result", result)); + message.setBody(Map.of(PlatformScriptEvent.RESULT, result)); session.push(message); } diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/listener/platform/PlatformShutdownListener.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/listener/platform/PlatformShutdownListener.java new file mode 100644 index 0000000..c106555 --- /dev/null +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/listener/platform/PlatformShutdownListener.java @@ -0,0 +1,45 @@ +package com.acgist.taoyao.signal.listener.platform; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ConfigurableApplicationContext; + +import com.acgist.taoyao.boot.annotation.EventListener; +import com.acgist.taoyao.boot.property.ScriptProperties; +import com.acgist.taoyao.signal.event.platform.PlatformScriptEvent; +import com.acgist.taoyao.signal.event.platform.PlatformShutdownEvent; +import com.acgist.taoyao.signal.listener.ApplicationListenerAdapter; + +/** + * 关闭平台监听 + * + * @author acgist + */ +@EventListener +public class PlatformShutdownListener extends ApplicationListenerAdapter { + + @Autowired + private ApplicationContext context; + @Autowired + private ScriptProperties scriptProperties; + + @Override + public void onApplicationEvent(PlatformShutdownEvent event) { + if(this.context instanceof ConfigurableApplicationContext context) { + // API关闭 + if(context.isActive()) { + // 如果需要完整广播可以设置延时 + context.close(); + } else { + } + } else { + // 命令关闭 + this.context.publishEvent(new PlatformScriptEvent( + this.scriptProperties.getPlatformShutdown(), + event.getMessage(), + event.getSession() + )); + } + } + +} diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/MediasoupClient.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/mediasoup/MediasoupClient.java similarity index 85% rename from taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/MediasoupClient.java rename to taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/mediasoup/MediasoupClient.java index 2eb31a0..231c2aa 100644 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/MediasoupClient.java +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/mediasoup/MediasoupClient.java @@ -1,4 +1,4 @@ -package com.acgist.taoyao.mediasoup; +package com.acgist.taoyao.signal.mediasoup; import java.net.URI; import java.net.http.HttpClient; @@ -25,28 +25,28 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.context.annotation.Scope; import org.springframework.scheduling.TaskScheduler; -import org.springframework.stereotype.Service; +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.property.MediasoupProperties; import com.acgist.taoyao.boot.property.TaoyaoProperties; import com.acgist.taoyao.boot.utils.JSONUtils; -import com.acgist.taoyao.mediasoup.protocol.AuthorizeProtocol; import com.acgist.taoyao.signal.protocol.Protocol; import com.acgist.taoyao.signal.protocol.ProtocolManager; -import com.acgist.taoyao.signal.protocol.ProtocolMediasoupAdapter; +import com.acgist.taoyao.signal.protocol.ProtocolMediaAdapter; +import com.acgist.taoyao.signal.protocol.media.MediaRegisterProtocol; import lombok.extern.slf4j.Slf4j; /** - * Mediasoup客户端 + * 媒体终端 * * @author acgist */ @Slf4j @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) -@Service +@Client public class MediasoupClient { @Autowired @@ -56,23 +56,22 @@ public class MediasoupClient { @Autowired private TaoyaoProperties taoyaoProperties; @Autowired - private AuthorizeProtocol authorizeProtocol; + private MediaRegisterProtocol authorizeProtocol; /** - * 最大重试次数 + * 媒体终端名称 */ - private static final int MAX_RETRY = 12; - + private String name; /** - * 重试次数 + * 当前重试周期 */ - private int retry = 1; + private long duration; /** - * Mediasoup WebSocket通道 + * 媒体终端WebSocket通道 */ private WebSocket webSocket; /** - * Mediasoup配置 + * 媒体终端配置 */ private MediasoupProperties mediasoupProperties; /** @@ -83,13 +82,22 @@ public class MediasoupClient { /** * 初始化客户端 * - * @param mediasoupProperties Mediasoup配置 + * @param mediasoupProperties 媒体终端配置 */ public void init(MediasoupProperties mediasoupProperties) { this.mediasoupProperties = mediasoupProperties; + this.name = mediasoupProperties.getName(); + this.duration = this.taoyaoProperties.getTimeout(); this.buildClient(); } + /** + * @return Mediasoup名称 + */ + public String name() { + return this.name; + } + /** * 连接Mediasoup WebSocket通道 */ @@ -109,7 +117,7 @@ public class MediasoupClient { log.error("连接Mediasoup异常:{}", uri, e); this.taskSchedulerl.schedule( this::buildClient, - Instant.now().plusSeconds(Math.min(this.retry++, MAX_RETRY) * 5) + Instant.now().plusSeconds(this.retryDuration()) ); } } @@ -158,14 +166,21 @@ public class MediasoupClient { if(this.webSocket != null && !(this.webSocket.isInputClosed() && this.webSocket.isOutputClosed())) { this.webSocket.abort(); } - // 重置重试次数 - this.retry = 1; + // 重置重试周期 + this.duration = this.taoyaoProperties.getTimeout(); // 设置新的通道 this.webSocket = webSocket; // 发送授权消息 this.send(this.authorizeProtocol.build(this.mediasoupProperties)); } + /** + * @return 重试周期 + */ + private long retryDuration() { + return this.duration = Math.min(this.duration + this.taoyaoProperties.getTimeout(), this.taoyaoProperties.getMaxTimeout()); + } + /** * 处理消息 * @@ -176,7 +191,7 @@ public class MediasoupClient { final Message message = JSONUtils.toJava(data, Message.class); final Header header = message.getHeader(); final String id = header.getId(); - final Integer pid = header.getPid(); + final String signal = header.getSignal(); final Message request = this.syncMessage.get(id); // 存在同步响应 if(request != null) { @@ -187,8 +202,8 @@ public class MediasoupClient { request.notifyAll(); } } else { - final Protocol protocol = this.protocolManager.protocol(pid); - if(protocol instanceof ProtocolMediasoupAdapter mediasoupProtocol) { + final Protocol protocol = this.protocolManager.protocol(signal); + if(protocol instanceof ProtocolMediaAdapter mediasoupProtocol) { mediasoupProtocol.execute(message, this.webSocket); } else { log.warn("未知Mediasoup信令:{}", data); @@ -232,7 +247,7 @@ public class MediasoupClient { } finally { MediasoupClient.this.taskSchedulerl.schedule( MediasoupClient.this::buildClient, - Instant.now().plusSeconds(Math.min(MediasoupClient.this.retry++, MAX_RETRY) * 5) + Instant.now().plusSeconds(MediasoupClient.this.retryDuration()) ); } } @@ -245,7 +260,7 @@ public class MediasoupClient { } finally { MediasoupClient.this.taskSchedulerl.schedule( MediasoupClient.this::buildClient, - Instant.now().plusSeconds(Math.min(MediasoupClient.this.retry++, MAX_RETRY) * 5) + Instant.now().plusSeconds(MediasoupClient.this.retryDuration()) ); } } diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/MediasoupClientManager.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/mediasoup/MediasoupClientManager.java similarity index 57% rename from taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/MediasoupClientManager.java rename to taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/mediasoup/MediasoupClientManager.java index 2f29c4f..33be49b 100644 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/MediasoupClientManager.java +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/mediasoup/MediasoupClientManager.java @@ -1,7 +1,7 @@ -package com.acgist.taoyao.mediasoup; +package com.acgist.taoyao.signal.mediasoup; -import java.util.ArrayList; -import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; @@ -13,7 +13,7 @@ import jakarta.annotation.PostConstruct; import lombok.extern.slf4j.Slf4j; /** - * Mediasoup客户端管理 + * 媒体终端管理 * * @author acgist */ @@ -27,18 +27,27 @@ public class MediasoupClientManager { private ApplicationContext applicationContext; /** - * Mediasoup客户端列表 + * 媒体终端列表 */ - private List clientList = new ArrayList<>(); + private Map clientMap = new ConcurrentHashMap<>(); @PostConstruct public void init() { this.webrtcProperties.getMediasoupList().forEach(v -> { final MediasoupClient client = this.applicationContext.getBean(MediasoupClient.class); client.init(v); - this.clientList.add(client); - log.info("新建MediasoupClient:{}-{}", v.getAddress(), client); + this.clientMap.put(client.name(), client); + log.info("新建媒体终端(MediasoupClient):{}-{}", v.getAddress(), client); }); } + /** + * @param name 媒体终端名称 + * + * @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/mediasoup/Router.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/mediasoup/Router.java similarity index 91% rename from taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/Router.java rename to taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/mediasoup/Router.java index ea9bc7f..b0ec6be 100644 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/Router.java +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/mediasoup/Router.java @@ -1,4 +1,4 @@ -package com.acgist.taoyao.mediasoup; +package com.acgist.taoyao.signal.mediasoup; import java.io.Closeable; import java.util.List; diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/Stream.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/mediasoup/Stream.java similarity index 93% rename from taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/Stream.java rename to taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/mediasoup/Stream.java index 67cf05c..b7582b9 100644 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/Stream.java +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/mediasoup/Stream.java @@ -1,4 +1,4 @@ -package com.acgist.taoyao.mediasoup; +package com.acgist.taoyao.signal.mediasoup; import java.io.Closeable; diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/Transport.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/mediasoup/Transport.java similarity index 92% rename from taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/Transport.java rename to taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/mediasoup/Transport.java index c4f4137..b2d8973 100644 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/Transport.java +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/mediasoup/Transport.java @@ -1,4 +1,4 @@ -package com.acgist.taoyao.mediasoup; +package com.acgist.taoyao.signal.mediasoup; import java.io.Closeable; import java.util.List; diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/listener/Listener.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/mediasoup/listener/Listener.java similarity index 63% rename from taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/listener/Listener.java rename to taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/mediasoup/listener/Listener.java index 6202f7c..dbcd4c8 100644 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/listener/Listener.java +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/mediasoup/listener/Listener.java @@ -1,4 +1,4 @@ -package com.acgist.taoyao.mediasoup.listener; +package com.acgist.taoyao.signal.mediasoup.listener; /** * Mediasoup事件监听 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 37b1325..2f183a7 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 @@ -6,30 +6,28 @@ import com.acgist.taoyao.signal.client.ClientSession; import com.acgist.taoyao.signal.event.ApplicationEventAdapter; /** - * 信令 + * 信令协议 * - * TODO:改为字符 - * - * 1000~1999:平台信令 - * 2000~2999:终端信令 - * 3000~3999:房间信令 - * 5000~5999:媒体信令 - * 6000~6999:媒体信令(Mediasoup) + * room:: 房间信令 + * media:: 媒体信令 + * client:: 终端信令 + * system:: 系统信令 + * platform:: 平台信令 * * @author acgist */ public interface Protocol { /** - * @return 信令协议标识 - */ - Integer pid(); - - /** - * @return 信令名称 + * @return 信令协议名称 */ String name(); + /** + * @return 信令协议标识 + */ + String signal(); + /** * 鉴权 * 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 afe3bc7..cb0e0d8 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 @@ -28,28 +28,18 @@ public abstract class ProtocolAdapter implements Protocol { @Autowired protected ClientSessionManager clientSessionManager; - /** - * 信令标识 - */ - protected final Integer pid; - /** - * 信令标识 - * TODO: - */ - protected final String signal = ""; /** * 信令名称 */ protected final String name; + /** + * 信令标识 + */ + protected final String signal; - protected ProtocolAdapter(Integer pid, String name) { - this.pid = pid; + protected ProtocolAdapter(String name, String signal) { this.name = name; - } - - @Override - public Integer pid() { - return this.pid; + this.signal = signal; } @Override @@ -57,6 +47,11 @@ public abstract class ProtocolAdapter implements Protocol { return this.name; } + @Override + public String signal() { + return this.signal; + } + @Override public void publishEvent(E event) { this.context.publishEvent(event); @@ -90,7 +85,7 @@ public abstract class ProtocolAdapter implements Protocol { final Header header = Header.builder() .v(this.taoyaoProperties.getVersion()) .id(id) - .pid(this.pid) + .signal(this.signal) .build(); final Message build = Message.builder() .header(header) 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 230fdcc..26f0732 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 @@ -15,7 +15,7 @@ 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.protocol.client.ClientRegisterProtocol; -import com.acgist.taoyao.signal.protocol.platform.ErrorProtocol; +import com.acgist.taoyao.signal.protocol.platform.PlatformErrorProtocol; import com.acgist.taoyao.signal.service.SecurityService; import jakarta.annotation.PostConstruct; @@ -33,42 +33,42 @@ public class ProtocolManager { /** * 协议映射 */ - private Map protocolMapping = new ConcurrentHashMap<>(); + private Map protocolMapping = new ConcurrentHashMap<>(); @Autowired private ApplicationContext context; @Autowired - private ErrorProtocol errorProtocol; - @Autowired private SecurityService securityService; @Autowired private ClientSessionManager clientSessionManager; + @Autowired + private PlatformErrorProtocol platformErrorProtocol; @PostConstruct public void init() { final Map map = this.context.getBeansOfType(Protocol.class); map.entrySet().stream() - .sorted((a, z) -> Integer.compare(a.getValue().pid(), z.getValue().pid())) + .sorted((a, z) -> a.getValue().signal().compareTo(z.getValue().signal())) .forEach(e -> { final String k = e.getKey(); final Protocol v = e.getValue(); - final Integer pid = v.pid(); final String name = v.name(); - if(this.protocolMapping.containsKey(pid)) { - throw MessageCodeException.of("存在重复信令协议:" + pid); + final String signal = v.signal(); + if(this.protocolMapping.containsKey(signal)) { + throw MessageCodeException.of("存在重复信令协议:" + signal); } - log.info("注册信令协议:{}-{}-{}", pid, String.format("%32s", k), name); - this.protocolMapping.put(pid, v); + log.info("注册信令协议:{} - {} - {}", String.format("%-32s", signal), String.format("%-32s", k), name); + this.protocolMapping.put(signal, v); }); } /** - * @param pid 信令标识 + * @param signal 信令标识 * * @return 信令 */ - public Protocol protocol(Integer pid) { - return this.protocolMapping.get(pid); + public Protocol protocol(String signal) { + return this.protocolMapping.get(signal); } /** @@ -84,31 +84,31 @@ public class ProtocolManager { final Message value = JSONUtils.toJava(message, Message.class); if(value == null) { log.warn("消息格式错误(解析失败):{}", message); - session.push(this.errorProtocol.build("消息格式错误(解析失败)")); + session.push(this.platformErrorProtocol.build("消息格式错误(解析失败)")); return; } final Header header = value.getHeader(); if(header == null) { log.warn("消息格式错误(没有头部):{}", message); - session.push(this.errorProtocol.build("消息格式错误(没有头部)")); + session.push(this.platformErrorProtocol.build("消息格式错误(没有头部)")); return; } final String v = header.getV(); final String id = header.getId(); final String sn = header.getSn(); - final Integer pid = header.getPid(); - if(v == null || id == null || sn == null || pid == null) { + final String signal = header.getSignal(); + if(v == null || id == null || sn == null || signal == null) { log.warn("消息格式错误(缺失头部关键参数):{}", message); - session.push(this.errorProtocol.build("消息格式错误(缺失头部关键参数)")); + session.push(this.platformErrorProtocol.build("消息格式错误(缺失头部关键参数)")); return; } // 设置缓存ID - this.errorProtocol.set(id); + this.platformErrorProtocol.set(id); // 开始处理协议 - final Protocol protocol = this.protocolMapping.get(pid); + final Protocol protocol = this.protocolMapping.get(signal); if(protocol == null) { log.warn("不支持的信令协议:{}", message); - session.push(this.errorProtocol.build("不支持的信令协议:" + pid)); + session.push(this.platformErrorProtocol.build("不支持的信令协议:" + signal)); return; } if(protocol instanceof ClientRegisterProtocol) { @@ -117,7 +117,7 @@ public class ProtocolManager { protocol.execute(sn, value, session); } else { log.warn("终端会话没有授权:{}", message); - session.push(this.errorProtocol.build(MessageCode.CODE_3401, "终端会话没有授权")); + session.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 673ed47..252b2d3 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 @@ -13,8 +13,8 @@ import com.acgist.taoyao.signal.client.ClientSession; */ public abstract class ProtocolMapAdapter extends ProtocolAdapter { - protected ProtocolMapAdapter(Integer pid, String name) { - super(pid, name); + protected ProtocolMapAdapter(String name, String signal) { + super(name, signal); } @Override diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/ProtocolMediasoupAdapter.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/ProtocolMediaAdapter.java similarity index 50% rename from taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/ProtocolMediasoupAdapter.java rename to taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/ProtocolMediaAdapter.java index 61031d0..7cc8db4 100644 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/ProtocolMediasoupAdapter.java +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/ProtocolMediaAdapter.java @@ -2,26 +2,18 @@ package com.acgist.taoyao.signal.protocol; import java.net.http.WebSocket; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Lazy; - import com.acgist.taoyao.boot.model.Message; -import com.acgist.taoyao.mediasoup.MediasoupClient; import com.acgist.taoyao.signal.client.ClientSession; /** - * Mediasoup信令适配器 + * 媒体信令适配器 * * @author acgist */ -public abstract class ProtocolMediasoupAdapter extends ProtocolAdapter { +public abstract class ProtocolMediaAdapter extends ProtocolAdapter { - @Lazy - @Autowired - protected MediasoupClient mediasoupClient; - - protected ProtocolMediasoupAdapter(Integer pid, String name) { - super(pid, name); + protected ProtocolMediaAdapter(String name, String signal) { + super(name, signal); } @Override @@ -29,7 +21,7 @@ public abstract class ProtocolMediasoupAdapter extends ProtocolAdapter { } /** - * 处理Mediasoup信令 + * 处理媒体信令 * * @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 f13c4d8..630d238 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 @@ -16,13 +16,13 @@ import com.acgist.taoyao.signal.protocol.ProtocolAdapter; @Protocol public class ClientBroadcastProtocol extends ProtocolAdapter { - public static final Integer PID = 2007; + public static final String SIGNAL = "client::broadcast"; @Autowired private ClientSessionManager clientSessionManager; public ClientBroadcastProtocol() { - super(PID, "广播信令"); + super("广播信令", SIGNAL); } @Override 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 e45dd06..d597e33 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 @@ -16,10 +16,10 @@ import lombok.extern.slf4j.Slf4j; @Protocol public class ClientCloseProtocol extends ProtocolAdapter { - public static final Integer PID = 2001; + public static final String SIGNAL = "client::close"; public ClientCloseProtocol() { - super(PID, "终端关闭信令"); + super("终端关闭信令", SIGNAL); } @Override 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 f2ea3a8..2985e03 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 @@ -22,7 +22,7 @@ import com.acgist.taoyao.signal.protocol.ProtocolAdapter; @Protocol public class ClientConfigProtocol extends ProtocolAdapter { - public static final Integer PID = 2004; + public static final String SIGNAL = "client::config"; @Autowired private MediaProperties mediaProperties; @@ -30,7 +30,7 @@ public class ClientConfigProtocol extends ProtocolAdapter { private WebrtcProperties webrtcProperties; public ClientConfigProtocol() { - super(PID, "信令协议标识"); + super("下发配置信令", SIGNAL); } @Override 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 aeff236..e2b9ea7 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 @@ -17,10 +17,10 @@ import com.acgist.taoyao.signal.protocol.ProtocolMapAdapter; @Protocol public class ClientHeartbeatProtocol extends ProtocolMapAdapter { - public static final Integer PID = 2005; + public static final String SIGNAL = "client::heartbeat"; public ClientHeartbeatProtocol() { - super(PID, "心跳信令"); + super("心跳信令", SIGNAL); } @Override @@ -31,6 +31,7 @@ public class ClientHeartbeatProtocol extends ProtocolMapAdapter { 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)); 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 86f6ed4..3228d48 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 @@ -16,13 +16,13 @@ import com.acgist.taoyao.signal.protocol.ProtocolAdapter; @Protocol public class ClientListProtocol extends ProtocolAdapter { - public static final Integer PID = 2999; + public static final String SIGNAL = "client::list"; @Autowired private ClientSessionManager clientSessionManager; public ClientListProtocol() { - super(PID, "终端列表信令"); + super("终端列表信令", SIGNAL); } @Override 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 0868771..d1b20a4 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 @@ -13,10 +13,10 @@ import com.acgist.taoyao.signal.protocol.ProtocolAdapter; @Protocol public class ClientOfflineProtocol extends ProtocolAdapter { - public static final Integer PID = 2003; + public static final String SIGNAL = "client::offline"; public ClientOfflineProtocol() { - super(PID, "终端下线信令"); + super("终端下线信令", SIGNAL); } @Override 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 1120a8c..cdcc715 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 @@ -13,10 +13,10 @@ import com.acgist.taoyao.signal.protocol.ProtocolAdapter; @Protocol public class ClientOnlineProtocol extends ProtocolAdapter { - public static final Integer PID = 2002; + public static final String SIGNAL = "client::online"; public ClientOnlineProtocol() { - super(PID, "终端上线信令"); + super("终端上线信令", SIGNAL); } @Override 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 4488c52..40170ac 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 @@ -13,10 +13,10 @@ import com.acgist.taoyao.signal.protocol.ProtocolAdapter; @Protocol public class ClientRebootProtocol extends ProtocolAdapter { - public static final Integer PID = 2997; + public static final String SIGNAL = "client::reboot"; public ClientRebootProtocol() { - super(PID, "重启终端信令"); + super("重启终端信令", SIGNAL); } @Override 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 f69c0a5..8de855a 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 @@ -23,13 +23,13 @@ import lombok.extern.slf4j.Slf4j; @Protocol public class ClientRegisterProtocol extends ProtocolMapAdapter { - public static final Integer PID = 2000; + public static final String SIGNAL = "client::register"; @Autowired private SecurityService securityService; public ClientRegisterProtocol() { - super(PID, "终端注册信令"); + super("终端注册信令", SIGNAL); } @Override @@ -47,7 +47,7 @@ public class ClientRegisterProtocol extends ProtocolMapAdapter { // 推送消息 session.push(message.cloneWidthoutBody()); // 发送事件 - this.publishEvent(new ClientRegisterEvent(sn, body, message, session)); + this.publishEvent(new ClientRegisterEvent(body, message, session)); } } 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 f662bb1..752dec1 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 @@ -19,19 +19,19 @@ import com.acgist.taoyao.signal.protocol.ProtocolMapAdapter; @Protocol public class ClientStatusProtocol extends ProtocolMapAdapter { - public static final Integer PID = 2998; + public static final String SIGNAL = "client::status"; @Autowired private ClientSessionManager clientSessionManager; public ClientStatusProtocol() { - super(PID, "终端状态信令"); + super("终端状态信令", SIGNAL); } @Override public void execute(String sn, Map body, Message message, ClientSession session) { - String querySn = (String) body.get("sn"); // 如果没有指定终端标识默认查询自己 + String querySn = (String) body.get("sn"); if(StringUtils.isEmpty(querySn)) { querySn = sn; } 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 9b2e161..4829f4b 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 @@ -22,13 +22,13 @@ import lombok.extern.slf4j.Slf4j; @Protocol public class ClientUnicastProtocol extends ProtocolMapAdapter { - public static final Integer PID = 2006; + public static final String SIGNAL = "client::unicast"; @Autowired private ClientSessionManager clientSessionManager; public ClientUnicastProtocol() { - super(PID, "单播信令"); + super("单播信令", SIGNAL); } @Override diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/ConsumerPauseProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/ConsumerPauseProtocol.java new file mode 100644 index 0000000..cd9d334 --- /dev/null +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/ConsumerPauseProtocol.java @@ -0,0 +1,5 @@ +package com.acgist.taoyao.signal.protocol.media; + +public class ConsumerPauseProtocol { + +} diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/ConsumerRequestKeyFrameProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/ConsumerRequestKeyFrameProtocol.java new file mode 100644 index 0000000..54e05d6 --- /dev/null +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/ConsumerRequestKeyFrameProtocol.java @@ -0,0 +1,5 @@ +package com.acgist.taoyao.signal.protocol.media; + +public class ConsumerRequestKeyFrameProtocol { + +} diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/ConsumerResumeProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/ConsumerResumeProtocol.java new file mode 100644 index 0000000..8b364fc --- /dev/null +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/ConsumerResumeProtocol.java @@ -0,0 +1,5 @@ +package com.acgist.taoyao.signal.protocol.media; + +public class ConsumerResumeProtocol { + +} diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/ConsumerSetPreferredLayersProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/ConsumerSetPreferredLayersProtocol.java new file mode 100644 index 0000000..cee1091 --- /dev/null +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/ConsumerSetPreferredLayersProtocol.java @@ -0,0 +1,5 @@ +package com.acgist.taoyao.signal.protocol.media; + +public class ConsumerSetPreferredLayersProtocol { + +} diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/ConsumerSetPriorityProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/ConsumerSetPriorityProtocol.java new file mode 100644 index 0000000..f24dff7 --- /dev/null +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/ConsumerSetPriorityProtocol.java @@ -0,0 +1,5 @@ +package com.acgist.taoyao.signal.protocol.media; + +public class ConsumerSetPriorityProtocol { + +} diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/ConsumerStatusProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/ConsumerStatusProtocol.java new file mode 100644 index 0000000..f1b3876 --- /dev/null +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/ConsumerStatusProtocol.java @@ -0,0 +1,5 @@ +package com.acgist.taoyao.signal.protocol.media; + +public class ConsumerStatusProtocol { + +} diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/DataConsumerStatusProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/DataConsumerStatusProtocol.java new file mode 100644 index 0000000..7cc4834 --- /dev/null +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/DataConsumerStatusProtocol.java @@ -0,0 +1,5 @@ +package com.acgist.taoyao.signal.protocol.media; + +public class DataConsumerStatusProtocol { + +} diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/DisplayNameChangeProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/DisplayNameChangeProtocol.java new file mode 100644 index 0000000..c21cd89 --- /dev/null +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/DisplayNameChangeProtocol.java @@ -0,0 +1,5 @@ +package com.acgist.taoyao.signal.protocol.media; + +public class DisplayNameChangeProtocol { + +} diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/IceRestartProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/IceRestartProtocol.java new file mode 100644 index 0000000..2786ee2 --- /dev/null +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/IceRestartProtocol.java @@ -0,0 +1,5 @@ +package com.acgist.taoyao.signal.protocol.media; + +public class IceRestartProtocol { + +} 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 new file mode 100644 index 0000000..ec407fe --- /dev/null +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/MediaRebootProtocol.java @@ -0,0 +1,39 @@ +package com.acgist.taoyao.signal.protocol.media; + +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.event.platform.PlatformScriptEvent; +import com.acgist.taoyao.signal.protocol.ProtocolAdapter; + +import lombok.extern.slf4j.Slf4j; + +/** + * 重启媒体信令 + * + * @author acgist + */ +@Slf4j +public class MediaRebootProtocol extends ProtocolAdapter { + + public static final String SIGNAL = "media::reboot"; + + @Autowired + private ScriptProperties scriptProperties; + + public MediaRebootProtocol() { + super("重启媒体信令", SIGNAL); + } + + @Override + public void execute(String sn, Message message, ClientSession session) { + log.info("重启媒体:{}", sn); + // 全员广播 + this.clientSessionManager.broadcast(message); + // 推送事件 + this.publishEvent(new PlatformScriptEvent(this.scriptProperties.getMediaReboot(), message, session)); + } + +} diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/MediaRecordProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/MediaRecordProtocol.java new file mode 100644 index 0000000..3dda6c9 --- /dev/null +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/MediaRecordProtocol.java @@ -0,0 +1,5 @@ +package com.acgist.taoyao.signal.protocol.media; + +public class MediaRecordProtocol { + +} diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/AuthorizeProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/MediaRegisterProtocol.java similarity index 59% rename from taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/AuthorizeProtocol.java rename to taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/MediaRegisterProtocol.java index aeb562c..527fb46 100644 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/AuthorizeProtocol.java +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/MediaRegisterProtocol.java @@ -1,4 +1,4 @@ -package com.acgist.taoyao.mediasoup.protocol; +package com.acgist.taoyao.signal.protocol.media; import java.net.http.WebSocket; import java.util.Map; @@ -6,29 +6,29 @@ 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.protocol.ProtocolMediasoupAdapter; +import com.acgist.taoyao.signal.protocol.ProtocolMediaAdapter; import lombok.extern.slf4j.Slf4j; /** - * Mediasoup终端授权信令 + * 媒体终端注册信令 * * @author acgist */ @Slf4j @Protocol -public class AuthorizeProtocol extends ProtocolMediasoupAdapter { +public class MediaRegisterProtocol extends ProtocolMediaAdapter { - public static final Integer PID = 6000; + public static final String SIGNAL = "media::register"; - public AuthorizeProtocol() { - super(PID, "Mediasoup终端授权信令"); + public MediaRegisterProtocol() { + super("媒体终端注册信令", SIGNAL); } /** * 创建信令消息 * - * @param mediasoup Mediasoup配置 + * @param mediasoup 媒体配置 * * @return 信令消息 */ @@ -41,7 +41,7 @@ public class AuthorizeProtocol extends ProtocolMediasoupAdapter { @Override public void execute(Message message, WebSocket webSocket) { - log.info("Mediasoup终端授权结果:{}", message); + log.info("媒体终端注册结果:{}", message); } } diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/MediaShutdownProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/MediaShutdownProtocol.java new file mode 100644 index 0000000..275d2cf --- /dev/null +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/MediaShutdownProtocol.java @@ -0,0 +1,5 @@ +package com.acgist.taoyao.signal.protocol.media; + +public class MediaShutdownProtocol { + +} diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/NetworkThrottleApplyProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/NetworkThrottleApplyProtocol.java new file mode 100644 index 0000000..2cd3135 --- /dev/null +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/NetworkThrottleApplyProtocol.java @@ -0,0 +1,5 @@ +package com.acgist.taoyao.signal.protocol.media; + +public class NetworkThrottleApplyProtocol { + +} diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/NetworkThrottleResetProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/NetworkThrottleResetProtocol.java new file mode 100644 index 0000000..ea452bb --- /dev/null +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/NetworkThrottleResetProtocol.java @@ -0,0 +1,5 @@ +package com.acgist.taoyao.signal.protocol.media; + +public class NetworkThrottleResetProtocol { + +} diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/PeerNewProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/PeerNewProtocol.java new file mode 100644 index 0000000..2f00b08 --- /dev/null +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/PeerNewProtocol.java @@ -0,0 +1,5 @@ +package com.acgist.taoyao.signal.protocol.media; + +public class PeerNewProtocol { + +} diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/ProduceDataProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/ProduceDataProtocol.java new file mode 100644 index 0000000..6ec9cf0 --- /dev/null +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/ProduceDataProtocol.java @@ -0,0 +1,5 @@ +package com.acgist.taoyao.signal.protocol.media; + +public class ProduceDataProtocol { + +} diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/ProduceProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/ProduceProtocol.java new file mode 100644 index 0000000..e964047 --- /dev/null +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/ProduceProtocol.java @@ -0,0 +1,5 @@ +package com.acgist.taoyao.signal.protocol.media; + +public class ProduceProtocol { + +} diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/ProducerCloseProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/ProducerCloseProtocol.java new file mode 100644 index 0000000..048c9b3 --- /dev/null +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/ProducerCloseProtocol.java @@ -0,0 +1,5 @@ +package com.acgist.taoyao.signal.protocol.media; + +public class ProducerCloseProtocol { + +} diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/ProducerDataStatusProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/ProducerDataStatusProtocol.java new file mode 100644 index 0000000..06a747d --- /dev/null +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/ProducerDataStatusProtocol.java @@ -0,0 +1,5 @@ +package com.acgist.taoyao.signal.protocol.media; + +public class ProducerDataStatusProtocol { + +} diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/ProducerPauseProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/ProducerPauseProtocol.java new file mode 100644 index 0000000..65b51ab --- /dev/null +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/ProducerPauseProtocol.java @@ -0,0 +1,5 @@ +package com.acgist.taoyao.signal.protocol.media; + +public class ProducerPauseProtocol { + +} diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/ProducerResumeProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/ProducerResumeProtocol.java new file mode 100644 index 0000000..4df76d0 --- /dev/null +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/ProducerResumeProtocol.java @@ -0,0 +1,5 @@ +package com.acgist.taoyao.signal.protocol.media; + +public class ProducerResumeProtocol { + +} diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/ProducerScoreProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/ProducerScoreProtocol.java new file mode 100644 index 0000000..9d34fd4 --- /dev/null +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/ProducerScoreProtocol.java @@ -0,0 +1,5 @@ +package com.acgist.taoyao.signal.protocol.media; + +public class ProducerScoreProtocol { + +} diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/ProducerStatusProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/ProducerStatusProtocol.java new file mode 100644 index 0000000..ebf3101 --- /dev/null +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/ProducerStatusProtocol.java @@ -0,0 +1,5 @@ +package com.acgist.taoyao.signal.protocol.media; + +public class ProducerStatusProtocol { + +} diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/TransportStatusProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/TransportStatusProtocol.java new file mode 100644 index 0000000..7583e3b --- /dev/null +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/TransportStatusProtocol.java @@ -0,0 +1,5 @@ +package com.acgist.taoyao.signal.protocol.media; + +public class TransportStatusProtocol { + +} diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/VideoOrientationChangeProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/VideoOrientationChangeProtocol.java new file mode 100644 index 0000000..5ac00ae --- /dev/null +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/VideoOrientationChangeProtocol.java @@ -0,0 +1,5 @@ +package com.acgist.taoyao.signal.protocol.media; + +public class VideoOrientationChangeProtocol { + +} diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/WebRtcTransportConnectProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/WebRtcTransportConnectProtocol.java new file mode 100644 index 0000000..8a25b38 --- /dev/null +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/WebRtcTransportConnectProtocol.java @@ -0,0 +1,5 @@ +package com.acgist.taoyao.signal.protocol.media; + +public class WebRtcTransportConnectProtocol { + +} diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/WebRtcTransportCreateProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/WebRtcTransportCreateProtocol.java new file mode 100644 index 0000000..2782b6d --- /dev/null +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/WebRtcTransportCreateProtocol.java @@ -0,0 +1,5 @@ +package com.acgist.taoyao.signal.protocol.media; + +public class WebRtcTransportCreateProtocol { + +} diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/platform/ErrorProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/platform/PlatformErrorProtocol.java similarity index 75% rename from taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/platform/ErrorProtocol.java rename to taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/platform/PlatformErrorProtocol.java index 4c3176e..3b9a8f4 100644 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/platform/ErrorProtocol.java +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/platform/PlatformErrorProtocol.java @@ -7,22 +7,22 @@ import com.acgist.taoyao.signal.client.ClientSession; import com.acgist.taoyao.signal.protocol.ProtocolAdapter; /** - * 异常信令 + * 平台异常信令 * * @author acgist */ @Protocol -public class ErrorProtocol extends ProtocolAdapter { +public class PlatformErrorProtocol extends ProtocolAdapter { - public static final Integer PID = 1999; + public static final String SIGNAL = "platform::error"; /** * 请求ID缓存 */ - private InheritableThreadLocal idLocal = new InheritableThreadLocal<>(); + private ThreadLocal idLocal = new InheritableThreadLocal<>(); - public ErrorProtocol() { - super(PID, "异常信令"); + public PlatformErrorProtocol() { + super("平台异常信令", SIGNAL); } /** 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 new file mode 100644 index 0000000..ae3f29c --- /dev/null +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/platform/PlatformRebootProtocol.java @@ -0,0 +1,39 @@ +package com.acgist.taoyao.signal.protocol.platform; + +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.event.platform.PlatformScriptEvent; +import com.acgist.taoyao.signal.protocol.ProtocolAdapter; + +import lombok.extern.slf4j.Slf4j; + +/** + * 重启平台信令 + * + * @author acgist + */ +@Slf4j +public class PlatformRebootProtocol extends ProtocolAdapter { + + public static final String SIGNAL = "platform::reboot"; + + @Autowired + private ScriptProperties scriptProperties; + + public PlatformRebootProtocol() { + super("重启平台信令", SIGNAL); + } + + @Override + public void execute(String sn, Message message, ClientSession session) { + log.info("重启平台:{}", sn); + // 全员广播 + this.clientSessionManager.broadcast(message); + // 推送事件 + this.publishEvent(new PlatformScriptEvent(this.scriptProperties.getPlatformReboot(), message, session)); + } + +} \ No newline at end of file diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/platform/ScriptProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/platform/PlatformScriptProtocol.java similarity index 54% rename from taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/platform/ScriptProtocol.java rename to taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/platform/PlatformScriptProtocol.java index 4de3e66..d382637 100644 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/platform/ScriptProtocol.java +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/platform/PlatformScriptProtocol.java @@ -4,7 +4,7 @@ import java.util.Map; import com.acgist.taoyao.boot.model.Message; import com.acgist.taoyao.signal.client.ClientSession; -import com.acgist.taoyao.signal.event.platform.ScriptEvent; +import com.acgist.taoyao.signal.event.platform.PlatformScriptEvent; import com.acgist.taoyao.signal.protocol.ProtocolMapAdapter; /** @@ -12,17 +12,17 @@ import com.acgist.taoyao.signal.protocol.ProtocolMapAdapter; * * @author acgist */ -public class ScriptProtocol extends ProtocolMapAdapter { +public class PlatformScriptProtocol extends ProtocolMapAdapter { - public static final Integer PID = 1001; + public static final String SIGNAL = "platform::script"; - public ScriptProtocol() { - super(PID, "执行命令信令"); + public PlatformScriptProtocol() { + super("执行命令信令", SIGNAL); } @Override public void execute(String sn, Map body, Message message, ClientSession session) { - this.publishEvent(new ScriptEvent(sn, body, message, session)); + this.publishEvent(new PlatformScriptEvent(body, message, session)); } } 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 new file mode 100644 index 0000000..df68260 --- /dev/null +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/platform/PlatformShutdownProtocol.java @@ -0,0 +1,33 @@ +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.event.platform.PlatformShutdownEvent; +import com.acgist.taoyao.signal.protocol.ProtocolAdapter; + +import lombok.extern.slf4j.Slf4j; + +/** + * 关闭平台信令 + * + * @author acgist + */ +@Slf4j +public class PlatformShutdownProtocol extends ProtocolAdapter { + + public static final String SIGNAL = "platform::shutdown"; + + public PlatformShutdownProtocol() { + super("关闭平台信令", SIGNAL); + } + + @Override + public void execute(String sn, Message message, ClientSession session) { + log.info("关闭平台:{}", sn); + // 全员广播 + this.clientSessionManager.broadcast(message); + // 推送事件 + this.publishEvent(new PlatformShutdownEvent(message, session)); + } + +} diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/platform/ShutdownProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/platform/ShutdownProtocol.java deleted file mode 100644 index 31a803d..0000000 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/platform/ShutdownProtocol.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.acgist.taoyao.signal.protocol.platform; - -import java.util.Map; - -import org.springframework.context.ConfigurableApplicationContext; - -import com.acgist.taoyao.boot.model.Message; -import com.acgist.taoyao.signal.client.ClientSession; -import com.acgist.taoyao.signal.event.platform.ShutdownEvent; -import com.acgist.taoyao.signal.protocol.ProtocolMapAdapter; - -import lombok.extern.slf4j.Slf4j; - -/** - * 关闭服务信令 - * - * @author acgist - */ -@Slf4j -public class ShutdownProtocol extends ProtocolMapAdapter { - - public static final Integer PID = 1000; - - public ShutdownProtocol() { - super(PID, "关闭服务信令"); - } - - @Override - public void execute(String sn, Map body, Message message, ClientSession session) { - // 推送事件 - this.publishEvent(new ShutdownEvent(sn, body, message, session)); - // 全员广播 - this.clientSessionManager.broadcast(message); - // 关闭信令服务 - if(this.context instanceof ConfigurableApplicationContext context) { - log.info("关闭信令服务:{}", sn); - if(context.isActive()) { - // 如果需要完整广播可以设置延时 - context.close(); - } - } else { - log.info("关闭服务失败:{}", sn); - } - } - -} 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 5d0360b..511683e 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 @@ -16,15 +16,15 @@ import com.acgist.taoyao.signal.protocol.ProtocolMapAdapter; @Protocol public class RoomCreateProtocol extends ProtocolMapAdapter { - public static final Integer PID = 4000; + public static final String SIGNAL = "room::create"; public RoomCreateProtocol() { - super(PID, "创建房间信令"); + super("创建房间信令", SIGNAL); } @Override public void execute(String sn, Map body, Message message, ClientSession session) { - this.publishEvent(new RoomCreateEvent(sn, body, message, session)); + this.publishEvent(new RoomCreateEvent(body, message, session)); } } 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 1b05e6a..5b3416d 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 @@ -16,15 +16,15 @@ import com.acgist.taoyao.signal.protocol.ProtocolMapAdapter; @Protocol public class RoomEnterProtocol extends ProtocolMapAdapter { - public static final Integer PID = 4002; + public static final String SIGNAL = "room::enter"; public RoomEnterProtocol() { - super(PID, "进入房间信令"); + super("进入房间信令", SIGNAL); } @Override public void execute(String sn, Map body, Message message, ClientSession session) { - this.publishEvent(new RoomEnterEvent(sn, body, message, session)); + this.publishEvent(new RoomEnterEvent(body, message, session)); } } 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 new file mode 100644 index 0000000..67370b5 --- /dev/null +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/system/SystemRebootProtocol.java @@ -0,0 +1,37 @@ +package com.acgist.taoyao.signal.protocol.system; + +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.event.platform.PlatformScriptEvent; +import com.acgist.taoyao.signal.protocol.ProtocolAdapter; + +import lombok.extern.slf4j.Slf4j; + +/** + * 重启系统信令 + * + * @author acgist + */ +@Slf4j +public class SystemRebootProtocol extends ProtocolAdapter { + + public static final String SIGNAL = "system::reboot"; + + @Autowired + private ScriptProperties scriptProperties; + + public SystemRebootProtocol() { + super("重启系统信令", SIGNAL); + } + + @Override + public void execute(String sn, Message message, ClientSession session) { + log.info("重启系统:{}", sn); + this.clientSessionManager.broadcast(message); + this.publishEvent(new PlatformScriptEvent(this.scriptProperties.getSystemReboot(), message, session)); + } + +} 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 new file mode 100644 index 0000000..4562696 --- /dev/null +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/system/SystemShutdownProtocol.java @@ -0,0 +1,37 @@ +package com.acgist.taoyao.signal.protocol.system; + +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.event.platform.PlatformScriptEvent; +import com.acgist.taoyao.signal.protocol.ProtocolAdapter; + +import lombok.extern.slf4j.Slf4j; + +/** + * 关闭系统信令 + * + * @author acgist + */ +@Slf4j +public class SystemShutdownProtocol extends ProtocolAdapter { + + public static final String SIGNAL = "system::shutdown"; + + @Autowired + private ScriptProperties scriptProperties; + + public SystemShutdownProtocol() { + super("关闭系统信令", SIGNAL); + } + + @Override + public void execute(String sn, Message message, ClientSession session) { + log.info("关闭系统:{}", sn); + this.clientSessionManager.broadcast(message); + this.publishEvent(new PlatformScriptEvent(this.scriptProperties.getSystemShutdown(), message, session)); + } + +} 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 new file mode 100644 index 0000000..0a55092 --- /dev/null +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/room/RoomStatus.java @@ -0,0 +1,44 @@ +package com.acgist.taoyao.signal.room; + +import java.util.List; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; + +/** + * 房间状态 + * + * @author acgist + */ +@Getter +@Setter +public class RoomStatus { + + /** + * 房间ID + */ + @Schema(title = "房间ID", description = "房间ID") + private Long id; + /** + * 房间终端数量 + */ + @Schema(title = "房间终端数量", description = "房间终端数量") + private Long snSize; + /** + * 房间在线终端数量 + */ + @Schema(title = "房间在线终端数量", description = "房间在线终端数量") + private Long onlineSnSize; + /** + * 房间终端列表 + */ + @Schema(title = "房间终端列表", description = "房间终端列表") + private List snList; + /** + * 媒体服务名称 + */ + @Schema(title = "媒体服务名称", description = "媒体服务名称") + private String mediasoup; + +} 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 5834e88..de0038f 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 @@ -18,11 +18,9 @@ public class SecurityServiceImpl implements SecurityService { @Override public boolean authenticate(String username, String password) { if( - Boolean.FALSE.equals(this.securityProperties.getEnabled()) || - ( - StringUtils.equals(this.securityProperties.getUsername(), username) && - StringUtils.equals(this.securityProperties.getPassword(), password) - ) + Boolean.TRUE.equals(this.securityProperties.getEnabled()) && + StringUtils.equals(this.securityProperties.getUsername(), username) && + StringUtils.equals(this.securityProperties.getPassword(), password) ) { return true; }