| package com.genersoft.iot.vmp.gb28181.transmit.request.impl;  | 
|   | 
| import java.util.HashMap;  | 
| import java.util.Map;  | 
|   | 
| import javax.sip.*;  | 
| import javax.sip.address.SipURI;  | 
| import javax.sip.header.FromHeader;  | 
| import javax.sip.header.HeaderAddress;  | 
| import javax.sip.header.ToHeader;  | 
|   | 
| import com.genersoft.iot.vmp.common.StreamInfo;  | 
| import com.genersoft.iot.vmp.gb28181.bean.SendRtpItem;  | 
| import com.genersoft.iot.vmp.gb28181.transmit.request.SIPRequestAbstractProcessor;  | 
| import com.genersoft.iot.vmp.media.zlm.ZLMRTPServerFactory;  | 
| import com.genersoft.iot.vmp.storager.IRedisCatchStorage;  | 
|   | 
| /**      | 
|  * @Description:ACK请求处理器    | 
|  * @author: swwheihei  | 
|  * @date:   2020年5月3日 下午5:31:45       | 
|  */  | 
| public class AckRequestProcessor extends SIPRequestAbstractProcessor {  | 
|   | 
|     private IRedisCatchStorage redisCatchStorage;  | 
|   | 
|     private ZLMRTPServerFactory zlmrtpServerFactory;  | 
|   | 
|     /**     | 
|      * 处理  ACK请求  | 
|      *   | 
|      * @param evt  | 
|      */  | 
|     @Override  | 
|     public void process(RequestEvent evt) {  | 
|         //Request request = evt.getRequest();  | 
|         Dialog dialog = evt.getDialog();  | 
|         if (dialog == null) return;  | 
|         //DialogState state = dialog.getState();  | 
|         if (/*request.getMecodewwthod().equals(Request.INVITE) &&*/ dialog.getState()== DialogState.CONFIRMED) {  | 
|             String platformGbId = ((SipURI) ((HeaderAddress) evt.getRequest().getHeader(FromHeader.NAME)).getAddress().getURI()).getUser();  | 
|             String channelId = ((SipURI) ((HeaderAddress) evt.getRequest().getHeader(ToHeader.NAME)).getAddress().getURI()).getUser();  | 
|             SendRtpItem sendRtpItem =  redisCatchStorage.querySendRTPServer(platformGbId, channelId);  | 
|             String is_Udp = sendRtpItem.isTcp() ? "0" : "1";  | 
|             String deviceId = sendRtpItem.getDeviceId();  | 
|             StreamInfo streamInfo = null;  | 
|             if (deviceId == null) {  | 
|                 streamInfo = new StreamInfo();  | 
|                 streamInfo.setApp(sendRtpItem.getApp());  | 
|                 streamInfo.setStreamId(sendRtpItem.getStreamId());  | 
|             }else {  | 
|                 streamInfo = redisCatchStorage.queryPlayByDevice(deviceId, channelId);  | 
|                 sendRtpItem.setStreamId(streamInfo.getStreamId());  | 
|                 streamInfo.setApp("rtp");  | 
|             }  | 
|   | 
|             redisCatchStorage.updateSendRTPSever(sendRtpItem);  | 
|             System.out.println(platformGbId);  | 
|             System.out.println(channelId);  | 
|             Map<String, Object> param = new HashMap<>();  | 
|             param.put("vhost","__defaultVhost__");  | 
|             param.put("app",streamInfo.getApp());  | 
|             param.put("stream",streamInfo.getStreamId());  | 
|             param.put("ssrc", sendRtpItem.getSsrc());  | 
|             param.put("dst_url",sendRtpItem.getIp());  | 
|             param.put("dst_port", sendRtpItem.getPort());  | 
|             param.put("is_udp", is_Udp);  | 
|             //param.put ("src_port", sendRtpItem.getLocalPort());  | 
|             // 设备推流查询,成功后才能转推  | 
|             boolean rtpPushed = false;  | 
|             long startTime = System.currentTimeMillis();  | 
|             while (!rtpPushed) {  | 
|                 try {  | 
|                     if (System.currentTimeMillis() - startTime < 30 * 1000) {  | 
|                         if (zlmrtpServerFactory.isStreamReady(streamInfo.getApp(), streamInfo.getStreamId())) {  | 
|                             rtpPushed = true;  | 
|                             System.out.println("已获取设备推流,开始向上级推流");  | 
|                             zlmrtpServerFactory.startSendRtpStream(param);  | 
|                         } else {  | 
|                             System.out.println("等待设备推流.......");  | 
|                             Thread.sleep(1000);  | 
|                             continue;  | 
|                         }  | 
|                     } else {  | 
|                         rtpPushed = true;  | 
|                         System.out.println("设备推流超时,终止向上级推流");  | 
|                     }  | 
|                 } catch (InterruptedException e) {  | 
|                     e.printStackTrace();  | 
|                 }  | 
|             }  | 
|         }  | 
|         // try {  | 
|         //     Request ackRequest = null;  | 
|         //     CSeq csReq = (CSeq) request.getHeader(CSeq.NAME);  | 
|         //     ackRequest = dialog.createAck(csReq.getSeqNumber());  | 
|         //     dialog.sendAck(ackRequest);  | 
|         //     System.out.println("send ack to callee:" + ackRequest.toString());  | 
|         // } catch (SipException e) {  | 
|         //     e.printStackTrace();  | 
|         // } catch (InvalidArgumentException e) {  | 
|         //     e.printStackTrace();  | 
|         // }  | 
|           | 
|     }  | 
|   | 
|     public IRedisCatchStorage getRedisCatchStorage() {  | 
|         return redisCatchStorage;  | 
|     }  | 
|   | 
|     public void setRedisCatchStorage(IRedisCatchStorage redisCatchStorage) {  | 
|         this.redisCatchStorage = redisCatchStorage;  | 
|     }  | 
|   | 
|     public ZLMRTPServerFactory getZlmrtpServerFactory() {  | 
|         return zlmrtpServerFactory;  | 
|     }  | 
|   | 
|     public void setZlmrtpServerFactory(ZLMRTPServerFactory zlmrtpServerFactory) {  | 
|         this.zlmrtpServerFactory = zlmrtpServerFactory;  | 
|     }  | 
| }  |