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