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 3 import com.genersoft.iot.vmp.common.VideoManagerConstants;
4 4 import com.genersoft.iot.vmp.conf.SipConfig;
5 5 import com.genersoft.iot.vmp.gb28181.auth.DigestServerAuthenticationHelper;
6   -import com.genersoft.iot.vmp.gb28181.auth.RegisterLogicHandler;
7 6 import com.genersoft.iot.vmp.gb28181.bean.Device;
8 7 import com.genersoft.iot.vmp.gb28181.bean.WvpSipDate;
9 8 import com.genersoft.iot.vmp.gb28181.event.EventPublisher;
... ... @@ -42,166 +41,157 @@ import java.util.Locale;
42 41 @Component
43 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 }
... ...