From 6358255458e74f55da7fefcd87dfb0bb7c358805 Mon Sep 17 00:00:00 2001 From: acgist <289547414@qq.com> Date: Wed, 22 Feb 2023 07:42:40 +0800 Subject: [PATCH] =?UTF-8?q?[+]=20=E7=BB=93=E6=9E=84=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitmodules | 8 +- README.md | 10 +- docs/Deploy.md | 10 +- .../libmediasoupclient | 0 .../README.md | 0 .../ecosystem.config.cluster.json | 2 +- .../ecosystem.config.json | 2 +- taoyao-client-media/mediasoup | 1 + .../package.json | 6 +- .../src/Config.js | 2 +- .../src/Server.js | 0 .../src/Signal.js | 0 .../src/certs/privateKey.pem | 0 .../src/certs/publicKey.pem | 0 .../src/index.html | 2 +- taoyao-media-server/mediasoup | 1 - .../docs/assembly/{release.xml => prd.xml} | 2 +- taoyao-signal-server/docs/bin/deploy.sh | 2 + taoyao-signal-server/pom.xml | 6 +- .../taoyao/boot/annotation/Description.java | 2 - .../boot/{property => config}/Constant.java | 26 +++- .../{property => config}/IdProperties.java | 2 +- .../MediaAudioProperties.java | 2 +- .../{property => config}/MediaProperties.java | 2 +- .../MediaServerProperties.java | 4 +- .../MediaVideoProperties.java | 2 +- .../ScriptProperties.java | 2 +- .../SecurityProperties.java | 3 +- .../SocketProperties.java | 2 +- .../TaoyaoProperties.java | 4 +- .../WebrtcProperties.java | 3 +- .../WebrtcStunProperties.java | 4 +- .../WebrtcTurnProperties.java | 4 +- .../configuration/BootAutoConfiguration.java | 31 ++-- .../SpringDocAutoConfiguration.java | 4 +- .../boot/runner/OrderedCommandLineRunner.java | 18 +++ .../acgist/taoyao/boot/service/IpService.java | 48 ++++++ .../boot/service/impl/IdServiceImpl.java | 2 +- .../boot/service/impl/IpServiceImpl.java | 145 ++++++++++++++++++ .../acgist/taoyao/boot/utils/HTTPUtils.java | 24 +++ .../src/main/resources/logback-spring.xml | 12 +- .../taoyao/controller/ConfigController.java | 4 +- .../taoyao/controller/ControlController.java | 85 ++++++++++ .../interceptor/SecurityInterceptor.java | 2 +- .../taoyao/interceptor/SlowInterceptor.java | 2 +- .../src/main/resources/application-dev.yml | 4 +- .../src/main/resources/application-local.yml | 12 -- ...cation-release.yml => application-prd.yml} | 0 .../src/main/resources/application.yml | 29 ++-- .../{boot => }/service/IdServiceTest.java | 3 +- .../acgist/taoyao/service/IpServiceTest.java | 77 ++++++++++ .../taoyao/signal/SocketSignalTest.java | 2 +- .../acgist/taoyao/signal/MapBodyGetter.java | 12 +- .../taoyao/signal/client/ClientManager.java | 4 +- .../taoyao/signal/client/ClientType.java | 45 ++++++ .../signal/client/socket/SocketClient.java | 2 +- .../signal/client/socket/SocketSignal.java | 2 +- .../socket/SocketSignalAcceptHandler.java | 2 +- .../socket/SocketSignalMessageHandler.java | 2 +- .../client/websocket/WebSocketClient.java | 2 +- .../WebSocketSignalConfigurator.java | 2 +- .../MediaClientAutoConfiguration.java | 5 +- .../SignalAutoConfiguration.java | 30 ++++ .../SocketSignalAutoConfiguration.java | 5 +- .../signal/controller/ClientController.java | 12 +- .../signal/controller/ProtocolController.java | 32 ++-- .../taoyao/signal/media/MediaClient.java | 11 +- .../signal/media/MediaClientManager.java | 2 +- .../taoyao/signal/media/RoomManager.java | 2 +- .../acgist/taoyao/signal/media/Transport.java | 2 +- .../signal/protocol/ControlProtocol.java | 11 ++ .../taoyao/signal/protocol/Protocol.java | 33 ++-- .../signal/protocol/ProtocolAdapter.java | 10 +- .../protocol/ProtocolClientAdapter.java | 16 +- .../signal/protocol/ProtocolManager.java | 14 +- .../signal/protocol/ProtocolMediaAdapter.java | 7 +- .../signal/protocol/ProtocolRoomAdapter.java | 22 +-- .../protocol/client/ClientCloseProtocol.java | 2 +- .../protocol/client/ClientConfigProtocol.java | 36 +++-- .../client/ClientHeartbeatProtocol.java | 2 +- .../protocol/client/ClientRebootProtocol.java | 19 ++- .../client/ClientRegisterProtocol.java | 4 +- .../client/ClientShutdownProtocol.java | 32 ++++ .../protocol/client/ClientStatusProtocol.java | 2 +- .../client/ClientUnicastProtocol.java | 2 +- .../protocol/client/ClientWakeupProtocol.java | 10 ++ .../protocol/media/MediaListProtocol.java | 2 +- .../protocol/media/MediaRebootProtocol.java | 16 +- .../protocol/media/MediaRegisterProtocol.java | 4 +- .../protocol/media/MediaShutdownProtocol.java | 16 +- .../MediaTransportWebRtcCreateProtocol.java | 57 ++++++- .../platform/PlatformRebootProtocol.java | 14 +- .../platform/PlatformScriptProtocol.java | 2 +- .../platform/PlatformShutdownProtocol.java | 21 ++- .../protocol/room/RoomCreateProtocol.java | 2 +- .../protocol/room/RoomEnterProtocol.java | 2 +- .../protocol/system/SystemRebootProtocol.java | 14 +- .../system/SystemShutdownProtocol.java | 14 +- .../signal/service/SecurityService.java | 3 + .../service/UsernamePasswordService.java | 20 +++ .../service/impl/SecurityServiceImpl.java | 23 +-- .../wrapper/WebrtcPropertiesWrapper.java | 79 ++++++++++ ...ot.autoconfigure.AutoConfiguration.imports | 1 + 103 files changed, 1056 insertions(+), 250 deletions(-) rename {taoyao-client-android => taoyao-client-harmony}/libmediasoupclient (100%) rename {taoyao-media-server => taoyao-client-media}/README.md (100%) rename {taoyao-media-server => taoyao-client-media}/ecosystem.config.cluster.json (87%) rename {taoyao-media-server => taoyao-client-media}/ecosystem.config.json (84%) create mode 160000 taoyao-client-media/mediasoup rename {taoyao-media-server => taoyao-client-media}/package.json (67%) rename {taoyao-media-server => taoyao-client-media}/src/Config.js (99%) rename {taoyao-media-server => taoyao-client-media}/src/Server.js (100%) rename {taoyao-media-server => taoyao-client-media}/src/Signal.js (100%) rename {taoyao-media-server => taoyao-client-media}/src/certs/privateKey.pem (100%) rename {taoyao-media-server => taoyao-client-media}/src/certs/publicKey.pem (100%) rename {taoyao-media-server => taoyao-client-media}/src/index.html (78%) delete mode 160000 taoyao-media-server/mediasoup rename taoyao-signal-server/docs/assembly/{release.xml => prd.xml} (98%) rename taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/{property => config}/Constant.java (89%) rename taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/{property => config}/IdProperties.java (93%) rename taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/{property => config}/MediaAudioProperties.java (94%) rename taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/{property => config}/MediaProperties.java (96%) rename taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/{property => config}/MediaServerProperties.java (85%) rename taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/{property => config}/MediaVideoProperties.java (97%) rename taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/{property => config}/ScriptProperties.java (96%) rename taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/{property => config}/SecurityProperties.java (88%) rename taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/{property => config}/SocketProperties.java (97%) rename taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/{property => config}/TaoyaoProperties.java (86%) rename taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/{property => config}/WebrtcProperties.java (92%) rename taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/{property => config}/WebrtcStunProperties.java (83%) rename taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/{property => config}/WebrtcTurnProperties.java (85%) create mode 100644 taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/runner/OrderedCommandLineRunner.java create mode 100644 taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/service/IpService.java create mode 100644 taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/service/impl/IpServiceImpl.java create mode 100644 taoyao-signal-server/taoyao-server/src/main/java/com/acgist/taoyao/controller/ControlController.java delete mode 100644 taoyao-signal-server/taoyao-server/src/main/resources/application-local.yml rename taoyao-signal-server/taoyao-server/src/main/resources/{application-release.yml => application-prd.yml} (100%) rename taoyao-signal-server/taoyao-server/src/test/java/com/acgist/taoyao/{boot => }/service/IdServiceTest.java (90%) create mode 100644 taoyao-signal-server/taoyao-server/src/test/java/com/acgist/taoyao/service/IpServiceTest.java create mode 100644 taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/ClientType.java create mode 100644 taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/configuration/SignalAutoConfiguration.java create mode 100644 taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/ControlProtocol.java create mode 100644 taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/client/ClientShutdownProtocol.java create mode 100644 taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/client/ClientWakeupProtocol.java create mode 100644 taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/service/UsernamePasswordService.java create mode 100644 taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/wrapper/WebrtcPropertiesWrapper.java diff --git a/.gitmodules b/.gitmodules index c7786e4..826c608 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,12 +1,12 @@ -[submodule "taoyao-media-server/mediasoup"] - path = taoyao-media-server/mediasoup +[submodule "taoyao-client-media/mediasoup"] + path = taoyao-client-media/mediasoup url = https://gitee.com/acgist/mediasoup.git branch = taoyao [submodule "taoyao-client-web/mediasoup-client"] path = taoyao-client-web/mediasoup-client url = https://gitee.com/acgist/mediasoup-client.git branch = taoyao -[submodule "taoyao-client-android/libmediasoupclient"] - path = taoyao-client-android/libmediasoupclient +[submodule "taoyao-client-harmony/libmediasoupclient"] + path = taoyao-client-harmony/libmediasoupclient url = https://gitee.com/acgist/libmediasoupclient.git branch = taoyao \ No newline at end of file diff --git a/README.md b/README.md index ceb9535..7d358e5 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # 桃夭 -桃夭是套基于`Mediasoup`开发的`WebRTC`音视频信令服务 +桃夭是套基于`Mediasoup`开发的`WebRTC`音视频信令服务,可以扩展其他智能终端接入。

Java @@ -20,10 +20,10 @@ |模块|名称|描述| |:--|:--|:--| -|taoyao-client-web|终端示例|Web终端示例| -|taoyao-client-android|终端示例|安卓终端示例| -|taoyao-media-server|媒体服务|媒体服务| -|taoyao-signal-server|信令服务|信令服务| +|taoyao-client-web|Web终端|提供前端控制页面| +|taoyao-client-media|媒体服务|提供音视频接入服务| +|taoyao-client-harmony|鸿蒙终端|鸿蒙智能终端接入| +|taoyao-signal-server|信令服务|终端信令控制| > 注意:只有Web实现完成信令控制 diff --git a/docs/Deploy.md b/docs/Deploy.md index 107f849..2aa9653 100644 --- a/docs/Deploy.md +++ b/docs/Deploy.md @@ -239,7 +239,7 @@ trusted-host = mirrors.aliyun.com pip config list # 编译代码 -cd /data/taoyao/taoyao-media-server +cd /data/taoyao/taoyao-client-media git submodule update --remote cd modulesup git checkout taoyao @@ -247,7 +247,7 @@ cd .. npm install # 配置服务 -pm2 start npm --name "taoyao-media-server" -- run dev | release +pm2 start npm --name "taoyao-client-media" -- run dev | prd pm2 save # 配置ecosystem @@ -256,7 +256,7 @@ pm2 start | reload ecosystem.config.json pm2 save # 管理服务 -pm2 start | stop | restart taoyao-media-server +pm2 start | stop | restart taoyao-client-media ``` ### Mediasoup单独编译 @@ -266,7 +266,7 @@ pm2 start | stop | restart taoyao-media-server ``` # 编译代码 # make -C worker -cd /data/taoyao/taoyao-media-server/mediasoup/worker +cd /data/taoyao/taoyao-client-media/mediasoup/worker make # 清理结果 @@ -285,7 +285,7 @@ make clean # 编译代码 cd /data/taoyao/taoyao-signal-server mvn clean package -D skipTests -#mvn clean package -D skipTests -P release +#mvn clean package -D skipTests -P prd # 拷贝脚本 cp taoyao-server/target/taoyao-server-1.0.0/bin/deploy.sh ./ diff --git a/taoyao-client-android/libmediasoupclient b/taoyao-client-harmony/libmediasoupclient similarity index 100% rename from taoyao-client-android/libmediasoupclient rename to taoyao-client-harmony/libmediasoupclient diff --git a/taoyao-media-server/README.md b/taoyao-client-media/README.md similarity index 100% rename from taoyao-media-server/README.md rename to taoyao-client-media/README.md diff --git a/taoyao-media-server/ecosystem.config.cluster.json b/taoyao-client-media/ecosystem.config.cluster.json similarity index 87% rename from taoyao-media-server/ecosystem.config.cluster.json rename to taoyao-client-media/ecosystem.config.cluster.json index ebf2818..2895b1d 100644 --- a/taoyao-media-server/ecosystem.config.cluster.json +++ b/taoyao-client-media/ecosystem.config.cluster.json @@ -2,7 +2,7 @@ "apps": [ { "cwd": "./", - "name": "taoyao-media-server", + "name": "taoyao-client-media", "script": "src/Server.js", "instances": 2, "exec_mode": "cluster", diff --git a/taoyao-media-server/ecosystem.config.json b/taoyao-client-media/ecosystem.config.json similarity index 84% rename from taoyao-media-server/ecosystem.config.json rename to taoyao-client-media/ecosystem.config.json index 7c82d86..c9f3fc3 100644 --- a/taoyao-media-server/ecosystem.config.json +++ b/taoyao-client-media/ecosystem.config.json @@ -2,7 +2,7 @@ "apps": [ { "cwd": "./", - "name": "taoyao-media-server", + "name": "taoyao-client-media", "script": "src/Server.js", "out_file": "./logs/out.log", "error_file": "./logs/error.log", diff --git a/taoyao-client-media/mediasoup b/taoyao-client-media/mediasoup new file mode 160000 index 0000000..f02edc6 --- /dev/null +++ b/taoyao-client-media/mediasoup @@ -0,0 +1 @@ +Subproject commit f02edc62e764b061917cbd215528db62e27fc9bd diff --git a/taoyao-media-server/package.json b/taoyao-client-media/package.json similarity index 67% rename from taoyao-media-server/package.json rename to taoyao-client-media/package.json index 3d052ef..6a6159a 100644 --- a/taoyao-media-server/package.json +++ b/taoyao-client-media/package.json @@ -1,12 +1,12 @@ { - "name": "taoyao-media-server", + "name": "taoyao-client-media", "author": "acgist", "version": "1.0.0", "private": true, - "description": "taoyao media server", + "description": "taoyao client media", "scripts": { "dev": "node src/Server.js", - "release": "node src/Server.js" + "prd": "node src/Server.js" }, "dependencies": { "ws": "^8.12.0", diff --git a/taoyao-media-server/src/Config.js b/taoyao-client-media/src/Config.js similarity index 99% rename from taoyao-media-server/src/Config.js rename to taoyao-client-media/src/Config.js index fea3c71..6b5bfb2 100644 --- a/taoyao-media-server/src/Config.js +++ b/taoyao-client-media/src/Config.js @@ -5,7 +5,7 @@ const os = require("os"); */ module.exports = { // 服务名称 - name: "taoyao-media-server", + name: "taoyao-client-media", // 服务版本 version: "1.0.0", // 欢迎页面 diff --git a/taoyao-media-server/src/Server.js b/taoyao-client-media/src/Server.js similarity index 100% rename from taoyao-media-server/src/Server.js rename to taoyao-client-media/src/Server.js diff --git a/taoyao-media-server/src/Signal.js b/taoyao-client-media/src/Signal.js similarity index 100% rename from taoyao-media-server/src/Signal.js rename to taoyao-client-media/src/Signal.js diff --git a/taoyao-media-server/src/certs/privateKey.pem b/taoyao-client-media/src/certs/privateKey.pem similarity index 100% rename from taoyao-media-server/src/certs/privateKey.pem rename to taoyao-client-media/src/certs/privateKey.pem diff --git a/taoyao-media-server/src/certs/publicKey.pem b/taoyao-client-media/src/certs/publicKey.pem similarity index 100% rename from taoyao-media-server/src/certs/publicKey.pem rename to taoyao-client-media/src/certs/publicKey.pem diff --git a/taoyao-media-server/src/index.html b/taoyao-client-media/src/index.html similarity index 78% rename from taoyao-media-server/src/index.html rename to taoyao-client-media/src/index.html index bcb89ca..0fbe2cb 100644 --- a/taoyao-media-server/src/index.html +++ b/taoyao-client-media/src/index.html @@ -9,7 +9,7 @@ -

taoyao-media-server

+

taoyao-client-media

acgist

\ No newline at end of file diff --git a/taoyao-media-server/mediasoup b/taoyao-media-server/mediasoup deleted file mode 160000 index 64851a8..0000000 --- a/taoyao-media-server/mediasoup +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 64851a8a813dc59f1269ea92c444fa36cceaf961 diff --git a/taoyao-signal-server/docs/assembly/release.xml b/taoyao-signal-server/docs/assembly/prd.xml similarity index 98% rename from taoyao-signal-server/docs/assembly/release.xml rename to taoyao-signal-server/docs/assembly/prd.xml index 81e48b1..0458d14 100644 --- a/taoyao-signal-server/docs/assembly/release.xml +++ b/taoyao-signal-server/docs/assembly/prd.xml @@ -2,7 +2,7 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.0.0 http://maven.apache.org/xsd/assembly-2.0.0.xsd"> - release + prd zip diff --git a/taoyao-signal-server/docs/bin/deploy.sh b/taoyao-signal-server/docs/bin/deploy.sh index 73b3198..d555336 100644 --- a/taoyao-signal-server/docs/bin/deploy.sh +++ b/taoyao-signal-server/docs/bin/deploy.sh @@ -16,6 +16,8 @@ fi if [ -z "$mvned" ]; then echo "编译代码:${project.artifactId}-${project.version}" mvn clean package -D skipTests -P ${profile} +# 指定编译模块以及依赖 +# mvn clean package -pl "${project.groupId}:${project.artifactId}" -am -D skipTests -P ${profile} fi # 删除文件:注意不要删除日志 diff --git a/taoyao-signal-server/pom.xml b/taoyao-signal-server/pom.xml index 8b66543..6d51827 100644 --- a/taoyao-signal-server/pom.xml +++ b/taoyao-signal-server/pom.xml @@ -249,9 +249,9 @@ - release + prd - release + prd -Xms2048M -Xmx4096M -XX:NewRatio=1 -XX:SurvivorRatio=2 @@ -262,7 +262,7 @@ maven-assembly-plugin - ${taoyao.maven.basedir}/docs/assembly/release.xml + ${taoyao.maven.basedir}/docs/assembly/prd.xml diff --git a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/annotation/Description.java b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/annotation/Description.java index 9b79a64..3e00652 100644 --- a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/annotation/Description.java +++ b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/annotation/Description.java @@ -10,13 +10,11 @@ import org.springframework.stereotype.Component; /** * 信令描述 - * 生成文档采用`RUNTIME` * * @author acgist */ @Target(ElementType.TYPE) @Component -//@Retention(RetentionPolicy.SOURCE) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface Description { diff --git a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/property/Constant.java b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/config/Constant.java similarity index 89% rename from taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/property/Constant.java rename to taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/config/Constant.java index 792baa1..3ebf288 100644 --- a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/property/Constant.java +++ b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/config/Constant.java @@ -1,4 +1,4 @@ -package com.acgist.taoyao.boot.property; +package com.acgist.taoyao.boot.config; /** * 字符常量 @@ -95,10 +95,6 @@ public interface Constant { * 密码 */ String PASSWORD = "password"; - /** - * 时间 - */ - String TIME = "time"; /** * 媒体 */ @@ -107,6 +103,10 @@ public interface Constant { * WebRTC */ String WEBRTC = "webrtc"; + /** + * 日期时间 + */ + String DATETIME = "datetime"; /** * PeerId * @@ -151,9 +151,25 @@ public interface Constant { * 数据消费者ID */ String DATA_CONSUMER_ID = "dataConsumerId"; + /** + * ICE服务:P2P直连使用 + */ + String ICE_SERVERS = "iceServers"; + /** + * ICE候选 + */ String ICE_CANDIDATES = "iceCandidates"; + /** + * ICE参数 + */ String ICE_PARAMETERS = "iceParameters"; + /** + * DTLS参数 + */ String DTLS_PARAMETERS = "dtlsParameters"; + /** + * SCTP参数 + */ String SCTP_PARAMETERS = "sctpParameters"; } diff --git a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/property/IdProperties.java b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/config/IdProperties.java similarity index 93% rename from taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/property/IdProperties.java rename to taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/config/IdProperties.java index 40df398..9078fd4 100644 --- a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/property/IdProperties.java +++ b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/config/IdProperties.java @@ -1,4 +1,4 @@ -package com.acgist.taoyao.boot.property; +package com.acgist.taoyao.boot.config; import org.springframework.boot.context.properties.ConfigurationProperties; diff --git a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/property/MediaAudioProperties.java b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/config/MediaAudioProperties.java similarity index 94% rename from taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/property/MediaAudioProperties.java rename to taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/config/MediaAudioProperties.java index b1bbcc4..c64fda1 100644 --- a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/property/MediaAudioProperties.java +++ b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/config/MediaAudioProperties.java @@ -1,4 +1,4 @@ -package com.acgist.taoyao.boot.property; +package com.acgist.taoyao.boot.config; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Getter; 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/config/MediaProperties.java similarity index 96% rename from taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/property/MediaProperties.java rename to taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/config/MediaProperties.java index aa9ed69..f4ea7d3 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/config/MediaProperties.java @@ -1,4 +1,4 @@ -package com.acgist.taoyao.boot.property; +package com.acgist.taoyao.boot.config; import java.util.List; diff --git a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/property/MediaServerProperties.java b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/config/MediaServerProperties.java similarity index 85% rename from taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/property/MediaServerProperties.java rename to taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/config/MediaServerProperties.java index df25d26..0d79543 100644 --- a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/property/MediaServerProperties.java +++ b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/config/MediaServerProperties.java @@ -1,4 +1,4 @@ -package com.acgist.taoyao.boot.property; +package com.acgist.taoyao.boot.config; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Getter; @@ -18,6 +18,8 @@ public class MediaServerProperties { private String mediaId; @Schema(title = "是否启用", description = "是否启用") private Boolean enabled; + @Schema(title = "是否启用重写本地IP", description = "内外网多网卡环境重写IP地址") + private Boolean rewriteIp; @Schema(title = "主机", description = "主机") private String host; @Schema(title = "端口", description = "端口") diff --git a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/property/MediaVideoProperties.java b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/config/MediaVideoProperties.java similarity index 97% rename from taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/property/MediaVideoProperties.java rename to taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/config/MediaVideoProperties.java index e5f0019..8aa4708 100644 --- a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/property/MediaVideoProperties.java +++ b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/config/MediaVideoProperties.java @@ -1,4 +1,4 @@ -package com.acgist.taoyao.boot.property; +package com.acgist.taoyao.boot.config; import java.util.LinkedHashMap; import java.util.Map; 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/config/ScriptProperties.java similarity index 96% rename from taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/property/ScriptProperties.java rename to taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/config/ScriptProperties.java index e7c4d4d..1137e16 100644 --- 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/config/ScriptProperties.java @@ -1,4 +1,4 @@ -package com.acgist.taoyao.boot.property; +package com.acgist.taoyao.boot.config; import org.springframework.boot.context.properties.ConfigurationProperties; diff --git a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/property/SecurityProperties.java b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/config/SecurityProperties.java similarity index 88% rename from taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/property/SecurityProperties.java rename to taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/config/SecurityProperties.java index 059bc99..ab52a0d 100644 --- a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/property/SecurityProperties.java +++ b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/config/SecurityProperties.java @@ -1,4 +1,4 @@ -package com.acgist.taoyao.boot.property; +package com.acgist.taoyao.boot.config; import org.springframework.boot.context.properties.ConfigurationProperties; @@ -8,6 +8,7 @@ import lombok.Setter; /** * 安全配置 + * 注意:没有配置`UsernamePasswordService`使用帐号密码 * * @author acgist */ diff --git a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/property/SocketProperties.java b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/config/SocketProperties.java similarity index 97% rename from taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/property/SocketProperties.java rename to taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/config/SocketProperties.java index 743b5e0..feb1117 100644 --- a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/property/SocketProperties.java +++ b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/config/SocketProperties.java @@ -1,4 +1,4 @@ -package com.acgist.taoyao.boot.property; +package com.acgist.taoyao.boot.config; import org.springframework.boot.context.properties.ConfigurationProperties; 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/config/TaoyaoProperties.java similarity index 86% rename from taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/property/TaoyaoProperties.java rename to taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/config/TaoyaoProperties.java index 92492ee..13642d6 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/config/TaoyaoProperties.java @@ -1,4 +1,4 @@ -package com.acgist.taoyao.boot.property; +package com.acgist.taoyao.boot.config; import org.springframework.boot.context.properties.ConfigurationProperties; @@ -25,6 +25,8 @@ public class TaoyaoProperties { private String version; @Schema(title = "项目描述", description = "项目描述") private String description; + @Schema(title = "子网掩码", description = "子网掩码") + private Integer ipMask; @Schema(title = "超时时间", description = "超时时间") private Long timeout; 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/config/WebrtcProperties.java similarity index 92% rename from taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/property/WebrtcProperties.java rename to taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/config/WebrtcProperties.java index 693e25b..4d6b510 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/config/WebrtcProperties.java @@ -1,4 +1,4 @@ -package com.acgist.taoyao.boot.property; +package com.acgist.taoyao.boot.config; import java.util.ArrayList; import java.util.HashMap; @@ -13,6 +13,7 @@ import lombok.Setter; /** * WebRTC配置 + * P2P视频监控会用,正常会议不会使用,需要自己搭建`coturn`服务。 * * @author acgist */ diff --git a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/property/WebrtcStunProperties.java b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/config/WebrtcStunProperties.java similarity index 83% rename from taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/property/WebrtcStunProperties.java rename to taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/config/WebrtcStunProperties.java index 625dc85..e21935b 100644 --- a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/property/WebrtcStunProperties.java +++ b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/config/WebrtcStunProperties.java @@ -1,6 +1,7 @@ -package com.acgist.taoyao.boot.property; +package com.acgist.taoyao.boot.config; import io.swagger.v3.oas.annotations.media.Schema; +import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.Setter; @@ -12,6 +13,7 @@ import lombok.Setter; @Getter @Setter @Schema(title = "WebRTC STUN配置", description = "WebRTC STUN配置") +@EqualsAndHashCode(of = { "host", "port" }) public class WebrtcStunProperties { @Schema(title = "主机", description = "主机") diff --git a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/property/WebrtcTurnProperties.java b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/config/WebrtcTurnProperties.java similarity index 85% rename from taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/property/WebrtcTurnProperties.java rename to taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/config/WebrtcTurnProperties.java index d8300f5..2c687f9 100644 --- a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/property/WebrtcTurnProperties.java +++ b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/config/WebrtcTurnProperties.java @@ -1,6 +1,7 @@ -package com.acgist.taoyao.boot.property; +package com.acgist.taoyao.boot.config; import io.swagger.v3.oas.annotations.media.Schema; +import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.Setter; @@ -12,6 +13,7 @@ import lombok.Setter; @Getter @Setter @Schema(title = "WebRTC TURN配置", description = "WebRTC TURN配置") +@EqualsAndHashCode(callSuper = true) public class WebrtcTurnProperties extends WebrtcStunProperties { @Schema(title = "帐号", description = "帐号") diff --git a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/configuration/BootAutoConfiguration.java b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/configuration/BootAutoConfiguration.java index e710270..c24e1ff 100644 --- a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/configuration/BootAutoConfiguration.java +++ b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/configuration/BootAutoConfiguration.java @@ -45,18 +45,21 @@ import org.springframework.web.context.request.async.AsyncRequestTimeoutExceptio import org.springframework.web.multipart.support.MissingServletRequestPartException; import org.springframework.web.servlet.NoHandlerFoundException; +import com.acgist.taoyao.boot.config.IdProperties; +import com.acgist.taoyao.boot.config.MediaProperties; +import com.acgist.taoyao.boot.config.ScriptProperties; +import com.acgist.taoyao.boot.config.SecurityProperties; +import com.acgist.taoyao.boot.config.SocketProperties; +import com.acgist.taoyao.boot.config.TaoyaoProperties; +import com.acgist.taoyao.boot.config.WebrtcProperties; import com.acgist.taoyao.boot.controller.TaoyaoControllerAdvice; 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.SocketProperties; -import com.acgist.taoyao.boot.property.TaoyaoProperties; -import com.acgist.taoyao.boot.property.WebrtcProperties; +import com.acgist.taoyao.boot.runner.OrderedCommandLineRunner; import com.acgist.taoyao.boot.service.IdService; +import com.acgist.taoyao.boot.service.IpService; import com.acgist.taoyao.boot.service.impl.IdServiceImpl; +import com.acgist.taoyao.boot.service.impl.IpServiceImpl; import com.acgist.taoyao.boot.utils.ErrorUtils; import com.acgist.taoyao.boot.utils.FileUtils; import com.acgist.taoyao.boot.utils.HTTPUtils; @@ -103,6 +106,12 @@ public class BootAutoConfiguration { return new IdServiceImpl(); } + @Bean + @ConditionalOnMissingBean + public IpService ipService() { + return new IpServiceImpl(); + } + @Bean @Primary @ConditionalOnMissingBean @@ -142,10 +151,15 @@ public class BootAutoConfiguration { TaskExecutor taskExecutor, TaoyaoProperties taoyaoProperties ) { - return new CommandLineRunner() { + return new OrderedCommandLineRunner() { + @Override + public int getOrder() { + return Integer.MAX_VALUE; + } @Override public void run(String ... args) throws Exception { HTTPUtils.init(taoyaoProperties.getTimeout(), taskExecutor); + BootAutoConfiguration.this.registerException(); log.info("项目启动成功:{}", BootAutoConfiguration.this.name); } }; @@ -181,7 +195,6 @@ public class BootAutoConfiguration { this.applicationContext.getBeansOfType(TaskScheduler.class).forEach((k, v) -> { log.info("系统定时任务线程池:{}-{}", k, v); }); - this.registerException(); } /** diff --git a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/configuration/SpringDocAutoConfiguration.java b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/configuration/SpringDocAutoConfiguration.java index 7235d13..9ad2632 100644 --- a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/configuration/SpringDocAutoConfiguration.java +++ b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/configuration/SpringDocAutoConfiguration.java @@ -11,7 +11,7 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Profile; -import com.acgist.taoyao.boot.property.TaoyaoProperties; +import com.acgist.taoyao.boot.config.TaoyaoProperties; import io.swagger.v3.oas.models.Components; import io.swagger.v3.oas.models.OpenAPI; @@ -26,7 +26,7 @@ import io.swagger.v3.oas.models.security.SecurityScheme; * * @author acgist */ -@Profile({ "dev", "local" }) +@Profile({ "dev", "sit" }) @Configuration @ConditionalOnClass(OpenAPI.class) public class SpringDocAutoConfiguration { diff --git a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/runner/OrderedCommandLineRunner.java b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/runner/OrderedCommandLineRunner.java new file mode 100644 index 0000000..e9fd865 --- /dev/null +++ b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/runner/OrderedCommandLineRunner.java @@ -0,0 +1,18 @@ +package com.acgist.taoyao.boot.runner; + +import org.springframework.boot.CommandLineRunner; +import org.springframework.core.Ordered; + +/** + * Ordered + CommandLineRunner + * + * @author acgist + */ +public interface OrderedCommandLineRunner extends Ordered, CommandLineRunner { + + @Override + default int getOrder() { + return 0; + } + +} diff --git a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/service/IpService.java b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/service/IpService.java new file mode 100644 index 0000000..dd21d19 --- /dev/null +++ b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/service/IpService.java @@ -0,0 +1,48 @@ +package com.acgist.taoyao.boot.service; + +/** + * 内外网多网卡环境IP服务 + * 支持配置域名 + * + * @author acgist + */ +public interface IpService { + + /** + * @see #subnetIp(String, String, String) + */ + default boolean subnetIp(String sourceIp, String clientIp) { + return this.subnetIp(sourceIp, clientIp, null); + } + + /** + * 内网是否相同网段 + * + * @param sourceIp 原始IP + * @param clientIp 终端IP + * @param defaultSourceIp 默认原始IP + * + * @return 是否匹配 + */ + boolean subnetIp(String sourceIp, String clientIp, String defaultSourceIp); + + /** + * @see #rewriteIp(String, String, String) + */ + default String rewriteIp(String sourceIp, String clientIp) { + return this.rewriteIp(sourceIp, clientIp, null); + } + + /** + * 重写IP地址 + * 内网环境重写IP地址:修改网络号保留主机号 + * + * @param sourceIp 原始IP + * @param clientIp 终端IP + * @param defaultSourceIp 默认原始IP + * + * @return 替换IP + */ + String rewriteIp(String sourceIp, String clientIp, String defaultSourceIp); + +} diff --git a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/service/impl/IdServiceImpl.java b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/service/impl/IdServiceImpl.java index d3459f5..77dd103 100644 --- a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/service/impl/IdServiceImpl.java +++ b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/service/impl/IdServiceImpl.java @@ -4,7 +4,7 @@ import java.time.LocalDateTime; import org.springframework.beans.factory.annotation.Autowired; -import com.acgist.taoyao.boot.property.IdProperties; +import com.acgist.taoyao.boot.config.IdProperties; import com.acgist.taoyao.boot.service.IdService; public class IdServiceImpl implements IdService { diff --git a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/service/impl/IpServiceImpl.java b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/service/impl/IpServiceImpl.java new file mode 100644 index 0000000..d3ae136 --- /dev/null +++ b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/service/impl/IpServiceImpl.java @@ -0,0 +1,145 @@ +package com.acgist.taoyao.boot.service.impl; + +import java.math.BigInteger; +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.util.BitSet; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; + +import com.acgist.taoyao.boot.config.TaoyaoProperties; +import com.acgist.taoyao.boot.service.IpService; + +import jakarta.annotation.PostConstruct; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +public class IpServiceImpl implements IpService { + + @Autowired + private TaoyaoProperties taoyaoProperties; + + /** + * 本机IP + */ + private String localIp; + /** + * 本机环回IP + */ + private String loopbackIp; + + @PostConstruct + public void init() { + try { + final InetAddress localHost = InetAddress.getLocalHost(); + final InetAddress loopbackAddress = InetAddress.getLoopbackAddress(); + this.localIp = localHost.getHostAddress(); + this.loopbackIp = loopbackAddress.getHostAddress(); + log.info("本机IP:{}", this.localIp); + log.info("环回IP:{}", this.loopbackIp); + } catch (UnknownHostException e) { + log.error("获取本机IP地址异常", e); + } + } + + @Override + public boolean subnetIp(final String sourceIp, final String clientIp, final String defaultSourceIp) { + try { + InetAddress clientAddress = InetAddress.getByName(clientIp); + // 通配地址或者本地地址替换本机IP + if(this.localAnyOrLoopAddress(clientAddress)) { + clientAddress = InetAddress.getByName(this.localIp); + } + InetAddress sourceAddress = InetAddress.getByName(sourceIp); + // 通配地址或者本地换回地址替换默认地址 + if(StringUtils.isNotEmpty(defaultSourceIp) && this.localAnyOrLoopAddress(sourceAddress)) { + sourceAddress = InetAddress.getByName(defaultSourceIp); + } + if(this.localAddress(sourceAddress) && this.localAddress(clientAddress)) { + final byte[] sourceBytes = sourceAddress.getAddress(); + final byte[] clientBytes = clientAddress.getAddress(); + final int length = (sourceBytes.length & clientBytes.length) * Byte.SIZE; + final BitSet sourceBit = BitSet.valueOf(sourceBytes); + final BitSet clientBit = BitSet.valueOf(clientBytes); + sourceBit.set(this.taoyaoProperties.getIpMask(), length, true); + clientBit.set(this.taoyaoProperties.getIpMask(), length, true); + final BigInteger source = new BigInteger(sourceBit.toByteArray()); + final BigInteger client = new BigInteger(clientBit.toByteArray()); + return source.equals(client); + } + } catch (Exception e) { + log.error("IP地址转换异常:{}-{}", sourceIp, clientIp, e); + } + return true; + } + + @Override + public String rewriteIp(final String sourceIp, final String clientIp, final String defaultSourceIp) { + try { + InetAddress clientAddress = InetAddress.getByName(clientIp); + // 通配地址或者本地地址替换本机IP + if(this.localAnyOrLoopAddress(clientAddress)) { + clientAddress = InetAddress.getByName(this.localIp); + } + InetAddress sourceAddress = InetAddress.getByName(sourceIp); + // 通配地址或者本地换回地址替换默认地址 + if(this.localAnyOrLoopAddress(sourceAddress) && StringUtils.isNotEmpty(defaultSourceIp)) { + sourceAddress = InetAddress.getByName(defaultSourceIp); + } + if(this.localAddress(sourceAddress) && this.localAddress(clientAddress)) { + final byte[] sourceBytes = sourceAddress.getAddress(); + final byte[] clientBytes = clientAddress.getAddress(); + final int length = (sourceBytes.length & clientBytes.length) * Byte.SIZE; + final BitSet sourceBit = BitSet.valueOf(sourceBytes); + final BitSet clientBit = BitSet.valueOf(clientBytes); + // 替换网络号保留主机号 + for (int index = 0; index < this.taoyaoProperties.getIpMask(); index++) { + sourceBit.set(index, clientBit.get(index)); + } + final byte[] bytes = sourceBit.toByteArray(); + if(bytes.length < length) { + final byte[] fillBytes = new byte[length / Byte.SIZE]; + System.arraycopy(bytes, 0, fillBytes, 0, bytes.length); + return InetAddress.getByAddress(fillBytes).getHostAddress(); + } else { + return InetAddress.getByAddress(bytes).getHostAddress(); + } + } + } catch (Exception e) { + log.error("IP地址转换异常:{}-{}", sourceIp, clientIp, e); + } + return sourceIp; + } + + /** + * @param inetAddress IP地址 + * + * @return 通配或者换回地址 + */ + private boolean localAnyOrLoopAddress(InetAddress inetAddress) { + return + inetAddress.isAnyLocalAddress() || + inetAddress.isLoopbackAddress(); + } + + /** + * @param inetAddress IP地址 + * + * @return 本地IP + */ + private boolean localAddress(InetAddress inetAddress) { + return + // 通配地址:0.0.0.0 + inetAddress.isAnyLocalAddress() || + // 环回地址:127.0.0.1 | 0:0:0:0:0:0:0:1 + inetAddress.isLoopbackAddress() || + // 链接地址:虚拟网卡 + inetAddress.isLinkLocalAddress() || + // 组播地址 + inetAddress.isMulticastAddress() || + // 本地地址:A/B/C类本地地址 + inetAddress.isSiteLocalAddress(); + } + +} diff --git a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/utils/HTTPUtils.java b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/utils/HTTPUtils.java index 9fdb654..001730e 100644 --- a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/utils/HTTPUtils.java +++ b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/utils/HTTPUtils.java @@ -8,11 +8,15 @@ import java.security.cert.CertificateException; import java.security.cert.X509Certificate; import java.time.Duration; import java.util.concurrent.Executor; +import java.util.function.Function; import javax.net.ssl.KeyManager; import javax.net.ssl.SSLContext; import javax.net.ssl.X509TrustManager; +import org.apache.commons.lang3.StringUtils; + +import jakarta.servlet.http.HttpServletRequest; import lombok.extern.slf4j.Slf4j; /** @@ -31,6 +35,10 @@ public final class HTTPUtils { * 线程池 */ private static Executor executor; + /** + * 无效IP验证 + */ + private static final Function NEXT_IP = ip -> StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip); private HTTPUtils() { } @@ -57,6 +65,22 @@ public final class HTTPUtils { // .followRedirects(Redirect.ALWAYS) .build(); } + + /** + * @param request HTTP请求 + * + * @return IP地址 + */ + public static final String httpIp(HttpServletRequest request) { + String ip = request.getHeader("X-Forwarded-For"); + if (NEXT_IP.apply(ip)) { + ip = request.getHeader("X-Real-IP"); + } + if (NEXT_IP.apply(ip)) { + ip = request.getRemoteAddr(); + } + return ip; + } /** * @return {@link SSLContext} diff --git a/taoyao-signal-server/taoyao-boot/src/main/resources/logback-spring.xml b/taoyao-signal-server/taoyao-boot/src/main/resources/logback-spring.xml index f386a52..a040590 100644 --- a/taoyao-signal-server/taoyao-boot/src/main/resources/logback-spring.xml +++ b/taoyao-signal-server/taoyao-boot/src/main/resources/logback-spring.xml @@ -99,15 +99,7 @@ - - - - - - - - - + @@ -115,7 +107,7 @@ - + diff --git a/taoyao-signal-server/taoyao-server/src/main/java/com/acgist/taoyao/controller/ConfigController.java b/taoyao-signal-server/taoyao-server/src/main/java/com/acgist/taoyao/controller/ConfigController.java index f1aca13..0aeea3c 100644 --- a/taoyao-signal-server/taoyao-server/src/main/java/com/acgist/taoyao/controller/ConfigController.java +++ b/taoyao-signal-server/taoyao-server/src/main/java/com/acgist/taoyao/controller/ConfigController.java @@ -5,9 +5,9 @@ import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import com.acgist.taoyao.boot.config.MediaProperties; +import com.acgist.taoyao.boot.config.WebrtcProperties; import com.acgist.taoyao.boot.model.Message; -import com.acgist.taoyao.boot.property.MediaProperties; -import com.acgist.taoyao.boot.property.WebrtcProperties; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.media.Content; diff --git a/taoyao-signal-server/taoyao-server/src/main/java/com/acgist/taoyao/controller/ControlController.java b/taoyao-signal-server/taoyao-server/src/main/java/com/acgist/taoyao/controller/ControlController.java new file mode 100644 index 0000000..e147564 --- /dev/null +++ b/taoyao-signal-server/taoyao-server/src/main/java/com/acgist/taoyao/controller/ControlController.java @@ -0,0 +1,85 @@ +package com.acgist.taoyao.controller; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.acgist.taoyao.boot.model.Message; +import com.acgist.taoyao.signal.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.PlatformShutdownProtocol; +import com.acgist.taoyao.signal.protocol.system.SystemRebootProtocol; +import com.acgist.taoyao.signal.protocol.system.SystemShutdownProtocol; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; + +/** + * 控制 + * + * @author acgist + */ +@Tag(name = "控制", description = "控制管理") +@RestController +@RequestMapping("/control") +public class ControlController { + + @Autowired + private MediaRebootProtocol mediaRebootProtocol; + @Autowired + private MediaShutdownProtocol mediaShutdownProtocol; + @Autowired + private SystemRebootProtocol systemRebootProtocol; + @Autowired + private SystemShutdownProtocol systemShutdownProtocol; + @Autowired + private PlatformRebootProtocol platformRebootProtocol; + @Autowired + private PlatformShutdownProtocol platformShutdownProtocol; + + @Operation(summary = "重启媒体", description = "重启媒体") + @GetMapping("/media/reboot/{mediaId}") + public Message mediaReboot(@PathVariable String mediaId) { + this.mediaRebootProtocol.execute(mediaId); + return Message.success(); + } + + @Operation(summary = "关闭媒体", description = "关闭媒体") + @GetMapping("/media/shutdown/{mediaId}") + public Message mediaShutdown(@PathVariable String mediaId) { + this.mediaShutdownProtocol.execute(mediaId); + return Message.success(); + } + + @Operation(summary = "重启系统", description = "重启系统") + @GetMapping("/system/reboot") + public Message systemReboot() { + this.systemRebootProtocol.execute(); + return Message.success(); + } + + @Operation(summary = "关闭系统", description = "关闭系统") + @GetMapping("/system/shutdown") + public Message systemShutdown() { + this.systemShutdownProtocol.execute(); + return Message.success(); + } + + @Operation(summary = "重启平台", description = "重启平台") + @GetMapping("/platform/reboot") + public Message platformReboot() { + this.platformRebootProtocol.execute(); + return Message.success(); + } + + @Operation(summary = "关闭平台", description = "关闭平台") + @GetMapping("/platform/shutdown") + public Message platformShutdown() { + this.platformShutdownProtocol.execute(); + return Message.success(); + } + +} diff --git a/taoyao-signal-server/taoyao-server/src/main/java/com/acgist/taoyao/interceptor/SecurityInterceptor.java b/taoyao-signal-server/taoyao-server/src/main/java/com/acgist/taoyao/interceptor/SecurityInterceptor.java index d0f0b90..2f764b4 100644 --- a/taoyao-signal-server/taoyao-server/src/main/java/com/acgist/taoyao/interceptor/SecurityInterceptor.java +++ b/taoyao-signal-server/taoyao-server/src/main/java/com/acgist/taoyao/interceptor/SecurityInterceptor.java @@ -9,8 +9,8 @@ import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.util.AntPathMatcher; +import com.acgist.taoyao.boot.config.SecurityProperties; import com.acgist.taoyao.boot.interceptor.InterceptorAdapter; -import com.acgist.taoyao.boot.property.SecurityProperties; import com.acgist.taoyao.signal.service.SecurityService; import jakarta.servlet.http.HttpServletRequest; diff --git a/taoyao-signal-server/taoyao-server/src/main/java/com/acgist/taoyao/interceptor/SlowInterceptor.java b/taoyao-signal-server/taoyao-server/src/main/java/com/acgist/taoyao/interceptor/SlowInterceptor.java index 6d3e10d..adcf34b 100644 --- a/taoyao-signal-server/taoyao-server/src/main/java/com/acgist/taoyao/interceptor/SlowInterceptor.java +++ b/taoyao-signal-server/taoyao-server/src/main/java/com/acgist/taoyao/interceptor/SlowInterceptor.java @@ -2,8 +2,8 @@ package com.acgist.taoyao.interceptor; import org.springframework.beans.factory.annotation.Autowired; +import com.acgist.taoyao.boot.config.TaoyaoProperties; import com.acgist.taoyao.boot.interceptor.InterceptorAdapter; -import com.acgist.taoyao.boot.property.TaoyaoProperties; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; diff --git a/taoyao-signal-server/taoyao-server/src/main/resources/application-dev.yml b/taoyao-signal-server/taoyao-server/src/main/resources/application-dev.yml index 53acc7f..e7e611f 100644 --- a/taoyao-signal-server/taoyao-server/src/main/resources/application-dev.yml +++ b/taoyao-signal-server/taoyao-server/src/main/resources/application-dev.yml @@ -2,7 +2,9 @@ taoyao: media: media-server-list: - media-id: media-local-a - enabled: true + enabled: false + rewrite-ip: true +# host: 192.168.1.110 host: 192.168.8.110 port: 9443 schema: wss diff --git a/taoyao-signal-server/taoyao-server/src/main/resources/application-local.yml b/taoyao-signal-server/taoyao-server/src/main/resources/application-local.yml deleted file mode 100644 index 8504aeb..0000000 --- a/taoyao-signal-server/taoyao-server/src/main/resources/application-local.yml +++ /dev/null @@ -1,12 +0,0 @@ -taoyao: - media: - media-server-list: - - media-id: media-local-a - enabled: true - host: 192.168.1.110 - port: 9443 - schema: wss - username: taoyao - password: taoyao - security: - permit: /v3/api-docs/**,/swagger-ui/**,/swagger-ui.html,/,/error,/index.html,/favicon.ico \ No newline at end of file diff --git a/taoyao-signal-server/taoyao-server/src/main/resources/application-release.yml b/taoyao-signal-server/taoyao-server/src/main/resources/application-prd.yml similarity index 100% rename from taoyao-signal-server/taoyao-server/src/main/resources/application-release.yml rename to taoyao-signal-server/taoyao-server/src/main/resources/application-prd.yml 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 2a770c9..842f409 100644 --- a/taoyao-signal-server/taoyao-server/src/main/resources/application.yml +++ b/taoyao-signal-server/taoyao-server/src/main/resources/application.yml @@ -20,7 +20,7 @@ server: # context-path: /taoyao spring: profiles: - active: local + active: dev application: name: taoyao-signal-server servlet: @@ -51,6 +51,7 @@ taoyao: name: 桃夭信令服务 version: 1.0.0 description: 桃夭WebRTC信令服务 + ip-mask: 24 timeout: 5000 id: index: 0 @@ -102,14 +103,16 @@ taoyao: media-server-list: - media-id: media-local-a enabled: true - host: localhost + rewrite-ip: true + host: 127.0.0.1 port: 9443 schema: wss username: taoyao password: taoyao - media-id: media-local-z enabled: true - host: localhost + rewrite-ip: true + host: 127.0.0.1 port: 9443 schema: wss username: taoyao @@ -126,21 +129,21 @@ taoyao: thread-name-prefix: ${spring.application.name}-signal- keep-alive-time: 60000 buffer-size: 2048 - # WebRTC配置:没有P2P所以不会用到 + # WebRTC配置 webrtc: # STUN服务 stun: - - host: stun1.l.google.com - port: 19302 - - host: stun2.l.google.com - port: 19302 - # TURN服务:需要自己搭建coturn - turn: + - host: 192.168.1.110 + port: 3478 - host: 192.168.8.110 port: 3478 + # TURN服务 + turn: + - host: 192.168.1.110 + port: 3478 username: taoyao password: taoyao - - host: 192.168.8.111 + - host: 192.168.8.110 port: 3478 username: taoyao password: taoyao @@ -158,8 +161,8 @@ taoyao: # 脚本配置 script: enabled: true - media-reboot: pm2 restart taoyao-media-server - media-shutdown: pm2 stop taoyao-media-server + media-reboot: pm2 restart taoyao-client-media + media-shutdown: pm2 stop taoyao-client-media system-reboot: reboot system-shutdown: shutdown now platform-reboot: systemctl restart taoyao-signal-server diff --git a/taoyao-signal-server/taoyao-server/src/test/java/com/acgist/taoyao/boot/service/IdServiceTest.java b/taoyao-signal-server/taoyao-server/src/test/java/com/acgist/taoyao/service/IdServiceTest.java similarity index 90% rename from taoyao-signal-server/taoyao-server/src/test/java/com/acgist/taoyao/boot/service/IdServiceTest.java rename to taoyao-signal-server/taoyao-server/src/test/java/com/acgist/taoyao/service/IdServiceTest.java index dee87d5..789eba0 100644 --- a/taoyao-signal-server/taoyao-server/src/test/java/com/acgist/taoyao/boot/service/IdServiceTest.java +++ b/taoyao-signal-server/taoyao-server/src/test/java/com/acgist/taoyao/service/IdServiceTest.java @@ -1,10 +1,11 @@ -package com.acgist.taoyao.boot.service; +package com.acgist.taoyao.service; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import com.acgist.taoyao.annotation.CostedTest; import com.acgist.taoyao.annotation.TaoyaoTest; +import com.acgist.taoyao.boot.service.IdService; import com.acgist.taoyao.main.TaoyaoApplication; import lombok.extern.slf4j.Slf4j; diff --git a/taoyao-signal-server/taoyao-server/src/test/java/com/acgist/taoyao/service/IpServiceTest.java b/taoyao-signal-server/taoyao-server/src/test/java/com/acgist/taoyao/service/IpServiceTest.java new file mode 100644 index 0000000..88f1614 --- /dev/null +++ b/taoyao-signal-server/taoyao-server/src/test/java/com/acgist/taoyao/service/IpServiceTest.java @@ -0,0 +1,77 @@ +package com.acgist.taoyao.service; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.net.InetAddress; +import java.net.UnknownHostException; + +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; + +import com.acgist.taoyao.annotation.TaoyaoTest; +import com.acgist.taoyao.boot.service.IpService; +import com.acgist.taoyao.main.TaoyaoApplication; + +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@TaoyaoTest(classes = TaoyaoApplication.class) +public class IpServiceTest { + + @Autowired + private IpService ipService; + + @Test + public void testDomain() throws UnknownHostException { + InetAddress byName = InetAddress.getByName("www.acgist.com"); + System.out.println(byName); + System.out.println(byName.getHostAddress()); + System.out.println(byName.getHostName()); + System.out.println(byName.isAnyLocalAddress()); + System.out.println(byName.isLoopbackAddress()); + System.out.println(byName.isLinkLocalAddress()); + System.out.println(byName.isMulticastAddress()); + System.out.println(byName.isSiteLocalAddress()); + } + + @Test + public void testSubnetIp() { + assertTrue(this.ipService.subnetIp("192.168.8.1", "192.168.8.100")); + assertTrue(this.ipService.subnetIp("192.168.100.1", "192.168.100.100")); + assertFalse(this.ipService.subnetIp("192.168.1.1", "192.168.8.100")); + assertFalse(this.ipService.subnetIp("192.168.80.1", "192.168.8.100")); + assertTrue(this.ipService.subnetIp("fe80::9ff9:2da9:9759:17e9", "fe80::9ff9:2da9:9759:17e9")); + assertTrue(this.ipService.subnetIp("fe80::9ff9:2da9:9759:17ee", "fe80::9ff9:2da9:9759:17e9")); + assertFalse(this.ipService.subnetIp("fe81::9ff9:2da9:9759:17e9", "fe80::9ff9:2da9:9759:17e9")); + assertFalse(this.ipService.subnetIp("fe81::9ff9:2da9:9759:17ee", "fe80::9ff9:2da9:9759:17e9")); + } + + @Test + public void testRewriteIp() { + assertEquals("192.168.1.0", this.ipService.rewriteIp("0.0.0.0", "192.168.1.1")); + assertEquals("192.168.1.10", this.ipService.rewriteIp("0.0.0.0", "192.168.1.1", "192.168.8.10")); + assertEquals("192.168.1.100", this.ipService.rewriteIp("192.168.8.100", "192.168.1.1")); + assertEquals("192.168.10.100", this.ipService.rewriteIp("192.168.8.100", "192.168.10.1")); + } + + @Test + public void testCost() { + long a = System.currentTimeMillis(); + for (int index = 0; index < 100000; index++) { + assertTrue(this.ipService.subnetIp("192.168.100.1", "192.168.100.100")); + assertFalse(this.ipService.subnetIp("192.168.1.1", "192.168.8.100")); + } + long z = System.currentTimeMillis(); + log.info("耗时:{}", z - a); + a = System.currentTimeMillis(); + for (int index = 0; index < 100000; index++) { + assertEquals("192.168.1.100", this.ipService.rewriteIp("192.168.8.100", "192.168.1.1")); + assertEquals("192.168.10.100", this.ipService.rewriteIp("192.168.8.100", "192.168.10.1")); + } + z = System.currentTimeMillis(); + log.info("耗时:{}", z - a); + } + +} diff --git a/taoyao-signal-server/taoyao-server/src/test/java/com/acgist/taoyao/signal/SocketSignalTest.java b/taoyao-signal-server/taoyao-server/src/test/java/com/acgist/taoyao/signal/SocketSignalTest.java index 112806a..3f00c52 100644 --- a/taoyao-signal-server/taoyao-server/src/test/java/com/acgist/taoyao/signal/SocketSignalTest.java +++ b/taoyao-signal-server/taoyao-server/src/test/java/com/acgist/taoyao/signal/SocketSignalTest.java @@ -10,7 +10,7 @@ import java.util.concurrent.Executors; import org.junit.jupiter.api.Test; -import com.acgist.taoyao.boot.property.Constant; +import com.acgist.taoyao.boot.config.Constant; import lombok.extern.slf4j.Slf4j; diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/MapBodyGetter.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/MapBodyGetter.java index 6f273b5..db44b21 100644 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/MapBodyGetter.java +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/MapBodyGetter.java @@ -15,7 +15,7 @@ public interface MapBodyGetter { * @param body 消息主体 * @param key 参数名称 * - * @return 值 + * @return 参数值 */ @SuppressWarnings("unchecked") default T get(Map body, String key) { @@ -30,9 +30,9 @@ public interface MapBodyGetter { * * @param body 消息主体 * @param key 参数名称 - * @param defaultValue 默认值 + * @param defaultValue 参数默认值 * - * @return 值 + * @return 参数值 */ @SuppressWarnings("unchecked") default T get(Map body, String key, T defaultValue) { @@ -47,7 +47,7 @@ public interface MapBodyGetter { * @param body 消息主体 * @param key 参数名称 * - * @return 值 + * @return 参数值 */ default Long getLong(Map body, String key) { if(body == null) { @@ -66,7 +66,7 @@ public interface MapBodyGetter { * @param body 消息主体 * @param key 参数名称 * - * @return 值 + * @return 参数值 */ default Integer getInteger(Map body, String key) { if(body == null) { @@ -85,7 +85,7 @@ public interface MapBodyGetter { * @param body 消息主体 * @param key 参数名称 * - * @return 值 + * @return 参数值 */ default Boolean getBoolean(Map body, String key) { if(body == null) { diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/ClientManager.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/ClientManager.java index 06fc1c2..18f0740 100644 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/ClientManager.java +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/ClientManager.java @@ -9,8 +9,8 @@ import org.springframework.context.ApplicationContext; import org.springframework.scheduling.annotation.Scheduled; import com.acgist.taoyao.boot.annotation.Manager; +import com.acgist.taoyao.boot.config.TaoyaoProperties; import com.acgist.taoyao.boot.model.Message; -import com.acgist.taoyao.boot.property.TaoyaoProperties; import com.acgist.taoyao.signal.event.client.ClientCloseEvent; import lombok.extern.slf4j.Slf4j; @@ -75,6 +75,8 @@ public class ClientManager { /** * 授权终端广播消息 * + * TODO:类型 + * * @param message 消息 */ public void broadcast(Message message) { diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/ClientType.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/ClientType.java new file mode 100644 index 0000000..683030c --- /dev/null +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/ClientType.java @@ -0,0 +1,45 @@ +package com.acgist.taoyao.signal.client; + +/** + * 终端类型 + * + * @author acgist + */ +public enum ClientType { + + /** + * 前端页面 + */ + WEB, + /** + * 媒体服务 + */ + MEDIA, + /** + * 洗衣机 + */ + WASHER, + /** + * 摄像头 + */ + CAMERA, + /** + * 冰箱 + */ + REFRIGERATOR, + /** + * 电视机 + */ + TELEVISION, + /** + * 空调 + */ + AIR_CONDITIONER, + /** + * 热水器 + */ + WATER_HEATER; + + private final String name; + +} diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/socket/SocketClient.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/socket/SocketClient.java index d04a334..611fea8 100644 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/socket/SocketClient.java +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/socket/SocketClient.java @@ -7,8 +7,8 @@ import java.nio.channels.AsynchronousSocketChannel; import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; +import com.acgist.taoyao.boot.config.Constant; import com.acgist.taoyao.boot.model.Message; -import com.acgist.taoyao.boot.property.Constant; import com.acgist.taoyao.signal.client.ClientAdapter; import lombok.Getter; diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/socket/SocketSignal.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/socket/SocketSignal.java index 0b72d56..ee683e7 100644 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/socket/SocketSignal.java +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/socket/SocketSignal.java @@ -10,7 +10,7 @@ import java.util.concurrent.ThreadFactory; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; -import com.acgist.taoyao.boot.property.SocketProperties; +import com.acgist.taoyao.boot.config.SocketProperties; import com.acgist.taoyao.boot.utils.CloseableUtils; import com.acgist.taoyao.signal.client.ClientManager; import com.acgist.taoyao.signal.protocol.ProtocolManager; diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/socket/SocketSignalAcceptHandler.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/socket/SocketSignalAcceptHandler.java index 2ad2af5..52d288d 100644 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/socket/SocketSignalAcceptHandler.java +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/socket/SocketSignalAcceptHandler.java @@ -6,7 +6,7 @@ import java.nio.channels.AsynchronousServerSocketChannel; import java.nio.channels.AsynchronousSocketChannel; import java.nio.channels.CompletionHandler; -import com.acgist.taoyao.boot.property.SocketProperties; +import com.acgist.taoyao.boot.config.SocketProperties; import com.acgist.taoyao.signal.client.ClientManager; import com.acgist.taoyao.signal.protocol.ProtocolManager; import com.acgist.taoyao.signal.protocol.platform.PlatformErrorProtocol; diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/socket/SocketSignalMessageHandler.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/socket/SocketSignalMessageHandler.java index d887564..232c477 100644 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/socket/SocketSignalMessageHandler.java +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/socket/SocketSignalMessageHandler.java @@ -4,7 +4,7 @@ import java.nio.ByteBuffer; import java.nio.channels.AsynchronousSocketChannel; import java.nio.channels.CompletionHandler; -import com.acgist.taoyao.boot.property.Constant; +import com.acgist.taoyao.boot.config.Constant; import com.acgist.taoyao.boot.utils.CloseableUtils; import com.acgist.taoyao.signal.client.ClientManager; import com.acgist.taoyao.signal.protocol.ProtocolManager; diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/websocket/WebSocketClient.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/websocket/WebSocketClient.java index be2a499..bb6b103 100644 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/websocket/WebSocketClient.java +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/websocket/WebSocketClient.java @@ -2,8 +2,8 @@ package com.acgist.taoyao.signal.client.websocket; import java.util.Map; +import com.acgist.taoyao.boot.config.Constant; import com.acgist.taoyao.boot.model.Message; -import com.acgist.taoyao.boot.property.Constant; import com.acgist.taoyao.signal.client.ClientAdapter; import jakarta.websocket.Session; diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/websocket/WebSocketSignalConfigurator.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/websocket/WebSocketSignalConfigurator.java index c49c660..65fab33 100644 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/websocket/WebSocketSignalConfigurator.java +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/websocket/WebSocketSignalConfigurator.java @@ -5,7 +5,7 @@ import java.util.Map; import org.apache.catalina.connector.RequestFacade; -import com.acgist.taoyao.boot.property.Constant; +import com.acgist.taoyao.boot.config.Constant; import jakarta.websocket.HandshakeResponse; import jakarta.websocket.server.HandshakeRequest; diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/configuration/MediaClientAutoConfiguration.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/configuration/MediaClientAutoConfiguration.java index cc5acf0..21c2d75 100644 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/configuration/MediaClientAutoConfiguration.java +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/configuration/MediaClientAutoConfiguration.java @@ -3,7 +3,9 @@ package com.acgist.taoyao.signal.configuration; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import com.acgist.taoyao.boot.runner.OrderedCommandLineRunner; import com.acgist.taoyao.signal.media.MediaClientManager; /** @@ -11,12 +13,13 @@ import com.acgist.taoyao.signal.media.MediaClientManager; * * @author acgist */ +@Configuration public class MediaClientAutoConfiguration { @Bean @Autowired public CommandLineRunner mediaCommandLineRunner(MediaClientManager mediaClientManager) { - return new CommandLineRunner() { + return new OrderedCommandLineRunner() { @Override public void run(String ... args) throws Exception { mediaClientManager.init(); diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/configuration/SignalAutoConfiguration.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/configuration/SignalAutoConfiguration.java new file mode 100644 index 0000000..6321134 --- /dev/null +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/configuration/SignalAutoConfiguration.java @@ -0,0 +1,30 @@ +package com.acgist.taoyao.signal.configuration; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.CommandLineRunner; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import com.acgist.taoyao.boot.runner.OrderedCommandLineRunner; +import com.acgist.taoyao.signal.protocol.ProtocolManager; + +/** + * 信令自动配置 + * + * @author acgist + */ +@Configuration +public class SignalAutoConfiguration { + + @Bean + @Autowired + public CommandLineRunner signalCommandLineRunner(ProtocolManager protocolManager) { + return new OrderedCommandLineRunner() { + @Override + public void run(String ... args) throws Exception { + protocolManager.init(); + } + }; + } + +} diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/configuration/SocketSignalAutoConfiguration.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/configuration/SocketSignalAutoConfiguration.java index a4442f6..b1eb9cf 100644 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/configuration/SocketSignalAutoConfiguration.java +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/configuration/SocketSignalAutoConfiguration.java @@ -8,7 +8,8 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import com.acgist.taoyao.boot.property.SocketProperties; +import com.acgist.taoyao.boot.config.SocketProperties; +import com.acgist.taoyao.boot.runner.OrderedCommandLineRunner; import com.acgist.taoyao.signal.client.ClientManager; import com.acgist.taoyao.signal.client.socket.SocketSignal; import com.acgist.taoyao.signal.protocol.ProtocolManager; @@ -39,7 +40,7 @@ public class SocketSignalAutoConfiguration { @Autowired @ConditionalOnBean(SocketSignal.class) public CommandLineRunner socketSignalCommandLineRunner(SocketSignal socketSignal) { - return new CommandLineRunner() { + return new OrderedCommandLineRunner() { @Override public void run(String ... args) throws Exception { socketSignal.init(); diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/controller/ClientController.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/controller/ClientController.java index 3f623e6..14e2f87 100644 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/controller/ClientController.java +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/controller/ClientController.java @@ -10,6 +10,7 @@ import com.acgist.taoyao.boot.model.Message; import com.acgist.taoyao.signal.client.ClientManager; import com.acgist.taoyao.signal.client.ClientStatus; import com.acgist.taoyao.signal.protocol.client.ClientRebootProtocol; +import com.acgist.taoyao.signal.protocol.client.ClientShutdownProtocol; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.media.Content; @@ -31,6 +32,8 @@ public class ClientController { private ClientManager clientManager; @Autowired private ClientRebootProtocol clientRebootProtocol; + @Autowired + private ClientShutdownProtocol clientShutdownProtocol; @Operation(summary = "终端列表", description = "终端列表") @GetMapping("/list") @@ -49,8 +52,15 @@ public class ClientController { @Operation(summary = "重启终端", description = "重启终端") @GetMapping("/reboot/{clientId}") public Message reboot(@PathVariable String clientId) { - this.clientManager.unicast(clientId, this.clientRebootProtocol.build()); + this.clientRebootProtocol.execute(clientId); return Message.success(); } + + @Operation(summary = "关闭终端", description = "关闭终端") + @GetMapping("/shutdown/{clientId}") + public Message shutdown(@PathVariable String clientId) { + this.clientShutdownProtocol.execute(clientId); + return Message.success(); + } } diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/controller/ProtocolController.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/controller/ProtocolController.java index b41dd05..56648cb 100644 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/controller/ProtocolController.java +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/controller/ProtocolController.java @@ -1,6 +1,5 @@ package com.acgist.taoyao.signal.controller; -import java.util.Map; import java.util.stream.Stream; import org.apache.commons.lang3.StringUtils; @@ -11,7 +10,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import com.acgist.taoyao.boot.annotation.Description; -import com.acgist.taoyao.boot.property.Constant; +import com.acgist.taoyao.boot.config.Constant; import com.acgist.taoyao.signal.protocol.Protocol; import io.swagger.v3.oas.annotations.Operation; @@ -32,7 +31,7 @@ public class ProtocolController { @Autowired private ApplicationContext applicationContext; - @Operation(summary = "信令列表", description = "信令列表") + @Operation(summary = "信令列表", description = "信令列表Markdown") @GetMapping("/list") public String list() { final StringBuilder builder = new StringBuilder(""" @@ -41,19 +40,19 @@ public class ProtocolController { ``` { "header": { - "v": "版本", - "id": 请求标识, + "v": "消息版本", + "id": "消息标识", "signal": "信令标识" }, - "code": "响应编码", - "message": "响应描述", + "code": "状态编码", + "message": "状态描述", "body": { - // 信令主体 + // 消息主体 } } ``` - ### 术语解释 + ### 数据流向 ``` 请求:终端->信令服务 || 信令服务->媒体服务 @@ -61,7 +60,7 @@ public class ProtocolController { 广播:信令服务-)终端 || 信令服务+)终端 ``` - ### 符号解释 + ### 流向解释 ``` -[消息类型]> 请求(单播):定向请求(单播)信令 @@ -69,11 +68,10 @@ public class ProtocolController { +[消息类型]) 全员广播:对所有的终端广播信令(包含自己) ``` - > 注意:没有消息类型表示请求类型 + > 没有指定消息类型时表示和信令消息类型相同 """); - final Map map = this.applicationContext.getBeansOfType(Protocol.class); - map.entrySet().stream() + this.applicationContext.getBeansOfType(Protocol.class).entrySet().stream() .sorted((a, z) -> a.getValue().signal().compareTo(z.getValue().signal())) .forEach(e -> { final String key = e.getKey(); @@ -82,17 +80,21 @@ public class ProtocolController { final String signal = protocol.signal(); final Description annotation = protocol.getClass().getDeclaredAnnotation(Description.class); if(annotation == null) { - log.info("没有注解:{}-{}", key, name); + log.info("信令没有注解:{}-{}", key, name); return; } - final String memo = annotation.memo().strip(); + // 信令名称 builder.append("### ").append(name).append("(").append(signal).append(")").append(Constant.LINE).append(Constant.LINE); + // 描述信息 + final String memo = annotation.memo().strip(); if(StringUtils.isNotEmpty(memo)) { builder.append(memo).append(Constant.LINE).append(Constant.LINE); } builder.append("```").append(Constant.LINE); + // 消息主体 builder.append("# 消息主体").append(Constant.LINE); Stream.of(annotation.body()).forEach(line -> builder.append(line.strip()).append(Constant.LINE)); + // 数据流向 builder.append("# 数据流向").append(Constant.LINE); Stream.of(annotation.flow()).forEach(line -> builder.append(line.strip()).append(Constant.LINE)); builder.append("```").append(Constant.LINE).append(Constant.LINE); diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/MediaClient.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/MediaClient.java index 7838705..acfa0b4 100644 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/MediaClient.java +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/MediaClient.java @@ -19,12 +19,12 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.TaskScheduler; import com.acgist.taoyao.boot.annotation.Prototype; +import com.acgist.taoyao.boot.config.MediaServerProperties; +import com.acgist.taoyao.boot.config.TaoyaoProperties; import com.acgist.taoyao.boot.model.Header; import com.acgist.taoyao.boot.model.Message; import com.acgist.taoyao.boot.model.MessageCode; import com.acgist.taoyao.boot.model.MessageCodeException; -import com.acgist.taoyao.boot.property.MediaServerProperties; -import com.acgist.taoyao.boot.property.TaoyaoProperties; import com.acgist.taoyao.boot.utils.HTTPUtils; import com.acgist.taoyao.boot.utils.JSONUtils; import com.acgist.taoyao.signal.protocol.Protocol; @@ -95,6 +95,13 @@ public class MediaClient { public String mediaId() { return this.mediaId; } + + /** + * @return 媒体服务配置 + */ + public MediaServerProperties mediaServerProperties() { + return this.mediaServerProperties; + } /** * 心跳 diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/MediaClientManager.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/MediaClientManager.java index b8df28d..e1054a9 100644 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/MediaClientManager.java +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/MediaClientManager.java @@ -8,7 +8,7 @@ import org.springframework.context.ApplicationContext; import org.springframework.scheduling.annotation.Scheduled; import com.acgist.taoyao.boot.annotation.Manager; -import com.acgist.taoyao.boot.property.MediaProperties; +import com.acgist.taoyao.boot.config.MediaProperties; import lombok.extern.slf4j.Slf4j; diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/RoomManager.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/RoomManager.java index d64ca07..7b978c0 100644 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/RoomManager.java +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/RoomManager.java @@ -8,9 +8,9 @@ import java.util.concurrent.CopyOnWriteArrayList; import org.springframework.beans.factory.annotation.Autowired; import com.acgist.taoyao.boot.annotation.Manager; +import com.acgist.taoyao.boot.config.Constant; import com.acgist.taoyao.boot.model.Message; import com.acgist.taoyao.boot.model.MessageCodeException; -import com.acgist.taoyao.boot.property.Constant; import com.acgist.taoyao.boot.service.IdService; import com.acgist.taoyao.signal.client.Client; diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/Transport.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/Transport.java index 07cb102..6291e23 100644 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/Transport.java +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/Transport.java @@ -3,7 +3,7 @@ package com.acgist.taoyao.signal.media; import java.io.Closeable; import java.util.Map; -import com.acgist.taoyao.boot.property.Constant; +import com.acgist.taoyao.boot.config.Constant; import com.acgist.taoyao.signal.MapBodyGetter; import com.acgist.taoyao.signal.client.Client; diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/ControlProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/ControlProtocol.java new file mode 100644 index 0000000..6fa5c25 --- /dev/null +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/ControlProtocol.java @@ -0,0 +1,11 @@ +package com.acgist.taoyao.signal.protocol; + +/** + * 控制信令 + * 直接通过平台发出控制信令 + * + * @author acgist + */ +public interface ControlProtocol { + +} 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 815ee5b..85f3eee 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 @@ -7,7 +7,7 @@ import com.acgist.taoyao.signal.event.ApplicationEventAdapter; import com.acgist.taoyao.signal.media.MediaClient; /** - * 信令协议 + * 信令 * * room:: 房间信令 * media:: 媒体信令 @@ -39,23 +39,23 @@ public interface Protocol { default boolean authenticate(Message message) { return true; } - - /** - * 处理信令消息 - * - * @param client 终端 - * @param message 信令消息 - */ - void execute(Client client, Message message); /** - * 处理媒体信令消息 + * 处理媒体服务信令 * * @param mediaClient 媒体服务终端 * @param message 信令消息 */ void execute(MediaClient mediaClient, Message message); + /** + * 处理终端信令 + * + * @param client 终端 + * @param message 信令消息 + */ + void execute(Client client, Message message); + /** * 发布事件 * @@ -66,15 +66,11 @@ public interface Protocol { void publishEvent(E event); /** - * 创建信令消息 - * * @return 信令消息 */ Message build(); /** - * 创建信令消息 - * * @param body 消息主体 * * @return 信令消息 @@ -82,8 +78,6 @@ public interface Protocol { Message build(Object body); /** - * 创建信令消息 - * * @param code 状态编码 * @param body 消息主体 * @@ -92,9 +86,6 @@ public interface Protocol { Message build(MessageCode code, Object body); /** - * 创建信令消息 - * - * @param code 状态编码 * @param message 状态描述 * @param body 消息主体 * @@ -103,8 +94,6 @@ public interface Protocol { Message build(String message, Object body); /** - * 创建信令消息 - * * @param code 状态编码 * @param message 状态描述 * @param body 消息主体 @@ -114,8 +103,6 @@ public interface Protocol { Message build(MessageCode code, String message, Object body); /** - * 创建信令消息 - * * @param id 消息标识 * @param code 状态编码 * @param message 状态描述 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 390daa8..e55afd9 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 @@ -4,10 +4,10 @@ import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; +import com.acgist.taoyao.boot.config.TaoyaoProperties; import com.acgist.taoyao.boot.model.Header; import com.acgist.taoyao.boot.model.Message; import com.acgist.taoyao.boot.model.MessageCode; -import com.acgist.taoyao.boot.property.TaoyaoProperties; import com.acgist.taoyao.boot.service.IdService; import com.acgist.taoyao.signal.MapBodyGetter; import com.acgist.taoyao.signal.client.ClientManager; @@ -16,7 +16,7 @@ import com.acgist.taoyao.signal.media.MediaClientManager; import com.acgist.taoyao.signal.media.RoomManager; /** - * 信令协议适配器 + * 信令适配器 * * @author acgist */ @@ -91,18 +91,18 @@ public abstract class ProtocolAdapter implements Protocol, MapBodyGetter { @Override public Message build(String id, MessageCode code, String message, Object body) { + // 消息标识 if(StringUtils.isEmpty(id)) { id = this.idService.buildIdToString(); } + // 消息头部 final Header header = Header.builder() .v(this.taoyaoProperties.getVersion()) .id(id) .signal(this.signal) .build(); final Message build = Message.builder().build(); - // 设置状态编码 - // 设置状态描述 - // 默认状态设置成功 + // 设置状态编码、状态描述:默认成功 build.setCode(code == null ? MessageCode.CODE_0000 : code, message); // 设置消息头部 build.setHeader(header); diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/ProtocolClientAdapter.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/ProtocolClientAdapter.java index 967314e..5549daa 100644 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/ProtocolClientAdapter.java +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/ProtocolClientAdapter.java @@ -8,7 +8,7 @@ import com.acgist.taoyao.signal.client.Client; import com.acgist.taoyao.signal.media.MediaClient; /** - * 终端信令协议适配器 + * 终端信令适配器 * * @author acgist */ @@ -17,6 +17,10 @@ public abstract class ProtocolClientAdapter extends ProtocolAdapter { protected ProtocolClientAdapter(String name, String signal) { super(name, signal); } + + @Override + public void execute(MediaClient mediaClient, Message message) { + } @Override public void execute(Client client, Message message) { @@ -29,20 +33,16 @@ public abstract class ProtocolClientAdapter extends ProtocolAdapter { throw MessageCodeException.of("信令主体类型错误:" + message); } } - - @Override - public void execute(MediaClient mediaClient, Message message) { - // 忽略 - } /** - * 处理信令 + * 处理终端信令 * * @param clientId 终端标识 * @param body 消息主体 * @param client 终端 * @param message 信令消息 */ - public abstract void execute(String clientId, Map body, Client client, Message message); + public void execute(String clientId, Map body, Client client, Message message) { + } } 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 da0a4fb..180b321 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 @@ -18,11 +18,10 @@ import com.acgist.taoyao.signal.protocol.client.ClientRegisterProtocol; import com.acgist.taoyao.signal.protocol.platform.PlatformErrorProtocol; import com.acgist.taoyao.signal.service.SecurityService; -import jakarta.annotation.PostConstruct; import lombok.extern.slf4j.Slf4j; /** - * 协议管理 + * 信令管理 * * @author acgist */ @@ -31,7 +30,7 @@ import lombok.extern.slf4j.Slf4j; public class ProtocolManager { /** - * 协议映射 + * 信令映射 */ private Map protocolMapping = new ConcurrentHashMap<>(); @@ -44,10 +43,11 @@ public class ProtocolManager { @Autowired private PlatformErrorProtocol platformErrorProtocol; - @PostConstruct + /** + * 加载信令映射 + */ public void init() { - final Map map = this.applicationContext.getBeansOfType(Protocol.class); - map.entrySet().stream() + this.applicationContext.getBeansOfType(Protocol.class).entrySet().stream() .sorted((a, z) -> a.getValue().signal().compareTo(z.getValue().signal())) .forEach(e -> { final String key = e.getKey(); @@ -57,7 +57,7 @@ public class ProtocolManager { if(this.protocolMapping.containsKey(signal)) { throw MessageCodeException.of("存在重复信令协议:" + signal); } - log.info("注册信令协议:{} - {} - {}", String.format("%-32s", signal), String.format("%-32s", key), name); + log.info("注册信令协议:{} - {} - {}", String.format("%-36s", signal), String.format("%-36s", key), name); this.protocolMapping.put(signal, value); }); } diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/ProtocolMediaAdapter.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/ProtocolMediaAdapter.java index b0895f2..a2e4765 100644 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/ProtocolMediaAdapter.java +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/ProtocolMediaAdapter.java @@ -7,7 +7,7 @@ import com.acgist.taoyao.boot.model.MessageCodeException; import com.acgist.taoyao.signal.media.MediaClient; /** - * 媒体服务信令协议适配器 + * 媒体服务信令适配器 * * @author acgist */ @@ -37,10 +37,11 @@ public abstract class ProtocolMediaAdapter extends ProtocolClientAdapter { /** * 处理媒体服务信令 * - * @param body 信令主体 + * @param body 消息主体 * @param mediaClient 媒体服务终端 * @param message 信令消息 */ - public abstract void execute(Map body, MediaClient mediaClient, Message message); + public void execute(Map body, MediaClient mediaClient, Message message) { + } } diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/ProtocolRoomAdapter.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/ProtocolRoomAdapter.java index e8999e0..dc3514d 100644 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/ProtocolRoomAdapter.java +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/ProtocolRoomAdapter.java @@ -2,15 +2,15 @@ package com.acgist.taoyao.signal.protocol; import java.util.Map; +import com.acgist.taoyao.boot.config.Constant; import com.acgist.taoyao.boot.model.Message; import com.acgist.taoyao.boot.model.MessageCodeException; -import com.acgist.taoyao.boot.property.Constant; import com.acgist.taoyao.signal.client.Client; import com.acgist.taoyao.signal.media.MediaClient; import com.acgist.taoyao.signal.media.Room; /** - * 房间信令协议适配器 + * 房间信令适配器 * * TODO:校验是否是房间内的用户权限 * @@ -33,7 +33,7 @@ public abstract class ProtocolRoomAdapter extends ProtocolMediaAdapter { } /** - * @param body 信令主体 + * @param body 消息主体 * * @return 房间 */ @@ -41,30 +41,32 @@ public abstract class ProtocolRoomAdapter extends ProtocolMediaAdapter { final String roomId = this.get(body, Constant.ROOM_ID); final Room room = this.roomManager.room(roomId); if(room == null) { - throw MessageCodeException.of("房间无效:" + roomId); + throw MessageCodeException.of("无效房间:" + roomId); } return room; } /** - * 处理房间信令 + * 处理媒体服务房间信令 * * @param room 房间 - * @param body 消息 + * @param body 消息主体 * @param mediaClient 媒体服务终端 * @param message 信令消息 */ - public abstract void execute(Room room, Map body, MediaClient mediaClient, Message message); + public void execute(Room room, Map body, MediaClient mediaClient, Message message) { + } /** - * 处理终端信令 + * 处理终端房间信令 * * @param clientId 终端标识 * @param room 房间 - * @param body 消息 + * @param body 消息主体 * @param client 终端 * @param message 信令消息 */ - public abstract void execute(String clientId, Room room, Map body, Client client, Message message); + public void execute(String clientId, Room room, Map body, Client client, Message message) { + } } diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/client/ClientCloseProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/client/ClientCloseProtocol.java index fe0e847..e78b46f 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 @@ -7,8 +7,8 @@ import org.springframework.context.ApplicationListener; import com.acgist.taoyao.boot.annotation.Description; import com.acgist.taoyao.boot.annotation.Protocol; +import com.acgist.taoyao.boot.config.Constant; import com.acgist.taoyao.boot.model.Message; -import com.acgist.taoyao.boot.property.Constant; import com.acgist.taoyao.signal.client.Client; import com.acgist.taoyao.signal.event.client.ClientCloseEvent; import com.acgist.taoyao.signal.protocol.ProtocolClientAdapter; 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 9f508e6..0c5db42 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 @@ -7,13 +7,16 @@ import org.springframework.beans.factory.annotation.Autowired; import com.acgist.taoyao.boot.annotation.Description; import com.acgist.taoyao.boot.annotation.Protocol; +import com.acgist.taoyao.boot.config.Constant; +import com.acgist.taoyao.boot.config.MediaProperties; +import com.acgist.taoyao.boot.config.WebrtcProperties; import com.acgist.taoyao.boot.model.Message; -import com.acgist.taoyao.boot.property.Constant; -import com.acgist.taoyao.boot.property.MediaProperties; -import com.acgist.taoyao.boot.property.WebrtcProperties; +import com.acgist.taoyao.boot.service.IpService; +import com.acgist.taoyao.boot.utils.DateUtils; import com.acgist.taoyao.boot.utils.DateUtils.DateTimeStyle; import com.acgist.taoyao.signal.client.Client; import com.acgist.taoyao.signal.protocol.ProtocolClientAdapter; +import com.acgist.taoyao.signal.wrapper.WebrtcPropertiesWrapper; /** * 终端配置信令 @@ -24,9 +27,9 @@ import com.acgist.taoyao.signal.protocol.ProtocolClientAdapter; @Description( body = """ { - "time": "系统时间(yyyyMMddHHmmss)", "media": "媒体配置", - "webrtc": "WebRTC配置" + "webrtc": "WebRTC配置", + "datetime": "日期时间(yyyyMMddHHmmss)" } """, flow = "终端-[终端注册]>信令服务->终端" @@ -35,6 +38,8 @@ public class ClientConfigProtocol extends ProtocolClientAdapter { public static final String SIGNAL = "client::config"; + @Autowired + private IpService ipService; @Autowired private MediaProperties mediaProperties; @Autowired @@ -46,19 +51,24 @@ public class ClientConfigProtocol extends ProtocolClientAdapter { @Override public void execute(String clientId, Map body, Client client, Message message) { - // 忽略 + client.push(this.build(client)); } - @Override - public Message build() { - final Message message = super.build(); + /** + * @param client 终端 + * + * @return 信令消息 + */ + public Message build(Client client) { + final String clientIp = client.ip(); + final Message message = this.build(); + final WebrtcPropertiesWrapper webrtcPropertiesWrapper = new WebrtcPropertiesWrapper(clientIp, this.ipService, this.webrtcProperties); message.setBody(Map.of( - // 系统时间 - Constant.TIME, DateTimeStyle.YYYYMMDDHH24MMSS.getDateTimeFormatter().format(LocalDateTime.now()), Constant.MEDIA, this.mediaProperties, - Constant.WEBRTC, this.webrtcProperties + Constant.WEBRTC, webrtcPropertiesWrapper, + Constant.DATETIME, DateUtils.format(LocalDateTime.now(), DateTimeStyle.YYYYMMDDHH24MMSS) )); return message; } - + } diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/client/ClientHeartbeatProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/client/ClientHeartbeatProtocol.java index 74aa4aa..9f5bd29 100644 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/client/ClientHeartbeatProtocol.java +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/client/ClientHeartbeatProtocol.java @@ -5,8 +5,8 @@ import java.util.Map; import com.acgist.taoyao.boot.annotation.Description; import com.acgist.taoyao.boot.annotation.Protocol; +import com.acgist.taoyao.boot.config.Constant; import com.acgist.taoyao.boot.model.Message; -import com.acgist.taoyao.boot.property.Constant; import com.acgist.taoyao.signal.client.Client; import com.acgist.taoyao.signal.client.ClientStatus; import com.acgist.taoyao.signal.protocol.ProtocolClientAdapter; 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 8606901..a2c4045 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 @@ -1,11 +1,8 @@ package com.acgist.taoyao.signal.protocol.client; -import java.util.Map; - import com.acgist.taoyao.boot.annotation.Description; import com.acgist.taoyao.boot.annotation.Protocol; -import com.acgist.taoyao.boot.model.Message; -import com.acgist.taoyao.signal.client.Client; +import com.acgist.taoyao.signal.protocol.ControlProtocol; import com.acgist.taoyao.signal.protocol.ProtocolClientAdapter; /** @@ -17,17 +14,19 @@ import com.acgist.taoyao.signal.protocol.ProtocolClientAdapter; @Description( flow = "信令服务->终端" ) -public class ClientRebootProtocol extends ProtocolClientAdapter { +public class ClientRebootProtocol extends ProtocolClientAdapter implements ControlProtocol { public static final String SIGNAL = "client::reboot"; public ClientRebootProtocol() { super("重启终端信令", SIGNAL); } - - @Override - public void execute(String clientId, Map body, Client client, Message message) { - // 忽略 - } + /** + * @param clientId 终端标识 + */ + public void execute(String clientId) { + this.clientManager.unicast(clientId, this.build()); + } + } 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 a3941f5..1a3ef06 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 @@ -8,10 +8,10 @@ import org.springframework.beans.factory.annotation.Autowired; import com.acgist.taoyao.boot.annotation.Description; import com.acgist.taoyao.boot.annotation.Protocol; +import com.acgist.taoyao.boot.config.Constant; import com.acgist.taoyao.boot.model.Message; import com.acgist.taoyao.boot.model.MessageCode; import com.acgist.taoyao.boot.model.MessageCodeException; -import com.acgist.taoyao.boot.property.Constant; import com.acgist.taoyao.signal.client.Client; import com.acgist.taoyao.signal.client.ClientStatus; import com.acgist.taoyao.signal.protocol.ProtocolClientAdapter; @@ -72,7 +72,7 @@ public class ClientRegisterProtocol extends ProtocolClientAdapter { // 推送消息 client.push(message.cloneWithoutBody()); // 下发配置 - client.push(this.configProtocol.build()); + client.push(this.configProtocol.build(client)); // 终端状态 final ClientStatus status = client.status(); status.setClientId(clientId); diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/client/ClientShutdownProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/client/ClientShutdownProtocol.java new file mode 100644 index 0000000..b8ba08c --- /dev/null +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/client/ClientShutdownProtocol.java @@ -0,0 +1,32 @@ +package com.acgist.taoyao.signal.protocol.client; + +import com.acgist.taoyao.boot.annotation.Description; +import com.acgist.taoyao.boot.annotation.Protocol; +import com.acgist.taoyao.signal.protocol.ControlProtocol; +import com.acgist.taoyao.signal.protocol.ProtocolClientAdapter; + +/** + * 关闭终端信令 + * + * @author acgist + */ +@Protocol +@Description( + flow = "信令服务->终端" +) +public class ClientShutdownProtocol extends ProtocolClientAdapter implements ControlProtocol { + + public static final String SIGNAL = "client::shutdown"; + + public ClientShutdownProtocol() { + super("关闭终端信令", SIGNAL); + } + + /** + * @param clientId 终端标识 + */ + public void execute(String clientId) { + this.clientManager.unicast(clientId, this.build()); + } + +} 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 fbc7e82..6c5f250 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 @@ -4,8 +4,8 @@ import java.util.Map; import com.acgist.taoyao.boot.annotation.Description; import com.acgist.taoyao.boot.annotation.Protocol; +import com.acgist.taoyao.boot.config.Constant; import com.acgist.taoyao.boot.model.Message; -import com.acgist.taoyao.boot.property.Constant; import com.acgist.taoyao.signal.client.Client; import com.acgist.taoyao.signal.protocol.ProtocolClientAdapter; 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 0d32cc5..0fb4bf7 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 @@ -6,8 +6,8 @@ import org.apache.commons.lang3.StringUtils; import com.acgist.taoyao.boot.annotation.Description; import com.acgist.taoyao.boot.annotation.Protocol; +import com.acgist.taoyao.boot.config.Constant; import com.acgist.taoyao.boot.model.Message; -import com.acgist.taoyao.boot.property.Constant; import com.acgist.taoyao.signal.client.Client; import com.acgist.taoyao.signal.protocol.ProtocolClientAdapter; diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/client/ClientWakeupProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/client/ClientWakeupProtocol.java new file mode 100644 index 0000000..a70413c --- /dev/null +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/client/ClientWakeupProtocol.java @@ -0,0 +1,10 @@ +package com.acgist.taoyao.signal.protocol.client; + +/** + * 终端唤醒信令 + * + * @author acgist + */ +public class ClientWakeupProtocol { + +} diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/MediaListProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/MediaListProtocol.java index 1891567..5454910 100644 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/MediaListProtocol.java +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/MediaListProtocol.java @@ -6,8 +6,8 @@ import org.springframework.beans.factory.annotation.Autowired; import com.acgist.taoyao.boot.annotation.Description; import com.acgist.taoyao.boot.annotation.Protocol; +import com.acgist.taoyao.boot.config.MediaProperties; import com.acgist.taoyao.boot.model.Message; -import com.acgist.taoyao.boot.property.MediaProperties; import com.acgist.taoyao.signal.client.Client; import com.acgist.taoyao.signal.protocol.ProtocolClientAdapter; diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/MediaRebootProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/MediaRebootProtocol.java index ca9901c..64aa485 100644 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/MediaRebootProtocol.java +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/MediaRebootProtocol.java @@ -5,10 +5,11 @@ import java.util.Map; import org.springframework.beans.factory.annotation.Autowired; import com.acgist.taoyao.boot.annotation.Description; +import com.acgist.taoyao.boot.config.ScriptProperties; import com.acgist.taoyao.boot.model.Message; -import com.acgist.taoyao.boot.property.ScriptProperties; import com.acgist.taoyao.boot.utils.ScriptUtils; import com.acgist.taoyao.signal.client.Client; +import com.acgist.taoyao.signal.protocol.ControlProtocol; import com.acgist.taoyao.signal.protocol.ProtocolClientAdapter; import lombok.extern.slf4j.Slf4j; @@ -16,11 +17,13 @@ import lombok.extern.slf4j.Slf4j; /** * 媒体服务重启信令 * + * TODO:指定媒体服务名称 + * * @author acgist */ @Slf4j @Description(flow = "终端->信令服务+)终端") -public class MediaRebootProtocol extends ProtocolClientAdapter { +public class MediaRebootProtocol extends ProtocolClientAdapter implements ControlProtocol { public static final String SIGNAL = "media::reboot"; @@ -31,6 +34,15 @@ public class MediaRebootProtocol extends ProtocolClientAdapter { super("重启媒体服务信令", SIGNAL); } + /** + * @param mediaId 媒体服务标识 + */ + public void execute(String mediaId) { + log.info("重启媒体服务"); + this.clientManager.broadcast(this.build()); + ScriptUtils.execute(this.scriptProperties.getMediaReboot()); + } + @Override public void execute(String clientId, Map body, Client client, Message message) { log.info("重启媒体服务:{}", clientId); diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/MediaRegisterProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/MediaRegisterProtocol.java index 97728b3..bbbf191 100644 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/MediaRegisterProtocol.java +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/MediaRegisterProtocol.java @@ -6,9 +6,9 @@ import org.springframework.beans.factory.annotation.Autowired; import com.acgist.taoyao.boot.annotation.Description; import com.acgist.taoyao.boot.annotation.Protocol; +import com.acgist.taoyao.boot.config.Constant; +import com.acgist.taoyao.boot.config.MediaServerProperties; import com.acgist.taoyao.boot.model.Message; -import com.acgist.taoyao.boot.property.Constant; -import com.acgist.taoyao.boot.property.MediaServerProperties; import com.acgist.taoyao.signal.client.Client; import com.acgist.taoyao.signal.media.MediaClient; import com.acgist.taoyao.signal.protocol.ProtocolMediaAdapter; 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 index aeed727..7412b39 100644 --- 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 @@ -4,10 +4,11 @@ import java.util.Map; import org.springframework.beans.factory.annotation.Autowired; +import com.acgist.taoyao.boot.config.ScriptProperties; import com.acgist.taoyao.boot.model.Message; -import com.acgist.taoyao.boot.property.ScriptProperties; import com.acgist.taoyao.boot.utils.ScriptUtils; import com.acgist.taoyao.signal.client.Client; +import com.acgist.taoyao.signal.protocol.ControlProtocol; import com.acgist.taoyao.signal.protocol.ProtocolClientAdapter; import lombok.extern.slf4j.Slf4j; @@ -15,10 +16,12 @@ import lombok.extern.slf4j.Slf4j; /** * 关闭媒体服务信令 * + * TODO:指定媒体服务名称 + * * @author acgist */ @Slf4j -public class MediaShutdownProtocol extends ProtocolClientAdapter { +public class MediaShutdownProtocol extends ProtocolClientAdapter implements ControlProtocol { public static final String SIGNAL = "media::shutdown"; @@ -29,6 +32,15 @@ public class MediaShutdownProtocol extends ProtocolClientAdapter { super("关闭媒体服务信令", SIGNAL); } + /** + * @param mediaId 媒体服务标识 + */ + public void execute(String mediaId) { + log.info("关闭媒体服务"); + this.clientManager.broadcast(this.build()); + ScriptUtils.execute(this.scriptProperties.getMediaShutdown()); + } + @Override public void execute(String clientId, Map body, Client client, Message message) { log.info("关闭媒体服务:{}", clientId); diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/MediaTransportWebRtcCreateProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/MediaTransportWebRtcCreateProtocol.java index 7015261..9b76954 100644 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/MediaTransportWebRtcCreateProtocol.java +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/MediaTransportWebRtcCreateProtocol.java @@ -1,11 +1,18 @@ package com.acgist.taoyao.signal.protocol.media; +import java.util.List; import java.util.Map; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.CollectionUtils; + import com.acgist.taoyao.boot.annotation.Description; import com.acgist.taoyao.boot.annotation.Protocol; +import com.acgist.taoyao.boot.config.Constant; +import com.acgist.taoyao.boot.config.MediaServerProperties; import com.acgist.taoyao.boot.model.Message; -import com.acgist.taoyao.boot.property.Constant; +import com.acgist.taoyao.boot.service.IpService; import com.acgist.taoyao.signal.client.Client; import com.acgist.taoyao.signal.media.MediaClient; import com.acgist.taoyao.signal.media.Peer; @@ -13,15 +20,29 @@ import com.acgist.taoyao.signal.media.Room; import com.acgist.taoyao.signal.media.Transport; import com.acgist.taoyao.signal.protocol.ProtocolRoomAdapter; +import lombok.extern.slf4j.Slf4j; + /** * 创建WebRTC通道信令 * * @author acgist */ +@Slf4j @Protocol @Description( body = { """ + { + "roomId": "房间标识" + } + { + "roomId": "房间标识", + "transportId": "传输通道标识", + "iceCandidates": "iceCandidates", + "iceParameters": "iceParameters", + "dtlsParameters": "dtlsParameters", + "sctpParameters": "sctpParameters" + } """ }, flow = "终端->信令服务->媒体服务->信令服务->终端" @@ -30,6 +51,9 @@ public class MediaTransportWebRtcCreateProtocol extends ProtocolRoomAdapter { public static final String SIGNAL = "media::transport::webrtc::create"; + @Autowired + private IpService ipService; + protected MediaTransportWebRtcCreateProtocol() { super("创建WebRTC通道信令", SIGNAL); } @@ -41,13 +65,42 @@ public class MediaTransportWebRtcCreateProtocol extends ProtocolRoomAdapter { @Override public void execute(String clientId, Room room, Map body, Client client, Message message) { final Message response = room.request(message); - final Map responseBody = (Map) response.getBody(); final Peer peer = client.peer(); + final Map responseBody = (Map) response.getBody(); + final MediaServerProperties mediaServerProperties = room.getMediaClient().mediaServerProperties(); + if(Boolean.TRUE.equals(mediaServerProperties.getRewriteIp())) { + // 重写IP地址 + this.rewriteIp(client.ip(), responseBody, mediaServerProperties); + } final Map transports = peer.getTransports(); final String transportId = this.get(responseBody, Constant.TRANSPORT_ID); final Transport transport = transports.computeIfAbsent(transportId, key -> new Transport(client)); + // 拷贝属性 transport.copy(responseBody); client.push(response); } + + /** + * 重写IP地址 + * + * @param clientIp 终端IP + * @param body 消息主体 + * @param mediaServerProperties 媒体服务配置 + */ + private void rewriteIp(String clientIp, Map body, MediaServerProperties mediaServerProperties) { + final List> iceCandidates = this.get(body, Constant.ICE_CANDIDATES); + if(CollectionUtils.isEmpty(iceCandidates)) { + return; + } + final String defaultMediaIp = mediaServerProperties.getHost(); + iceCandidates.forEach(map -> { + final String mediaIp = (String) map.get(Constant.IP); + if(StringUtils.isNotEmpty(mediaIp)) { + final String rewriteIp = this.ipService.rewriteIp(mediaIp, clientIp, defaultMediaIp); + log.debug("重写IP地址:{} | {} + {} -> {}", mediaIp, defaultMediaIp, clientIp, rewriteIp); + map.put(Constant.IP, rewriteIp); + } + }); + } } diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/platform/PlatformRebootProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/platform/PlatformRebootProtocol.java index 5d04406..a37b7f1 100644 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/platform/PlatformRebootProtocol.java +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/platform/PlatformRebootProtocol.java @@ -5,10 +5,11 @@ import java.util.Map; import org.springframework.beans.factory.annotation.Autowired; import com.acgist.taoyao.boot.annotation.Description; +import com.acgist.taoyao.boot.config.ScriptProperties; import com.acgist.taoyao.boot.model.Message; -import com.acgist.taoyao.boot.property.ScriptProperties; import com.acgist.taoyao.boot.utils.ScriptUtils; import com.acgist.taoyao.signal.client.Client; +import com.acgist.taoyao.signal.protocol.ControlProtocol; import com.acgist.taoyao.signal.protocol.ProtocolClientAdapter; import lombok.extern.slf4j.Slf4j; @@ -20,7 +21,7 @@ import lombok.extern.slf4j.Slf4j; */ @Slf4j @Description(flow = "终端->信令服务+)终端") -public class PlatformRebootProtocol extends ProtocolClientAdapter { +public class PlatformRebootProtocol extends ProtocolClientAdapter implements ControlProtocol { public static final String SIGNAL = "platform::reboot"; @@ -30,6 +31,15 @@ public class PlatformRebootProtocol extends ProtocolClientAdapter { public PlatformRebootProtocol() { super("重启平台信令", SIGNAL); } + + /** + * 执行命令信令 + */ + public void execute() { + log.info("重启平台"); + this.clientManager.broadcast(this.build()); + ScriptUtils.execute(this.scriptProperties.getPlatformReboot()); + } @Override public void execute(String clientId, Map body, Client client, Message message) { diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/platform/PlatformScriptProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/platform/PlatformScriptProtocol.java index df38efe..75eedbc 100644 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/platform/PlatformScriptProtocol.java +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/platform/PlatformScriptProtocol.java @@ -3,8 +3,8 @@ package com.acgist.taoyao.signal.protocol.platform; import java.util.Map; import com.acgist.taoyao.boot.annotation.Description; +import com.acgist.taoyao.boot.config.Constant; import com.acgist.taoyao.boot.model.Message; -import com.acgist.taoyao.boot.property.Constant; import com.acgist.taoyao.boot.utils.ScriptUtils; import com.acgist.taoyao.signal.client.Client; import com.acgist.taoyao.signal.protocol.ProtocolClientAdapter; diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/platform/PlatformShutdownProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/platform/PlatformShutdownProtocol.java index 8faf560..fbf6a79 100644 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/platform/PlatformShutdownProtocol.java +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/platform/PlatformShutdownProtocol.java @@ -6,10 +6,11 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ConfigurableApplicationContext; import com.acgist.taoyao.boot.annotation.Description; +import com.acgist.taoyao.boot.config.ScriptProperties; import com.acgist.taoyao.boot.model.Message; -import com.acgist.taoyao.boot.property.ScriptProperties; import com.acgist.taoyao.boot.utils.ScriptUtils; import com.acgist.taoyao.signal.client.Client; +import com.acgist.taoyao.signal.protocol.ControlProtocol; import com.acgist.taoyao.signal.protocol.ProtocolClientAdapter; import lombok.extern.slf4j.Slf4j; @@ -21,7 +22,7 @@ import lombok.extern.slf4j.Slf4j; */ @Slf4j @Description(flow = "终端->信令服务+)终端") -public class PlatformShutdownProtocol extends ProtocolClientAdapter { +public class PlatformShutdownProtocol extends ProtocolClientAdapter implements ControlProtocol { public static final String SIGNAL = "platform::shutdown"; @@ -32,10 +33,26 @@ public class PlatformShutdownProtocol extends ProtocolClientAdapter { super("关闭平台信令", SIGNAL); } + /** + * 执行命令信令 + */ + public void execute() { + log.info("关闭平台"); + this.clientManager.broadcast(this.build()); + this.shutdown(); + } + @Override public void execute(String clientId, Map body, Client client, Message message) { log.info("关闭平台:{}", clientId); this.clientManager.broadcast(message); + this.shutdown(); + } + + /** + * 关闭平台 + */ + private void shutdown() { if(this.applicationContext instanceof ConfigurableApplicationContext context) { // API关闭 if(context.isActive()) { 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 6896225..651022f 100644 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/room/RoomCreateProtocol.java +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/room/RoomCreateProtocol.java @@ -4,9 +4,9 @@ import java.util.Map; import com.acgist.taoyao.boot.annotation.Description; import com.acgist.taoyao.boot.annotation.Protocol; +import com.acgist.taoyao.boot.config.Constant; import com.acgist.taoyao.boot.model.Message; import com.acgist.taoyao.boot.model.MessageCodeException; -import com.acgist.taoyao.boot.property.Constant; import com.acgist.taoyao.signal.client.Client; import com.acgist.taoyao.signal.media.Room; import com.acgist.taoyao.signal.protocol.ProtocolClientAdapter; 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 b11a681..dc6b83f 100644 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/room/RoomEnterProtocol.java +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/room/RoomEnterProtocol.java @@ -4,10 +4,10 @@ import java.util.Map; import com.acgist.taoyao.boot.annotation.Description; import com.acgist.taoyao.boot.annotation.Protocol; +import com.acgist.taoyao.boot.config.Constant; import com.acgist.taoyao.boot.model.Message; import com.acgist.taoyao.boot.model.MessageCode; import com.acgist.taoyao.boot.model.MessageCodeException; -import com.acgist.taoyao.boot.property.Constant; import com.acgist.taoyao.signal.client.Client; import com.acgist.taoyao.signal.media.MediaClient; import com.acgist.taoyao.signal.media.Room; diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/system/SystemRebootProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/system/SystemRebootProtocol.java index 33c17bf..2740b06 100644 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/system/SystemRebootProtocol.java +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/system/SystemRebootProtocol.java @@ -5,10 +5,11 @@ import java.util.Map; import org.springframework.beans.factory.annotation.Autowired; import com.acgist.taoyao.boot.annotation.Description; +import com.acgist.taoyao.boot.config.ScriptProperties; import com.acgist.taoyao.boot.model.Message; -import com.acgist.taoyao.boot.property.ScriptProperties; import com.acgist.taoyao.boot.utils.ScriptUtils; import com.acgist.taoyao.signal.client.Client; +import com.acgist.taoyao.signal.protocol.ControlProtocol; import com.acgist.taoyao.signal.protocol.ProtocolClientAdapter; import lombok.extern.slf4j.Slf4j; @@ -20,7 +21,7 @@ import lombok.extern.slf4j.Slf4j; */ @Slf4j @Description(flow = "终端->信令服务+)终端") -public class SystemRebootProtocol extends ProtocolClientAdapter { +public class SystemRebootProtocol extends ProtocolClientAdapter implements ControlProtocol { public static final String SIGNAL = "system::reboot"; @@ -30,6 +31,15 @@ public class SystemRebootProtocol extends ProtocolClientAdapter { public SystemRebootProtocol() { super("重启系统信令", SIGNAL); } + + /** + * 执行命令信令 + */ + public void execute() { + log.info("重启系统"); + this.clientManager.broadcast(this.build()); + ScriptUtils.execute(this.scriptProperties.getSystemReboot()); + } @Override public void execute(String clientId, Map body, Client client, Message message) { diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/system/SystemShutdownProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/system/SystemShutdownProtocol.java index 41577fb..95f86a9 100644 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/system/SystemShutdownProtocol.java +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/system/SystemShutdownProtocol.java @@ -5,10 +5,11 @@ import java.util.Map; import org.springframework.beans.factory.annotation.Autowired; import com.acgist.taoyao.boot.annotation.Description; +import com.acgist.taoyao.boot.config.ScriptProperties; import com.acgist.taoyao.boot.model.Message; -import com.acgist.taoyao.boot.property.ScriptProperties; import com.acgist.taoyao.boot.utils.ScriptUtils; import com.acgist.taoyao.signal.client.Client; +import com.acgist.taoyao.signal.protocol.ControlProtocol; import com.acgist.taoyao.signal.protocol.ProtocolClientAdapter; import lombok.extern.slf4j.Slf4j; @@ -20,7 +21,7 @@ import lombok.extern.slf4j.Slf4j; */ @Slf4j @Description(flow = "终端->信令服务+)终端") -public class SystemShutdownProtocol extends ProtocolClientAdapter { +public class SystemShutdownProtocol extends ProtocolClientAdapter implements ControlProtocol { public static final String SIGNAL = "system::shutdown"; @@ -31,6 +32,15 @@ public class SystemShutdownProtocol extends ProtocolClientAdapter { super("关闭系统信令", SIGNAL); } + /** + * 执行命令信令 + */ + public void execute() { + log.info("关闭系统"); + this.clientManager.broadcast(this.build()); + ScriptUtils.execute(this.scriptProperties.getSystemShutdown()); + } + @Override public void execute(String clientId, Map body, Client client, Message message) { log.info("关闭系统:{}", clientId); diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/service/SecurityService.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/service/SecurityService.java index daddb48..268326d 100644 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/service/SecurityService.java +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/service/SecurityService.java @@ -13,11 +13,14 @@ public interface SecurityService { /** * 认证 + * 优先使用`UsernamePasswordService`其次使用配置帐号密码 * * @param username 用户名称 * @param password 用户密码 * * @return 是否成功 + * + * @see UsernamePasswordService */ boolean authenticate(String username, String password); diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/service/UsernamePasswordService.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/service/UsernamePasswordService.java new file mode 100644 index 0000000..1baa2b6 --- /dev/null +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/service/UsernamePasswordService.java @@ -0,0 +1,20 @@ +package com.acgist.taoyao.signal.service; + +/** + * 用户密码认证服务 + * + * @author acgist + */ +public interface UsernamePasswordService { + + /** + * 认证 + * + * @param username 用户名称 + * @param password 用户密码 + * + * @return 是否成功 + */ + boolean authenticate(String username, String password); + +} 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 b3f7935..3b1bf9f 100644 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/service/impl/SecurityServiceImpl.java +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/service/impl/SecurityServiceImpl.java @@ -3,27 +3,32 @@ package com.acgist.taoyao.signal.service.impl; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; +import com.acgist.taoyao.boot.config.SecurityProperties; import com.acgist.taoyao.boot.model.Message; -import com.acgist.taoyao.boot.property.SecurityProperties; import com.acgist.taoyao.signal.client.Client; import com.acgist.taoyao.signal.protocol.Protocol; import com.acgist.taoyao.signal.service.SecurityService; +import com.acgist.taoyao.signal.service.UsernamePasswordService; public class SecurityServiceImpl implements SecurityService { @Autowired private SecurityProperties securityProperties; + @Autowired(required = false) + private UsernamePasswordService usernamePasswordService; @Override public boolean authenticate(String username, String password) { - if( - Boolean.TRUE.equals(this.securityProperties.getEnabled()) && - StringUtils.equals(this.securityProperties.getUsername(), username) && - StringUtils.equals(this.securityProperties.getPassword(), password) - ) { - return true; - } - return false; + if(Boolean.FALSE.equals(this.securityProperties.getEnabled())) { + return true; + } + if(this.usernamePasswordService == null) { + return + StringUtils.equals(this.securityProperties.getUsername(), username) && + StringUtils.equals(this.securityProperties.getPassword(), password); + } else { + return this.usernamePasswordService.authenticate(username, password); + } } @Override diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/wrapper/WebrtcPropertiesWrapper.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/wrapper/WebrtcPropertiesWrapper.java new file mode 100644 index 0000000..58f23b9 --- /dev/null +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/wrapper/WebrtcPropertiesWrapper.java @@ -0,0 +1,79 @@ +package com.acgist.taoyao.signal.wrapper; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import com.acgist.taoyao.boot.config.Constant; +import com.acgist.taoyao.boot.config.WebrtcProperties; +import com.acgist.taoyao.boot.config.WebrtcStunProperties; +import com.acgist.taoyao.boot.config.WebrtcTurnProperties; +import com.acgist.taoyao.boot.service.IpService; +import com.fasterxml.jackson.annotation.JsonIgnore; + +import lombok.AllArgsConstructor; + +/** + * WebRTC配置包装器 + * + * @author acgist + */ +@AllArgsConstructor +public class WebrtcPropertiesWrapper extends WebrtcProperties { + + /** + * 终端IP + */ + @JsonIgnore + private String clientIp; + /** + * IP服务 + */ + @JsonIgnore + private IpService ipService; + /** + * WebRTC配置 + */ + @JsonIgnore + private WebrtcProperties webrtcProperties; + + @Override + public WebrtcStunProperties[] getStun() { + return this.webrtcProperties.getStun(); + } + + @Override + public WebrtcTurnProperties[] getTurn() { + return this.webrtcProperties.getTurn(); + } + + @Override + public List> getIceServers() { + final List> list = new ArrayList<>(); + final WebrtcStunProperties[] stunList = this.webrtcProperties.getStun(); + if(stunList != null) { + for (WebrtcStunProperties stun : stunList) { + if(this.ipService.subnetIp(stun.getHost(), this.clientIp)) { + final Map map = new HashMap<>(); + map.put(Constant.URLS, stun.getAddress()); + list.add(map); + } + } + } + final WebrtcTurnProperties[] turnList = this.webrtcProperties.getTurn(); + if(turnList != null) { + for (WebrtcTurnProperties turn : turnList) { + if(this.ipService.subnetIp(turn.getHost(), this.clientIp)) { + final Map map = new HashMap<>(); + map.put(Constant.URLS, turn.getAddress()); + map.put(Constant.USERNAME, turn.getUsername()); + map.put(Constant.CREDENTIAL, turn.getPassword()); + list.add(map); + } + } + } + return list; + } + +} diff --git a/taoyao-signal-server/taoyao-signal/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/taoyao-signal-server/taoyao-signal/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports index 942b253..07a20fa 100644 --- a/taoyao-signal-server/taoyao-signal/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +++ b/taoyao-signal-server/taoyao-signal/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -1,4 +1,5 @@ com.acgist.taoyao.signal.configuration.ScriptAutoConfiguration +com.acgist.taoyao.signal.configuration.SignalAutoConfiguration com.acgist.taoyao.signal.configuration.MediaClientAutoConfiguration com.acgist.taoyao.signal.configuration.SocketSignalAutoConfiguration com.acgist.taoyao.signal.configuration.WebSocketSignalAutoConfiguration