|  |  | 
 |  |  | import org.springframework.beans.factory.InitializingBean; | 
 |  |  | import org.springframework.beans.factory.annotation.Autowired; | 
 |  |  | import org.springframework.stereotype.Component; | 
 |  |  | import org.springframework.util.ObjectUtils; | 
 |  |  | import org.springframework.util.StringUtils; | 
 |  |  |  | 
 |  |  | import javax.sip.InvalidArgumentException; | 
 |  |  | 
 |  |  | import javax.sip.header.ViaHeader; | 
 |  |  | import javax.sip.message.Response; | 
 |  |  | import java.text.ParseException; | 
 |  |  | import java.util.Calendar; | 
 |  |  | import java.util.Date; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  |  * 状态信息(心跳)报送 | 
 |  |  |  */ | 
 |  |  | @Component | 
 |  |  | public class KeepaliveNotifyMessageHandler extends SIPRequestProcessorParent implements InitializingBean, IMessageHandler { | 
 |  |  |  | 
 |  |  | 
 |  |  |             return; | 
 |  |  |         } | 
 |  |  |         try { | 
 |  |  |             // 判断RPort是否改变,改变则说明路由nat信息变化,修改设备信息 | 
 |  |  |             // 获取到通信地址等信息 | 
 |  |  |             ViaHeader viaHeader = (ViaHeader) evt.getRequest().getHeader(ViaHeader.NAME); | 
 |  |  |             String received = viaHeader.getReceived(); | 
 |  |  |             int rPort = viaHeader.getRPort(); | 
 |  |  |             // 解析本地地址替代 | 
 |  |  |             if (ObjectUtils.isEmpty(received) || rPort == -1) { | 
 |  |  |                 received = viaHeader.getHost(); | 
 |  |  |                 rPort = viaHeader.getPort(); | 
 |  |  |             } | 
 |  |  |             if (device.getPort() != rPort) { | 
 |  |  |                 device.setPort(rPort); | 
 |  |  |                 device.setHostAddress(received.concat(":").concat(String.valueOf(rPort))); | 
 |  |  |             } | 
 |  |  |             device.setKeepaliveTime(DateUtil.getNow()); | 
 |  |  |             // 回复200 OK | 
 |  |  |             responseAck(evt, Response.OK); | 
 |  |  |             if (device.getOnline() == 1) { | 
 |  |  |                 // 回复200 OK | 
 |  |  |                 responseAck(evt, Response.OK); | 
 |  |  |                 deviceService.updateDevice(device); | 
 |  |  |             }else { | 
 |  |  |                 // 对于已经离线的设备判断他的注册是否已经过期 | 
 |  |  |                 if (!deviceService.expire(device)){ | 
 |  |  |                     device.setKeepaliveTime(DateUtil.getNow()); | 
 |  |  |                     // 判断RPort是否改变,改变则说明路由nat信息变化,修改设备信息 | 
 |  |  |                     // 获取到通信地址等信息 | 
 |  |  |                     ViaHeader viaHeader = (ViaHeader) evt.getRequest().getHeader(ViaHeader.NAME); | 
 |  |  |                     String received = viaHeader.getReceived(); | 
 |  |  |                     int rPort = viaHeader.getRPort(); | 
 |  |  |                     // 解析本地地址替代 | 
 |  |  |                     if (StringUtils.isEmpty(received) || rPort == -1) { | 
 |  |  |                         received = viaHeader.getHost(); | 
 |  |  |                         rPort = viaHeader.getPort(); | 
 |  |  |                     } | 
 |  |  |                     if (device.getPort() != rPort) { | 
 |  |  |                         device.setPort(rPort); | 
 |  |  |                         device.setHostAddress(received.concat(":").concat(String.valueOf(rPort))); | 
 |  |  |                     } | 
 |  |  |                     deviceService.online(device); | 
 |  |  |                     // 回复200 OK | 
 |  |  |                     responseAck(evt, Response.OK); | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |         } catch (SipException e) { |