Commit 6bb8f45e270681dbcb70aed663b406e7d905e091

Authored by xiaoxie
1 parent 0dc1807f

优化摄像头注册流程

src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/RegisterRequestProcessor.java
@@ -3,7 +3,6 @@ package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl; @@ -3,7 +3,6 @@ package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl;
3 import com.genersoft.iot.vmp.common.VideoManagerConstants; 3 import com.genersoft.iot.vmp.common.VideoManagerConstants;
4 import com.genersoft.iot.vmp.conf.SipConfig; 4 import com.genersoft.iot.vmp.conf.SipConfig;
5 import com.genersoft.iot.vmp.gb28181.auth.DigestServerAuthenticationHelper; 5 import com.genersoft.iot.vmp.gb28181.auth.DigestServerAuthenticationHelper;
6 -import com.genersoft.iot.vmp.gb28181.auth.RegisterLogicHandler;  
7 import com.genersoft.iot.vmp.gb28181.bean.Device; 6 import com.genersoft.iot.vmp.gb28181.bean.Device;
8 import com.genersoft.iot.vmp.gb28181.bean.WvpSipDate; 7 import com.genersoft.iot.vmp.gb28181.bean.WvpSipDate;
9 import com.genersoft.iot.vmp.gb28181.event.EventPublisher; 8 import com.genersoft.iot.vmp.gb28181.event.EventPublisher;
@@ -42,166 +41,157 @@ import java.util.Locale; @@ -42,166 +41,157 @@ import java.util.Locale;
42 @Component 41 @Component
43 public class RegisterRequestProcessor extends SIPRequestProcessorParent implements InitializingBean, ISIPRequestProcessor { 42 public class RegisterRequestProcessor extends SIPRequestProcessorParent implements InitializingBean, ISIPRequestProcessor {
44 43
45 - private Logger logger = LoggerFactory.getLogger(RegisterRequestProcessor.class);  
46 -  
47 - public String method = "REGISTER";  
48 -  
49 - @Autowired  
50 - private SipConfig sipConfig;  
51 -  
52 - @Autowired  
53 - private RegisterLogicHandler handler;  
54 -  
55 - @Autowired  
56 - private IRedisCatchStorage redisCatchStorage;  
57 -  
58 - @Autowired  
59 - private IVideoManagerStorage storager;  
60 -  
61 - @Autowired  
62 - private EventPublisher publisher;  
63 -  
64 - @Autowired  
65 - private SIPProcessorObserver sipProcessorObserver;  
66 -  
67 - @Override  
68 - public void afterPropertiesSet() throws Exception {  
69 - // 添加消息处理的订阅  
70 - sipProcessorObserver.addRequestProcessor(method, this);  
71 - }  
72 -  
73 - /**  
74 - * 收到注册请求 处理  
75 - * @param evt  
76 - */  
77 - @Override  
78 - public void process(RequestEvent evt) {  
79 - try {  
80 - RequestEventExt evtExt = (RequestEventExt)evt;  
81 - String requestAddress = evtExt.getRemoteIpAddress() + ":" + evtExt.getRemotePort();  
82 - logger.info("[{}] 收到注册请求,开始处理", requestAddress);  
83 - Request request = evt.getRequest();  
84 - ExpiresHeader expiresHeader = (ExpiresHeader) request.getHeader(Expires.NAME);  
85 - Response response = null;  
86 - boolean passwordCorrect = false;  
87 - // 注册标志 0:未携带授权头或者密码错误 1:注册成功 2:注销成功  
88 - int registerFlag = 0;  
89 - FromHeader fromHeader = (FromHeader) request.getHeader(FromHeader.NAME);  
90 - AddressImpl address = (AddressImpl) fromHeader.getAddress();  
91 - SipUri uri = (SipUri) address.getURI();  
92 - String deviceId = uri.getUser();  
93 - Device deviceInRedis = redisCatchStorage.getDevice(deviceId);  
94 - Device device = storager.queryVideoDevice(deviceId);  
95 - if (deviceInRedis != null && device == null) {  
96 - // redis 存在脏数据  
97 - redisCatchStorage.clearCatchByDeviceId(deviceId);  
98 - }  
99 - AuthorizationHeader authorhead = (AuthorizationHeader) request.getHeader(AuthorizationHeader.NAME);  
100 - // 校验密码是否正确  
101 - if (authorhead != null) {  
102 - passwordCorrect = new DigestServerAuthenticationHelper().doAuthenticatePlainTextPassword(request,  
103 - sipConfig.getPassword());  
104 - }  
105 - if (StringUtils.isEmpty(sipConfig.getPassword())){  
106 - passwordCorrect = true;  
107 - }  
108 -  
109 - // 未携带授权头或者密码错误 回复401  
110 - if (authorhead == null ) {  
111 -  
112 - logger.info("[{}] 未携带授权头 回复401", requestAddress);  
113 - response = getMessageFactory().createResponse(Response.UNAUTHORIZED, request);  
114 - new DigestServerAuthenticationHelper().generateChallenge(getHeaderFactory(), response, sipConfig.getDomain());  
115 - }else {  
116 - if (!passwordCorrect){  
117 - // 注册失败  
118 - response = getMessageFactory().createResponse(Response.FORBIDDEN, request);  
119 - response.setReasonPhrase("wrong password");  
120 - logger.info("[{}] 密码/SIP服务器ID错误, 回复403", requestAddress);  
121 - }else {  
122 - // 携带授权头并且密码正确  
123 - response = getMessageFactory().createResponse(Response.OK, request);  
124 - // 添加date头  
125 - SIPDateHeader dateHeader = new SIPDateHeader();  
126 - // 使用自己修改的  
127 - WvpSipDate wvpSipDate = new WvpSipDate(Calendar.getInstance(Locale.ENGLISH).getTimeInMillis());  
128 - dateHeader.setDate(wvpSipDate);  
129 - response.addHeader(dateHeader);  
130 -  
131 -  
132 - if (expiresHeader == null) {  
133 - response = getMessageFactory().createResponse(Response.BAD_REQUEST, request);  
134 - ServerTransaction serverTransaction = getServerTransaction(evt);  
135 - serverTransaction.sendResponse(response);  
136 - if (serverTransaction.getDialog() != null) serverTransaction.getDialog().delete();  
137 - return;  
138 - }  
139 - // 添加Contact头  
140 - response.addHeader(request.getHeader(ContactHeader.NAME));  
141 - // 添加Expires头  
142 - response.addHeader(request.getExpires());  
143 -  
144 - // 获取到通信地址等信息  
145 - ViaHeader viaHeader = (ViaHeader) request.getHeader(ViaHeader.NAME);  
146 - String received = viaHeader.getReceived();  
147 - int rPort = viaHeader.getRPort();  
148 - // 解析本地地址替代  
149 - if (StringUtils.isEmpty(received) || rPort == -1) {  
150 - received = viaHeader.getHost();  
151 - rPort = viaHeader.getPort();  
152 - }  
153 - //  
154 -  
155 - if (device == null) {  
156 - device = new Device();  
157 - device.setStreamMode("UDP");  
158 - device.setCharset("GB2312");  
159 - device.setDeviceId(deviceId);  
160 - device.setFirsRegister(true);  
161 - }else {  
162 - if (device.getOnline() == 0) {  
163 - device.setFirsRegister(true);  
164 - }  
165 - }  
166 - device.setIp(received);  
167 - device.setPort(rPort);  
168 - device.setHostAddress(received.concat(":").concat(String.valueOf(rPort)));  
169 - // 注销成功  
170 - if (expiresHeader.getExpires() == 0) {  
171 - registerFlag = 2;  
172 - }  
173 - // 注册成功  
174 - else {  
175 - device.setExpires(expiresHeader.getExpires());  
176 - registerFlag = 1;  
177 - // 判断TCP还是UDP  
178 - boolean isTcp = false;  
179 - ViaHeader reqViaHeader = (ViaHeader) request.getHeader(ViaHeader.NAME);  
180 - String transport = reqViaHeader.getTransport();  
181 - if (transport.equals("TCP")) {  
182 - isTcp = true;  
183 - }  
184 - device.setTransport(isTcp ? "TCP" : "UDP");  
185 - }  
186 - }  
187 - }  
188 -  
189 - ServerTransaction serverTransaction = getServerTransaction(evt);  
190 - serverTransaction.sendResponse(response);  
191 - if (serverTransaction.getDialog() != null) serverTransaction.getDialog().delete();  
192 - // 注册成功  
193 - // 保存到redis  
194 - if (registerFlag == 1 ) {  
195 - logger.info("[{}] 注册成功! deviceId:" + device.getDeviceId(), requestAddress);  
196 - publisher.onlineEventPublish(device, VideoManagerConstants.EVENT_ONLINE_REGISTER, expiresHeader.getExpires());  
197 - } else if (registerFlag == 2) {  
198 - logger.info("[{}] 注销成功! deviceId:" + device.getDeviceId(), requestAddress);  
199 - publisher.outlineEventPublish(device.getDeviceId(), VideoManagerConstants.EVENT_OUTLINE_UNREGISTER);  
200 - }  
201 - } catch (SipException | InvalidArgumentException | NoSuchAlgorithmException | ParseException e) {  
202 - e.printStackTrace();  
203 - }  
204 -  
205 - } 44 + private final Logger logger = LoggerFactory.getLogger(RegisterRequestProcessor.class);
  45 +
  46 + public String method = "REGISTER";
  47 +
  48 + @Autowired
  49 + private SipConfig sipConfig;
  50 +
  51 + @Autowired
  52 + private IRedisCatchStorage redisCatchStorage;
  53 +
  54 + @Autowired
  55 + private IVideoManagerStorage storager;
  56 +
  57 + @Autowired
  58 + private EventPublisher publisher;
  59 +
  60 + @Autowired
  61 + private SIPProcessorObserver sipProcessorObserver;
  62 +
  63 + @Override
  64 + public void afterPropertiesSet() throws Exception {
  65 + // 添加消息处理的订阅
  66 + sipProcessorObserver.addRequestProcessor(method, this);
  67 + }
  68 +
  69 + /**
  70 + * 收到注册请求 处理
  71 + *
  72 + * @param evt
  73 + */
  74 + @Override
  75 + public void process(RequestEvent evt) {
  76 + try {
  77 + RequestEventExt evtExt = (RequestEventExt) evt;
  78 + String requestAddress = evtExt.getRemoteIpAddress() + ":" + evtExt.getRemotePort();
  79 + logger.info("[{}] 收到注册请求,开始处理", requestAddress);
  80 + Request request = evt.getRequest();
  81 + ExpiresHeader expiresHeader = (ExpiresHeader) request.getHeader(Expires.NAME);
  82 + Response response = null;
  83 + boolean passwordCorrect = false;
  84 + // 注册标志 0:未携带授权头或者密码错误 1:注册成功 2:注销成功
  85 + int registerFlag = 0;
  86 + FromHeader fromHeader = (FromHeader) request.getHeader(FromHeader.NAME);
  87 + AddressImpl address = (AddressImpl) fromHeader.getAddress();
  88 + SipUri uri = (SipUri) address.getURI();
  89 + String deviceId = uri.getUser();
  90 +
  91 + AuthorizationHeader authHead = (AuthorizationHeader) request.getHeader(AuthorizationHeader.NAME);
  92 + if (authHead == null) {
  93 + logger.info("[{}] 未携带授权头 回复401", requestAddress);
  94 + response = getMessageFactory().createResponse(Response.UNAUTHORIZED, request);
  95 + new DigestServerAuthenticationHelper().generateChallenge(getHeaderFactory(), response, sipConfig.getDomain());
  96 + sendResponse(evt, response);
  97 + return;
  98 + }
  99 +
  100 + // 校验密码是否正确
  101 + passwordCorrect = StringUtils.isEmpty(sipConfig.getPassword()) ||
  102 + new DigestServerAuthenticationHelper().doAuthenticatePlainTextPassword(request, sipConfig.getPassword());
  103 + // 未携带授权头或者密码错误 回复401
  104 +
  105 + if (!passwordCorrect) {
  106 + // 注册失败
  107 + response = getMessageFactory().createResponse(Response.FORBIDDEN, request);
  108 + response.setReasonPhrase("wrong password");
  109 + logger.info("[{}] 密码/SIP服务器ID错误, 回复403", requestAddress);
  110 + sendResponse(evt, response);
  111 + return;
  112 + }
  113 +
  114 + Device deviceInRedis = redisCatchStorage.getDevice(deviceId);
  115 + Device device = storager.queryVideoDevice(deviceId);
  116 + if (deviceInRedis != null && device == null) {
  117 + // redis 存在脏数据
  118 + redisCatchStorage.clearCatchByDeviceId(deviceId);
  119 + }
  120 + // 携带授权头并且密码正确
  121 + response = getMessageFactory().createResponse(Response.OK, request);
  122 + // 添加date头
  123 + SIPDateHeader dateHeader = new SIPDateHeader();
  124 + // 使用自己修改的
  125 + WvpSipDate wvpSipDate = new WvpSipDate(Calendar.getInstance(Locale.ENGLISH).getTimeInMillis());
  126 + dateHeader.setDate(wvpSipDate);
  127 + response.addHeader(dateHeader);
  128 +
  129 + if (expiresHeader == null) {
  130 + response = getMessageFactory().createResponse(Response.BAD_REQUEST, request);
  131 + ServerTransaction serverTransaction = getServerTransaction(evt);
  132 + serverTransaction.sendResponse(response);
  133 + if (serverTransaction.getDialog() != null) serverTransaction.getDialog().delete();
  134 + return;
  135 + }
  136 + // 添加Contact头
  137 + response.addHeader(request.getHeader(ContactHeader.NAME));
  138 + // 添加Expires头
  139 + response.addHeader(request.getExpires());
  140 +
  141 + // 获取到通信地址等信息
  142 + ViaHeader viaHeader = (ViaHeader) request.getHeader(ViaHeader.NAME);
  143 + String received = viaHeader.getReceived();
  144 + int rPort = viaHeader.getRPort();
  145 + // 解析本地地址替代
  146 + if (StringUtils.isEmpty(received) || rPort == -1) {
  147 + received = viaHeader.getHost();
  148 + rPort = viaHeader.getPort();
  149 + }
  150 + if (device == null) {
  151 + device = new Device();
  152 + device.setStreamMode("UDP");
  153 + device.setCharset("GB2312");
  154 + device.setDeviceId(deviceId);
  155 + device.setFirsRegister(true);
  156 + } else {
  157 + device.setFirsRegister(device.getOnline() == 0);
  158 + }
  159 + device.setIp(received);
  160 + device.setPort(rPort);
  161 + device.setHostAddress(received.concat(":").concat(String.valueOf(rPort)));
  162 + if (expiresHeader.getExpires() == 0) {
  163 + // 注销成功
  164 + registerFlag = 2;
  165 + } else {
  166 + // 注册成功
  167 + device.setExpires(expiresHeader.getExpires());
  168 + registerFlag = 1;
  169 + // 判断TCP还是UDP
  170 + ViaHeader reqViaHeader = (ViaHeader) request.getHeader(ViaHeader.NAME);
  171 + String transport = reqViaHeader.getTransport();
  172 + device.setTransport("TCP".equals(transport) ? "TCP" : "UDP");
  173 + }
  174 +
  175 + sendResponse(evt, response);
  176 + // 注册成功
  177 + // 保存到redis
  178 + if (registerFlag == 1) {
  179 + logger.info("[{}] 注册成功! deviceId:" + deviceId, requestAddress);
  180 + publisher.onlineEventPublish(device, VideoManagerConstants.EVENT_ONLINE_REGISTER, expiresHeader.getExpires());
  181 + } else if (registerFlag == 2) {
  182 + logger.info("[{}] 注销成功! deviceId:" + deviceId, requestAddress);
  183 + publisher.outlineEventPublish(deviceId, VideoManagerConstants.EVENT_OUTLINE_UNREGISTER);
  184 + }
  185 + } catch (SipException | InvalidArgumentException | NoSuchAlgorithmException | ParseException e) {
  186 + e.printStackTrace();
  187 + }
  188 +
  189 + }
  190 +
  191 + private void sendResponse(RequestEvent evt, Response response) throws InvalidArgumentException, SipException {
  192 + ServerTransaction serverTransaction = getServerTransaction(evt);
  193 + serverTransaction.sendResponse(response);
  194 + if (serverTransaction.getDialog() != null) serverTransaction.getDialog().delete();
  195 + }
206 196
207 } 197 }