From d34be408d6f933586cdab190a6f78ff1a10a5820 Mon Sep 17 00:00:00 2001 From: lanss <7428909+lanss-01@user.noreply.gitee.com> Date: Tue, 25 Jan 2022 13:50:22 +0000 Subject: [PATCH 01/24] update web_src/src/components/dialog/changePassword.vue. --- web_src/src/components/dialog/changePassword.vue | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/web_src/src/components/dialog/changePassword.vue b/web_src/src/components/dialog/changePassword.vue index a95736f2..23d761e1 100644 --- a/web_src/src/components/dialog/changePassword.vue +++ b/web_src/src/components/dialog/changePassword.vue @@ -75,7 +75,10 @@ export default { isLoging: false, rules: { oldPassword: [{ required: true, validator: validatePass0, trigger: "blur" }], - newPassword: [{ required: true, validator: validatePass1, trigger: "blur" }], + newPassword: [{ required: true, validator: validatePass1, trigger: "blur" }, { + pattern: /^(?=.*[a-zA-Z])(?=.*\d)(?=.*[~!@#$%^&*()_+`\-={}:";'<>?,.\/]).{8,20}$/, + message: "密码长度在8-20位之间,由字母+数字+特殊字符组成", + },], confirmPassword: [{ required: true, validator: validatePass2, trigger: "blur" }], }, }; From c8b9e590efaf5e7a10724b5f26f14de741e3c8a7 Mon Sep 17 00:00:00 2001 From: chenjialing <595168663@qq.com> Date: Thu, 24 Feb 2022 19:02:11 +0800 Subject: [PATCH 02/24] =?UTF-8?q?=E6=97=A5=E5=BF=97=E4=BC=98=E5=8C=96--?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=9C=AC=E5=9C=B0=E7=9A=84=E6=97=A5=E5=BF=97?= =?UTF-8?q?=E8=AE=B0=E5=BD=95=E6=96=B9=E5=BC=8F=EF=BC=8C=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?druid=E7=9A=84sql=E7=9A=84=E6=97=A5=E5=BF=97=E6=89=93=E5=8D=B0?= =?UTF-8?q?=E5=92=8C=E7=9B=91=E6=8E=A7=E9=9D=A2=E6=9D=BF=EF=BC=8C=E4=BF=AE?= =?UTF-8?q?=E6=94=B9druid=E7=9A=84=E9=85=8D=E7=BD=AE=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 4 +- .../genersoft/iot/vmp/VManageBootstrap.java | 2 + .../vmp/conf/druid/DruidConfiguration.java | 64 +++++++++++++ .../vmp/conf/druid/EnableDruidSupport.java | 24 +++++ src/main/resources/logback-spring-local.xml | 90 +++++++++++++++++++ 5 files changed, 182 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/genersoft/iot/vmp/conf/druid/DruidConfiguration.java create mode 100644 src/main/java/com/genersoft/iot/vmp/conf/druid/EnableDruidSupport.java create mode 100644 src/main/resources/logback-spring-local.xml diff --git a/pom.xml b/pom.xml index f1ac4581..809d8dbe 100644 --- a/pom.xml +++ b/pom.xml @@ -90,8 +90,8 @@ com.alibaba - druid - 1.2.3 + druid-spring-boot-starter + 1.1.22 diff --git a/src/main/java/com/genersoft/iot/vmp/VManageBootstrap.java b/src/main/java/com/genersoft/iot/vmp/VManageBootstrap.java index bfe58419..9dacbade 100644 --- a/src/main/java/com/genersoft/iot/vmp/VManageBootstrap.java +++ b/src/main/java/com/genersoft/iot/vmp/VManageBootstrap.java @@ -2,6 +2,7 @@ package com.genersoft.iot.vmp; import java.util.logging.LogManager; +import com.genersoft.iot.vmp.conf.druid.EnableDruidSupport; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.servlet.ServletComponentScan; @@ -17,6 +18,7 @@ import springfox.documentation.oas.annotations.EnableOpenApi; @SpringBootApplication @EnableScheduling @EnableOpenApi +@EnableDruidSupport public class VManageBootstrap extends LogManager { private static String[] args; private static ConfigurableApplicationContext context; diff --git a/src/main/java/com/genersoft/iot/vmp/conf/druid/DruidConfiguration.java b/src/main/java/com/genersoft/iot/vmp/conf/druid/DruidConfiguration.java new file mode 100644 index 00000000..12f6e636 --- /dev/null +++ b/src/main/java/com/genersoft/iot/vmp/conf/druid/DruidConfiguration.java @@ -0,0 +1,64 @@ +package com.genersoft.iot.vmp.conf.druid; + +import com.alibaba.druid.support.http.StatViewServlet; +import com.alibaba.druid.support.http.WebStatFilter; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.web.servlet.FilterRegistrationBean; +import org.springframework.boot.web.servlet.ServletRegistrationBean; +import org.springframework.context.annotation.Bean; + +import javax.servlet.Filter; +import javax.servlet.Servlet; + +/** + * druid监控配置 + * @author + */ +public class DruidConfiguration { + + @Value("${rj-druid-manage.allow:127.0.0.1}") + private String allow; + + @Value("${rj-druid-manage.deny:}") + private String deny; + + @Value("${rj-druid-manage.loginUsername:admin}") + private String loginUsername; + + @Value("${rj-druid-manage.loginPassword:admin}") + private String loginPassword; + + @Value("${rj-druid-manage.resetEnable:false}") + private String resetEnable; + + /** + * druid监控页面开启 + */ + @Bean + public ServletRegistrationBean druidServlet() { + ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean<>(new StatViewServlet(), "/druid/*"); + // IP白名单 + servletRegistrationBean.addInitParameter("allow", allow); + // IP黑名单(共同存在时,deny优先于allow) + servletRegistrationBean.addInitParameter("deny", deny); + //控制台管理用户 + servletRegistrationBean.addInitParameter("loginUsername", loginUsername); + servletRegistrationBean.addInitParameter("loginPassword", loginPassword); + //是否能够重置数据 禁用HTML页面上的“Reset All”功能 + servletRegistrationBean.addInitParameter("resetEnable", resetEnable); + return servletRegistrationBean; + } + + /** + * druid url监控配置 + */ + @Bean + public FilterRegistrationBean filterRegistrationBean() { + FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean<>(new WebStatFilter()); + filterRegistrationBean.addUrlPatterns("/*"); + filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"); + return filterRegistrationBean; + } + + +} \ No newline at end of file diff --git a/src/main/java/com/genersoft/iot/vmp/conf/druid/EnableDruidSupport.java b/src/main/java/com/genersoft/iot/vmp/conf/druid/EnableDruidSupport.java new file mode 100644 index 00000000..5fd710be --- /dev/null +++ b/src/main/java/com/genersoft/iot/vmp/conf/druid/EnableDruidSupport.java @@ -0,0 +1,24 @@ +package com.genersoft.iot.vmp.conf.druid; + +import org.springframework.boot.web.servlet.ServletComponentScan; +import org.springframework.context.annotation.Import; + +import java.lang.annotation.*; + +/** + * druid监控支持注解 + * + * @author + * {@link DruidConfiguration} druid监控页面安全配置支持 + * {@link ServletComponentScan} druid监控页面需要扫描servlet + */ +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.RUNTIME) +@Documented +@Inherited +@Import({ + DruidConfiguration.class, +}) +@ServletComponentScan +public @interface EnableDruidSupport { +} diff --git a/src/main/resources/logback-spring-local.xml b/src/main/resources/logback-spring-local.xml new file mode 100644 index 00000000..6d818420 --- /dev/null +++ b/src/main/resources/logback-spring-local.xml @@ -0,0 +1,90 @@ + + + + + + + + + + + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}:%L - %msg%n + + + + + + + + + + ${LOG_HOME}/wvp-%d{yyyy-MM-dd}.%i.log + + 30 + 20MB + + + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}:%L - %msg%n + + + + + INFO + + + + + + + + + ${LOG_HOME}/error-%d{yyyy-MM-dd}.%i.log + + 30 + 20MB + + + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}:%L - %msg%n + + + + WARN + + + + + + + + + + ${LOG_HOME}/druid-%d{yyyy-MM-dd}.%i.log + + 30 + 50MB + + + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}:%L - %msg%n + + + + + + + + + + + + + + + + + + + \ No newline at end of file From 7852c4fde736fddef780e87e831a70932acdb439 Mon Sep 17 00:00:00 2001 From: chenjialing <595168663@qq.com> Date: Sun, 9 Jan 2022 09:30:50 +0800 Subject: [PATCH 03/24] =?UTF-8?q?research--local=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/application-local.yml | 99 ++++++++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 src/main/resources/application-local.yml diff --git a/src/main/resources/application-local.yml b/src/main/resources/application-local.yml new file mode 100644 index 00000000..e7e689b4 --- /dev/null +++ b/src/main/resources/application-local.yml @@ -0,0 +1,99 @@ +spring: + # REDIS数据库配置 + redis: + # [必须修改] Redis服务器IP, REDIS安装在本机的,使用127.0.0.1 + host: 127.0.0.1 + # [必须修改] 端口号 + port: 6379 + # [可选] 数据库 DB + database: 6 + # [可选] 访问密码,若你的redis服务器没有设置密码,就不需要用密码去连接 + password: + # [可选] 超时时间 + timeout: 10000 + # [可选] jdbc数据库配置, 项目使用sqlite作为数据库,一般不需要配置 + datasource: + # 使用mysql 打开23-28行注释, 删除29-36行 + name: wvp + url: jdbc:mysql://127.0.0.1:3306/wvp?useUnicode=true&characterEncoding=UTF8&rewriteBatchedStatements=true&serverTimezone=PRC&useSSL=false + username: root + password: root123 + type: com.alibaba.druid.pool.DruidDataSource + driver-class-name: com.mysql.cj.jdbc.Driver +# name: eiot +# url: jdbc:sqlite::resource:wvp.sqlite +# username: +# password: +# type: com.alibaba.druid.pool.DruidDataSource +# driver-class-name: org.sqlite.JDBC +# journal_mode: WAL +# synchronous: NORMAL +# transaction_mode: IMMEDIATE +# max-active: 1 +# min-idle: 1 + +# [可选] WVP监听的HTTP端口, 网页和接口调用都是这个端口 +server: + port: 18080 + +# 作为28181服务器的配置 +sip: + # [必须修改] 本机的IP + ip: 192.168.118.212 + # [可选] 28181服务监听的端口 + port: 5060 + # 根据国标6.1.2中规定,domain宜采用ID统一编码的前十位编码。国标附录D中定义前8位为中心编码(由省级、市级、区级、基层编号组成,参照GB/T 2260-2007) + # 后两位为行业编码,定义参照附录D.3 + # 3701020049标识山东济南历下区 信息行业接入 + # [可选] + domain: 4401020049 + # [可选] + id: 44010200492000000001 + # [可选] 默认设备认证密码,后续扩展使用设备单独密码, 移除密码将不进行校验 + password: admin123 + +#zlm 默认服务器配置 +media: + # [必须修改] zlm服务器的内网IP + ip: 127.0.0.1 + # [必须修改] zlm服务器的http.port + http-port: 80 + # [可选] zlm服务器的hook.admin_params=secret + secret: 035c73f7-bb6b-4889-a715-d9eb2d1925cc + # 启用多端口模式, 多端口模式使用端口区分每路流,兼容性更好。 单端口使用流的ssrc区分, 点播超时建议使用多端口测试 + rtp: + # [可选] 是否启用多端口模式, 开启后会在portRange范围内选择端口用于媒体流传输 + enable: true + # [可选] 在此范围内选择端口用于媒体流传输, + port-range: 30000,30500 # 端口范围 + # [可选] 国标级联在此范围内选择端口发送媒体流, + send-port-range: 30000,30500 # 端口范围 + # 录像辅助服务, 部署此服务可以实现zlm录像的管理与下载, 0 表示不使用 + record-assist-port: 18081 +# [可选] 日志配置, 一般不需要改 +logging: + file: + name: logs/wvp.log + max-history: 30 + max-size: 10MB + total-size-cap: 300MB + level: + com.genersoft.iot: debug + com.genersoft.iot.vmp.storager.dao: info + com.genersoft.iot.vmp.gb28181: info + +# [根据业务需求配置] +user-settings: + # 推流直播是否录制 + record-push-live: true + auto-apply-play: false + +# 在线文档: swagger-ui(生产环境建议关闭) +swagger-ui: + enabled: true + +# 版本信息, 不需修改 +version: + version: "@project.version@" + description: "@project.description@" + artifact-id: "@project.artifactId@" From e0f8acf09f70fdbcf0d8dd912d70cfc6f27bcef6 Mon Sep 17 00:00:00 2001 From: chenjialing <595168663@qq.com> Date: Wed, 9 Feb 2022 09:37:04 +0800 Subject: [PATCH 04/24] =?UTF-8?q?=E6=B7=BB=E5=8A=A0git=E7=9A=84=E5=BF=BD?= =?UTF-8?q?=E7=95=A5logs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 51ebf9e9..21f40064 100644 --- a/.gitignore +++ b/.gitignore @@ -3,7 +3,7 @@ # Log file *.log - +logs/* # BlueJ files *.ctxt From 777f2e21217fcc4ee3a946cc071602da8b977258 Mon Sep 17 00:00:00 2001 From: chenjialing <595168663@qq.com> Date: Fri, 25 Feb 2022 09:54:18 +0800 Subject: [PATCH 05/24] =?UTF-8?q?=E6=97=A5=E5=BF=97=E4=BC=98=E5=8C=96--?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=9C=AC=E5=9C=B0=E9=85=8D=E7=BD=AE=E6=96=87?= =?UTF-8?q?=E4=BB=B6local=E7=9A=84mysql=E8=BF=9E=E6=8E=A5=E6=96=B9?= =?UTF-8?q?=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/application-local.yml | 74 ++++++++++++++---------- 1 file changed, 43 insertions(+), 31 deletions(-) diff --git a/src/main/resources/application-local.yml b/src/main/resources/application-local.yml index e7e689b4..9a109520 100644 --- a/src/main/resources/application-local.yml +++ b/src/main/resources/application-local.yml @@ -11,35 +11,54 @@ spring: password: # [可选] 超时时间 timeout: 10000 - # [可选] jdbc数据库配置, 项目使用sqlite作为数据库,一般不需要配置 + # [可选] jdbc数据库配置, 项目使用sqlite作为数据库,一般不需要配置 + # mysql数据源 datasource: - # 使用mysql 打开23-28行注释, 删除29-36行 - name: wvp - url: jdbc:mysql://127.0.0.1:3306/wvp?useUnicode=true&characterEncoding=UTF8&rewriteBatchedStatements=true&serverTimezone=PRC&useSSL=false - username: root - password: root123 - type: com.alibaba.druid.pool.DruidDataSource - driver-class-name: com.mysql.cj.jdbc.Driver -# name: eiot -# url: jdbc:sqlite::resource:wvp.sqlite -# username: -# password: -# type: com.alibaba.druid.pool.DruidDataSource -# driver-class-name: org.sqlite.JDBC -# journal_mode: WAL -# synchronous: NORMAL -# transaction_mode: IMMEDIATE -# max-active: 1 -# min-idle: 1 + type: com.alibaba.druid.pool.DruidDataSource + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://127.0.0.1:3306/wvp?useUnicode=true&characterEncoding=UTF8&rewriteBatchedStatements=true&serverTimezone=PRC&useSSL=false + username: root + password: root123 + druid: + initialSize: 10 # 连接池初始化连接数 + maxActive: 200 # 连接池最大连接数 + minIdle: 5 # 连接池最小空闲连接数 + maxWait: 60000 # 获取连接时最大等待时间,单位毫秒。配置了maxWait之后,缺省启用公平锁,并发效率会有所下降,如果需要可以通过配置useUnfairLock属性为true使用非公平锁。 + keepAlive: true # 连接池中的minIdle数量以内的连接,空闲时间超过minEvictableIdleTimeMillis,则会执行keepAlive操作。 + validationQuery: select 1 # 检测连接是否有效sql,要求是查询语句,常用select 'x'。如果validationQuery为null,testOnBorrow、testOnReturn、testWhileIdle都不会起作用。 + testWhileIdle: true # 建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。 + testOnBorrow: false # 申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。 + testOnReturn: false # 归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。 + poolPreparedStatements: false # 是否開啟PSCache,並且指定每個連線上PSCache的大小 + timeBetweenEvictionRunsMillis: 60000 # 配置間隔多久才進行一次檢測,檢測需要關閉的空閒連線,單位是毫秒 + minEvictableIdleTimeMillis: 300000 # 配置一個連線在池中最小生存的時間,單位是毫秒 + filters: stat,wall,slf4j # 配置监控统计拦截的filters,监控统计用的filter:sta, 日志用的filter:log4j, 防御sql注入的filter:wall + useGlobalDataSourceStat: true # 合并多个DruidDataSource的监控数据 + # 通过connectProperties属性来打开mergeSql功能;慢SQL记录 + connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=1000 + #stat-view-servlet.url-pattern: /admin/druid/* -# [可选] WVP监听的HTTP端口, 网页和接口调用都是这个端口 + # druid管理监控页面的一些配置 +rj-druid-manage: + allow: # 访问druid监控页面的IP白名单 + deny: 192.168.1.100 # 访问druid监控页面IP黑名单 + loginUsername: rjAdmin # 访问druid监控页面账号 + loginPassword: rj@2022 # 访问druid监控页面密码 + resetEnable: false # 是否能够重置数据 禁用HTML页面上的“Reset All”功能 +#mybatis: +# configuration: +# # 这个配置会将执行的sql打印出来,在开发或测试的时候可以用 +# log-impl: org.apache.ibatis.logging.stdout.StdOutImpl +# # 返回类型为Map,显示null对应的字段 +# call-setters-on-nulls: true +## [可选] WVP监听的HTTP端口, 网页和接口调用都是这个端口 server: port: 18080 # 作为28181服务器的配置 sip: # [必须修改] 本机的IP - ip: 192.168.118.212 + ip: 192.168.118.70 # [可选] 28181服务监听的端口 port: 5060 # 根据国标6.1.2中规定,domain宜采用ID统一编码的前十位编码。国标附录D中定义前8位为中心编码(由省级、市级、区级、基层编号组成,参照GB/T 2260-2007) @@ -55,7 +74,7 @@ sip: #zlm 默认服务器配置 media: # [必须修改] zlm服务器的内网IP - ip: 127.0.0.1 + ip: 192.168.118.70 # [必须修改] zlm服务器的http.port http-port: 80 # [可选] zlm服务器的hook.admin_params=secret @@ -72,15 +91,8 @@ media: record-assist-port: 18081 # [可选] 日志配置, 一般不需要改 logging: - file: - name: logs/wvp.log - max-history: 30 - max-size: 10MB - total-size-cap: 300MB - level: - com.genersoft.iot: debug - com.genersoft.iot.vmp.storager.dao: info - com.genersoft.iot.vmp.gb28181: info + config: classpath:logback-spring-local.xml + # [根据业务需求配置] user-settings: From 7400ace65d693bb7bcc564b9211d8bab2af3ac01 Mon Sep 17 00:00:00 2001 From: 648540858 <648540858@qq.com> Date: Fri, 25 Feb 2022 20:33:02 +0800 Subject: [PATCH 06/24] =?UTF-8?q?=E8=A7=84=E8=8C=83=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=BA=93=EF=BC=8C=E8=A7=A3=E5=86=B3bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 9 +++ sql/mysql.sql | 68 +++++++++---------- .../iot/vmp/gb28181/bean/DeviceChannel.java | 12 ++++ .../subscribe/catalog/CatalogEventLister.java | 2 +- .../cmd/CatalogNotifyMessageHandler.java | 1 - .../vmp/media/zlm/ZLMMediaListManager.java | 6 +- .../iot/vmp/media/zlm/ZLMRESTfulUtils.java | 19 +++++- .../vmp/storager/dao/DeviceChannelMapper.java | 35 +++++----- .../iot/vmp/storager/dao/GbStreamMapper.java | 1 + .../storager/dao/PlatformChannelMapper.java | 18 ++--- .../impl/VideoManagerStoragerImpl.java | 16 ++--- .../iot/vmp/utils/node/BaseNode.java | 2 +- .../iot/vmp/utils/node/ForestNode.java | 2 +- .../iot/vmp/utils/node/ForestNodeManager.java | 6 +- .../genersoft/iot/vmp/utils/node/INode.java | 2 +- .../vmp/vmanager/bean/DeviceChannelTree.java | 2 +- .../gb28181/media/MediaController.java | 5 ++ .../gb28181/platform/bean/ChannelReduce.java | 14 ++++ web_src/src/components/channelList.vue | 4 +- 19 files changed, 142 insertions(+), 82 deletions(-) diff --git a/pom.xml b/pom.xml index f1ac4581..770cc253 100644 --- a/pom.xml +++ b/pom.xml @@ -183,6 +183,15 @@ 4.9.0 + + + com.squareup.okhttp3 + logging-interceptor + 4.9.0 + + + + com.burgstaller diff --git a/sql/mysql.sql b/sql/mysql.sql index f2e358fc..13e1ccdf 100644 --- a/sql/mysql.sql +++ b/sql/mysql.sql @@ -44,7 +44,7 @@ CREATE TABLE `device` ( `charset` varchar(50) COLLATE utf8mb4_general_ci NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `device_deviceId_uindex` (`deviceId`) -) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -95,39 +95,41 @@ DROP TABLE IF EXISTS `device_channel`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `device_channel` ( - `channelId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, - `manufacture` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, - `model` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, - `owner` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, - `civilCode` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, - `block` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, - `address` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, - `parentId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `id` int NOT NULL AUTO_INCREMENT, + `channelId` varchar(50) COLLATE utf8mb4_general_ci NOT NULL, + `name` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL, + `manufacture` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL, + `model` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL, + `owner` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL, + `civilCode` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL, + `block` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL, + `address` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL, + `parentId` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL, `safetyWay` int DEFAULT NULL, `registerWay` int DEFAULT NULL, - `certNum` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `certNum` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL, `certifiable` int DEFAULT NULL, `errCode` int DEFAULT NULL, - `endTime` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, - `secrecy` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, - `ipAddress` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `endTime` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL, + `secrecy` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL, + `ipAddress` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL, `port` int DEFAULT NULL, - `password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `password` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL, `PTZType` int DEFAULT NULL, `status` int DEFAULT NULL, `longitude` double DEFAULT NULL, `latitude` double DEFAULT NULL, - `streamId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, - `deviceId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `parental` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `streamId` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL, + `deviceId` varchar(50) COLLATE utf8mb4_general_ci NOT NULL, + `parental` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL, `hasAudio` bit(1) DEFAULT NULL, - `createTime` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `updateTime` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `createTime` varchar(50) COLLATE utf8mb4_general_ci NOT NULL, + `updateTime` varchar(50) COLLATE utf8mb4_general_ci NOT NULL, `subCount` int DEFAULT '0', - PRIMARY KEY (`channelId`,`deviceId`) USING BTREE, + PRIMARY KEY (`id`), + UNIQUE KEY `device_channel_id_uindex` (`id`), UNIQUE KEY `device_channel_pk` (`channelId`,`deviceId`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC; +) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -196,7 +198,7 @@ CREATE TABLE `gb_stream` ( PRIMARY KEY (`gbStreamId`) USING BTREE, UNIQUE KEY `app` (`app`,`stream`) USING BTREE, UNIQUE KEY `gbId` (`gbId`) USING BTREE -) ENGINE=InnoDB AUTO_INCREMENT=291 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC; +) ENGINE=InnoDB AUTO_INCREMENT=375 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -226,7 +228,7 @@ CREATE TABLE `log` ( `username` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, `createTime` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, PRIMARY KEY (`id`) USING BTREE -) ENGINE=InnoDB AUTO_INCREMENT=245 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC; +) ENGINE=InnoDB AUTO_INCREMENT=313 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -315,7 +317,7 @@ CREATE TABLE `parent_platform` ( PRIMARY KEY (`id`), UNIQUE KEY `parent_platform_id_uindex` (`id`), UNIQUE KEY `parent_platform_pk` (`serverGBId`) -) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC; +) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -361,13 +363,11 @@ DROP TABLE IF EXISTS `platform_gb_channel`; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `platform_gb_channel` ( `id` int NOT NULL AUTO_INCREMENT, - `channelId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `deviceId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `platformId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `deviceAndChannelId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `catalogId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `platformId` varchar(50) COLLATE utf8mb4_general_ci NOT NULL, + `catalogId` varchar(50) COLLATE utf8mb4_general_ci NOT NULL, + `deviceChannelId` int NOT NULL, PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC; +) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -393,7 +393,7 @@ CREATE TABLE `platform_gb_stream` ( `id` int NOT NULL AUTO_INCREMENT, PRIMARY KEY (`id`), UNIQUE KEY `platform_gb_stream_pk` (`platformId`,`catalogId`,`gbStreamId`) -) ENGINE=InnoDB AUTO_INCREMENT=256 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC; +) ENGINE=InnoDB AUTO_INCREMENT=406 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -463,7 +463,7 @@ CREATE TABLE `stream_push` ( `mediaServerId` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `stream_push_pk` (`app`,`stream`) -) ENGINE=InnoDB AUTO_INCREMENT=310 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +) ENGINE=InnoDB AUTO_INCREMENT=394 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -540,4 +540,4 @@ UNLOCK TABLES; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; --- Dump completed on 2022-02-24 16:52:12 +-- Dump completed on 2022-02-25 20:32:21 diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/DeviceChannel.java b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/DeviceChannel.java index 6d40e360..36337895 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/DeviceChannel.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/DeviceChannel.java @@ -3,6 +3,10 @@ package com.genersoft.iot.vmp.gb28181.bean; public class DeviceChannel { + /** + * 数据库自赠ID + */ + private int id; /** * 通道id @@ -165,6 +169,14 @@ public class DeviceChannel { */ private boolean hasAudio; + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + public String getDeviceId() { return deviceId; } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/event/subscribe/catalog/CatalogEventLister.java b/src/main/java/com/genersoft/iot/vmp/gb28181/event/subscribe/catalog/CatalogEventLister.java index 997031b6..3bb28887 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/event/subscribe/catalog/CatalogEventLister.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/event/subscribe/catalog/CatalogEventLister.java @@ -60,7 +60,7 @@ public class CatalogEventLister implements ApplicationListener { Map> parentPlatformMap = new HashMap<>(); if (event.getPlatformId() != null) { parentPlatform = storager.queryParentPlatByServerGBId(event.getPlatformId()); - if (!parentPlatform.isStatus())return; + if (parentPlatform != null && !parentPlatform.isStatus())return; String key = VideoManagerConstants.SIP_SUBSCRIBE_PREFIX + userSetup.getServerId() + "_Catalog_" + event.getPlatformId(); subscribe = redisCatchStorage.getSubscribe(key); if (subscribe == null) return; diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/CatalogNotifyMessageHandler.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/CatalogNotifyMessageHandler.java index 7ddcd824..4b99f902 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/CatalogNotifyMessageHandler.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/CatalogNotifyMessageHandler.java @@ -98,7 +98,6 @@ public class CatalogNotifyMessageHandler extends SIPRequestProcessorParent imple DeviceChannel deviceChannel = storager.queryChannel(channelReduce.getDeviceId(), channelReduce.getChannelId()); deviceChannel.setParental(0); deviceChannel.setParentId(channelReduce.getCatalogId()); - cmderFroPlatform.catalogQuery(deviceChannel, parentPlatform, sn, fromHeader.getTag(), size); // 防止发送过快 Thread.sleep(50); diff --git a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMMediaListManager.java b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMMediaListManager.java index a15e01a4..c8844959 100644 --- a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMMediaListManager.java +++ b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMMediaListManager.java @@ -122,7 +122,6 @@ public class ZLMMediaListManager { transform.setName(thirdPartyGB.getName()); } } - storager.updateMedia(transform); if (!StringUtils.isEmpty(transform.getGbId())) { // 如果这个国标ID已经给了其他推流且流已离线,则移除其他推流 List gbStreams = gbStreamMapper.selectByGBId(transform.getGbId()); @@ -135,13 +134,16 @@ public class ZLMMediaListManager { } } } - if (gbStreamMapper.selectOne(transform.getApp(), transform.getStream()) != null) { + StreamProxyItem streamProxyItem = gbStreamMapper.selectOne(transform.getApp(), transform.getStream()); + if (streamProxyItem != null) { + transform.setGbStreamId(streamProxyItem.getGbStreamId()); gbStreamMapper.update(transform); }else { transform.setCreateStamp(System.currentTimeMillis()); gbStreamMapper.add(transform); } } + storager.updateMedia(transform); return transform; } diff --git a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRESTfulUtils.java b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRESTfulUtils.java index 8238a838..05ecd3fb 100644 --- a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRESTfulUtils.java +++ b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRESTfulUtils.java @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; import okhttp3.*; +import okhttp3.logging.HttpLoggingInterceptor; import org.jetbrains.annotations.NotNull; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -25,8 +26,23 @@ public class ZLMRESTfulUtils { void run(JSONObject response); } + private OkHttpClient getClient(){ + OkHttpClient.Builder httpClientBuilder = new OkHttpClient.Builder(); + if (logger.isDebugEnabled()) { + HttpLoggingInterceptor logging = new HttpLoggingInterceptor(message -> { + logger.debug("http请求参数:" + message); + }); + logging.setLevel(HttpLoggingInterceptor.Level.BASIC); + // OkHttp進行添加攔截器loggingInterceptor + httpClientBuilder.addInterceptor(logging); + } + return httpClientBuilder.build(); + } + + public JSONObject sendPost(MediaServerItem mediaServerItem, String api, Map param, RequestCallback callback) { - OkHttpClient client = new OkHttpClient(); + OkHttpClient client = getClient(); + if (mediaServerItem == null) { return null; } @@ -56,6 +72,7 @@ public class ZLMRESTfulUtils { ResponseBody responseBody = response.body(); if (responseBody != null) { String responseStr = responseBody.string(); + System.out.println(responseStr); responseJSON = JSON.parseObject(responseStr); } }else { diff --git a/src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceChannelMapper.java b/src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceChannelMapper.java index 6d9cd002..d4cace44 100644 --- a/src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceChannelMapper.java +++ b/src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceChannelMapper.java @@ -87,26 +87,27 @@ public interface DeviceChannelMapper { void startPlay(String deviceId, String channelId, String streamId); @Select(value = {" "}) List queryChannelListInAll(String query, Boolean online, Boolean hasSubChannel, String platformId, String catalogId); @@ -196,8 +197,8 @@ public interface DeviceChannelMapper { List queryOnlineChannelsByDeviceId(String deviceId); @Select(" SELECT\n" + + " id,\n" + " channelId,\n" + - " channelId as id,\n" + " deviceId,\n" + " parentId,\n" + " status,\n" + diff --git a/src/main/java/com/genersoft/iot/vmp/storager/dao/GbStreamMapper.java b/src/main/java/com/genersoft/iot/vmp/storager/dao/GbStreamMapper.java index 55b53793..2c63c82b 100644 --- a/src/main/java/com/genersoft/iot/vmp/storager/dao/GbStreamMapper.java +++ b/src/main/java/com/genersoft/iot/vmp/storager/dao/GbStreamMapper.java @@ -19,6 +19,7 @@ public interface GbStreamMapper { "('${app}', '${stream}', '${gbId}', '${name}', " + "'${longitude}', '${latitude}', '${streamType}', " + "'${mediaServerId}', ${status}, ${createStamp})") + @Options(useGeneratedKeys = true, keyProperty = "gbStreamId", keyColumn = "gbStreamId") int add(GbStream gbStream); @Update("UPDATE gb_stream " + diff --git a/src/main/java/com/genersoft/iot/vmp/storager/dao/PlatformChannelMapper.java b/src/main/java/com/genersoft/iot/vmp/storager/dao/PlatformChannelMapper.java index 37c86a81..6d3be955 100644 --- a/src/main/java/com/genersoft/iot/vmp/storager/dao/PlatformChannelMapper.java +++ b/src/main/java/com/genersoft/iot/vmp/storager/dao/PlatformChannelMapper.java @@ -21,22 +21,22 @@ public interface PlatformChannelMapper { * 查询列表里已经关联的 */ @Select("") - List findChannelRelatedPlatform(String platformId, List deviceAndChannelIds); + List findChannelRelatedPlatform(String platformId, List channelReduces); @Insert("") int addChannels(String platformId, List channelReducesToAdd); @Delete("") int delChannelForGB(String platformId, List channelReducesToDel); @@ -79,8 +79,10 @@ public interface PlatformChannelMapper { "parent_platform pp " + "left join platform_gb_channel pgc on " + "pp.serverGBId = pgc.platformId " + + "left join device_channel dc on " + + "dc.id = pgc.deviceChannelId " + "WHERE " + - "pgc.channelId = #{channelId} and pp.status = true " + + "dc.channelId = #{channelId} and pp.status = true " + "AND pp.serverGBId IN" + " #{item}" + " ") diff --git a/src/main/java/com/genersoft/iot/vmp/storager/impl/VideoManagerStoragerImpl.java b/src/main/java/com/genersoft/iot/vmp/storager/impl/VideoManagerStoragerImpl.java index 1d04c82d..5ab940cd 100644 --- a/src/main/java/com/genersoft/iot/vmp/storager/impl/VideoManagerStoragerImpl.java +++ b/src/main/java/com/genersoft/iot/vmp/storager/impl/VideoManagerStoragerImpl.java @@ -607,19 +607,19 @@ public class VideoManagerStoragerImpl implements IVideoManagerStorager { @Override public int updateChannelForGB(String platformId, List channelReduces, String catalogId) { - Map deviceAndChannels = new HashMap<>(); + Map deviceAndChannels = new HashMap<>(); for (ChannelReduce channelReduce : channelReduces) { channelReduce.setCatalogId(catalogId); - deviceAndChannels.put(channelReduce.getDeviceId() + "_" + channelReduce.getChannelId(), channelReduce); + deviceAndChannels.put(channelReduce.getId(), channelReduce); } - List deviceAndChannelList = new ArrayList<>(deviceAndChannels.keySet()); + List deviceAndChannelList = new ArrayList<>(deviceAndChannels.keySet()); // 查询当前已经存在的 - List relatedPlatformchannels = platformChannelMapper.findChannelRelatedPlatform(platformId, deviceAndChannelList); - if (relatedPlatformchannels != null) { - deviceAndChannelList.removeAll(relatedPlatformchannels); + List channelIds = platformChannelMapper.findChannelRelatedPlatform(platformId, channelReduces); + if (deviceAndChannelList != null) { + deviceAndChannelList.removeAll(channelIds); } - for (String relatedPlatformchannel : relatedPlatformchannels) { - deviceAndChannels.remove(relatedPlatformchannel); + for (Integer channelId : channelIds) { + deviceAndChannels.remove(channelId); } List channelReducesToAdd = new ArrayList<>(deviceAndChannels.values()); // 对剩下的数据进行存储 diff --git a/src/main/java/com/genersoft/iot/vmp/utils/node/BaseNode.java b/src/main/java/com/genersoft/iot/vmp/utils/node/BaseNode.java index 0de21608..6b955081 100644 --- a/src/main/java/com/genersoft/iot/vmp/utils/node/BaseNode.java +++ b/src/main/java/com/genersoft/iot/vmp/utils/node/BaseNode.java @@ -18,7 +18,7 @@ public class BaseNode implements INode { /** * 主键ID */ - protected String id; + protected int id; /** * 父节点ID diff --git a/src/main/java/com/genersoft/iot/vmp/utils/node/ForestNode.java b/src/main/java/com/genersoft/iot/vmp/utils/node/ForestNode.java index 0ba72072..d0500a1e 100644 --- a/src/main/java/com/genersoft/iot/vmp/utils/node/ForestNode.java +++ b/src/main/java/com/genersoft/iot/vmp/utils/node/ForestNode.java @@ -19,7 +19,7 @@ public class ForestNode extends BaseNode { */ private Object content; - public ForestNode(String id, String parentId, Object content) { + public ForestNode(int id, String parentId, Object content) { this.id = id; this.parentId = parentId; this.content = content; diff --git a/src/main/java/com/genersoft/iot/vmp/utils/node/ForestNodeManager.java b/src/main/java/com/genersoft/iot/vmp/utils/node/ForestNodeManager.java index de98fdc7..895e6de0 100644 --- a/src/main/java/com/genersoft/iot/vmp/utils/node/ForestNodeManager.java +++ b/src/main/java/com/genersoft/iot/vmp/utils/node/ForestNodeManager.java @@ -17,12 +17,12 @@ public class ForestNodeManager> { /** * 森林的所有节点 */ - private final ImmutableMap nodeMap; + private final ImmutableMap nodeMap; /** * 森林的父节点ID */ - private final Map parentIdMap = Maps.newHashMap(); + private final Map parentIdMap = Maps.newHashMap(); public ForestNodeManager(List nodes) { nodeMap = Maps.uniqueIndex(nodes, INode::getId); @@ -46,7 +46,7 @@ public class ForestNodeManager> { * * @param parentId 父节点ID */ - public void addParentId(String parentId) { + public void addParentId(int parentId) { parentIdMap.put(parentId, ""); } diff --git a/src/main/java/com/genersoft/iot/vmp/utils/node/INode.java b/src/main/java/com/genersoft/iot/vmp/utils/node/INode.java index 4d6ebfcb..c82d6f76 100644 --- a/src/main/java/com/genersoft/iot/vmp/utils/node/INode.java +++ b/src/main/java/com/genersoft/iot/vmp/utils/node/INode.java @@ -14,7 +14,7 @@ public interface INode extends Serializable { * * @return String */ - String getId(); + int getId(); /** * 父主键 diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/bean/DeviceChannelTree.java b/src/main/java/com/genersoft/iot/vmp/vmanager/bean/DeviceChannelTree.java index 773f2c13..4eaf5987 100644 --- a/src/main/java/com/genersoft/iot/vmp/vmanager/bean/DeviceChannelTree.java +++ b/src/main/java/com/genersoft/iot/vmp/vmanager/bean/DeviceChannelTree.java @@ -19,7 +19,7 @@ public class DeviceChannelTree extends DeviceChannel implements INode - - - + From 0cd86a79c229167f9e2f9d3284d577732061c317 Mon Sep 17 00:00:00 2001 From: 648540858 <648540858@qq.com> Date: Mon, 28 Feb 2022 10:39:51 +0800 Subject: [PATCH 07/24] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E8=AE=BE=E5=A4=87?= =?UTF-8?q?=E5=88=A0=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../iot/vmp/media/zlm/ZLMRESTfulUtils.java | 1 - .../vmp/service/impl/MediaServerServiceImpl.java | 2 ++ .../iot/vmp/service/impl/MediaServiceImpl.java | 14 ++++++++------ .../vmp/storager/dao/PlatformChannelMapper.java | 9 ++++++--- 4 files changed, 16 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRESTfulUtils.java b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRESTfulUtils.java index 05ecd3fb..d0b1cb2d 100644 --- a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRESTfulUtils.java +++ b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRESTfulUtils.java @@ -72,7 +72,6 @@ public class ZLMRESTfulUtils { ResponseBody responseBody = response.body(); if (responseBody != null) { String responseStr = responseBody.string(); - System.out.println(responseStr); responseJSON = JSON.parseObject(responseStr); } }else { diff --git a/src/main/java/com/genersoft/iot/vmp/service/impl/MediaServerServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/service/impl/MediaServerServiceImpl.java index 507d4e66..159cd055 100644 --- a/src/main/java/com/genersoft/iot/vmp/service/impl/MediaServerServiceImpl.java +++ b/src/main/java/com/genersoft/iot/vmp/service/impl/MediaServerServiceImpl.java @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.genersoft.iot.vmp.common.VideoManagerConstants; +import com.genersoft.iot.vmp.conf.MediaConfig; import com.genersoft.iot.vmp.conf.SipConfig; import com.genersoft.iot.vmp.conf.UserSetup; import com.genersoft.iot.vmp.gb28181.bean.Device; @@ -278,6 +279,7 @@ public class MediaServerServiceImpl implements IMediaServerService, CommandLineR @Override public MediaServerItem getDefaultMediaServer() { + return mediaServerMapper.queryDefault(); } diff --git a/src/main/java/com/genersoft/iot/vmp/service/impl/MediaServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/service/impl/MediaServiceImpl.java index fcb52070..6e3debaa 100644 --- a/src/main/java/com/genersoft/iot/vmp/service/impl/MediaServiceImpl.java +++ b/src/main/java/com/genersoft/iot/vmp/service/impl/MediaServiceImpl.java @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.genersoft.iot.vmp.common.StreamInfo; +import com.genersoft.iot.vmp.conf.MediaConfig; import com.genersoft.iot.vmp.media.zlm.ZLMRESTfulUtils; import com.genersoft.iot.vmp.media.zlm.dto.MediaItem; import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; @@ -26,6 +27,10 @@ public class MediaServiceImpl implements IMediaService { @Autowired private IMediaServerService mediaServerService; + + @Autowired + private MediaConfig mediaConfig; + @Autowired private ZLMRESTfulUtils zlmresTfulUtils; @@ -39,15 +44,12 @@ public class MediaServiceImpl implements IMediaService { @Override public StreamInfo getStreamInfoByAppAndStreamWithCheck(String app, String stream, String mediaServerId, String addr) { StreamInfo streamInfo = null; - - MediaServerItem mediaInfo; if (mediaServerId == null) { - mediaInfo = mediaServerService.getDefaultMediaServer(); - }else { - mediaInfo = mediaServerService.getOne(mediaServerId); + mediaServerId = mediaConfig.getId(); } + MediaServerItem mediaInfo = mediaServerService.getOne(mediaServerId);; if (mediaInfo == null) { - return streamInfo; + return null; } JSONObject mediaList = zlmresTfulUtils.getMediaList(mediaInfo, app, stream); if (mediaList != null) { diff --git a/src/main/java/com/genersoft/iot/vmp/storager/dao/PlatformChannelMapper.java b/src/main/java/com/genersoft/iot/vmp/storager/dao/PlatformChannelMapper.java index 6d3be955..c3c11a88 100644 --- a/src/main/java/com/genersoft/iot/vmp/storager/dao/PlatformChannelMapper.java +++ b/src/main/java/com/genersoft/iot/vmp/storager/dao/PlatformChannelMapper.java @@ -41,7 +41,11 @@ public interface PlatformChannelMapper { int delChannelForGB(String platformId, List channelReducesToDel); @Delete("") int delChannelForDeviceId(String deviceId); @@ -50,8 +54,7 @@ public interface PlatformChannelMapper { "") int cleanChannelForGB(String platformId); - @Select("SELECT * FROM device_channel WHERE deviceId = (SELECT deviceId FROM platform_gb_channel WHERE " + - "platformId='${platformId}' AND channelId='${channelId}' ) AND channelId='${channelId}'") + @Select("SELECT dc.* FROM platform_gb_channel pgc left join device_channel dc on dc.id = pgc.deviceChannelId WHERE dc.channelId='${channelId}' and pgc.platformId='${platformId}'") DeviceChannel queryChannelInParentPlatform(String platformId, String channelId); @Select("select dc.channelId as id, dc.name as name, pgc.platformId as platformId, pgc.catalogId as parentId, 0 as childrenCount, 1 as type " + From 6d454423a2357df64d2f6993dac056c3c994ef97 Mon Sep 17 00:00:00 2001 From: ckb_test <745836797@qq.com> Date: Mon, 28 Feb 2022 09:07:02 +0000 Subject: [PATCH 08/24] =?UTF-8?q?rPort=20=E5=8F=98=E6=9B=B4=E4=BA=86HostAd?= =?UTF-8?q?dres=E4=B9=9F=E8=A6=81=E5=8F=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/message/notify/cmd/KeepaliveNotifyMessageHandler.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/KeepaliveNotifyMessageHandler.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/KeepaliveNotifyMessageHandler.java index 228ce10f..edd9fe86 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/KeepaliveNotifyMessageHandler.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/KeepaliveNotifyMessageHandler.java @@ -68,6 +68,7 @@ public class KeepaliveNotifyMessageHandler extends SIPRequestProcessorParent imp } if (device.getPort() != rPort) { device.setPort(rPort); + device.setHostAddress(received.concat(":").concat(String.valueOf(rPort))); videoManagerStorager.updateDevice(device); redisCatchStorage.updateDevice(device); } From 9c5b1060af4e6c468b2cf95fbb9ec6d0a05fad5c Mon Sep 17 00:00:00 2001 From: 648540858 <648540858@qq.com> Date: Mon, 28 Feb 2022 17:56:27 +0800 Subject: [PATCH 09/24] =?UTF-8?q?=E6=94=AF=E6=8C=81=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E5=9C=A8=E7=BA=BF=E8=AE=BE=E5=A4=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../vmanager/gb28181/device/DeviceQuery.java | 29 +++++++-------- web_src/src/components/DeviceList.vue | 36 +++++++++++++------ 2 files changed, 38 insertions(+), 27 deletions(-) diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceQuery.java b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceQuery.java index d9357d20..1d639098 100644 --- a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceQuery.java +++ b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceQuery.java @@ -204,10 +204,7 @@ public class DeviceQuery { if (logger.isDebugEnabled()) { logger.debug("设备信息删除API调用,deviceId:" + deviceId); } - - if (offLineDetector.isOnline(deviceId)) { - return new ResponseEntity("不允许删除在线设备!", HttpStatus.NOT_ACCEPTABLE); - } + // 清除redis记录 boolean isSuccess = storager.delete(deviceId); if (isSuccess) { @@ -319,20 +316,20 @@ public class DeviceQuery { if (!StringUtils.isEmpty(device.getCharset())) deviceInStore.setCharset(device.getCharset()); if (!StringUtils.isEmpty(device.getMediaServerId())) deviceInStore.setMediaServerId(device.getMediaServerId()); - if ((deviceInStore.getSubscribeCycleForCatalog() <=0 && device.getSubscribeCycleForCatalog() > 0) - || deviceInStore.getSubscribeCycleForCatalog() != device.getSubscribeCycleForCatalog()) { - deviceInStore.setSubscribeCycleForCatalog(device.getSubscribeCycleForCatalog()); - // 开启订阅 - deviceService.addCatalogSubscribe(deviceInStore); - } - if (deviceInStore.getSubscribeCycleForCatalog() > 0 && device.getSubscribeCycleForCatalog() <= 0) { - deviceInStore.setSubscribeCycleForCatalog(device.getSubscribeCycleForCatalog()); - // 取消订阅 - deviceService.removeCatalogSubscribe(deviceInStore); + if (device.getSubscribeCycleForCatalog() > 0) { + if (deviceInStore.getSubscribeCycleForCatalog() == 0 || deviceInStore.getSubscribeCycleForCatalog() != device.getSubscribeCycleForCatalog()) { + // 开启订阅 + deviceService.addCatalogSubscribe(deviceInStore); + } + }else if (device.getSubscribeCycleForCatalog() == 0) { + if (deviceInStore.getSubscribeCycleForCatalog() != 0) { + // 取消订阅 + deviceService.removeCatalogSubscribe(deviceInStore); + } } - storager.updateDevice(deviceInStore); - cmder.deviceInfoQuery(deviceInStore); + storager.updateDevice(device); + cmder.deviceInfoQuery(device); } WVPResult result = new WVPResult<>(); result.setCode(0); diff --git a/web_src/src/components/DeviceList.vue b/web_src/src/components/DeviceList.vue index 0dab7465..7922a934 100644 --- a/web_src/src/components/DeviceList.vue +++ b/web_src/src/components/DeviceList.vue @@ -55,14 +55,14 @@ - + @@ -165,15 +165,29 @@ }, deleteDevice: function(row) { - let that = this; - this.$axios({ - method: 'delete', - url:`/api/device/query/devices/${row.deviceId}/delete` - }).then((res)=>{ - this.getDeviceList(); - }).catch((error) =>{ - console.log(error); - }); + let msg = "确定删除此设备?" + if (row.online !== 0) { + msg = "在线设备删除后仍可通过注册再次上线。
如需彻底删除请先将设备离线。
确定删除此设备?" + } + this.$confirm(msg, '提示', { + dangerouslyUseHTMLString : true, + confirmButtonText: '确定', + cancelButtonText: '取消', + center: true, + type: 'warning' + }).then(() => { + this.$axios({ + method: 'delete', + url:`/api/device/query/devices/${row.deviceId}/delete` + }).then((res)=>{ + this.getDeviceList(); + }).catch((error) =>{ + console.log(error); + }); + }).catch(() => { + + }); + }, showChannelList: function(row) { From e4e0cde16ce4f464859d8fa4eff56660b2bd24fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9A=8F=E6=B3=A2?= Date: Mon, 28 Feb 2022 15:31:50 +0000 Subject: [PATCH 10/24] =?UTF-8?q?update=20src/main/java/com/genersoft/iot/?= =?UTF-8?q?vmp/storager/dao/StreamProxyMapper.java.=20=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E6=96=B0=E5=BB=BA=E6=8B=89=E6=B5=81=E4=BB=A3=E7=90=86=E6=97=B6?= =?UTF-8?q?=E4=B8=8D=E4=BF=9D=E5=AD=98=E2=80=9C=E5=90=8D=E7=A7=B0=E2=80=9D?= =?UTF-8?q?=E5=AD=97=E6=AE=B5=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../genersoft/iot/vmp/storager/dao/StreamProxyMapper.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/genersoft/iot/vmp/storager/dao/StreamProxyMapper.java b/src/main/java/com/genersoft/iot/vmp/storager/dao/StreamProxyMapper.java index 63cd425d..2447ad98 100644 --- a/src/main/java/com/genersoft/iot/vmp/storager/dao/StreamProxyMapper.java +++ b/src/main/java/com/genersoft/iot/vmp/storager/dao/StreamProxyMapper.java @@ -10,15 +10,16 @@ import java.util.List; @Repository public interface StreamProxyMapper { - @Insert("INSERT INTO stream_proxy (type, app, stream,mediaServerId, url, src_url, dst_url, " + + @Insert("INSERT INTO stream_proxy (type, name, app, stream,mediaServerId, url, src_url, dst_url, " + "timeout_ms, ffmpeg_cmd_key, rtp_type, enable_hls, enable_mp4, enable, status, enable_remove_none_reader, createTime) VALUES" + - "('${type}','${app}', '${stream}', '${mediaServerId}','${url}', '${src_url}', '${dst_url}', " + + "('${type}','${name}', '${app}', '${stream}', '${mediaServerId}','${url}', '${src_url}', '${dst_url}', " + "'${timeout_ms}', '${ffmpeg_cmd_key}', '${rtp_type}', ${enable_hls}, ${enable_mp4}, ${enable}, ${status}, " + "${enable_remove_none_reader}, '${createTime}' )") int add(StreamProxyItem streamProxyDto); @Update("UPDATE stream_proxy " + "SET type=#{type}, " + + "name=#{name}," + "app=#{app}," + "stream=#{stream}," + "url=#{url}, " + From b1d4123d29fa1b25abb554da38f062d8c4e93170 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9A=8F=E6=B3=A2?= Date: Mon, 28 Feb 2022 15:34:20 +0000 Subject: [PATCH 11/24] =?UTF-8?q?update=20sql/mysql.sql.=20=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E6=8B=89=E6=B5=81=E4=BB=A3=E7=90=86=E7=BC=BA=E5=B0=91?= =?UTF-8?q?=E2=80=9C=E5=90=8D=E7=A7=B0=E2=80=9D=E5=AD=97=E6=AE=B5=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sql/mysql.sql | 1 + 1 file changed, 1 insertion(+) diff --git a/sql/mysql.sql b/sql/mysql.sql index 13e1ccdf..d45f6de5 100644 --- a/sql/mysql.sql +++ b/sql/mysql.sql @@ -415,6 +415,7 @@ DROP TABLE IF EXISTS `stream_proxy`; CREATE TABLE `stream_proxy` ( `id` int NOT NULL AUTO_INCREMENT, `type` varchar(50) COLLATE utf8mb4_general_ci NOT NULL, + `name` varchar(255) COLLATE utf8mb4_general_ci NOT NULL, `app` varchar(255) COLLATE utf8mb4_general_ci NOT NULL, `stream` varchar(255) COLLATE utf8mb4_general_ci NOT NULL, `url` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL, From bb1fada32cdd9c563c3c526d39adbaabbc6a1b2b Mon Sep 17 00:00:00 2001 From: SaltFish <42058801+SaltFish001@users.noreply.github.com> Date: Tue, 1 Mar 2022 14:33:04 +0800 Subject: [PATCH 12/24] Update StreamPushMapper.java --- .../com/genersoft/iot/vmp/storager/dao/StreamPushMapper.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/genersoft/iot/vmp/storager/dao/StreamPushMapper.java b/src/main/java/com/genersoft/iot/vmp/storager/dao/StreamPushMapper.java index 594c319e..909d3a8b 100644 --- a/src/main/java/com/genersoft/iot/vmp/storager/dao/StreamPushMapper.java +++ b/src/main/java/com/genersoft/iot/vmp/storager/dao/StreamPushMapper.java @@ -3,7 +3,7 @@ package com.genersoft.iot.vmp.storager.dao; import com.genersoft.iot.vmp.gb28181.bean.GbStream; import com.genersoft.iot.vmp.media.zlm.dto.StreamPushItem; import org.apache.ibatis.annotations.*; -import org.omg.PortableInterceptor.INACTIVE; +// import org.omg.PortableInterceptor.INACTIVE; import org.springframework.stereotype.Repository; import java.util.Collection; From 4c53b10737ac97861adaacd7cdc7571970860e9f Mon Sep 17 00:00:00 2001 From: 648540858 <648540858@qq.com> Date: Tue, 1 Mar 2022 17:42:22 +0800 Subject: [PATCH 13/24] =?UTF-8?q?=E8=A7=A3=E5=86=B3=E5=AF=B9=E6=8E=A5?= =?UTF-8?q?=E4=B8=AD=E9=81=87=E5=88=B0=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../iot/vmp/conf/SipPlatformRunner.java | 6 +- .../iot/vmp/gb28181/bean/SubscribeInfo.java | 23 ++- .../iot/vmp/gb28181/event/EventPublisher.java | 15 +- .../event/subscribe/catalog/CatalogEvent.java | 6 +- .../subscribe/catalog/CatalogEventLister.java | 12 +- .../transmit/SIPProcessorObserver.java | 6 +- .../cmd/ISIPCommanderForPlatform.java | 2 +- .../cmd/SIPRequestHeaderPlarformProvider.java | 26 +++- .../cmd/SIPRequestHeaderProvider.java | 4 +- .../cmd/impl/SIPCommanderFroPlatform.java | 132 +++++++++--------- .../request/SIPRequestProcessorParent.java | 17 ++- .../request/impl/InviteRequestProcessor.java | 4 +- .../impl/SubscribeRequestProcessor.java | 10 +- .../cmd/CatalogNotifyMessageHandler.java | 19 ++- .../query/cmd/CatalogQueryMessageHandler.java | 20 ++- .../vmp/media/zlm/ZLMHttpHookListener.java | 4 +- .../iot/vmp/media/zlm/dto/MediaItem.java | 12 ++ .../vmp/service/impl/GbStreamServiceImpl.java | 2 +- .../vmp/service/impl/RedisGPSMsgListener.java | 5 + .../service/impl/StreamPushServiceImpl.java | 15 +- .../iot/vmp/storager/dao/DeviceMapper.java | 2 +- .../storager/dao/PlatformChannelMapper.java | 8 +- .../gb28181/platform/PlatformController.java | 32 ++++- 23 files changed, 249 insertions(+), 133 deletions(-) diff --git a/src/main/java/com/genersoft/iot/vmp/conf/SipPlatformRunner.java b/src/main/java/com/genersoft/iot/vmp/conf/SipPlatformRunner.java index 41b68cc0..b69bf68e 100644 --- a/src/main/java/com/genersoft/iot/vmp/conf/SipPlatformRunner.java +++ b/src/main/java/com/genersoft/iot/vmp/conf/SipPlatformRunner.java @@ -3,6 +3,7 @@ package com.genersoft.iot.vmp.conf; import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; import com.genersoft.iot.vmp.gb28181.bean.ParentPlatformCatch; import com.genersoft.iot.vmp.gb28181.event.EventPublisher; +import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommanderForPlatform; import com.genersoft.iot.vmp.media.zlm.ZLMRTPServerFactory; import com.genersoft.iot.vmp.storager.IRedisCatchStorage; import com.genersoft.iot.vmp.storager.IVideoManagerStorager; @@ -30,7 +31,7 @@ public class SipPlatformRunner implements CommandLineRunner { private EventPublisher publisher; @Autowired - private ZLMRTPServerFactory zlmrtpServerFactory; + private ISIPCommanderForPlatform sipCommanderForPlatform; @Override @@ -57,6 +58,9 @@ public class SipPlatformRunner implements CommandLineRunner { parentPlatformCatch.setId(parentPlatform.getServerGBId()); redisCatchStorage.updatePlatformCatchInfo(parentPlatformCatch); + // 取消订阅 + sipCommanderForPlatform.unregister(parentPlatform, null, null); + Thread.sleep(500); // 发送平台未注册消息 publisher.platformNotRegisterEventPublish(parentPlatform.getServerGBId()); } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/SubscribeInfo.java b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/SubscribeInfo.java index 60418f2c..355edcc7 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/SubscribeInfo.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/SubscribeInfo.java @@ -18,13 +18,16 @@ public class SubscribeInfo { this.fromTag = fromHeader.getTag(); ExpiresHeader expiresHeader = (ExpiresHeader)request.getHeader(ExpiresHeader.NAME); this.expires = expiresHeader.getExpires(); - this.event = ((EventHeader)request.getHeader(EventHeader.NAME)).getName(); + EventHeader eventHeader = (EventHeader)request.getHeader(EventHeader.NAME); + this.eventId = eventHeader.getEventId(); + this.eventType = eventHeader.getEventType(); } private String id; private int expires; private String callId; - private String event; + private String eventId; + private String eventType; private String fromTag; private String toTag; @@ -68,11 +71,19 @@ public class SubscribeInfo { this.fromTag = fromTag; } - public String getEvent() { - return event; + public String getEventId() { + return eventId; } - public void setEvent(String event) { - this.event = event; + public void setEventId(String eventId) { + this.eventId = eventId; + } + + public String getEventType() { + return eventType; + } + + public void setEventType(String eventType) { + this.eventType = eventType; } } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/event/EventPublisher.java b/src/main/java/com/genersoft/iot/vmp/gb28181/event/EventPublisher.java index 8c8565be..746467d6 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/event/EventPublisher.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/event/EventPublisher.java @@ -101,14 +101,14 @@ public class EventPublisher { applicationEventPublisher.publishEvent(outEvent); } - @Async + public void catalogEventPublish(String platformId, DeviceChannel deviceChannel, String type) { List deviceChannelList = new ArrayList<>(); deviceChannelList.add(deviceChannel); catalogEventPublish(platformId, deviceChannelList, type); } - @Async + public void catalogEventPublish(String platformId, List deviceChannels, String type) { CatalogEvent outEvent = new CatalogEvent(this); List channels = new ArrayList<>(); @@ -130,8 +130,8 @@ public class EventPublisher { applicationEventPublisher.publishEvent(outEvent); } - @Async - public void catalogEventPublishForStream(String platformId, GbStream[] gbStreams, String type) { + + public void catalogEventPublishForStream(String platformId, List gbStreams, String type) { CatalogEvent outEvent = new CatalogEvent(this); outEvent.setGbStreams(gbStreams); outEvent.setType(type); @@ -139,9 +139,10 @@ public class EventPublisher { applicationEventPublisher.publishEvent(outEvent); } - @Async + public void catalogEventPublishForStream(String platformId, GbStream gbStream, String type) { - GbStream[] gbStreams = {gbStream}; - catalogEventPublishForStream(platformId, gbStreams, type); + List gbStreamList = new ArrayList<>(); + gbStreamList.add(gbStream); + catalogEventPublishForStream(platformId, gbStreamList, type); } } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/event/subscribe/catalog/CatalogEvent.java b/src/main/java/com/genersoft/iot/vmp/gb28181/event/subscribe/catalog/CatalogEvent.java index e343fec7..c035b808 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/event/subscribe/catalog/CatalogEvent.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/event/subscribe/catalog/CatalogEvent.java @@ -20,7 +20,7 @@ public class CatalogEvent extends ApplicationEvent { public static final String UPDATE = "UPDATE"; // 更新 private List deviceChannels; - private GbStream[] gbStreams; + private List gbStreams; private String type; private String platformId; @@ -48,11 +48,11 @@ public class CatalogEvent extends ApplicationEvent { this.platformId = platformId; } - public GbStream[] getGbStreams() { + public List getGbStreams() { return gbStreams; } - public void setGbStreams(GbStream[] gbStreams) { + public void setGbStreams(List gbStreams) { this.gbStreams = gbStreams; } } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/event/subscribe/catalog/CatalogEventLister.java b/src/main/java/com/genersoft/iot/vmp/gb28181/event/subscribe/catalog/CatalogEventLister.java index 3bb28887..fac55cb2 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/event/subscribe/catalog/CatalogEventLister.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/event/subscribe/catalog/CatalogEventLister.java @@ -63,7 +63,11 @@ public class CatalogEventLister implements ApplicationListener { if (parentPlatform != null && !parentPlatform.isStatus())return; String key = VideoManagerConstants.SIP_SUBSCRIBE_PREFIX + userSetup.getServerId() + "_Catalog_" + event.getPlatformId(); subscribe = redisCatchStorage.getSubscribe(key); - if (subscribe == null) return; + + if (subscribe == null) { + logger.debug("发送订阅消息时发现订阅信息已经不存在"); + return; + } }else { // 获取所用订阅 List platforms = redisCatchStorage.getAllSubscribePlatform(); @@ -94,7 +98,7 @@ public class CatalogEventLister implements ApplicationListener { if (event.getDeviceChannels() != null) { deviceChannelList.addAll(event.getDeviceChannels()); } - if (event.getGbStreams() != null && event.getGbStreams().length > 0){ + if (event.getGbStreams() != null && event.getGbStreams().size() > 0){ for (GbStream gbStream : event.getGbStreams()) { DeviceChannel deviceChannelByStream = gbStreamService.getDeviceChannelListByStream(gbStream, gbStream.getCatalogId(), parentPlatform.getDeviceGBId()); deviceChannelList.add(deviceChannelByStream); @@ -134,7 +138,7 @@ public class CatalogEventLister implements ApplicationListener { if (event.getDeviceChannels() != null) { deviceChannelList.addAll(event.getDeviceChannels()); } - if (event.getGbStreams() != null && event.getGbStreams().length > 0){ + if (event.getGbStreams() != null && event.getGbStreams().size() > 0){ for (GbStream gbStream : event.getGbStreams()) { DeviceChannel deviceChannelByStream = gbStreamService.getDeviceChannelListByStream(gbStream, gbStream.getCatalogId(), parentPlatform.getDeviceGBId()); deviceChannelList.add(deviceChannelByStream); @@ -142,7 +146,7 @@ public class CatalogEventLister implements ApplicationListener { } if (deviceChannelList.size() > 0) { logger.info("[Catalog事件: {}]平台:{},影响通道{}个", event.getType(), event.getPlatformId(), deviceChannelList.size()); - sipCommanderFroPlatform.sendNotifyForCatalogAddOrUpdate(event.getType(), parentPlatform, deviceChannelList, subscribe); + sipCommanderFroPlatform.sendNotifyForCatalogAddOrUpdate(event.getType(), parentPlatform, deviceChannelList, subscribe, null); } }else if (parentPlatformMap.keySet().size() > 0) { for (String gbId : parentPlatformMap.keySet()) { diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/SIPProcessorObserver.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/SIPProcessorObserver.java index 71025c00..4732cc1c 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/SIPProcessorObserver.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/SIPProcessorObserver.java @@ -73,6 +73,7 @@ public class SIPProcessorObserver implements ISIPProcessorObserver { @Override @Async public void processRequest(RequestEvent requestEvent) { + logger.debug("\n收到请求:\n{}", requestEvent.getRequest()); String method = requestEvent.getRequest().getMethod(); ISIPRequestProcessor sipRequestProcessor = requestProcessorMap.get(method); if (sipRequestProcessor == null) { @@ -90,9 +91,8 @@ public class SIPProcessorObserver implements ISIPProcessorObserver { @Override @Async public void processResponse(ResponseEvent responseEvent) { - logger.debug(responseEvent.getResponse().toString()); Response response = responseEvent.getResponse(); - logger.debug(responseEvent.getResponse().toString()); + logger.debug("\n收到响应:\n{}", responseEvent.getResponse()); int status = response.getStatusCode(); if (((status >= 200) && (status < 300)) || status == 401) { // Success! CSeqHeader cseqHeader = (CSeqHeader) responseEvent.getResponse().getHeader(CSeqHeader.NAME); @@ -107,8 +107,8 @@ public class SIPProcessorObserver implements ISIPProcessorObserver { SipSubscribe.Event subscribe = sipSubscribe.getOkSubscribe(callIdHeader.getCallId()); if (subscribe != null) { SipSubscribe.EventResult eventResult = new SipSubscribe.EventResult(responseEvent); - subscribe.response(eventResult); sipSubscribe.removeOkSubscribe(callIdHeader.getCallId()); + subscribe.response(eventResult); } } } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommanderForPlatform.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommanderForPlatform.java index 7325889f..feb32fcb 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommanderForPlatform.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommanderForPlatform.java @@ -78,7 +78,7 @@ public interface ISIPCommanderForPlatform { * @param parentPlatform * @param deviceChannels */ - boolean sendNotifyForCatalogAddOrUpdate(String type, ParentPlatform parentPlatform, List deviceChannels, SubscribeInfo subscribeInfo); + boolean sendNotifyForCatalogAddOrUpdate(String type, ParentPlatform parentPlatform, List deviceChannels, SubscribeInfo subscribeInfo, Integer index); /** * 回复catalog事件-删除 diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/SIPRequestHeaderPlarformProvider.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/SIPRequestHeaderPlarformProvider.java index 27125e1e..0addc576 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/SIPRequestHeaderPlarformProvider.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/SIPRequestHeaderPlarformProvider.java @@ -2,6 +2,7 @@ package com.genersoft.iot.vmp.gb28181.transmit.cmd; import com.genersoft.iot.vmp.conf.SipConfig; import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; +import com.genersoft.iot.vmp.gb28181.bean.SubscribeInfo; import com.genersoft.iot.vmp.storager.IRedisCatchStorage; import gov.nist.javax.sip.message.MessageFactoryImpl; import org.springframework.beans.factory.annotation.Autowired; @@ -223,30 +224,31 @@ public class SIPRequestHeaderPlarformProvider { UserAgentHeader userAgentHeader = sipFactory.createHeaderFactory().createUserAgentHeader(agentParam); request.addHeader(userAgentHeader); - ContentTypeHeader contentTypeHeader = sipFactory.createHeaderFactory().createContentTypeHeader("APPLICATION", "MANSCDP+xml"); + ContentTypeHeader contentTypeHeader = sipFactory.createHeaderFactory().createContentTypeHeader("Application", "MANSCDP+xml"); request.setContent(content, contentTypeHeader); return request; } - public Request createNotifyRequest(ParentPlatform parentPlatform, String content, String fromTag, String toTag, CallIdHeader callIdHeader) throws PeerUnavailableException, ParseException, InvalidArgumentException { + public Request createNotifyRequest(ParentPlatform parentPlatform, String content, CallIdHeader callIdHeader, String viaTag, SubscribeInfo subscribeInfo) throws PeerUnavailableException, ParseException, InvalidArgumentException { Request request = null; // sipuri SipURI requestURI = sipFactory.createAddressFactory().createSipURI(parentPlatform.getServerGBId(), parentPlatform.getServerIP()+ ":" + parentPlatform.getServerPort()); // via ArrayList viaHeaders = new ArrayList(); ViaHeader viaHeader = sipFactory.createHeaderFactory().createViaHeader(parentPlatform.getDeviceIp(), Integer.parseInt(parentPlatform.getDevicePort()), - parentPlatform.getTransport(), null); + parentPlatform.getTransport(), viaTag); viaHeader.setRPort(); viaHeaders.add(viaHeader); // from SipURI fromSipURI = sipFactory.createAddressFactory().createSipURI(parentPlatform.getDeviceGBId(), parentPlatform.getDeviceIp() + ":" + parentPlatform.getDevicePort()); Address fromAddress = sipFactory.createAddressFactory().createAddress(fromSipURI); - FromHeader fromHeader = sipFactory.createHeaderFactory().createFromHeader(fromAddress, fromTag); + String tm = Long.toString(System.currentTimeMillis()); + FromHeader fromHeader = sipFactory.createHeaderFactory().createFromHeader(fromAddress, "fromtag" + tm); // to SipURI toSipURI = sipFactory.createAddressFactory().createSipURI(parentPlatform.getServerGBId(), parentPlatform.getServerGBDomain()); Address toAddress = sipFactory.createAddressFactory().createAddress(toSipURI); - ToHeader toHeader = sipFactory.createHeaderFactory().createToHeader(toAddress, toTag); + ToHeader toHeader = sipFactory.createHeaderFactory().createToHeader(toAddress, subscribeInfo.getToTag()); // Forwards MaxForwardsHeader maxForwards = sipFactory.createHeaderFactory().createMaxForwardsHeader(70); @@ -262,7 +264,19 @@ public class SIPRequestHeaderPlarformProvider { UserAgentHeader userAgentHeader = sipFactory.createHeaderFactory().createUserAgentHeader(agentParam); request.addHeader(userAgentHeader); - ContentTypeHeader contentTypeHeader = sipFactory.createHeaderFactory().createContentTypeHeader("APPLICATION", "MANSCDP+xml"); + EventHeader event = sipFactory.createHeaderFactory().createEventHeader(subscribeInfo.getEventType()); + event.setEventId(subscribeInfo.getEventId()); + request.addHeader(event); + + SubscriptionStateHeader active = sipFactory.createHeaderFactory().createSubscriptionStateHeader("active"); + request.setHeader(active); + + String sipAddress = sipConfig.getIp() + ":" + sipConfig.getPort(); + Address concatAddress = sipFactory.createAddressFactory().createAddress(sipFactory.createAddressFactory() + .createSipURI(parentPlatform.getDeviceGBId(), sipAddress)); + request.addHeader(sipFactory.createHeaderFactory().createContactHeader(concatAddress)); + + ContentTypeHeader contentTypeHeader = sipFactory.createHeaderFactory().createContentTypeHeader("Application", "MANSCDP+xml"); request.setContent(content, contentTypeHeader); return request; } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/SIPRequestHeaderProvider.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/SIPRequestHeaderProvider.java index ee237c0c..2da4c466 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/SIPRequestHeaderProvider.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/SIPRequestHeaderProvider.java @@ -67,7 +67,7 @@ public class SIPRequestHeaderProvider { request = sipFactory.createMessageFactory().createRequest(requestURI, Request.MESSAGE, callIdHeader, cSeqHeader, fromHeader, toHeader, viaHeaders, maxForwards); - ContentTypeHeader contentTypeHeader = sipFactory.createHeaderFactory().createContentTypeHeader("APPLICATION", "MANSCDP+xml"); + ContentTypeHeader contentTypeHeader = sipFactory.createHeaderFactory().createContentTypeHeader("Application", "MANSCDP+xml"); request.setContent(content, contentTypeHeader); return request; } @@ -217,7 +217,7 @@ public class SIPRequestHeaderProvider { EventHeader eventHeader = sipFactory.createHeaderFactory().createEventHeader(event); request.addHeader(eventHeader); - ContentTypeHeader contentTypeHeader = sipFactory.createHeaderFactory().createContentTypeHeader("APPLICATION", "MANSCDP+xml"); + ContentTypeHeader contentTypeHeader = sipFactory.createHeaderFactory().createContentTypeHeader("Application", "MANSCDP+xml"); request.setContent(content, contentTypeHeader); return request; } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommanderFroPlatform.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommanderFroPlatform.java index a00da62f..a855c1db 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommanderFroPlatform.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommanderFroPlatform.java @@ -32,21 +32,9 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform { private final Logger logger = LoggerFactory.getLogger(SIPCommanderFroPlatform.class); - // @Autowired - // private SipConfig sipConfig; - - // @Autowired - // private SIPRequestHeaderProvider headerProvider; - @Autowired private SIPRequestHeaderPlarformProvider headerProviderPlarformProvider; - // @Autowired - // private VideoStreamSessionManager streamSession; - - // @Autowired - // private IVideoManagerStorager storager; - @Autowired private IRedisCatchStorage redisCatchStorage; @@ -173,6 +161,7 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform { } private void transmitRequest(ParentPlatform parentPlatform, Request request, SipSubscribe.Event errorEvent , SipSubscribe.Event okEvent) throws SipException { + logger.debug("\n发送消息:\n{}", request); if("TCP".equals(parentPlatform.getTransport())) { tcpSipProvider.sendRequest(request); @@ -223,7 +212,9 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform { catalogXml.append("" + channel.getCivilCode() + "\r\n"); catalogXml.append("
" + channel.getAddress() + "
\r\n"); catalogXml.append("" + channel.getParental() + "\r\n"); - catalogXml.append("" + channel.getParentId() + "\r\n"); + if (channel.getParentId() != null) { + catalogXml.append("" + channel.getParentId() + "\r\n"); + } catalogXml.append("" + channel.getSecrecy() + "\r\n"); catalogXml.append("" + channel.getRegisterWay() + "\r\n"); catalogXml.append("" + (channel.getStatus() == 0?"OFF":"ON") + "\r\n"); @@ -358,7 +349,9 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform { String tm = Long.toString(System.currentTimeMillis()); - Request request = headerProviderPlarformProvider.createNotifyRequest(parentPlatform, deviceStatusXml.toString(), subscribeInfo.getToTag(), subscribeInfo.getFromTag(), callIdHeader); + Request request = headerProviderPlarformProvider.createNotifyRequest(parentPlatform, + deviceStatusXml.toString(),callIdHeader, + "z9hG4bK-" + UUID.randomUUID().toString().replace("-", ""), subscribeInfo); transmitRequest(parentPlatform, request); } catch (SipException | ParseException | InvalidArgumentException e) { @@ -369,63 +362,73 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform { } @Override - public boolean sendNotifyForCatalogAddOrUpdate(String type, ParentPlatform parentPlatform, List deviceChannels, SubscribeInfo subscribeInfo) { + public boolean sendNotifyForCatalogAddOrUpdate(String type, ParentPlatform parentPlatform, List deviceChannels, SubscribeInfo subscribeInfo, Integer index) { if (parentPlatform == null || deviceChannels == null || deviceChannels.size() == 0 || subscribeInfo == null) { return false; } - for (DeviceChannel channel : deviceChannels) { - try { - StringBuffer catalogXml = new StringBuffer(600); - catalogXml.append("\r\n"); - catalogXml.append("\r\n"); - catalogXml.append("Catalog\r\n"); - catalogXml.append("" + (int) ((Math.random() * 9 + 1) * 100000) + "\r\n"); - catalogXml.append("" + deviceChannels.size() + "\r\n"); - catalogXml.append("\r\n"); - catalogXml.append("\r\n"); - catalogXml.append("" + channel.getChannelId() + "\r\n"); - catalogXml.append("" + type + "\r\n"); - catalogXml.append("" + channel.getName() + "\r\n"); - catalogXml.append("" + channel.getManufacture() + "\r\n"); - catalogXml.append("" + channel.getModel() + "\r\n"); - catalogXml.append("" + channel.getOwner() + "\r\n"); - catalogXml.append("" + channel.getCivilCode() + "\r\n"); - catalogXml.append("
" + channel.getAddress() + "
\r\n"); - catalogXml.append("" + channel.getParental() + "\r\n"); - catalogXml.append("" + channel.getParentId() + "\r\n"); - catalogXml.append("" + channel.getSecrecy() + "\r\n"); - catalogXml.append("" + channel.getRegisterWay() + "\r\n"); - catalogXml.append("" + (channel.getStatus() == 0 ? "OFF" : "ON") + "\r\n"); - catalogXml.append("" + channel.getLongitude() + "\r\n"); - catalogXml.append("" + channel.getLatitude() + "\r\n"); - catalogXml.append("" + channel.getIpAddress() + "\r\n"); - catalogXml.append("" + channel.getPort() + "\r\n"); - catalogXml.append("\r\n"); - catalogXml.append("" + channel.getPTZType() + "\r\n"); - catalogXml.append("\r\n"); - catalogXml.append("
\r\n"); - catalogXml.append("
\r\n"); - catalogXml.append("
\r\n"); + if (index == null) { + index = 0; + } - CallIdHeader callIdHeader = parentPlatform.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId() - : udpSipProvider.getNewCallId(); - callIdHeader.setCallId(subscribeInfo.getCallId()); - - String tm = Long.toString(System.currentTimeMillis()); - - Request request = headerProviderPlarformProvider.createNotifyRequest(parentPlatform, catalogXml.toString(), subscribeInfo.getToTag(), subscribeInfo.getFromTag(), callIdHeader); - transmitRequest(parentPlatform, request); - Thread.sleep(10); - } catch (SipException | ParseException | InvalidArgumentException e) { - e.printStackTrace(); - return false; - } catch (InterruptedException e) { - e.printStackTrace(); + try { + if (index == deviceChannels.size() - 1) { + return true; } + Request request = getCatalogNotifyRequest(parentPlatform, deviceChannels.get(index), deviceChannels.size(), type, subscribeInfo); + index += 1; + Integer finalIndex = index; + transmitRequest(parentPlatform, request, null, (eventResult -> { + sendNotifyForCatalogAddOrUpdate(type, parentPlatform, deviceChannels, subscribeInfo, finalIndex); + })); + } catch (SipException | ParseException | InvalidArgumentException e) { + e.printStackTrace(); + return false; } return true; } + private Request getCatalogNotifyRequest(ParentPlatform parentPlatform, DeviceChannel channel, int size, String type, + SubscribeInfo subscribeInfo) throws ParseException, InvalidArgumentException, + PeerUnavailableException { + String catalogXmlContent = getCatalogXmlContent(parentPlatform, channel, size, type); + + CallIdHeader callIdHeader = parentPlatform.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId() + : udpSipProvider.getNewCallId(); + callIdHeader.setCallId(subscribeInfo.getCallId()); + Request request = headerProviderPlarformProvider.createNotifyRequest(parentPlatform, catalogXmlContent, + callIdHeader, "z9hG4bK-" + UUID.randomUUID().toString().replace("-", ""), subscribeInfo); + return request; + } + + private String getCatalogXmlContent(ParentPlatform parentPlatform, DeviceChannel channel, int sumNum, String type) { + StringBuffer catalogXml = new StringBuffer(600); + catalogXml.append("\r\n"); + catalogXml.append("\r\n"); + catalogXml.append("Catalog\r\n"); + catalogXml.append("" + (int) ((Math.random() * 9 + 1) * 100000) + "\r\n"); + catalogXml.append("" + parentPlatform.getDeviceGBId() + "\r\n"); + catalogXml.append("" + sumNum + "\r\n"); + catalogXml.append("\r\n"); + catalogXml.append("\r\n"); + catalogXml.append("" + channel.getChannelId() + "\r\n"); + catalogXml.append("" + channel.getName() + "\r\n"); + catalogXml.append("" + channel.getManufacture() + "\r\n"); + catalogXml.append("" + channel.getModel() + "\r\n"); + catalogXml.append("0\r\n"); + catalogXml.append("CivilCode\r\n"); + catalogXml.append("
" + channel.getAddress() + "
\r\n"); + catalogXml.append("" + channel.getParental() + "\r\n"); + catalogXml.append("" + channel.getParentId() + "\r\n"); + catalogXml.append("" + channel.getSecrecy() + "\r\n"); + catalogXml.append("" + channel.getRegisterWay() + "\r\n"); + catalogXml.append("" + (channel.getStatus() == 0 ? "OFF" : "ON") + "\r\n"); + catalogXml.append("" + type + "\r\n"); + catalogXml.append("
\r\n"); + catalogXml.append("
\r\n"); + catalogXml.append("
\r\n"); + return catalogXml.toString(); + } + @Override public boolean sendNotifyForCatalogOther(String type, ParentPlatform parentPlatform, List deviceChannels, SubscribeInfo subscribeInfo) { if (parentPlatform == null @@ -442,6 +445,7 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform { catalogXml.append("\r\n"); catalogXml.append("Catalog\r\n"); catalogXml.append("" + (int) ((Math.random() * 9 + 1) * 100000) + "\r\n"); + catalogXml.append("" + parentPlatform.getDeviceGBId() + "\r\n"); catalogXml.append("" + deviceChannels.size() + "\r\n"); catalogXml.append("\r\n"); catalogXml.append("\r\n"); @@ -457,7 +461,9 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform { String tm = Long.toString(System.currentTimeMillis()); - Request request = headerProviderPlarformProvider.createNotifyRequest(parentPlatform, catalogXml.toString(), subscribeInfo.getToTag(), subscribeInfo.getFromTag(), callIdHeader); + Request request = headerProviderPlarformProvider.createNotifyRequest(parentPlatform, catalogXml.toString(), + callIdHeader, + "z9hG4bK-" + UUID.randomUUID().toString().replace("-", ""), subscribeInfo); transmitRequest(parentPlatform, request); Thread.sleep(200); } catch (SipException | ParseException | InvalidArgumentException e) { diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/SIPRequestProcessorParent.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/SIPRequestProcessorParent.java index 390565c7..34d45368 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/SIPRequestProcessorParent.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/SIPRequestProcessorParent.java @@ -1,5 +1,6 @@ package com.genersoft.iot.vmp.gb28181.transmit.event.request; +import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; import gov.nist.javax.sip.SipProviderImpl; import gov.nist.javax.sip.SipStackImpl; import gov.nist.javax.sip.message.SIPRequest; @@ -160,13 +161,18 @@ public abstract class SIPRequestProcessorParent { * @throws InvalidArgumentException * @throws ParseException */ - public void responseSdpAck(RequestEvent evt, String sdp) throws SipException, InvalidArgumentException, ParseException { + public void responseSdpAck(RequestEvent evt, String sdp, ParentPlatform platform) throws SipException, InvalidArgumentException, ParseException { Response response = getMessageFactory().createResponse(Response.OK, evt.getRequest()); SipFactory sipFactory = SipFactory.getInstance(); ContentTypeHeader contentTypeHeader = sipFactory.createHeaderFactory().createContentTypeHeader("APPLICATION", "SDP"); response.setContent(sdp, contentTypeHeader); + // 兼容国标中的使用编码@域名作为RequestURI的情况 SipURI sipURI = (SipURI)evt.getRequest().getRequestURI(); + if (sipURI.getPort() == -1) { + sipURI = sipFactory.createAddressFactory().createSipURI(platform.getServerGBId(), platform.getServerIP()+":"+platform.getServerPort()); + } + logger.debug("responseSdpAck SipURI: {}:{}", sipURI.getHost(), sipURI.getPort()); Address concatAddress = sipFactory.createAddressFactory().createAddress( sipFactory.createAddressFactory().createSipURI(sipURI.getUser(), sipURI.getHost()+":"+sipURI.getPort() @@ -183,13 +189,18 @@ public abstract class SIPRequestProcessorParent { * @throws InvalidArgumentException * @throws ParseException */ - public Response responseXmlAck(RequestEvent evt, String xml) throws SipException, InvalidArgumentException, ParseException { + public Response responseXmlAck(RequestEvent evt, String xml, ParentPlatform platform) throws SipException, InvalidArgumentException, ParseException { Response response = getMessageFactory().createResponse(Response.OK, evt.getRequest()); SipFactory sipFactory = SipFactory.getInstance(); - ContentTypeHeader contentTypeHeader = sipFactory.createHeaderFactory().createContentTypeHeader("APPLICATION", "MANSCDP+xml"); + ContentTypeHeader contentTypeHeader = sipFactory.createHeaderFactory().createContentTypeHeader("Application", "MANSCDP+xml"); response.setContent(xml, contentTypeHeader); + // 兼容国标中的使用编码@域名作为RequestURI的情况 SipURI sipURI = (SipURI)evt.getRequest().getRequestURI(); + if (sipURI.getPort() == -1) { + sipURI = sipFactory.createAddressFactory().createSipURI(platform.getServerGBId(), platform.getServerIP()+":"+platform.getServerPort()); + } + logger.debug("responseXmlAck SipURI: {}:{}", sipURI.getHost(), sipURI.getPort()); Address concatAddress = sipFactory.createAddressFactory().createAddress( sipFactory.createAddressFactory().createSipURI(sipURI.getUser(), sipURI.getHost()+":"+sipURI.getPort() diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/InviteRequestProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/InviteRequestProcessor.java index ae2819ca..0c228c7f 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/InviteRequestProcessor.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/InviteRequestProcessor.java @@ -252,7 +252,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements content.append("f=\r\n"); try { - responseSdpAck(evt, content.toString()); + responseSdpAck(evt, content.toString(), platform); } catch (SipException e) { e.printStackTrace(); } catch (InvalidArgumentException e) { @@ -309,7 +309,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements content.append("f=\r\n"); try { - responseSdpAck(evt, content.toString()); + responseSdpAck(evt, content.toString(), platform); } catch (SipException e) { e.printStackTrace(); } catch (InvalidArgumentException e) { diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/SubscribeRequestProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/SubscribeRequestProcessor.java index 8d0bdd2f..a2c6cbfb 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/SubscribeRequestProcessor.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/SubscribeRequestProcessor.java @@ -4,6 +4,7 @@ import com.genersoft.iot.vmp.common.VideoManagerConstants; import com.genersoft.iot.vmp.conf.DynamicTask; import com.genersoft.iot.vmp.conf.UserSetup; import com.genersoft.iot.vmp.gb28181.bean.CmdType; +import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; import com.genersoft.iot.vmp.gb28181.bean.SubscribeInfo; import com.genersoft.iot.vmp.gb28181.task.GPSSubscribeTask; import com.genersoft.iot.vmp.gb28181.transmit.SIPProcessorObserver; @@ -105,9 +106,6 @@ public class SubscribeRequestProcessor extends SIPRequestProcessorParent impleme logger.info("processRequest serverTransactionId is null."); } } - - - } catch (ParseException e) { e.printStackTrace(); } catch (SipException e) { @@ -155,7 +153,8 @@ public class SubscribeRequestProcessor extends SIPRequestProcessorParent impleme try { - Response response = responseXmlAck(evt, resultXml.toString()); + ParentPlatform parentPlatform = storager.queryParentPlatByServerGBId(platformId); + Response response = responseXmlAck(evt, resultXml.toString(), parentPlatform); ToHeader toHeader = (ToHeader)response.getHeader(ToHeader.NAME); subscribeInfo.setToTag(toHeader.getTag()); redisCatchStorage.updateSubscribe(key, subscribeInfo); @@ -196,7 +195,8 @@ public class SubscribeRequestProcessor extends SIPRequestProcessorParent impleme } try { - Response response = responseXmlAck(evt, resultXml.toString()); + ParentPlatform parentPlatform = storager.queryParentPlatByServerGBId(platformId); + Response response = responseXmlAck(evt, resultXml.toString(), parentPlatform); ToHeader toHeader = (ToHeader)response.getHeader(ToHeader.NAME); subscribeInfo.setToTag(toHeader.getTag()); redisCatchStorage.updateSubscribe(key, subscribeInfo); diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/CatalogNotifyMessageHandler.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/CatalogNotifyMessageHandler.java index 4b99f902..21f36b3a 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/CatalogNotifyMessageHandler.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/CatalogNotifyMessageHandler.java @@ -72,6 +72,9 @@ public class CatalogNotifyMessageHandler extends SIPRequestProcessorParent imple List catalogs = storager.queryCatalogInPlatform(parentPlatform.getServerGBId()); if (catalogs.size() > 0) { for (PlatformCatalog catalog : catalogs) { + if (catalog.getParentId().equals(catalog.getPlatformId())) { + catalog.setParentId(parentPlatform.getDeviceGBId()); + } DeviceChannel deviceChannel = new DeviceChannel(); deviceChannel.setChannelId(catalog.getId()); deviceChannel.setName(catalog.getName()); @@ -83,29 +86,35 @@ public class CatalogNotifyMessageHandler extends SIPRequestProcessorParent imple deviceChannel.setParental(1); deviceChannel.setParentId(catalog.getParentId()); deviceChannel.setRegisterWay(1); - deviceChannel.setCivilCode(config.getDomain()); + deviceChannel.setCivilCode(config.getDomain().substring(0, config.getDomain().length() - 2)); deviceChannel.setModel("live"); deviceChannel.setOwner("wvp-pro"); deviceChannel.setSecrecy("0"); cmderFroPlatform.catalogQuery(deviceChannel, parentPlatform, sn, fromHeader.getTag(), size); // 防止发送过快 - Thread.sleep(50); + Thread.sleep(100); } } // 回复级联的通道 if (channelReduces.size() > 0) { for (ChannelReduce channelReduce : channelReduces) { + if (channelReduce.getCatalogId().equals(parentPlatform.getServerGBId())) { + channelReduce.setCatalogId(parentPlatform.getDeviceGBId()); + } DeviceChannel deviceChannel = storager.queryChannel(channelReduce.getDeviceId(), channelReduce.getChannelId()); deviceChannel.setParental(0); deviceChannel.setParentId(channelReduce.getCatalogId()); cmderFroPlatform.catalogQuery(deviceChannel, parentPlatform, sn, fromHeader.getTag(), size); // 防止发送过快 - Thread.sleep(50); + Thread.sleep(100); } } // 回复直播的通道 if (gbStreams.size() > 0) { for (GbStream gbStream : gbStreams) { + if (gbStream.getCatalogId().equals(parentPlatform.getServerGBId())) { + gbStream.setCatalogId(null); + } DeviceChannel deviceChannel = new DeviceChannel(); deviceChannel.setChannelId(gbStream.getGbId()); deviceChannel.setName(gbStream.getName()); @@ -116,14 +125,14 @@ public class CatalogNotifyMessageHandler extends SIPRequestProcessorParent imple deviceChannel.setStatus(gbStream.isStatus()?1:0); deviceChannel.setParentId(gbStream.getCatalogId()); deviceChannel.setRegisterWay(1); - deviceChannel.setCivilCode(config.getDomain()); + deviceChannel.setCivilCode(config.getDomain().substring(0, config.getDomain().length() - 2)); deviceChannel.setModel("live"); deviceChannel.setOwner("wvp-pro"); deviceChannel.setParental(0); deviceChannel.setSecrecy("0"); cmderFroPlatform.catalogQuery(deviceChannel, parentPlatform, sn, fromHeader.getTag(), size); // 防止发送过快 - Thread.sleep(50); + Thread.sleep(100); } } if (size == 0) { diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/query/cmd/CatalogQueryMessageHandler.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/query/cmd/CatalogQueryMessageHandler.java index c5c2961b..925a21e5 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/query/cmd/CatalogQueryMessageHandler.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/query/cmd/CatalogQueryMessageHandler.java @@ -75,6 +75,9 @@ public class CatalogQueryMessageHandler extends SIPRequestProcessorParent implem int size = catalogs.size() + channelReduces.size() + gbStreams.size(); if (catalogs.size() > 0) { for (PlatformCatalog catalog : catalogs) { + if (catalog.getParentId().equals(parentPlatform.getServerGBId())) { + catalog.setParentId(parentPlatform.getDeviceGBId()); + } DeviceChannel deviceChannel = new DeviceChannel(); deviceChannel.setChannelId(catalog.getId()); deviceChannel.setName(catalog.getName()); @@ -86,30 +89,35 @@ public class CatalogQueryMessageHandler extends SIPRequestProcessorParent implem deviceChannel.setParental(1); deviceChannel.setParentId(catalog.getParentId()); deviceChannel.setRegisterWay(1); - deviceChannel.setCivilCode(config.getDomain()); + deviceChannel.setCivilCode(config.getDomain().substring(0, config.getDomain().length() - 2)); deviceChannel.setModel("live"); deviceChannel.setOwner("wvp-pro"); deviceChannel.setSecrecy("0"); cmderFroPlatform.catalogQuery(deviceChannel, parentPlatform, sn, fromHeader.getTag(), size); // 防止发送过快 - Thread.sleep(50); + Thread.sleep(100); } } // 回复级联的通道 if (channelReduces.size() > 0) { for (ChannelReduce channelReduce : channelReduces) { + if (channelReduce.getCatalogId().equals(parentPlatform.getServerGBId())) { + channelReduce.setCatalogId(parentPlatform.getDeviceGBId()); + } DeviceChannel deviceChannel = storager.queryChannel(channelReduce.getDeviceId(), channelReduce.getChannelId()); - // TODO 目前暂时认为这里只用通道没有目录 deviceChannel.setParental(0); deviceChannel.setParentId(channelReduce.getCatalogId()); cmderFroPlatform.catalogQuery(deviceChannel, parentPlatform, sn, fromHeader.getTag(), size); // 防止发送过快 - Thread.sleep(50); + Thread.sleep(100); } } // 回复直播的通道 if (gbStreams.size() > 0) { for (GbStream gbStream : gbStreams) { + if (gbStream.getCatalogId().equals(parentPlatform.getServerGBId())) { + gbStream.setCatalogId(parentPlatform.getDeviceGBId()); + } DeviceChannel deviceChannel = new DeviceChannel(); deviceChannel.setChannelId(gbStream.getGbId()); deviceChannel.setName(gbStream.getName()); @@ -120,7 +128,7 @@ public class CatalogQueryMessageHandler extends SIPRequestProcessorParent implem deviceChannel.setStatus(gbStream.isStatus()?1:0); deviceChannel.setParentId(gbStream.getCatalogId()); deviceChannel.setRegisterWay(1); - deviceChannel.setCivilCode(config.getDomain()); + deviceChannel.setCivilCode(config.getDomain().substring(0, config.getDomain().length() - 2)); deviceChannel.setModel("live"); deviceChannel.setOwner("wvp-pro"); deviceChannel.setParental(0); @@ -128,7 +136,7 @@ public class CatalogQueryMessageHandler extends SIPRequestProcessorParent implem cmderFroPlatform.catalogQuery(deviceChannel, parentPlatform, sn, fromHeader.getTag(), size); // 防止发送过快 - Thread.sleep(50); + Thread.sleep(100); } } if (size == 0) { diff --git a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java index 4f458135..424188d3 100644 --- a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java +++ b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java @@ -358,6 +358,8 @@ public class ZLMHttpHookListener { if (mediaServerItem != null){ if (regist) { StreamPushItem streamPushItem = null; + StreamInfo streamInfoByAppAndStream = mediaService.getStreamInfoByAppAndStream(mediaServerItem, app, streamId, tracks); + item.setStreamInfo(streamInfoByAppAndStream); redisCatchStorage.addStream(mediaServerItem, type, app, streamId, item); if (item.getOriginType() == OriginType.RTSP_PUSH.ordinal() || item.getOriginType() == OriginType.RTMP_PUSH.ordinal() @@ -375,7 +377,7 @@ public class ZLMHttpHookListener { } } if (gbStreams.size() > 0) { - eventPublisher.catalogEventPublishForStream(null, gbStreams.toArray(new GbStream[0]), CatalogEvent.ON); + eventPublisher.catalogEventPublishForStream(null, gbStreams, CatalogEvent.ON); } }else { diff --git a/src/main/java/com/genersoft/iot/vmp/media/zlm/dto/MediaItem.java b/src/main/java/com/genersoft/iot/vmp/media/zlm/dto/MediaItem.java index 4685d1fd..ad158ec7 100644 --- a/src/main/java/com/genersoft/iot/vmp/media/zlm/dto/MediaItem.java +++ b/src/main/java/com/genersoft/iot/vmp/media/zlm/dto/MediaItem.java @@ -1,5 +1,7 @@ package com.genersoft.iot.vmp.media.zlm.dto; +import com.genersoft.iot.vmp.common.StreamInfo; + import java.util.List; public class MediaItem { @@ -281,6 +283,8 @@ public class MediaItem { } } + private StreamInfo streamInfo; + public String getApp() { return app; } @@ -402,4 +406,12 @@ public class MediaItem { public void setMediaServerId(String mediaServerId) { this.mediaServerId = mediaServerId; } + + public StreamInfo getStreamInfo() { + return streamInfo; + } + + public void setStreamInfo(StreamInfo streamInfo) { + this.streamInfo = streamInfo; + } } diff --git a/src/main/java/com/genersoft/iot/vmp/service/impl/GbStreamServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/service/impl/GbStreamServiceImpl.java index 2b4515f7..32a1305d 100644 --- a/src/main/java/com/genersoft/iot/vmp/service/impl/GbStreamServiceImpl.java +++ b/src/main/java/com/genersoft/iot/vmp/service/impl/GbStreamServiceImpl.java @@ -103,7 +103,7 @@ public class GbStreamServiceImpl implements IGbStreamService { deviceChannel.setStatus(gbStream.isStatus()?1:0); deviceChannel.setParentId(catalogId ==null?gbStream.getCatalogId():catalogId); deviceChannel.setRegisterWay(1); - deviceChannel.setCivilCode(sipConfig.getDomain()); + deviceChannel.setCivilCode(sipConfig.getDomain().substring(0, sipConfig.getDomain().length() - 2)); deviceChannel.setModel("live"); deviceChannel.setOwner("wvp-pro"); deviceChannel.setParental(0); diff --git a/src/main/java/com/genersoft/iot/vmp/service/impl/RedisGPSMsgListener.java b/src/main/java/com/genersoft/iot/vmp/service/impl/RedisGPSMsgListener.java index e3bfcde7..92bcd5e8 100644 --- a/src/main/java/com/genersoft/iot/vmp/service/impl/RedisGPSMsgListener.java +++ b/src/main/java/com/genersoft/iot/vmp/service/impl/RedisGPSMsgListener.java @@ -3,6 +3,8 @@ package com.genersoft.iot.vmp.service.impl; import com.alibaba.fastjson.JSON; import com.genersoft.iot.vmp.service.bean.GPSMsgInfo; import com.genersoft.iot.vmp.storager.IRedisCatchStorage; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.connection.Message; import org.springframework.data.redis.connection.MessageListener; @@ -11,11 +13,14 @@ import org.springframework.stereotype.Component; @Component public class RedisGPSMsgListener implements MessageListener { + private final static Logger logger = LoggerFactory.getLogger(RedisGPSMsgListener.class); + @Autowired private IRedisCatchStorage redisCatchStorage; @Override public void onMessage(Message message, byte[] bytes) { + logger.debug("收到来自REDIS的GPS通知: {}", new String(message.getBody())); GPSMsgInfo gpsMsgInfo = JSON.parseObject(message.getBody(), GPSMsgInfo.class); redisCatchStorage.updateGpsMsgInfo(gpsMsgInfo); } diff --git a/src/main/java/com/genersoft/iot/vmp/service/impl/StreamPushServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/service/impl/StreamPushServiceImpl.java index 8a015d9d..a13dc29d 100644 --- a/src/main/java/com/genersoft/iot/vmp/service/impl/StreamPushServiceImpl.java +++ b/src/main/java/com/genersoft/iot/vmp/service/impl/StreamPushServiceImpl.java @@ -377,7 +377,7 @@ public class StreamPushServiceImpl implements IStreamPushService { if (streamPushItemsForPlatform.size() > 0) { List streamPushItemListFroPlatform = new ArrayList<>(); - Map> platformForEvent = new HashMap<>(); + Map> platformForEvent = new HashMap<>(); // 遍历存储结果,查找app+Stream->platformId+catalogId的对应关系,然后执行批量写入 for (StreamPushItem streamPushItem : streamPushItemsForPlatform) { List platFormInfoList = streamPushItemsForAll.get(streamPushItem.getApp() + streamPushItem.getStream()); @@ -390,16 +390,17 @@ public class StreamPushServiceImpl implements IStreamPushService { // 数组 platFormInfoArray 0 为平台ID。 1为目录ID streamPushItemForPlatform.setPlatformId(platFormInfoArray[0]); - List streamPushItemsInPlatform = platformForEvent.get(streamPushItem.getPlatformId()); - if (streamPushItemsInPlatform == null) { - streamPushItemsInPlatform = new ArrayList<>(); - platformForEvent.put(platFormInfoArray[0], streamPushItemsInPlatform); + List gbStreamList = platformForEvent.get(streamPushItem.getPlatformId()); + if (gbStreamList == null) { + gbStreamList = new ArrayList<>(); + platformForEvent.put(platFormInfoArray[0], gbStreamList); } // 为发送通知整理数据 + streamPushItemForPlatform.setName(streamPushItem.getName()); streamPushItemForPlatform.setApp(streamPushItem.getApp()); streamPushItemForPlatform.setStream(streamPushItem.getStream()); streamPushItemForPlatform.setGbId(streamPushItem.getGbId()); - streamPushItemsInPlatform.add(streamPushItemForPlatform); + gbStreamList.add(streamPushItemForPlatform); } if (platFormInfoArray.length > 1) { streamPushItemForPlatform.setCatalogId(platFormInfoArray[1]); @@ -416,7 +417,7 @@ public class StreamPushServiceImpl implements IStreamPushService { // 发送通知 for (String platformId : platformForEvent.keySet()) { eventPublisher.catalogEventPublishForStream( - platformId, platformForEvent.get(platformId).toArray(new GbStream[0]), CatalogEvent.ADD); + platformId, platformForEvent.get(platformId), CatalogEvent.ADD); } } } diff --git a/src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceMapper.java b/src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceMapper.java index ed2d8c89..28f79f18 100644 --- a/src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceMapper.java +++ b/src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceMapper.java @@ -74,7 +74,7 @@ public interface DeviceMapper { ", keepaliveTime='${keepaliveTime}'" + ", expires=${expires}" + ", charset='${charset}'" + - ", subscribeCycleForCatalog=#{subscribeCycleForCatalog}" + + ", subscribeCycleForCatalog=${subscribeCycleForCatalog}" + "WHERE deviceId='${deviceId}'"+ " "}) int update(Device device); diff --git a/src/main/java/com/genersoft/iot/vmp/storager/dao/PlatformChannelMapper.java b/src/main/java/com/genersoft/iot/vmp/storager/dao/PlatformChannelMapper.java index c3c11a88..190a7b18 100644 --- a/src/main/java/com/genersoft/iot/vmp/storager/dao/PlatformChannelMapper.java +++ b/src/main/java/com/genersoft/iot/vmp/storager/dao/PlatformChannelMapper.java @@ -58,11 +58,15 @@ public interface PlatformChannelMapper { DeviceChannel queryChannelInParentPlatform(String platformId, String channelId); @Select("select dc.channelId as id, dc.name as name, pgc.platformId as platformId, pgc.catalogId as parentId, 0 as childrenCount, 1 as type " + - "from device_channel dc left join platform_gb_channel pgc on dc.deviceId = pgc.deviceId and dc.channelId = pgc.channelId " + + "from device_channel dc left join platform_gb_channel pgc on dc.id = pgc.deviceChannelId" + "where pgc.platformId=#{platformId} and pgc.catalogId=#{catalogId}") List queryChannelInParentPlatformAndCatalog(String platformId, String catalogId); - @Select("SELECT * FROM device WHERE deviceId = (SELECT deviceId FROM platform_gb_channel WHERE platformId='${platformId}' AND channelId='${channelId}')") + @Select("select d.*\n" + + "from platform_gb_channel pgc\n" + + " left join device_channel dc on dc.id = pgc.deviceChannelId\n" + + " left join device d on dc.deviceId = d.deviceId\n" + + "where dc.channelId = #{channelId} and pgc.platformId=#{platformId}") Device queryVideoDeviceByPlatformIdAndChannelId(String platformId, String channelId); @Delete("