diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/controller/AlarmController.java b/src/main/java/com/genersoft/iot/vmp/gb28181/controller/AlarmController.java
index a08c7c710..de75437a6 100755
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/controller/AlarmController.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/controller/AlarmController.java
@@ -99,7 +99,7 @@ public class AlarmController {
     @Operation(summary = "测试向上级/设备发送模拟报警通知", security = @SecurityRequirement(name = JwtUtils.HEADER))
     @Parameter(name = "deviceId", description = "设备国标编号")
     public void delete(@RequestParam String deviceId) {
-        Device device = deviceService.getDevice(deviceId);
+        Device device = deviceService.getDeviceByDeviceId(deviceId);
         Platform platform = storage.queryParentPlatByServerGBId(deviceId);
         DeviceAlarm deviceAlarm = new DeviceAlarm();
         deviceAlarm.setChannelId(deviceId);
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/controller/DeviceConfig.java b/src/main/java/com/genersoft/iot/vmp/gb28181/controller/DeviceConfig.java
index ccdeb0044..d485be4a0 100755
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/controller/DeviceConfig.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/controller/DeviceConfig.java
@@ -77,7 +77,7 @@ public class DeviceConfig {
         if (log.isDebugEnabled()) {
 			log.debug("报警复位API调用");
 		}
-		Device device = deviceService.getDevice(deviceId);
+		Device device = deviceService.getDeviceByDeviceId(deviceId);
 		String uuid = UUID.randomUUID().toString();
 		String key = DeferredResultHolder.CALLBACK_CMD_DEVICECONFIG + deviceId + channelId;
 		try {
@@ -130,7 +130,7 @@ public class DeviceConfig {
 		}
 		String key = DeferredResultHolder.CALLBACK_CMD_CONFIGDOWNLOAD + (ObjectUtils.isEmpty(channelId) ? deviceId : channelId);
 		String uuid = UUID.randomUUID().toString();
-		Device device = deviceService.getDevice(deviceId);
+		Device device = deviceService.getDeviceByDeviceId(deviceId);
 		try {
 			cmder.deviceConfigQuery(device, channelId, configType, event -> {
 				RequestMessage msg = new RequestMessage();
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/controller/DeviceControl.java b/src/main/java/com/genersoft/iot/vmp/gb28181/controller/DeviceControl.java
index ed503b66c..06d5fa85f 100755
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/controller/DeviceControl.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/controller/DeviceControl.java
@@ -59,7 +59,7 @@ public class DeviceControl {
         if (log.isDebugEnabled()) {
             log.debug("设备远程启动API调用");
         }
-        Device device = deviceService.getDevice(deviceId);
+        Device device = deviceService.getDeviceByDeviceId(deviceId);
 		try {
 			cmder.teleBootCmd(device);
 		} catch (InvalidArgumentException | SipException | ParseException e) {
@@ -85,7 +85,7 @@ public class DeviceControl {
         if (log.isDebugEnabled()) {
             log.debug("开始/停止录像API调用");
         }
-        Device device = deviceService.getDevice(deviceId);
+        Device device = deviceService.getDeviceByDeviceId(deviceId);
 		String uuid = UUID.randomUUID().toString();
 		String key = DeferredResultHolder.CALLBACK_CMD_DEVICECONTROL +  deviceId + channelId;
 		DeferredResult<ResponseEntity<String>> result = new DeferredResult<ResponseEntity<String>>(3 * 1000L);
@@ -132,7 +132,7 @@ public class DeviceControl {
 		if (log.isDebugEnabled()) {
 			log.debug("布防/撤防API调用");
 		}
-		Device device = deviceService.getDevice(deviceId);
+		Device device = deviceService.getDeviceByDeviceId(deviceId);
 		String key = DeferredResultHolder.CALLBACK_CMD_DEVICECONTROL + deviceId + deviceId;
 		String uuid =UUID.randomUUID().toString();
 		try {
@@ -181,7 +181,7 @@ public class DeviceControl {
 		if (log.isDebugEnabled()) {
 			log.debug("报警复位API调用");
 		}
-		Device device = deviceService.getDevice(deviceId);
+		Device device = deviceService.getDeviceByDeviceId(deviceId);
 		String uuid = UUID.randomUUID().toString();
 		String key = DeferredResultHolder.CALLBACK_CMD_DEVICECONTROL + deviceId + channelId;
 		try {
@@ -225,7 +225,7 @@ public class DeviceControl {
 		if (log.isDebugEnabled()) {
 			log.debug("强制关键帧API调用");
 		}
-		Device device = deviceService.getDevice(deviceId);
+		Device device = deviceService.getDeviceByDeviceId(deviceId);
 		try {
 			cmder.iFrameCmd(device, channelId);
 		} catch (InvalidArgumentException | SipException | ParseException e) {
@@ -263,7 +263,7 @@ public class DeviceControl {
 		}
 		String key = DeferredResultHolder.CALLBACK_CMD_DEVICECONTROL + (ObjectUtils.isEmpty(channelId) ? deviceId : channelId);
 		String uuid = UUID.randomUUID().toString();
-		Device device = deviceService.getDevice(deviceId);
+		Device device = deviceService.getDeviceByDeviceId(deviceId);
 		try {
 			cmder.homePositionCmd(device, channelId, enabled, resetTime, presetIndex, event -> {
 				RequestMessage msg = new RequestMessage();
@@ -326,7 +326,7 @@ public class DeviceControl {
 		if (log.isDebugEnabled()) {
 			log.debug(String.format("设备拉框放大 API调用,deviceId:%s ,channelId:%s ,length:%d ,width:%d ,midpointx:%d ,midpointy:%d ,lengthx:%d ,lengthy:%d",deviceId, channelId, length, width, midpointx, midpointy,lengthx, lengthy));
 		}
-		Device device = deviceService.getDevice(deviceId);
+		Device device = deviceService.getDeviceByDeviceId(deviceId);
 		StringBuffer cmdXml = new StringBuffer(200);
 		cmdXml.append("<DragZoomIn>\r\n");
 		cmdXml.append("<Length>" + length+ "</Length>\r\n");
@@ -378,7 +378,7 @@ public class DeviceControl {
 		if (log.isDebugEnabled()) {
 			log.debug(String.format("设备拉框缩小 API调用,deviceId:%s ,channelId:%s ,length:%d ,width:%d ,midpointx:%d ,midpointy:%d ,lengthx:%d ,lengthy:%d",deviceId, channelId, length, width, midpointx, midpointy,lengthx, lengthy));
 		}
-		Device device = deviceService.getDevice(deviceId);
+		Device device = deviceService.getDeviceByDeviceId(deviceId);
 		StringBuffer cmdXml = new StringBuffer(200);
 		cmdXml.append("<DragZoomOut>\r\n");
 		cmdXml.append("<Length>" + length+ "</Length>\r\n");
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/controller/DeviceQuery.java b/src/main/java/com/genersoft/iot/vmp/gb28181/controller/DeviceQuery.java
index 712f6182f..9c92ca5de 100755
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/controller/DeviceQuery.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/controller/DeviceQuery.java
@@ -91,7 +91,7 @@ public class DeviceQuery {
 	@GetMapping("/devices/{deviceId}")
 	public Device devices(@PathVariable String deviceId){
 		
-		return deviceService.getDevice(deviceId);
+		return deviceService.getDeviceByDeviceId(deviceId);
 	}
 
 	/**
@@ -148,7 +148,7 @@ public class DeviceQuery {
 		if (log.isDebugEnabled()) {
 			log.debug("设备通道信息同步API调用,deviceId:" + deviceId);
 		}
-		Device device = deviceService.getDevice(deviceId);
+		Device device = deviceService.getDeviceByDeviceId(deviceId);
 		boolean status = deviceService.isSyncRunning(deviceId);
 		// 已存在则返回进度
 		if (status) {
@@ -273,7 +273,7 @@ public class DeviceQuery {
 			"UDP(udp传输),TCP-ACTIVE(tcp主动模式,暂不支持),TCP-PASSIVE(tcp被动模式)", required = true)
 	@PostMapping("/transport/{deviceId}/{streamMode}")
 	public void updateTransport(@PathVariable String deviceId, @PathVariable String streamMode){
-		Device device = deviceService.getDevice(deviceId);
+		Device device = deviceService.getDeviceByDeviceId(deviceId);
 		device.setStreamMode(streamMode);
 		deviceService.updateCustomDevice(device);
 	}
@@ -330,7 +330,7 @@ public class DeviceQuery {
 		if (log.isDebugEnabled()) {
 			log.debug("设备状态查询API调用");
 		}
-		Device device = deviceService.getDevice(deviceId);
+		Device device = deviceService.getDeviceByDeviceId(deviceId);
 		String uuid = UUID.randomUUID().toString();
 		String key = DeferredResultHolder.CALLBACK_CMD_DEVICESTATUS + deviceId;
 		DeferredResult<ResponseEntity<String>> result = new DeferredResult<ResponseEntity<String>>(2*1000L);
@@ -393,7 +393,7 @@ public class DeviceQuery {
 		if (log.isDebugEnabled()) {
 			log.debug("设备报警查询API调用");
 		}
-		Device device = deviceService.getDevice(deviceId);
+		Device device = deviceService.getDeviceByDeviceId(deviceId);
 		String key = DeferredResultHolder.CALLBACK_CMD_ALARM + deviceId;
 		String uuid = UUID.randomUUID().toString();
 		try {
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/controller/GBRecordController.java b/src/main/java/com/genersoft/iot/vmp/gb28181/controller/GBRecordController.java
index b289b7424..254404871 100755
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/controller/GBRecordController.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/controller/GBRecordController.java
@@ -83,7 +83,7 @@ public class GBRecordController {
 			throw new ControllerException(ErrorCode.ERROR100.getCode(), "endTime格式为" + DateUtil.PATTERN);
 		}
 
-		Device device = deviceService.getDevice(deviceId);
+		Device device = deviceService.getDeviceByDeviceId(deviceId);
 		// 指定超时时间 1分钟30秒
 		String uuid = UUID.randomUUID().toString();
 		int sn  =  (int)((Math.random()*9+1)*100000);
@@ -182,7 +182,7 @@ public class GBRecordController {
 			throw new ControllerException(ErrorCode.ERROR400);
 		}
 
-		Device device = deviceService.getDevice(deviceId);
+		Device device = deviceService.getDeviceByDeviceId(deviceId);
 		if (device == null) {
 			throw new ControllerException(ErrorCode.ERROR400.getCode(), "设备:" + deviceId + "未找到");
 		}
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/controller/MobilePositionController.java b/src/main/java/com/genersoft/iot/vmp/gb28181/controller/MobilePositionController.java
index 79c38d242..5c10b1192 100755
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/controller/MobilePositionController.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/controller/MobilePositionController.java
@@ -99,7 +99,7 @@ public class MobilePositionController {
     @Parameter(name = "deviceId", description = "设备国标编号", required = true)
     @GetMapping("/realtime/{deviceId}")
     public DeferredResult<MobilePosition> realTimePosition(@PathVariable String deviceId) {
-        Device device = deviceService.getDevice(deviceId);
+        Device device = deviceService.getDeviceByDeviceId(deviceId);
         String uuid = UUID.randomUUID().toString();
         String key = DeferredResultHolder.CALLBACK_CMD_MOBILE_POSITION + deviceId;
         try {
@@ -147,7 +147,7 @@ public class MobilePositionController {
         if (StringUtil.isEmpty(interval)) {
             interval = "5";
         }
-        Device device = deviceService.getDevice(deviceId);
+        Device device = deviceService.getDeviceByDeviceId(deviceId);
         device.setSubscribeCycleForMobilePosition(Integer.parseInt(expires));
         device.setMobilePositionSubmissionInterval(Integer.parseInt(interval));
         deviceService.updateCustomDevice(device);
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/controller/PlayController.java b/src/main/java/com/genersoft/iot/vmp/gb28181/controller/PlayController.java
index 96e68cf45..e4a12334f 100755
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/controller/PlayController.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/controller/PlayController.java
@@ -94,7 +94,7 @@ public class PlayController {
 		Assert.notNull(deviceId, "设备国标编号不可为NULL");
 		Assert.notNull(channelId, "通道国标编号不可为NULL");
 		// 获取可用的zlm
-		Device device = deviceService.getDevice(deviceId);
+		Device device = deviceService.getDeviceByDeviceId(deviceId);
 		MediaServer newMediaServerItem = playService.getNewMediaServerItem(device);
 
 		RequestMessage requestMessage = new RequestMessage();
@@ -169,7 +169,7 @@ public class PlayController {
 			throw new ControllerException(ErrorCode.ERROR400);
 		}
 
-		Device device = deviceService.getDevice(deviceId);
+		Device device = deviceService.getDeviceByDeviceId(deviceId);
 		if (device == null) {
 			throw new ControllerException(ErrorCode.ERROR100.getCode(), "设备[" + deviceId + "]不存在");
 		}
@@ -212,7 +212,7 @@ public class PlayController {
 		if (log.isDebugEnabled()) {
 			log.debug("语音广播API调用");
 		}
-		Device device = deviceService.getDevice(deviceId);
+		Device device = deviceService.getDeviceByDeviceId(deviceId);
 		if (device == null) {
 			throw new ControllerException(ErrorCode.ERROR400.getCode(), "未找到设备: " + deviceId);
 		}
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/controller/PlaybackController.java b/src/main/java/com/genersoft/iot/vmp/gb28181/controller/PlaybackController.java
index 0d293b5fb..756d96327 100755
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/controller/PlaybackController.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/controller/PlaybackController.java
@@ -140,7 +140,7 @@ public class PlaybackController {
 		if (ObjectUtils.isEmpty(deviceId) || ObjectUtils.isEmpty(channelId) || ObjectUtils.isEmpty(stream)) {
 			throw new ControllerException(ErrorCode.ERROR400);
 		}
-		Device device = deviceService.getDevice(deviceId);
+		Device device = deviceService.getDeviceByDeviceId(deviceId);
 		if (device == null) {
 			throw new ControllerException(ErrorCode.ERROR400.getCode(), "设备:" + deviceId + " 未找到");
 		}
@@ -195,7 +195,7 @@ public class PlaybackController {
 			log.warn("streamId不存在!");
 			throw new ControllerException(ErrorCode.ERROR400.getCode(), "streamId不存在");
 		}
-		Device device = deviceService.getDevice(inviteInfo.getDeviceId());
+		Device device = deviceService.getDeviceByDeviceId(inviteInfo.getDeviceId());
 		try {
 			cmder.playSeekCmd(device, inviteInfo.getStreamInfo(), seekTime);
 		} catch (InvalidArgumentException | ParseException | SipException e) {
@@ -219,7 +219,7 @@ public class PlaybackController {
 			log.warn("不支持的speed: " + speed);
 			throw new ControllerException(ErrorCode.ERROR100.getCode(), "不支持的speed(0.25 0.5 1、2、4)");
 		}
-		Device device = deviceService.getDevice(inviteInfo.getDeviceId());
+		Device device = deviceService.getDeviceByDeviceId(inviteInfo.getDeviceId());
 		try {
 			cmder.playSpeedCmd(device, inviteInfo.getStreamInfo(), speed);
 		} catch (InvalidArgumentException | ParseException | SipException e) {
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/controller/PtzController.java b/src/main/java/com/genersoft/iot/vmp/gb28181/controller/PtzController.java
index 1d5043008..e83eae33e 100755
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/controller/PtzController.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/controller/PtzController.java
@@ -66,7 +66,7 @@ public class PtzController {
 		if (log.isDebugEnabled()) {
 			log.debug(String.format("设备云台控制 API调用,deviceId:%s ,channelId:%s ,command:%s ,horizonSpeed:%d ,verticalSpeed:%d ,zoomSpeed:%d",deviceId, channelId, command, horizonSpeed, verticalSpeed, zoomSpeed));
 		}
-		Device device = deviceService.getDevice(deviceId);
+		Device device = deviceService.getDeviceByDeviceId(deviceId);
 		int cmdCode = 0;
 		switch (command){
 			case "left":
@@ -129,7 +129,7 @@ public class PtzController {
 		if (log.isDebugEnabled()) {
 			log.debug(String.format("设备云台控制 API调用,deviceId:%s ,channelId:%s ,cmdCode:%d parameter1:%d parameter2:%d",deviceId, channelId, cmdCode, parameter1, parameter2));
 		}
-		Device device = deviceService.getDevice(deviceId);
+		Device device = deviceService.getDeviceByDeviceId(deviceId);
 
 		try {
 			cmder.frontEndCmd(device, channelId, cmdCode, parameter1, parameter2, combindCode2);
@@ -148,7 +148,7 @@ public class PtzController {
 		if (log.isDebugEnabled()) {
 			log.debug("设备预置位查询API调用");
 		}
-		Device device = deviceService.getDevice(deviceId);
+		Device device = deviceService.getDeviceByDeviceId(deviceId);
 		String uuid =  UUID.randomUUID().toString();
 		String key =  DeferredResultHolder.CALLBACK_CMD_PRESETQUERY + (ObjectUtils.isEmpty(channelId) ? deviceId : channelId);
 		DeferredResult<String> result = new DeferredResult<String> (3 * 1000L);
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/dao/CommonGBChannelMapper.java b/src/main/java/com/genersoft/iot/vmp/gb28181/dao/CommonGBChannelMapper.java
index 44389f345..35df9b7ab 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/dao/CommonGBChannelMapper.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/dao/CommonGBChannelMapper.java
@@ -456,4 +456,100 @@ public interface CommonGBChannelMapper {
             "</foreach>" +
             "</script>"})
     int batchUpdate(List<CommonGBChannel> commonGBChannels);
+
+    @Select("select\n" +
+            "    wdc.id as gb_id,\n" +
+            "    wdc.device_db_id as gb_device_db_id,\n" +
+            "    wdc.stream_push_id,\n" +
+            "    wdc.stream_proxy_id,\n" +
+            "    wdc.create_time,\n" +
+            "    wdc.update_time,\n" +
+            "    coalesce(wpgc.device_id, wdc.gb_device_id, wdc.device_id) as gb_device_id,\n" +
+            "    coalesce(wpgc.name, wdc.gb_name, wdc.name) as gb_name,\n" +
+            "    coalesce(wdc.gb_manufacturer, wdc.manufacturer) as gb_manufacturer,\n" +
+            "    coalesce(wdc.gb_model, wdc.model) as gb_model,\n" +
+            "    coalesce(wdc.gb_owner, wdc.owner) as gb_owner,\n" +
+            "    coalesce(wpgc.civil_code, wdc.gb_civil_code, wdc.civil_code),\n" +
+            "    coalesce(wdc.gb_block, wdc.block) as gb_block,\n" +
+            "    coalesce(wdc.gb_address, wdc.address) as gb_address,\n" +
+            "    coalesce(wdc.gb_parental, wdc.parental) as gb_parental,\n" +
+            "    coalesce(wpgc.parent_id, wdc.gb_parent_id, wdc.parent_id) as gb_parent_id,\n" +
+            "    coalesce(wdc.gb_safety_way, wdc.safety_way) as gb_safety_way,\n" +
+            "    coalesce(wdc.gb_register_way, wdc.register_way) as gb_register_way,\n" +
+            "    coalesce(wdc.gb_cert_num, wdc.cert_num) as gb_cert_num,\n" +
+            "    coalesce(wdc.gb_certifiable, wdc.certifiable) as gb_certifiable,\n" +
+            "    coalesce(wdc.gb_err_code, wdc.err_code) as gb_err_code,\n" +
+            "    coalesce(wdc.gb_end_time, wdc.end_time) as gb_end_time,\n" +
+            "    coalesce(wdc.gb_secrecy, wdc.secrecy) as gb_secrecy,\n" +
+            "    coalesce(wdc.gb_ip_address, wdc.ip_address) as gb_ip_address,\n" +
+            "    coalesce(wdc.gb_port, wdc.port) as gb_port,\n" +
+            "    coalesce(wdc.gb_password, wdc.password) as gb_password,\n" +
+            "    coalesce(wdc.gb_status, wdc.status) as gb_status,\n" +
+            "    coalesce(wdc.gb_longitude, wdc.longitude) as gb_longitude,\n" +
+            "    coalesce(wdc.gb_latitude, wdc.latitude) as gb_latitude,\n" +
+            "    coalesce(wdc.gb_ptz_type, wdc.ptz_type) as gb_ptz_type,\n" +
+            "    coalesce(wdc.gb_position_type, wdc.position_type) as gb_position_type,\n" +
+            "    coalesce(wdc.gb_room_type, wdc.room_type) as gb_room_type,\n" +
+            "    coalesce(wdc.gb_use_type, wdc.use_type) as gb_use_type,\n" +
+            "    coalesce(wdc.gb_supply_light_type, wdc.supply_light_type) as gb_supply_light_type,\n" +
+            "    coalesce(wdc.gb_direction_type, wdc.direction_type) as gb_direction_type,\n" +
+            "    coalesce(wdc.gb_resolution, wdc.resolution) as gb_resolution,\n" +
+            "    coalesce(wpgc.business_group_id, wdc.gb_business_group_id, wdc.business_group_id) as gb_business_group_id,\n" +
+            "    coalesce(wdc.gb_download_speed, wdc.download_speed) as gb_download_speed,\n" +
+            "    coalesce(wdc.gb_svc_space_support_mod, wdc.svc_space_support_mod) as gb_svc_space_support_mod,\n" +
+            "    coalesce(wdc.gb_svc_time_support_mode, wdc.svc_time_support_mode) as gb_svc_time_support_mode\n" +
+            " from wvp_device_channel wdc" +
+            " left jon wvp_platform_gb_channel wpgc on wdc.id = wpgc.device_channel_id" +
+            " where wpgc.platform_id = #{platformId}"
+
+    )
+    List<CommonGBChannel> queryWithPlatform(@Param("platformId") Integer platformId);
+
+    @Select("select\n" +
+            "    wdc.id as gb_id,\n" +
+            "    wdc.device_db_id as gb_device_db_id,\n" +
+            "    wdc.stream_push_id,\n" +
+            "    wdc.stream_proxy_id,\n" +
+            "    wdc.create_time,\n" +
+            "    wdc.update_time,\n" +
+            "    coalesce(wpgc.device_id, wdc.gb_device_id, wdc.device_id) as gb_device_id,\n" +
+            "    coalesce(wpgc.name, wdc.gb_name, wdc.name) as gb_name,\n" +
+            "    coalesce(wdc.gb_manufacturer, wdc.manufacturer) as gb_manufacturer,\n" +
+            "    coalesce(wdc.gb_model, wdc.model) as gb_model,\n" +
+            "    coalesce(wdc.gb_owner, wdc.owner) as gb_owner,\n" +
+            "    coalesce(wpgc.civil_code, wdc.gb_civil_code, wdc.civil_code),\n" +
+            "    coalesce(wdc.gb_block, wdc.block) as gb_block,\n" +
+            "    coalesce(wdc.gb_address, wdc.address) as gb_address,\n" +
+            "    coalesce(wdc.gb_parental, wdc.parental) as gb_parental,\n" +
+            "    coalesce(wpgc.parent_id, wdc.gb_parent_id, wdc.parent_id) as gb_parent_id,\n" +
+            "    coalesce(wdc.gb_safety_way, wdc.safety_way) as gb_safety_way,\n" +
+            "    coalesce(wdc.gb_register_way, wdc.register_way) as gb_register_way,\n" +
+            "    coalesce(wdc.gb_cert_num, wdc.cert_num) as gb_cert_num,\n" +
+            "    coalesce(wdc.gb_certifiable, wdc.certifiable) as gb_certifiable,\n" +
+            "    coalesce(wdc.gb_err_code, wdc.err_code) as gb_err_code,\n" +
+            "    coalesce(wdc.gb_end_time, wdc.end_time) as gb_end_time,\n" +
+            "    coalesce(wdc.gb_secrecy, wdc.secrecy) as gb_secrecy,\n" +
+            "    coalesce(wdc.gb_ip_address, wdc.ip_address) as gb_ip_address,\n" +
+            "    coalesce(wdc.gb_port, wdc.port) as gb_port,\n" +
+            "    coalesce(wdc.gb_password, wdc.password) as gb_password,\n" +
+            "    coalesce(wdc.gb_status, wdc.status) as gb_status,\n" +
+            "    coalesce(wdc.gb_longitude, wdc.longitude) as gb_longitude,\n" +
+            "    coalesce(wdc.gb_latitude, wdc.latitude) as gb_latitude,\n" +
+            "    coalesce(wdc.gb_ptz_type, wdc.ptz_type) as gb_ptz_type,\n" +
+            "    coalesce(wdc.gb_position_type, wdc.position_type) as gb_position_type,\n" +
+            "    coalesce(wdc.gb_room_type, wdc.room_type) as gb_room_type,\n" +
+            "    coalesce(wdc.gb_use_type, wdc.use_type) as gb_use_type,\n" +
+            "    coalesce(wdc.gb_supply_light_type, wdc.supply_light_type) as gb_supply_light_type,\n" +
+            "    coalesce(wdc.gb_direction_type, wdc.direction_type) as gb_direction_type,\n" +
+            "    coalesce(wdc.gb_resolution, wdc.resolution) as gb_resolution,\n" +
+            "    coalesce(wpgc.business_group_id, wdc.gb_business_group_id, wdc.business_group_id) as gb_business_group_id,\n" +
+            "    coalesce(wdc.gb_download_speed, wdc.download_speed) as gb_download_speed,\n" +
+            "    coalesce(wdc.gb_svc_space_support_mod, wdc.svc_space_support_mod) as gb_svc_space_support_mod,\n" +
+            "    coalesce(wdc.gb_svc_time_support_mode, wdc.svc_time_support_mode) as gb_svc_time_support_mode\n" +
+            " from wvp_device_channel wdc" +
+            " left jon wvp_platform_gb_channel wpgc on wdc.id = wpgc.device_channel_id" +
+            " where wpgc.platform_id = #{platformId} and coalesce(wpgc.device_id, wdc.gb_device_id, wdc.device_id) = #{channelDeviceId}"
+
+    )
+    CommonGBChannel queryOneWithPlatform(@Param("platformId") Integer platformId, @Param("channelDeviceId") String channelDeviceId);
 }
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/dao/DeviceMapper.java b/src/main/java/com/genersoft/iot/vmp/gb28181/dao/DeviceMapper.java
index dc1192dfa..79974f905 100755
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/dao/DeviceMapper.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/dao/DeviceMapper.java
@@ -347,4 +347,7 @@ public interface DeviceMapper {
 
     @Select("select * from wvp_device_channel where id = #{id}")
     DeviceChannel getRawChannel(@Param("id") int id);
+
+    @Select("select * from wvp_device where id = #{id}")
+    Device query(@Param("id") Integer id);
 }
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/dao/GroupMapper.java b/src/main/java/com/genersoft/iot/vmp/gb28181/dao/GroupMapper.java
index 212e722b1..c0b10691c 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/dao/GroupMapper.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/dao/GroupMapper.java
@@ -1,5 +1,6 @@
 package com.genersoft.iot.vmp.gb28181.dao;
 
+import com.genersoft.iot.vmp.gb28181.bean.CommonGBChannel;
 import com.genersoft.iot.vmp.gb28181.bean.Group;
 import com.genersoft.iot.vmp.gb28181.bean.GroupTree;
 import com.genersoft.iot.vmp.gb28181.bean.Region;
@@ -160,4 +161,14 @@ public interface GroupMapper {
             " <foreach collection='groupList'  item='item'  open='(' separator=',' close=')' > #{item.deviceId}</foreach>" +
             " </script>")
     List<Region> queryInGroupList(List<Group> groupList);
+
+    @Select(" <script>" +
+            " SELECT " +
+            " device_id as gb_device_id" +
+            " name as gb_name" +
+            " from wvp_common_group " +
+            " where (device_id, business_group) in " +
+            " <foreach collection='channelList'  item='item'  open='(' separator=',' close=')' > (#{item.gbParentId}, #{item.gbBusinessGroupId})</foreach>" +
+            " </script>")
+    List<CommonGBChannel> queryInChannelList(List<CommonGBChannel> channelList);
 }
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/dao/RegionMapper.java b/src/main/java/com/genersoft/iot/vmp/gb28181/dao/RegionMapper.java
index 2289ffb21..6523459ae 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/dao/RegionMapper.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/dao/RegionMapper.java
@@ -1,5 +1,6 @@
 package com.genersoft.iot.vmp.gb28181.dao;
 
+import com.genersoft.iot.vmp.gb28181.bean.CommonGBChannel;
 import com.genersoft.iot.vmp.gb28181.bean.Region;
 import com.genersoft.iot.vmp.gb28181.bean.RegionTree;
 import org.apache.ibatis.annotations.*;
@@ -96,4 +97,14 @@ public interface RegionMapper {
             " <foreach collection='regionList'  item='item'  open='(' separator=',' close=')' > #{item.deviceId}</foreach>" +
             " </script>")
     List<Region> queryInRegionList(List<Region> regionList);
+
+    @Select(" <script>" +
+            " SELECT " +
+            " device_id as gb_device_id" +
+            " name as gb_name" +
+            " from wvp_common_region " +
+            " where device_id in " +
+            " <foreach collection='channelList'  item='item'  open='(' separator=',' close=')' > #{item.gbCivilCode}</foreach>" +
+            " </script>")
+    List<CommonGBChannel> queryInChannelList(List<CommonGBChannel> channelList);
 }
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/service/IDeviceService.java b/src/main/java/com/genersoft/iot/vmp/gb28181/service/IDeviceService.java
index 25ad7f64b..970fc46b5 100755
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/service/IDeviceService.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/service/IDeviceService.java
@@ -81,7 +81,7 @@ public interface IDeviceService {
      * @param deviceId 设备编号
      * @return 设备信息
      */
-    Device getDevice(String deviceId);
+    Device getDeviceByDeviceId(String deviceId);
 
     /**
      * 获取所有在线设备
@@ -164,4 +164,7 @@ public interface IDeviceService {
     List<Device> getAll();
 
     PageInfo<Device> getAll(int page, int count, String query, Boolean status);
+
+    Device getDevice(Integer gbDeviceDbId);
+
 }
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/service/IGbChannelService.java b/src/main/java/com/genersoft/iot/vmp/gb28181/service/IGbChannelService.java
index b57cb74a7..a8e8c668e 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/service/IGbChannelService.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/service/IGbChannelService.java
@@ -75,4 +75,6 @@ public interface IGbChannelService {
     void deleteChannelToGroupByGbDevice(List<Integer> deviceIds);
 
     void batchUpdate(List<CommonGBChannel> commonGBChannels);
+
+    CommonGBChannel queryOneWithPlatform(Integer platformId, String channelDeviceId);
 }
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/service/IPlatformService.java b/src/main/java/com/genersoft/iot/vmp/gb28181/service/IPlatformService.java
index c34c44a0c..423734416 100755
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/service/IPlatformService.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/service/IPlatformService.java
@@ -1,5 +1,6 @@
 package com.genersoft.iot.vmp.gb28181.service;
 
+import com.genersoft.iot.vmp.gb28181.bean.CommonGBChannel;
 import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel;
 import com.genersoft.iot.vmp.gb28181.bean.Platform;
 import com.genersoft.iot.vmp.gb28181.event.SipSubscribe;
@@ -79,7 +80,7 @@ public interface IPlatformService {
     /**
      * 语音喊话回复BYE
      */
-    void stopBroadcast(Platform platform, DeviceChannel channel, String stream, boolean sendBye, MediaServer mediaServerItem);
+    void stopBroadcast(Platform platform, CommonGBChannel channel, String stream, boolean sendBye, MediaServer mediaServerItem);
 
     void addSimulatedSubscribeInfo(Platform parentPlatform);
 
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/service/impl/DeviceServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/gb28181/service/impl/DeviceServiceImpl.java
index d3823ad52..51db16a07 100755
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/service/impl/DeviceServiceImpl.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/service/impl/DeviceServiceImpl.java
@@ -351,7 +351,7 @@ public class DeviceServiceImpl implements IDeviceService {
     }
 
     @Override
-    public Device getDevice(String deviceId) {
+    public Device getDeviceByDeviceId(String deviceId) {
         Device device = redisCatchStorage.getDevice(deviceId);
         if (device == null) {
             device = deviceMapper.getDeviceByDeviceId(deviceId);
@@ -568,4 +568,9 @@ public class DeviceServiceImpl implements IDeviceService {
         List<Device> all = deviceMapper.getDeviceList(query, status);
         return new PageInfo<>(all);
     }
+
+    @Override
+    public Device getDevice(Integer id) {
+        return deviceMapper.query(id);
+    }
 }
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/service/impl/GbChannelServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/gb28181/service/impl/GbChannelServiceImpl.java
index 422fc10f2..c0d98bc0e 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/service/impl/GbChannelServiceImpl.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/service/impl/GbChannelServiceImpl.java
@@ -3,6 +3,8 @@ package com.genersoft.iot.vmp.gb28181.service.impl;
 import com.genersoft.iot.vmp.conf.exception.ControllerException;
 import com.genersoft.iot.vmp.gb28181.bean.*;
 import com.genersoft.iot.vmp.gb28181.dao.CommonGBChannelMapper;
+import com.genersoft.iot.vmp.gb28181.dao.GroupMapper;
+import com.genersoft.iot.vmp.gb28181.dao.RegionMapper;
 import com.genersoft.iot.vmp.gb28181.event.EventPublisher;
 import com.genersoft.iot.vmp.gb28181.event.subscribe.catalog.CatalogEvent;
 import com.genersoft.iot.vmp.gb28181.service.IGbChannelService;
@@ -32,6 +34,12 @@ public class GbChannelServiceImpl implements IGbChannelService {
     @Autowired
     private CommonGBChannelMapper commonGBChannelMapper;
 
+    @Autowired
+    private RegionMapper regionMapper;
+
+    @Autowired
+    private GroupMapper groupMapper;
+
     @Override
     public CommonGBChannel queryByDeviceId(String gbDeviceId) {
         return commonGBChannelMapper.queryByDeviceId(gbDeviceId);
@@ -316,14 +324,19 @@ public class GbChannelServiceImpl implements IGbChannelService {
 
         // 是否包含行政区划信息
         if (platform.getCatalogWithRegion()) {
-
+            List<CommonGBChannel> regionChannelList = regionMapper.queryInChannelList(commonGBChannelList);
+            if (!regionChannelList.isEmpty()) {
+                channelList.addAll(regionChannelList);
+            }
         }
         // 是否包含分组信息
         if (platform.getCatalogWithGroup()) {
-
+            List<CommonGBChannel> groupChannelList = groupMapper.queryInChannelList(commonGBChannelList);
+            if (!groupChannelList.isEmpty()) {
+                channelList.addAll(groupChannelList);
+            }
         }
-
-
+        channelList.addAll(commonGBChannelList);
         return channelList;
     }
 
@@ -619,4 +632,9 @@ public class GbChannelServiceImpl implements IGbChannelService {
         }
         commonGBChannelMapper.removeParentIdByChannels(channelList);
     }
+
+    @Override
+    public CommonGBChannel queryOneWithPlatform(Integer platformId, String channelDeviceId) {
+        return commonGBChannelMapper.queryOneWithPlatform(platformId, channelDeviceId);
+    }
 }
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/service/impl/PlatformServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/gb28181/service/impl/PlatformServiceImpl.java
index b63369396..20332854d 100755
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/service/impl/PlatformServiceImpl.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/service/impl/PlatformServiceImpl.java
@@ -165,7 +165,6 @@ public class PlatformServiceImpl implements IPlatformService {
             // 每次发送目录的数量默认为1
             parentPlatform.setCatalogGroup(1);
         }
-        parentPlatform.setCatalogId(parentPlatform.getDeviceGBId());
         int result = platformMapper.addParentPlatform(parentPlatform);
         // 添加缓存
         PlatformCatch parentPlatformCatch = new PlatformCatch();
@@ -776,23 +775,23 @@ public class PlatformServiceImpl implements IPlatformService {
     }
 
     @Override
-    public void stopBroadcast(Platform platform, DeviceChannel channel, String stream, boolean sendBye, MediaServer mediaServerItem) {
+    public void stopBroadcast(Platform platform, CommonGBChannel channel, String stream, boolean sendBye, MediaServer mediaServerItem) {
 
         try {
             if (sendBye) {
-                commanderForPlatform.streamByeCmd(platform, channel.getDeviceId(), stream, null, null);
+                commanderForPlatform.streamByeCmd(platform, channel.getGbDeviceId(), stream, null, null);
             }
         } catch (InvalidArgumentException | SipException | ParseException | SsrcTransactionNotFoundException e) {
-            log.warn("[消息发送失败] 停止语音对讲, 平台:{},通道:{}", platform.getId(), channel.getDeviceId() );
+            log.warn("[消息发送失败] 停止语音对讲, 平台:{},通道:{}", platform.getId(), channel.getGbDeviceId() );
         } finally {
             mediaServerService.closeRTPServer(mediaServerItem, stream);
-            InviteInfo inviteInfo = inviteStreamService.getInviteInfo(null, platform.getServerGBId(), channel.getDeviceId(), stream);
+            InviteInfo inviteInfo = inviteStreamService.getInviteInfo(null, platform.getServerGBId(), channel.getGbDeviceId(), stream);
             if (inviteInfo != null) {
                 // 释放ssrc
                 mediaServerService.releaseSsrc(mediaServerItem.getId(), inviteInfo.getSsrcInfo().getSsrc());
                 inviteStreamService.removeInviteInfo(inviteInfo);
             }
-            streamSession.remove(platform.getServerGBId(), channel.getDeviceId(), stream);
+            streamSession.remove(platform.getServerGBId(), channel.getGbDeviceId(), stream);
         }
     }
 
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/service/impl/PlayServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/gb28181/service/impl/PlayServiceImpl.java
index 5e02ceff6..60d6ede6a 100755
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/service/impl/PlayServiceImpl.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/service/impl/PlayServiceImpl.java
@@ -130,7 +130,7 @@ public class PlayServiceImpl implements IPlayService {
                 if (streamArray.length == 2) {
                     String deviceId = streamArray[0];
                     String channelId = streamArray[1];
-                    Device device = deviceService.getDevice(deviceId);
+                    Device device = deviceService.getDeviceByDeviceId(deviceId);
                     if (device == null) {
                         log.info("[语音对讲/喊话] 未找到设备:{}", deviceId);
                         return;
@@ -172,7 +172,7 @@ public class PlayServiceImpl implements IPlayService {
             for (SendRtpItem sendRtpItem : sendRtpItems) {
                 if (sendRtpItem != null && sendRtpItem.getApp().equals(event.getApp())) {
                     String platformId = sendRtpItem.getPlatformId();
-                    Device device = deviceService.getDevice(platformId);
+                    Device device = deviceService.getDeviceByDeviceId(platformId);
                     try {
                         if (device != null) {
                             cmder.streamByeCmd(device, sendRtpItem.getChannelId(), event.getStream(), sendRtpItem.getCallId());
@@ -200,7 +200,7 @@ public class PlayServiceImpl implements IPlayService {
                 if (streamArray.length == 2) {
                     String deviceId = streamArray[0];
                     String channelId = streamArray[1];
-                    Device device = deviceService.getDevice(deviceId);
+                    Device device = deviceService.getDeviceByDeviceId(deviceId);
                     if (device == null) {
                         log.info("[语音对讲/喊话] 未找到设备:{}", deviceId);
                         return;
@@ -753,7 +753,7 @@ public class PlayServiceImpl implements IPlayService {
     @Override
     public void playBack(String deviceId, String channelId, String startTime,
                          String endTime, ErrorCallback<Object> callback) {
-        Device device = deviceService.getDevice(deviceId);
+        Device device = deviceService.getDeviceByDeviceId(deviceId);
         if (device == null) {
             log.warn("[录像回放] 未找到设备 deviceId: {},channelId:{}", deviceId, channelId);
             throw new ControllerException(ErrorCode.ERROR100.getCode(), "未找到设备:" + deviceId);
@@ -793,7 +793,7 @@ public class PlayServiceImpl implements IPlayService {
             return;
         }
 
-        Device device = deviceService.getDevice(deviceId);
+        Device device = deviceService.getDeviceByDeviceId(deviceId);
         if (device == null) {
             throw new ControllerException(ErrorCode.ERROR100.getCode(), "设备: " + deviceId + "不存在");
         }
@@ -959,7 +959,7 @@ public class PlayServiceImpl implements IPlayService {
 
     @Override
     public void download(String deviceId, String channelId, String startTime, String endTime, int downloadSpeed, ErrorCallback<Object> callback) {
-        Device device = deviceService.getDevice(deviceId);
+        Device device = deviceService.getDeviceByDeviceId(deviceId);
         if (device == null) {
             return;
         }
@@ -989,7 +989,7 @@ public class PlayServiceImpl implements IPlayService {
                     null);
             return;
         }
-        Device device = deviceService.getDevice(deviceId);
+        Device device = deviceService.getDeviceByDeviceId(deviceId);
         if (device == null) {
             callback.run(InviteErrorCode.ERROR_FOR_PARAMETER_ERROR.getCode(),
                     "设备:" + deviceId + "不存在",
@@ -1169,7 +1169,7 @@ public class PlayServiceImpl implements IPlayService {
         if (allSsrc.size() > 0) {
             for (SsrcTransaction ssrcTransaction : allSsrc) {
                 if (ssrcTransaction.getMediaServerId().equals(mediaServerId)) {
-                    Device device = deviceService.getDevice(ssrcTransaction.getDeviceId());
+                    Device device = deviceService.getDeviceByDeviceId(ssrcTransaction.getDeviceId());
                     if (device == null) {
                         continue;
                     }
@@ -1291,7 +1291,7 @@ public class PlayServiceImpl implements IPlayService {
         }
         if (audioBroadcastCatchList.size() > 0) {
             for (AudioBroadcastCatch audioBroadcastCatch : audioBroadcastCatchList) {
-                Device device = deviceService.getDevice(deviceId);
+                Device device = deviceService.getDeviceByDeviceId(deviceId);
                 if (device == null || audioBroadcastCatch == null) {
                     return;
                 }
@@ -1390,7 +1390,7 @@ public class PlayServiceImpl implements IPlayService {
         if (!result) {
             throw new ServiceException("暂停RTP接收失败");
         }
-        Device device = deviceService.getDevice(inviteInfo.getDeviceId());
+        Device device = deviceService.getDeviceByDeviceId(inviteInfo.getDeviceId());
         cmder.playPauseCmd(device, inviteInfo.getStreamInfo());
     }
 
@@ -1418,7 +1418,7 @@ public class PlayServiceImpl implements IPlayService {
         if (!result) {
             throw new ServiceException("继续RTP接收失败");
         }
-        Device device = deviceService.getDevice(inviteInfo.getDeviceId());
+        Device device = deviceService.getDeviceByDeviceId(inviteInfo.getDeviceId());
         cmder.playResumeCmd(device, inviteInfo.getStreamInfo());
     }
 
@@ -1450,7 +1450,7 @@ public class PlayServiceImpl implements IPlayService {
     @Override
     public void startSendRtpStreamFailHand(SendRtpItem sendRtpItem, Platform platform, CallIdHeader callIdHeader) {
         if (sendRtpItem.isOnlyAudio()) {
-            Device device = deviceService.getDevice(sendRtpItem.getDeviceId());
+            Device device = deviceService.getDeviceByDeviceId(sendRtpItem.getDeviceId());
             AudioBroadcastCatch audioBroadcastCatch = audioBroadcastManager.get(sendRtpItem.getDeviceId(), sendRtpItem.getChannelId());
             if (audioBroadcastCatch != null) {
                 try {
@@ -1571,7 +1571,7 @@ public class PlayServiceImpl implements IPlayService {
 
     @Override
     public void getSnap(String deviceId, String channelId, String fileName, ErrorCallback errorCallback) {
-        Device device = deviceService.getDevice(deviceId);
+        Device device = deviceService.getDeviceByDeviceId(deviceId);
         if (device == null) {
             errorCallback.run(InviteErrorCode.ERROR_FOR_PARAMETER_ERROR.getCode(), InviteErrorCode.ERROR_FOR_PARAMETER_ERROR.getMsg(), null);
             return;
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/AckRequestProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/AckRequestProcessor.java
index 6329833a8..52976144e 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/AckRequestProcessor.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/AckRequestProcessor.java
@@ -122,7 +122,7 @@ public class AckRequestProcessor extends SIPRequestProcessorParent implements In
 				}
 			}
 		}else {
-			Device device = deviceService.getDevice(fromUserId);
+			Device device = deviceService.getDeviceByDeviceId(fromUserId);
 			if (device == null) {
 				log.warn("[收到ACK]:来自{},目标为({})的推流信息为找到流体服务[{}]信息",fromUserId, toUserId, sendRtpItem.getMediaServerId());
 				return;
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/ByeRequestProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/ByeRequestProcessor.java
index c36016713..5903cd15f 100755
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/ByeRequestProcessor.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/ByeRequestProcessor.java
@@ -67,10 +67,10 @@ public class ByeRequestProcessor extends SIPRequestProcessorParent implements In
 	private AudioBroadcastManager audioBroadcastManager;
 
 	@Autowired
-	private IDeviceChannelService channelService;
+	private IVideoManagerStorage storager;
 
 	@Autowired
-	private IVideoManagerStorage storager;
+	private IGbChannelService channelService;
 
 	@Autowired
 	private IMediaServerService mediaServerService;
@@ -163,7 +163,7 @@ public class ByeRequestProcessor extends SIPRequestProcessorParent implements In
 				if (mediaInfo.getReaderCount() <= 0) {
 					log.info("[收到bye] {} 无其它观看者,通知设备停止推流", streamId);
 					if (sendRtpItem.getPlayType().equals(InviteStreamType.PLAY)) {
-						Device device = deviceService.getDevice(sendRtpItem.getDeviceId());
+						Device device = deviceService.getDeviceByDeviceId(sendRtpItem.getDeviceId());
 						if (device == null) {
 							log.info("[收到bye] {} 通知设备停止推流时未找到设备信息", streamId);
 						}
@@ -189,7 +189,7 @@ public class ByeRequestProcessor extends SIPRequestProcessorParent implements In
 		if (platform != null ) {
 			if (ssrcTransaction.getType().equals(InviteSessionType.BROADCAST)) {
 				log.info("[收到bye] 上级停止语音对讲,来自:{}, 通道已停止推流: {}", ssrcTransaction.getDeviceId(), ssrcTransaction.getChannelId());
-				DeviceChannel channel = storager.queryChannelInParentPlatform(ssrcTransaction.getDeviceId(), ssrcTransaction.getChannelId());
+				CommonGBChannel channel = channelService.queryOneWithPlatform(platform.getId(), ssrcTransaction.getChannelId());
 				if (channel == null) {
 					log.info("[收到bye] 未找到通道,设备:{}, 通道:{}", ssrcTransaction.getDeviceId(), ssrcTransaction.getChannelId());
 					return;
@@ -198,16 +198,16 @@ public class ByeRequestProcessor extends SIPRequestProcessorParent implements In
 				platformService.stopBroadcast(platform, channel, ssrcTransaction.getStream(), false,
 						mediaServerService.getOne(mediaServerId));
 
-				playService.stopAudioBroadcast(ssrcTransaction.getDeviceId(), channel.getDeviceId());
+				playService.stopAudioBroadcast(ssrcTransaction.getDeviceId(), channel.getGbDeviceId());
 			}
 
 		}else {
-			Device device = deviceService.getDevice(ssrcTransaction.getDeviceId());
+			Device device = deviceService.getDeviceByDeviceId(ssrcTransaction.getDeviceId());
 			if (device == null) {
 				log.info("[收到bye] 未找到设备:{} ", ssrcTransaction.getDeviceId());
 				return;
 			}
-			DeviceChannel channel = channelService.getOne(ssrcTransaction.getDeviceId(), ssrcTransaction.getChannelId());
+			DeviceChannel channel = deviceChannelService.getOne(ssrcTransaction.getDeviceId(), ssrcTransaction.getChannelId());
 			if (channel == null) {
 				log.info("[收到bye] 未找到通道,设备:{}, 通道:{}", ssrcTransaction.getDeviceId(), ssrcTransaction.getChannelId());
 				return;
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 6c3fe7e4d..53518ad65 100755
--- 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
@@ -10,6 +10,7 @@ import com.genersoft.iot.vmp.conf.SipConfig;
 import com.genersoft.iot.vmp.conf.UserSetting;
 import com.genersoft.iot.vmp.conf.exception.ControllerException;
 import com.genersoft.iot.vmp.gb28181.bean.*;
+import com.genersoft.iot.vmp.gb28181.service.IGbChannelService;
 import com.genersoft.iot.vmp.gb28181.service.IPlayService;
 import com.genersoft.iot.vmp.gb28181.session.AudioBroadcastManager;
 import com.genersoft.iot.vmp.gb28181.session.SSRCFactory;
@@ -82,6 +83,9 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
     @Autowired
     private IVideoManagerStorage storager;
 
+    @Autowired
+    private IGbChannelService channelService;
+
     @Autowired
     private IStreamPushService streamPushService;
 
@@ -190,15 +194,12 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
 
             } else {
                 // 查询平台下是否有该通道
-                DeviceChannel channel = storager.queryChannelInParentPlatform(requesterId, channelId);
-                GbStream gbStream = storager.queryStreamInParentPlatform(requesterId, channelId);
-//                PlatformCatalog catalog = storager.getCatalog(requesterId, channelId);
-
+                CommonGBChannel channel= channelService.queryOneWithPlatform(platform.getId(), channelId);
                 MediaServer mediaServerItem = null;
                 StreamPush streamPushItem = null;
                 StreamProxy proxyByAppAndStream = null;
                 // 不是通道可能是直播流
-                if (channel != null && gbStream == null) {
+                if (channel != null ) {
                     // 通道存在,发100,TRYING
                     try {
                         responseAck(request, Response.TRYING);
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/RegisterRequestProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/RegisterRequestProcessor.java
index abcac1703..23a6e42a5 100755
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/RegisterRequestProcessor.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/RegisterRequestProcessor.java
@@ -93,7 +93,7 @@ public class RegisterRequestProcessor extends SIPRequestProcessorParent implemen
             SipUri uri = (SipUri) address.getURI();
             String deviceId = uri.getUser();
 
-            Device device = deviceService.getDevice(deviceId);
+            Device device = deviceService.getDeviceByDeviceId(deviceId);
 
             RemoteAddressInfo remoteAddressInfo = SipUtils.getRemoteAddressFromRequest(request,
                     userSetting.getSipUseSourceIpAsRemoteAddress());
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/info/InfoRequestProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/info/InfoRequestProcessor.java
index 6a206cf93..3cdbbfe3c 100755
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/info/InfoRequestProcessor.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/info/InfoRequestProcessor.java
@@ -9,7 +9,6 @@ import com.genersoft.iot.vmp.gb28181.transmit.SIPProcessorObserver;
 import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander;
 import com.genersoft.iot.vmp.gb28181.transmit.event.request.ISIPRequestProcessor;
 import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent;
-import com.genersoft.iot.vmp.gb28181.utils.SipUtils;
 import com.genersoft.iot.vmp.gb28181.service.IDeviceService;
 import com.genersoft.iot.vmp.gb28181.service.IInviteStreamService;
 import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
@@ -28,6 +27,9 @@ import javax.sip.header.ContentTypeHeader;
 import javax.sip.message.Response;
 import java.text.ParseException;
 
+/**
+ * INFO 一般用于国标级联时的回放控制
+ */
 @Slf4j
 @Component
 public class InfoRequestProcessor extends SIPRequestProcessorParent implements InitializingBean, ISIPRequestProcessor {
@@ -68,22 +70,17 @@ public class InfoRequestProcessor extends SIPRequestProcessorParent implements I
     public void process(RequestEvent evt) {
         log.debug("接收到消息:" + evt.getRequest());
         SIPRequest request = (SIPRequest) evt.getRequest();
-        String deviceId = SipUtils.getUserIdFromFromHeader(request);
         CallIdHeader callIdHeader = request.getCallIdHeader();
         // 先从会话内查找
         SsrcTransaction ssrcTransaction = sessionManager.getSsrcTransaction(null, null, callIdHeader.getCallId(), null);
 
-        // 兼容海康 媒体通知 消息from字段不是设备ID的问题
-        if (ssrcTransaction != null) {
-            deviceId = ssrcTransaction.getDeviceId();
-        }
         // 查询设备是否存在
-        Device device = redisCatchStorage.getDevice(deviceId);
+        Device device = redisCatchStorage.getDevice(ssrcTransaction.getDeviceId());
         // 查询上级平台是否存在
-        Platform parentPlatform = storage.queryParentPlatByServerGBId(deviceId);
+        Platform parentPlatform = storage.queryParentPlatByServerGBId(ssrcTransaction.getDeviceId());
         try {
             if (device != null && parentPlatform != null) {
-                log.warn("[重复]平台与设备编号重复:{}", deviceId);
+                log.warn("[重复]平台与设备编号重复:{}", ssrcTransaction.getDeviceId());
                 String hostAddress = request.getRemoteAddress().getHostAddress();
                 int remotePort = request.getRemotePort();
                 if (device.getHostAddress().equals(hostAddress + ":" + remotePort)) {
@@ -94,8 +91,8 @@ public class InfoRequestProcessor extends SIPRequestProcessorParent implements I
             }
             if (device == null && parentPlatform == null) {
                 // 不存在则回复404
-                responseAck(request, Response.NOT_FOUND, "device "+ deviceId +" not found");
-                log.warn("[设备未找到 ]: {}", deviceId);
+                responseAck(request, Response.NOT_FOUND, "device "+ ssrcTransaction.getDeviceId() +" not found");
+                log.warn("[设备未找到 ]: {}", ssrcTransaction.getDeviceId());
                 if (sipSubscribe.getErrorSubscribe(callIdHeader.getCallId()) != null){
                     DeviceNotFoundEvent deviceNotFoundEvent = new DeviceNotFoundEvent(evt.getDialog());
                     deviceNotFoundEvent.setCallId(callIdHeader.getCallId());
@@ -114,8 +111,9 @@ public class InfoRequestProcessor extends SIPRequestProcessorParent implements I
                         responseAck(request, Response.NOT_FOUND, "stream " + streamId + " not found");
                         return;
                     }
-                    Device device1 = deviceService.getDevice(inviteInfo.getDeviceId());
+                    Device device1 = deviceService.getDeviceByDeviceId(inviteInfo.getDeviceId());
                     if (inviteInfo.getStreamInfo() != null) {
+                        // 不解析协议, 直接转发给对应的设备
                         cmder.playbackControlCmd(device1,inviteInfo.getStreamInfo(),new String(evt.getRequest().getRawContent()),eventResult -> {
                             // 失败的回复
                             try {
@@ -143,6 +141,4 @@ public class InfoRequestProcessor extends SIPRequestProcessorParent implements I
             log.warn("SIP回复时解析异常", e);
         }
     }
-
-
 }
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/control/cmd/DeviceControlQueryMessageHandler.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/control/cmd/DeviceControlQueryMessageHandler.java
index c5e762603..b8080d96e 100755
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/control/cmd/DeviceControlQueryMessageHandler.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/control/cmd/DeviceControlQueryMessageHandler.java
@@ -65,38 +65,14 @@ public class DeviceControlQueryMessageHandler extends SIPRequestProcessorParent
         String channelId = getText(rootElement, "DeviceID");
         // 远程启动功能
         if (!ObjectUtils.isEmpty(getText(rootElement, "TeleBoot"))) {
-            // TODO 拒绝远程启动命令
-            log.warn("[国标级联]收到平台的远程启动命令, 不处理");
-
-//            if (parentPlatform.getServerGBId().equals(targetGBId)) {
-//                // 远程启动本平台:需要在重新启动程序后先对SipStack解绑
-//                logger.info("执行远程启动本平台命令");
-//                try {
-//                    cmderFroPlatform.unregister(parentPlatform, null, null);
-//                } catch (InvalidArgumentException | ParseException | SipException e) {
-//                    logger.error("[命令发送失败] 国标级联 注销: {}", e.getMessage());
-//                }
-//                taskExecutor.execute(() -> {
-//                    // 远程启动
-////                    try {
-////                        Thread.sleep(3000);
-////                        SipProvider up = (SipProvider) SpringBeanFactory.getBean("udpSipProvider");
-////                        SipStackImpl stack = (SipStackImpl)up.getSipStack();
-////                        stack.stop();
-////                        Iterator listener = stack.getListeningPoints();
-////                        while (listener.hasNext()) {
-////                            stack.deleteListeningPoint((ListeningPoint) listener.next());
-////                        }
-////                        Iterator providers = stack.getSipProviders();
-////                        while (providers.hasNext()) {
-////                            stack.deleteSipProvider((SipProvider) providers.next());
-////                        }
-////                        VManageBootstrap.restart();
-////                    } catch (InterruptedException | ObjectInUseException e) {
-////                        logger.error("[任务执行失败] 服务重启: {}", e.getMessage());
-////                    }
-//                });
-//            }
+            // 拒绝远程启动命令
+            log.warn("[国标级联]收到平台的远程启动命令, 禁用,不允许上级平台随意重启下级平台");
+            try {
+                responseAck(request, Response.FORBIDDEN);
+            } catch (SipException | InvalidArgumentException | ParseException e) {
+                log.error("[命令发送失败] 错误信息: {}", e.getMessage());
+            }
+            return;
         }
         DeviceControlType deviceControlType = DeviceControlType.typeOf(rootElement);
         log.info("[接受deviceControl命令] 命令: {}", deviceControlType);
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/BroadcastNotifyMessageHandler.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/BroadcastNotifyMessageHandler.java
index df483ca4e..ceca2576e 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/BroadcastNotifyMessageHandler.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/BroadcastNotifyMessageHandler.java
@@ -2,6 +2,7 @@ package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.notify
 
 import com.genersoft.iot.vmp.conf.exception.ControllerException;
 import com.genersoft.iot.vmp.gb28181.bean.*;
+import com.genersoft.iot.vmp.gb28181.service.IGbChannelService;
 import com.genersoft.iot.vmp.gb28181.session.AudioBroadcastManager;
 import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommanderForPlatform;
 import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent;
@@ -42,6 +43,9 @@ public class BroadcastNotifyMessageHandler extends SIPRequestProcessorParent imp
     @Autowired
     private IVideoManagerStorage storage;
 
+    @Autowired
+    private IGbChannelService channelService;
+
     @Autowired
     private ISIPCommanderForPlatform commanderForPlatform;
 
@@ -94,14 +98,14 @@ public class BroadcastNotifyMessageHandler extends SIPRequestProcessorParent imp
 
             log.info("[国标级联 语音喊话] platform: {}, channel: {}", platform.getServerGBId(), targetId);
 
-            DeviceChannel deviceChannel = storage.queryChannelInParentPlatform(platform.getServerGBId(), targetId);
-            if (deviceChannel == null) {
+            CommonGBChannel channel = channelService.queryOneWithPlatform(platform.getId(), targetId);
+            if (channel == null) {
                 log.warn("[国标级联 语音喊话] 未找到通道 platform: {}, channel: {}", platform.getServerGBId(), targetId);
                 responseAck(request, Response.NOT_FOUND, "TargetID not found");
                 return;
             }
             // 向下级发送语音的喊话请求
-            Device device = deviceService.getDevice(deviceChannel.getDeviceId());
+            Device device = deviceService.getDevice(channel.getGbDeviceDbId());
             if (device == null) {
                 responseAck(request, Response.NOT_FOUND, "device not found");
                 return;
@@ -110,26 +114,26 @@ public class BroadcastNotifyMessageHandler extends SIPRequestProcessorParent imp
 
             // 查看语音通道是否已经建立并且已经在使用
             if (playService.audioBroadcastInUse(device, targetId)) {
-                commanderForPlatform.broadcastResultCmd(platform, deviceChannel, sn, false,null, null);
+                commanderForPlatform.broadcastResultCmd(platform, channel, sn, false,null, null);
                 return;
             }
 
             MediaServer mediaServerForMinimumLoad = mediaServerService.getMediaServerForMinimumLoad(null);
-            commanderForPlatform.broadcastResultCmd(platform, deviceChannel, sn, true,  eventResult->{
+            commanderForPlatform.broadcastResultCmd(platform, channel, sn, true,  eventResult->{
                 log.info("[国标级联] 语音喊话 回复失败 platform: {}, 错误:{}/{}", platform.getServerGBId(), eventResult.statusCode, eventResult.msg);
             }, eventResult->{
 
                 // 消息发送成功, 向上级发送invite,获取推流
                 try {
-                    platformService.broadcastInvite(platform, deviceChannel.getDeviceId(), mediaServerForMinimumLoad,  (hookData)->{
+                    platformService.broadcastInvite(platform, channel.getGbDeviceId(), mediaServerForMinimumLoad,  (hookData)->{
                         // 上级平台推流成功
                         AudioBroadcastCatch broadcastCatch = audioBroadcastManager.get(device.getDeviceId(), targetId);
                         if (broadcastCatch != null ) {
                             if (playService.audioBroadcastInUse(device, targetId)) {
                                 log.info("[国标级联] 语音喊话 设备正在使用中 platform: {}, channel: {}",
-                                        platform.getServerGBId(), deviceChannel.getDeviceId());
+                                        platform.getServerGBId(), channel.getGbDeviceId());
                                 //  查看语音通道已经建立且已经占用 回复BYE
-                                platformService.stopBroadcast(platform, deviceChannel, hookData.getStream(),  true, hookData.getMediaServer());
+                                platformService.stopBroadcast(platform, channel, hookData.getStream(),  true, hookData.getMediaServer());
                             }else {
                                 // 查看语音通道已经建立但是未占用
                                 broadcastCatch.setApp(hookData.getApp());
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 1c0762572..d66d6a476 100755
--- 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
@@ -41,14 +41,6 @@ public class CatalogQueryMessageHandler extends SIPRequestProcessorParent implem
     @Autowired
     private SIPCommanderFroPlatform cmderFroPlatform;
 
-    @Autowired
-    private SipConfig config;
-
-    @Autowired
-    private EventPublisher publisher;
-
-    @Autowired
-    private IVideoManagerStorage storage;
 
     @Override
     public void afterPropertiesSet() throws Exception {
@@ -57,7 +49,10 @@ public class CatalogQueryMessageHandler extends SIPRequestProcessorParent implem
 
     @Override
     public void handForDevice(RequestEvent evt, Device device, Element element) {
-
+        try {
+            // 回复200 OK
+            responseAck((SIPRequest) evt.getRequest(), Response.FORBIDDEN);
+        } catch (SipException | InvalidArgumentException | ParseException ignored) {}
     }
 
     @Override
@@ -84,6 +79,5 @@ public class CatalogQueryMessageHandler extends SIPRequestProcessorParent implem
         } catch (SipException | InvalidArgumentException | ParseException e) {
             log.error("[命令发送失败] 国标级联 目录查询回复: {}", e.getMessage());
         }
-
     }
 }
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/query/cmd/DeviceInfoQueryMessageHandler.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/query/cmd/DeviceInfoQueryMessageHandler.java
index 2aaa27ca6..ca8b4db1b 100755
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/query/cmd/DeviceInfoQueryMessageHandler.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/query/cmd/DeviceInfoQueryMessageHandler.java
@@ -48,7 +48,7 @@ public class DeviceInfoQueryMessageHandler extends SIPRequestProcessorParent imp
     }
 
     @Override
-    public void handForPlatform(RequestEvent evt, Platform parentPlatform, Element rootElement) {
+    public void handForPlatform(RequestEvent evt, Platform platform, Element rootElement) {
         log.info("[DeviceInfo查询]消息");
         FromHeader fromHeader = (FromHeader) evt.getRequest().getHeader(FromHeader.NAME);
         try {
@@ -68,15 +68,15 @@ public class DeviceInfoQueryMessageHandler extends SIPRequestProcessorParent imp
         // 查询这是通道id还是设备id
         Device device = null;
         // 如果id指向平台的国标编号,那么就是查询平台的信息
-        if (!parentPlatform.getDeviceGBId().equals(channelId)) {
-            device = storager.queryDeviceInfoByPlatformIdAndChannelId(parentPlatform.getServerGBId(), channelId);
+        if (!platform.getDeviceGBId().equals(channelId)) {
+            device = storager.queryDeviceInfoByPlatformIdAndChannelId(platform.getServerGBId(), channelId);
             if (device ==null){
-                log.error("[平台没有该通道的使用权限]:platformId"+parentPlatform.getServerGBId()+"  deviceID:"+channelId);
+                log.error("[平台没有该通道的使用权限]:platformId"+platform.getServerGBId()+"  deviceID:"+channelId);
                 return;
             }
         }
         try {
-            cmderFroPlatform.deviceInfoResponse(parentPlatform, device, sn, fromHeader.getTag());
+            cmderFroPlatform.deviceInfoResponse(platform, device, sn, fromHeader.getTag());
         } catch (SipException | InvalidArgumentException | ParseException e) {
             log.error("[命令发送失败] 国标级联 DeviceInfo查询回复: {}", e.getMessage());
         }
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/query/cmd/DeviceStatusQueryMessageHandler.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/query/cmd/DeviceStatusQueryMessageHandler.java
index 343826a1a..f4027f304 100755
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/query/cmd/DeviceStatusQueryMessageHandler.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/query/cmd/DeviceStatusQueryMessageHandler.java
@@ -1,8 +1,10 @@
 package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.query.cmd;
 
+import com.genersoft.iot.vmp.gb28181.bean.CommonGBChannel;
 import com.genersoft.iot.vmp.gb28181.bean.Device;
 import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel;
 import com.genersoft.iot.vmp.gb28181.bean.Platform;
+import com.genersoft.iot.vmp.gb28181.service.IGbChannelService;
 import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommanderForPlatform;
 import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent;
 import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.IMessageHandler;
@@ -34,7 +36,7 @@ public class DeviceStatusQueryMessageHandler extends SIPRequestProcessorParent i
     private QueryMessageHandler queryMessageHandler;
 
     @Autowired
-    private IVideoManagerStorage storager;
+    private IGbChannelService channelService;
 
     @Autowired
     private ISIPCommanderForPlatform cmderFroPlatform;
@@ -62,13 +64,13 @@ public class DeviceStatusQueryMessageHandler extends SIPRequestProcessorParent i
         }
         String sn = rootElement.element("SN").getText();
         String channelId = getText(rootElement, "DeviceID");
-        DeviceChannel deviceChannel = storager.queryChannelInParentPlatform(parentPlatform.getServerGBId(), channelId);
-        if (deviceChannel ==null){
+        CommonGBChannel channel= channelService.queryOneWithPlatform(parentPlatform.getId(), channelId);
+        if (channel ==null){
             log.error("[平台没有该通道的使用权限]:platformId"+parentPlatform.getServerGBId()+"  deviceID:"+channelId);
             return;
         }
         try {
-            cmderFroPlatform.deviceStatusResponse(parentPlatform,channelId, sn, fromHeader.getTag(), "ON".equalsIgnoreCase(deviceChannel.getStatus()));
+            cmderFroPlatform.deviceStatusResponse(parentPlatform, channelId, sn, fromHeader.getTag(), "ON".equalsIgnoreCase(channel.getGbStatus()));
         } catch (SipException | InvalidArgumentException | ParseException e) {
             log.error("[命令发送失败] 国标级联 DeviceStatus查询回复: {}", e.getMessage());
         }
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/query/cmd/RecordInfoQueryMessageHandler.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/query/cmd/RecordInfoQueryMessageHandler.java
index 823d53012..55782a0b2 100755
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/query/cmd/RecordInfoQueryMessageHandler.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/query/cmd/RecordInfoQueryMessageHandler.java
@@ -1,9 +1,12 @@
 package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.query.cmd;
 
+import com.genersoft.iot.vmp.gb28181.bean.CommonGBChannel;
 import com.genersoft.iot.vmp.gb28181.bean.Device;
 import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel;
 import com.genersoft.iot.vmp.gb28181.bean.Platform;
 import com.genersoft.iot.vmp.gb28181.event.record.RecordEndEventListener;
+import com.genersoft.iot.vmp.gb28181.service.IDeviceService;
+import com.genersoft.iot.vmp.gb28181.service.IGbChannelService;
 import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander;
 import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommanderFroPlatform;
 import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent;
@@ -38,6 +41,12 @@ public class RecordInfoQueryMessageHandler extends SIPRequestProcessorParent imp
     @Autowired
     private IVideoManagerStorage storager;
 
+    @Autowired
+    private IGbChannelService channelService;
+
+    @Autowired
+    private IDeviceService deviceService;
+
     @Autowired
     private SIPCommanderFroPlatform cmderFroPlatform;
 
@@ -85,56 +94,65 @@ public class RecordInfoQueryMessageHandler extends SIPRequestProcessorParent imp
         if (typeElement != null) {
             type =  typeElement.getText();
         }
-        // 确认是直播还是国标, 国标直接请求下级,直播请求录像管理服务
-        List<ChannelSourceInfo> channelSources = storager.getChannelSource(parentPlatform.getServerGBId(), channelId);
 
-        if (channelSources.get(0).getCount() > 0) { // 国标
-            // 向国标设备请求录像数据
-            Device device = storager.queryVideoDeviceByPlatformIdAndChannelId(parentPlatform.getServerGBId(), channelId);
-            DeviceChannel deviceChannel = storager.queryChannelInParentPlatform(parentPlatform.getServerGBId(), channelId);
-            // 接收录像数据
-            recordEndEventListener.addEndEventHandler(deviceChannel.getDeviceId(), channelId, (recordInfo)->{
-                try {
-                    log.info("[国标级联] 录像查询收到数据, 通道: {},准备转发===", channelId);
-                    cmderFroPlatform.recordInfo(deviceChannel, parentPlatform, request.getFromTag(), recordInfo);
-                } catch (SipException | InvalidArgumentException | ParseException e) {
-                    log.error("[命令发送失败] 国标级联 回复录像数据: {}", e.getMessage());
-                }
-            });
-            try {
-                commander.recordInfoQuery(device, channelId, DateUtil.ISO8601Toyyyy_MM_dd_HH_mm_ss(startTime),
-                        DateUtil.ISO8601Toyyyy_MM_dd_HH_mm_ss(endTime), sn, secrecy, type, (eventResult -> {
-                            // 回复200 OK
-                            try {
-                                responseAck(request, Response.OK);
-                            } catch (SipException | InvalidArgumentException | ParseException e) {
-                                log.error("[命令发送失败] 录像查询回复: {}", e.getMessage());
-                            }
-                        }),(eventResult -> {
-                            // 查询失败
-                            try {
-                                responseAck(request, eventResult.statusCode, eventResult.msg);
-                            } catch (SipException | InvalidArgumentException | ParseException e) {
-                                log.error("[命令发送失败] 录像查询回复: {}", e.getMessage());
-                            }
-                        }));
-            } catch (InvalidArgumentException | ParseException | SipException e) {
-                log.error("[命令发送失败] 录像查询: {}", e.getMessage());
-            }
-
-        }else if (channelSources.get(1).getCount() > 0) { // 直播流
-            // TODO
-            try {
-                responseAck(request, Response.NOT_IMPLEMENTED); // 回复未实现
-            } catch (SipException | InvalidArgumentException | ParseException e) {
-                log.error("[命令发送失败] 录像查询: {}", e.getMessage());
-            }
-        }else { // 错误的请求
+        // 向国标设备请求录像数据
+        CommonGBChannel channel = channelService.queryOneWithPlatform(parentPlatform.getId(), channelId);
+        if (channel == null) {
+            log.info("[平台查询录像记录] 未找到通道 {}/{}", parentPlatform.getName(), channelId );
             try {
                 responseAck(request, Response.BAD_REQUEST);
             } catch (SipException | InvalidArgumentException | ParseException e) {
-                log.error("[命令发送失败] 录像查询: {}", e.getMessage());
+                log.error("[命令发送失败] [平台查询录像记录] 未找到通道: {}", e.getMessage());
             }
+            return;
+        }
+        if (channel.getStreamProxyId() > 0 || channel.getStreamPushId() > 0) {
+            log.info("[平台查询录像记录] 不支持查询推流和拉流代理的录像数据 {}/{}", parentPlatform.getName(), channelId );
+            try {
+                responseAck(request, Response.NOT_IMPLEMENTED); // 回复未实现
+            } catch (SipException | InvalidArgumentException | ParseException e) {
+                log.error("[命令发送失败] 平台查询录像记录: {}", e.getMessage());
+            }
+            return;
+        }
+        Device device = deviceService.getDevice(channel.getGbDeviceDbId());
+        if (device == null) {
+            log.warn("[平台查询录像记录] 未找到通道对应的设备 {}/{}", parentPlatform.getName(), channelId );
+            try {
+                responseAck(request, Response.BAD_REQUEST);
+            } catch (SipException | InvalidArgumentException | ParseException e) {
+                log.error("[命令发送失败] [平台查询录像记录] 未找到通道对应的设备: {}", e.getMessage());
+            }
+            return;
+        }
+        // 接收录像数据
+        recordEndEventListener.addEndEventHandler(channel.getGbDeviceId(), channelId, (recordInfo)->{
+            try {
+                log.info("[国标级联] 录像查询收到数据, 通道: {},准备转发===", channelId);
+                cmderFroPlatform.recordInfo(channel, parentPlatform, request.getFromTag(), recordInfo);
+            } catch (SipException | InvalidArgumentException | ParseException e) {
+                log.error("[命令发送失败] 国标级联 回复录像数据: {}", e.getMessage());
+            }
+        });
+        try {
+            commander.recordInfoQuery(device, channelId, DateUtil.ISO8601Toyyyy_MM_dd_HH_mm_ss(startTime),
+                    DateUtil.ISO8601Toyyyy_MM_dd_HH_mm_ss(endTime), sn, secrecy, type, (eventResult -> {
+                        // 回复200 OK
+                        try {
+                            responseAck(request, Response.OK);
+                        } catch (SipException | InvalidArgumentException | ParseException e) {
+                            log.error("[命令发送失败] 录像查询回复: {}", e.getMessage());
+                        }
+                    }),(eventResult -> {
+                        // 查询失败
+                        try {
+                            responseAck(request, eventResult.statusCode, eventResult.msg);
+                        } catch (SipException | InvalidArgumentException | ParseException e) {
+                            log.error("[命令发送失败] 录像查询回复: {}", e.getMessage());
+                        }
+                    }));
+        } catch (InvalidArgumentException | ParseException | SipException e) {
+            log.error("[命令发送失败] 录像查询: {}", e.getMessage());
         }
     }
 }
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 9a7420737..1e75b4343 100755
--- a/src/main/java/com/genersoft/iot/vmp/service/impl/MediaServiceImpl.java
+++ b/src/main/java/com/genersoft/iot/vmp/service/impl/MediaServiceImpl.java
@@ -248,7 +248,7 @@ public class MediaServiceImpl implements IMediaService {
                         }
                     }
                 }
-                Device device = deviceService.getDevice(inviteInfo.getDeviceId());
+                Device device = deviceService.getDeviceByDeviceId(inviteInfo.getDeviceId());
                 if (device != null) {
                     try {
                         // 多查询一次防止已经被处理了
diff --git a/src/main/java/com/genersoft/iot/vmp/service/redisMsg/RedisAlarmMsgListener.java b/src/main/java/com/genersoft/iot/vmp/service/redisMsg/RedisAlarmMsgListener.java
index fbe6e78db..670f8556c 100755
--- a/src/main/java/com/genersoft/iot/vmp/service/redisMsg/RedisAlarmMsgListener.java
+++ b/src/main/java/com/genersoft/iot/vmp/service/redisMsg/RedisAlarmMsgListener.java
@@ -129,7 +129,7 @@ public class RedisAlarmMsgListener implements MessageListener {
                             }
 
                         }else {
-                            Device device = deviceService.getDevice(gbId);
+                            Device device = deviceService.getDeviceByDeviceId(gbId);
                             Platform platform = storage.queryParentPlatByServerGBId(gbId);
                             if (device != null && platform == null) {
                                 try {
diff --git a/src/main/java/com/genersoft/iot/vmp/web/gb28181/ApiControlController.java b/src/main/java/com/genersoft/iot/vmp/web/gb28181/ApiControlController.java
index 50829c5cf..edfd71a2d 100644
--- a/src/main/java/com/genersoft/iot/vmp/web/gb28181/ApiControlController.java
+++ b/src/main/java/com/genersoft/iot/vmp/web/gb28181/ApiControlController.java
@@ -51,7 +51,7 @@ public class ApiControlController {
         }
         if (channel == null) {channel = 0;}
         if (speed == null) {speed = 0;}
-        Device device = deviceService.getDevice(serial);
+        Device device = deviceService.getDeviceByDeviceId(serial);
         if (device == null) {
             throw new ControllerException(ErrorCode.ERROR100.getCode(), "device[ " + serial + " ]未找到");
         }
@@ -125,7 +125,7 @@ public class ApiControlController {
         }
 
         if (channel == null) {channel = 0;}
-        Device device = deviceService.getDevice(serial);
+        Device device = deviceService.getDeviceByDeviceId(serial);
         if (device == null) {
             throw new ControllerException(ErrorCode.ERROR100.getCode(), "device[ " + serial + " ]未找到");
         }
diff --git a/src/main/java/com/genersoft/iot/vmp/web/gb28181/ApiDeviceController.java b/src/main/java/com/genersoft/iot/vmp/web/gb28181/ApiDeviceController.java
index 891e36a97..06fd5f81c 100644
--- a/src/main/java/com/genersoft/iot/vmp/web/gb28181/ApiDeviceController.java
+++ b/src/main/java/com/genersoft/iot/vmp/web/gb28181/ApiDeviceController.java
@@ -200,7 +200,7 @@ public class ApiDeviceController {
                     serial, channel, code, fill, timeout);
         }
 
-        Device device = deviceService.getDevice(serial);
+        Device device = deviceService.getDeviceByDeviceId(serial);
         String uuid =  UUID.randomUUID().toString();
         String key =  DeferredResultHolder.CALLBACK_CMD_PRESETQUERY + (ObjectUtils.isEmpty(code) ? serial : code);
         DeferredResult<Object> result = new DeferredResult<> (timeout * 1000L);
diff --git a/src/main/java/com/genersoft/iot/vmp/web/gb28181/ApiStreamController.java b/src/main/java/com/genersoft/iot/vmp/web/gb28181/ApiStreamController.java
index 39049b780..e8566deed 100644
--- a/src/main/java/com/genersoft/iot/vmp/web/gb28181/ApiStreamController.java
+++ b/src/main/java/com/genersoft/iot/vmp/web/gb28181/ApiStreamController.java
@@ -82,7 +82,7 @@ public class ApiStreamController {
 
     ){
         DeferredResult<JSONObject> result = new DeferredResult<>(userSetting.getPlayTimeout().longValue() + 10);
-        Device device = deviceService.getDevice(serial);
+        Device device = deviceService.getDeviceByDeviceId(serial);
         if (device == null ) {
             JSONObject resultJSON = new JSONObject();
             resultJSON.put("error","device[ " + serial + " ]未找到");
@@ -230,7 +230,7 @@ public class ApiStreamController {
             result.put("error","未找到流信息");
             return result;
         }
-        Device device = deviceService.getDevice(serial);
+        Device device = deviceService.getDeviceByDeviceId(serial);
         if (device == null) {
             JSONObject result = new JSONObject();
             result.put("error","未找到设备");