From 9361943e47a09ea46f76adf06fa0d24a07ac711d Mon Sep 17 00:00:00 2001 From: 648540858 <648540858@qq.com> Date: 星期一, 26 十月 2020 11:40:46 +0800 Subject: [PATCH] 修复ui录象播放 优化录象查询接口 --- src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/MessageRequestProcessor.java | 225 +++++++++++++++++++++++++++++++++++++++---------------- 1 files changed, 158 insertions(+), 67 deletions(-) diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/MessageRequestProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/MessageRequestProcessor.java index 453420a..ec19cd5 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/MessageRequestProcessor.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/MessageRequestProcessor.java @@ -2,15 +2,10 @@ import java.io.ByteArrayInputStream; import java.text.ParseException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; +import java.util.*; import javax.sip.InvalidArgumentException; import javax.sip.RequestEvent; -import javax.sip.ServerTransaction; import javax.sip.SipException; import javax.sip.message.Request; import javax.sip.message.Response; @@ -19,75 +14,94 @@ import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.io.SAXReader; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; import com.genersoft.iot.vmp.common.VideoManagerConstants; -import com.genersoft.iot.vmp.gb28181.SipLayer; import com.genersoft.iot.vmp.gb28181.bean.Device; import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel; import com.genersoft.iot.vmp.gb28181.bean.RecordInfo; import com.genersoft.iot.vmp.gb28181.bean.RecordItem; +import com.genersoft.iot.vmp.gb28181.event.DeviceOffLineDetector; import com.genersoft.iot.vmp.gb28181.event.EventPublisher; import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder; import com.genersoft.iot.vmp.gb28181.transmit.callback.RequestMessage; import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander; -import com.genersoft.iot.vmp.gb28181.transmit.request.ISIPRequestProcessor; +import com.genersoft.iot.vmp.gb28181.transmit.request.SIPRequestAbstractProcessor; import com.genersoft.iot.vmp.gb28181.utils.DateUtil; import com.genersoft.iot.vmp.gb28181.utils.XmlUtil; import com.genersoft.iot.vmp.storager.IVideoManagerStorager; +import com.genersoft.iot.vmp.utils.redis.RedisUtil; +import org.springframework.util.StringUtils; /** * @Description:MESSAGE璇锋眰澶勭悊鍣� - * @author: songww + * @author: swwheihei * @date: 2020骞�5鏈�3鏃� 涓嬪崍5:32:41 */ -@Component -public class MessageRequestProcessor implements ISIPRequestProcessor { - - private ServerTransaction transaction; +public class MessageRequestProcessor extends SIPRequestAbstractProcessor { - private SipLayer layer; + private final static Logger logger = LoggerFactory.getLogger(MessageRequestProcessor.class); - @Autowired private SIPCommander cmder; - @Autowired private IVideoManagerStorager storager; - @Autowired private EventPublisher publisher; - @Autowired + private RedisUtil redis; + private DeferredResultHolder deferredResultHolder; + + private DeviceOffLineDetector offLineDetector; + + private final static String CACHE_RECORDINFO_KEY = "CACHE_RECORDINFO_"; + + private static final String MESSAGE_KEEP_ALIVE = "Keepalive"; + private static final String MESSAGE_CONFIG_DOWNLOAD = "ConfigDownload"; + private static final String MESSAGE_CATALOG = "Catalog"; + private static final String MESSAGE_DEVICE_INFO = "DeviceInfo"; + private static final String MESSAGE_ALARM = "Alarm"; + private static final String MESSAGE_RECORD_INFO = "RecordInfo"; +// private static final String MESSAGE_BROADCAST = "Broadcast"; +// private static final String MESSAGE_DEVICE_STATUS = "DeviceStatus"; +// private static final String MESSAGE_MOBILE_POSITION = "MobilePosition"; +// private static final String MESSAGE_MOBILE_POSITION_INTERVAL = "Interval"; /** * 澶勭悊MESSAGE璇锋眰 * * @param evt - * @param layer - * @param transaction */ @Override - public void process(RequestEvent evt, SipLayer layer, ServerTransaction transaction) { - - this.layer = layer; - this.transaction = transaction; - - Request request = evt.getRequest(); - - if (new String(request.getRawContent()).contains("<CmdType>Keepalive</CmdType>")) { - processMessageKeepAlive(evt); - } else if (new String(request.getRawContent()).contains("<CmdType>Catalog</CmdType>")) { - processMessageCatalogList(evt); - } else if (new String(request.getRawContent()).contains("<CmdType>DeviceInfo</CmdType>")) { - processMessageDeviceInfo(evt); - } else if (new String(request.getRawContent()).contains("<CmdType>Alarm</CmdType>")) { - processMessageAlarm(evt); - } else if (new String(request.getRawContent()).contains("<CmdType>recordInfo</CmdType>")) { - processMessageRecordInfo(evt); + public void process(RequestEvent evt) { + + try { + Element rootElement = getRootElement(evt); + String cmd = XmlUtil.getText(rootElement,"CmdType"); + + if (MESSAGE_KEEP_ALIVE.equals(cmd)) { + logger.info("鎺ユ敹鍒癒eepAlive娑堟伅"); + processMessageKeepAlive(evt); + } else if (MESSAGE_CONFIG_DOWNLOAD.equals(cmd)) { + logger.info("鎺ユ敹鍒癈onfigDownload娑堟伅"); + } else if (MESSAGE_CATALOG.equals(cmd)) { + logger.info("鎺ユ敹鍒癈atalog娑堟伅"); + processMessageCatalogList(evt); + } else if (MESSAGE_DEVICE_INFO.equals(cmd)) { + logger.info("鎺ユ敹鍒癉eviceInfo娑堟伅"); + processMessageDeviceInfo(evt); + } else if (MESSAGE_ALARM.equals(cmd)) { + logger.info("鎺ユ敹鍒癆larm娑堟伅"); + processMessageAlarm(evt); + } else if (MESSAGE_RECORD_INFO.equals(cmd)) { + logger.info("鎺ユ敹鍒癛ecordInfo娑堟伅"); + processMessageRecordInfo(evt); + } + } catch (DocumentException e) { + e.printStackTrace(); } - } /** @@ -108,7 +122,10 @@ device.setManufacturer(XmlUtil.getText(rootElement,"Manufacturer")); device.setModel(XmlUtil.getText(rootElement,"Model")); device.setFirmware(XmlUtil.getText(rootElement,"Firmware")); - storager.update(device); + if (StringUtils.isEmpty(device.getStreamMode())){ + device.setStreamMode("UDP"); + } + storager.updateDevice(device); RequestMessage msg = new RequestMessage(); msg.setDeviceId(deviceId); @@ -128,7 +145,7 @@ try { Element rootElement = getRootElement(evt); Element deviceIdElement = rootElement.element("DeviceID"); - String deviceId = deviceIdElement.getText().toString(); + String deviceId = deviceIdElement.getText(); Element deviceListElement = rootElement.element("DeviceList"); if (deviceListElement == null) { return; @@ -139,11 +156,6 @@ if (device == null) { return; } - Map<String, DeviceChannel> channelMap = device.getChannelMap(); - if (channelMap == null) { - channelMap = new HashMap<String, DeviceChannel>(5); - device.setChannelMap(channelMap); - } // 閬嶅巻DeviceList while (deviceListIterator.hasNext()) { Element itemDevice = deviceListIterator.next(); @@ -151,18 +163,18 @@ if (channelDeviceElement == null) { continue; } - String channelDeviceId = channelDeviceElement.getText().toString(); + String channelDeviceId = channelDeviceElement.getText(); Element channdelNameElement = itemDevice.element("Name"); - String channelName = channdelNameElement != null ? channdelNameElement.getText().toString() : ""; + String channelName = channdelNameElement != null ? channdelNameElement.getTextTrim().toString() : ""; Element statusElement = itemDevice.element("Status"); String status = statusElement != null ? statusElement.getText().toString() : "ON"; - DeviceChannel deviceChannel = channelMap.containsKey(channelDeviceId) ? channelMap.get(channelDeviceId) : new DeviceChannel(); + DeviceChannel deviceChannel = new DeviceChannel(); deviceChannel.setName(channelName); deviceChannel.setChannelId(channelDeviceId); - if(status.equals("ON")) { + if(status.equals("ON") || status.equals("On")) { deviceChannel.setStatus(1); } - if(status.equals("OFF")) { + if(status.equals("OFF") || status.equals("Off")) { deviceChannel.setStatus(0); } @@ -173,7 +185,7 @@ deviceChannel.setBlock(XmlUtil.getText(itemDevice,"Block")); deviceChannel.setAddress(XmlUtil.getText(itemDevice,"Address")); deviceChannel.setParental(itemDevice.element("Parental") == null? 0:Integer.parseInt(XmlUtil.getText(itemDevice,"Parental"))); - deviceChannel.setParentId(XmlUtil.getText(itemDevice,"ParentId")); + deviceChannel.setParentId(XmlUtil.getText(itemDevice,"ParentID")); deviceChannel.setSafetyWay(itemDevice.element("SafetyWay") == null? 0:Integer.parseInt(XmlUtil.getText(itemDevice,"SafetyWay"))); deviceChannel.setRegisterWay(itemDevice.element("RegisterWay") == null? 1:Integer.parseInt(XmlUtil.getText(itemDevice,"RegisterWay"))); deviceChannel.setCertNum(XmlUtil.getText(itemDevice,"CertNum")); @@ -186,17 +198,25 @@ deviceChannel.setPassword(XmlUtil.getText(itemDevice,"Password")); deviceChannel.setLongitude(itemDevice.element("Longitude") == null? 0.00:Double.parseDouble(XmlUtil.getText(itemDevice,"Longitude"))); deviceChannel.setLatitude(itemDevice.element("Latitude") == null? 0.00:Double.parseDouble(XmlUtil.getText(itemDevice,"Latitude"))); - channelMap.put(channelDeviceId, deviceChannel); + deviceChannel.setPTZType(itemDevice.element("PTZType") == null? 0:Integer.parseInt(XmlUtil.getText(itemDevice,"PTZType"))); + deviceChannel.setHasAudio(true); // 榛樿鍚湁闊抽锛屾挱鏀炬椂鍐嶆鏌ユ槸鍚︽湁闊抽鍙婃槸鍚AC + storager.updateChannel(device.getDeviceId(), deviceChannel); } - // 鏇存柊 - storager.update(device); + RequestMessage msg = new RequestMessage(); msg.setDeviceId(deviceId); msg.setType(DeferredResultHolder.CALLBACK_CMD_CATALOG); msg.setData(device); deferredResultHolder.invokeResult(msg); + + // 鍥炲200 + if (offLineDetector.isOnline(deviceId)) { + responseAck(evt); + publisher.onlineEventPublish(deviceId, VideoManagerConstants.EVENT_ONLINE_KEEPLIVE); + } + } - } catch (DocumentException e) { + } catch (DocumentException | SipException | InvalidArgumentException | ParseException e) { e.printStackTrace(); } } @@ -213,13 +233,18 @@ Device device = storager.queryVideoDevice(deviceId); if (device == null) { + // TODO 涔熷彲鑳芥槸閫氶亾 +// storager.queryChannel(deviceId) return; } device.setName(XmlUtil.getText(rootElement,"DeviceName")); device.setManufacturer(XmlUtil.getText(rootElement,"Manufacturer")); device.setModel(XmlUtil.getText(rootElement,"Model")); device.setFirmware(XmlUtil.getText(rootElement,"Firmware")); - storager.update(device); + if (StringUtils.isEmpty(device.getStreamMode())){ + device.setStreamMode("UDP"); + } + storager.updateDevice(device); cmder.catalogQuery(device); } catch (DocumentException e) { e.printStackTrace(); @@ -232,12 +257,13 @@ */ private void processMessageKeepAlive(RequestEvent evt){ try { - Request request = evt.getRequest(); - Response response = layer.getMessageFactory().createResponse(Response.OK,request); Element rootElement = getRootElement(evt); - Element deviceIdElement = rootElement.element("DeviceID"); - transaction.sendResponse(response); - publisher.onlineEventPublish(deviceIdElement.getText(), VideoManagerConstants.EVENT_ONLINE_KEEPLIVE); + String deviceId = XmlUtil.getText(rootElement,"DeviceID"); + if (offLineDetector.isOnline(deviceId)) { + responseAck(evt); + publisher.onlineEventPublish(deviceId, VideoManagerConstants.EVENT_ONLINE_KEEPLIVE); + } else { + } } catch (ParseException | SipException | InvalidArgumentException | DocumentException e) { e.printStackTrace(); } @@ -245,6 +271,7 @@ /*** * 鏀跺埌catalog璁惧鐩綍鍒楄〃璇锋眰 澶勭悊 + * TODO 杩囨湡鏃堕棿鏆傛椂鍐欐180绉掞紝鍚庣画涓嶥eferredResult瓒呮椂鏃堕棿淇濇寔涓�鑷� * @param evt */ private void processMessageRecordInfo(RequestEvent evt) { @@ -256,15 +283,15 @@ recordInfo.setDeviceId(deviceId); recordInfo.setName(XmlUtil.getText(rootElement,"Name")); recordInfo.setSumNum(Integer.parseInt(XmlUtil.getText(rootElement,"SumNum"))); + String sn = XmlUtil.getText(rootElement,"SN"); Element recordListElement = rootElement.element("RecordList"); if (recordListElement == null) { return; } Iterator<Element> recordListIterator = recordListElement.elementIterator(); + List<RecordItem> recordList = new ArrayList<RecordItem>(); if (recordListIterator != null) { - - List<RecordItem> recordList = new ArrayList<RecordItem>(); RecordItem record = new RecordItem(); // 閬嶅巻DeviceList while (recordListIterator.hasNext()) { @@ -273,6 +300,7 @@ if (recordElement == null) { continue; } + record = new RecordItem(); record.setDeviceId(XmlUtil.getText(itemRecord,"DeviceID")); record.setName(XmlUtil.getText(itemRecord,"Name")); record.setFilePath(XmlUtil.getText(itemRecord,"FilePath")); @@ -281,16 +309,50 @@ record.setEndTime(DateUtil.ISO8601Toyyyy_MM_dd_HH_mm_ss(XmlUtil.getText(itemRecord,"EndTime"))); record.setSecrecy(itemRecord.element("Secrecy") == null? 0:Integer.parseInt(XmlUtil.getText(itemRecord,"Secrecy"))); record.setType(XmlUtil.getText(itemRecord,"Type")); - record.setRecordId(XmlUtil.getText(itemRecord,"RecordID")); + record.setRecorderId(XmlUtil.getText(itemRecord,"RecorderID")); recordList.add(record); } +// recordList.sort(Comparator.naturalOrder()); recordInfo.setRecordList(recordList); } - + // 瀛樺湪褰曞儚涓斿鏋滃綋鍓嶅綍鍍忔槑缁嗕釜鏁板皬浜庢�绘潯鏁帮紝璇存槑鎷嗗寘杩斿洖锛岄渶瑕佺粍瑁咃紝鏆備笉杩斿洖 + if (recordInfo.getSumNum() > 0 && recordList.size() > 0 && recordList.size() < recordInfo.getSumNum()) { + // 涓洪槻姝㈣繛缁姹傝璁惧鐨勫綍鍍忔暟鎹紝杩斿洖鏁版嵁閿欎贡锛岀壒澧炲姞sn杩涜鍖哄垎 + String cacheKey = CACHE_RECORDINFO_KEY+deviceId+sn; + // TODO 鏆傛椂鐩存帴鎿嶄綔redis瀛樺偍锛屽悗缁皝瑁呬笓鐢ㄧ紦瀛樻帴鍙o紝鏀逛负鏈湴鍐呭瓨缂撳瓨 + if (redis.hasKey(cacheKey)) { + List<RecordItem> previousList = (List<RecordItem>) redis.get(cacheKey); + if (previousList != null && previousList.size() > 0) { + recordList.addAll(previousList); + } + // 鏈垎鏀〃绀哄綍鍍忓垪琛ㄨ鎷嗗寘锛屼笖鍔犱笂涔嬪墠鐨勬暟鎹繕鏄笉澶�,淇濆瓨缂撳瓨杩斿洖锛岀瓑寰呬笅涓寘鍐嶅鐞� + if (recordList.size() < recordInfo.getSumNum()) { + redis.set(cacheKey, recordList, 180); + return; + } else { + // 鏈垎鏀〃绀哄綍鍍忚鎷嗗寘锛屼絾鍔犱笂涔嬪墠鐨勬暟鎹瓒冲锛岃繑鍥炲搷搴� + // 鍥犺澶囧績璺虫湁鐩戝惉redis杩囨湡鏈哄埗锛屼负鎻愰珮鎬ц兘锛屾澶勬墜鍔ㄥ垹闄� + redis.del(cacheKey); + } + } else { + // 鏈垎鏀湁涓ょ鍙兘锛�1銆佸綍鍍忓垪琛ㄨ鎷嗗寘锛屼笖鏄涓�涓寘,鐩存帴淇濆瓨缂撳瓨杩斿洖锛岀瓑寰呬笅涓寘鍐嶅鐞� + // 2銆佷箣鍓嶆湁鍖咃紝浣嗚秴鏃舵竻绌轰簡锛岄偅涔堣繖娆n鎵规鐨勫搷搴旀暟鎹凡缁忎笉瀹屾暣锛岀瓑寰呰繃鏈熸椂闂村悗redis鑷姩娓呯┖鏁版嵁 + redis.set(cacheKey, recordList, 180); + return; + } + + } + // 璧板埌杩欓噷锛屾湁浠ヤ笅鍙兘锛�1銆佹病鏈夊綍鍍忎俊鎭�,绗竴娆℃敹鍒皉ecordinfo鐨勬秷鎭嵆杩斿洖鍝嶅簲鏁版嵁锛屾棤redis鎿嶄綔 + // 2銆佹湁褰曞儚鏁版嵁锛屼笖绗竴娆″嵆鏀跺埌瀹屾暣鏁版嵁锛岃繑鍥炲搷搴旀暟鎹紝鏃爎edis鎿嶄綔 + // 3銆佹湁褰曞儚鏁版嵁锛屽湪瓒呮椂鏃堕棿鍐呮敹鍒板娆″寘缁勮鍚庢暟閲忚冻澶燂紝杩斿洖鏁版嵁 + + // 瀵硅褰曡繘琛屾帓搴� RequestMessage msg = new RequestMessage(); msg.setDeviceId(deviceId); msg.setType(DeferredResultHolder.CALLBACK_CMD_RECORDINFO); + // 鑷劧椤哄簭鎺掑簭, 鍏冪礌杩涜鍗囧簭鎺掑垪 + recordInfo.getRecordList().sort(Comparator.naturalOrder()); msg.setData(recordInfo); deferredResultHolder.invokeResult(msg); } catch (DocumentException e) { @@ -298,12 +360,41 @@ } } + private void responseAck(RequestEvent evt) throws SipException, InvalidArgumentException, ParseException { + Response response = getMessageFactory().createResponse(Response.OK,evt.getRequest()); + getServerTransaction(evt).sendResponse(response); + } + private Element getRootElement(RequestEvent evt) throws DocumentException { Request request = evt.getRequest(); SAXReader reader = new SAXReader(); - reader.setEncoding("GB2312"); + reader.setEncoding("gbk"); Document xml = reader.read(new ByteArrayInputStream(request.getRawContent())); return xml.getRootElement(); } + public void setCmder(SIPCommander cmder) { + this.cmder = cmder; + } + + public void setStorager(IVideoManagerStorager storager) { + this.storager = storager; + } + + public void setPublisher(EventPublisher publisher) { + this.publisher = publisher; + } + + public void setRedis(RedisUtil redis) { + this.redis = redis; + } + + public void setDeferredResultHolder(DeferredResultHolder deferredResultHolder) { + this.deferredResultHolder = deferredResultHolder; + } + + public void setOffLineDetector(DeviceOffLineDetector offLineDetector) { + this.offLineDetector = offLineDetector; + } + } -- Gitblit v1.8.0