Compare commits

..

No commits in common. "ec45deda5ebbe036bf693b8d2bbb375480027133" and "46e9d56c24308493cd26571f56638258f6913918" have entirely different histories.

9 changed files with 61 additions and 59 deletions

View File

@ -60,7 +60,6 @@
<asciidoctor.html.output.directory>${project.build.directory}/asciidoc/html</asciidoctor.html.output.directory> <asciidoctor.html.output.directory>${project.build.directory}/asciidoc/html</asciidoctor.html.output.directory>
<asciidoctor.pdf.output.directory>${project.build.directory}/asciidoc/pdf</asciidoctor.pdf.output.directory> <asciidoctor.pdf.output.directory>${project.build.directory}/asciidoc/pdf</asciidoctor.pdf.output.directory>
<java.version>21</java.version>
<maven.compiler.source>21</maven.compiler.source> <maven.compiler.source>21</maven.compiler.source>
<maven.compiler.target>21</maven.compiler.target> <maven.compiler.target>21</maven.compiler.target>
</properties> </properties>

View File

@ -1,6 +1,5 @@
package com.genersoft.iot.vmp; package com.genersoft.iot.vmp;
import com.genersoft.iot.vmp.gb28181.event.EventPublisher;
import com.genersoft.iot.vmp.jt1078.util.ClassUtil; import com.genersoft.iot.vmp.jt1078.util.ClassUtil;
import com.genersoft.iot.vmp.utils.GitUtil; import com.genersoft.iot.vmp.utils.GitUtil;
import com.genersoft.iot.vmp.utils.SpringBeanFactory; import com.genersoft.iot.vmp.utils.SpringBeanFactory;
@ -44,7 +43,6 @@ public class VManageBootstrap extends SpringBootServletInitializer {
log.info("构建时间: {}", gitUtil.getBuildDate()); log.info("构建时间: {}", gitUtil.getBuildDate());
log.info("GIT信息 分支: {}, ID: {}, 时间: {}", gitUtil.getBranch(), gitUtil.getCommitIdShort(), gitUtil.getCommitTime()); log.info("GIT信息 分支: {}, ID: {}, 时间: {}", gitUtil.getBranch(), gitUtil.getCommitIdShort(), gitUtil.getCommitTime());
} }
} }
// 项目重启 // 项目重启
public static void restart() { public static void restart() {

View File

@ -20,12 +20,13 @@ public interface IDeviceService {
* 设备上线 * 设备上线
* @param device 设备信息 * @param device 设备信息
*/ */
void online(Device device); void online(Device device, SipTransactionInfo sipTransactionInfo);
/** /**
* 设备下线 * 设备下线
* @param deviceId 设备编号
*/ */
void offline(Device device); void offline(String deviceId, String reason, boolean check);
/** /**
* 添加目录订阅 * 添加目录订阅

View File

@ -17,7 +17,7 @@ import com.genersoft.iot.vmp.gb28181.service.IDeviceService;
import com.genersoft.iot.vmp.gb28181.service.IInviteStreamService; import com.genersoft.iot.vmp.gb28181.service.IInviteStreamService;
import com.genersoft.iot.vmp.gb28181.session.AudioBroadcastManager; import com.genersoft.iot.vmp.gb28181.session.AudioBroadcastManager;
import com.genersoft.iot.vmp.gb28181.session.SipInviteSessionManager; import com.genersoft.iot.vmp.gb28181.session.SipInviteSessionManager;
import com.genersoft.iot.vmp.gb28181.task.deviceStatus.DeviceStatusManager; import com.genersoft.iot.vmp.gb28181.task.deviceStatus.DeviceStatusTaskRunner;
import com.genersoft.iot.vmp.gb28181.task.deviceSubscribe.SubscribeTask; import com.genersoft.iot.vmp.gb28181.task.deviceSubscribe.SubscribeTask;
import com.genersoft.iot.vmp.gb28181.task.deviceSubscribe.SubscribeTaskInfo; import com.genersoft.iot.vmp.gb28181.task.deviceSubscribe.SubscribeTaskInfo;
import com.genersoft.iot.vmp.gb28181.task.deviceSubscribe.SubscribeTaskRunner; import com.genersoft.iot.vmp.gb28181.task.deviceSubscribe.SubscribeTaskRunner;
@ -119,7 +119,7 @@ public class DeviceServiceImpl implements IDeviceService, CommandLineRunner {
private SubscribeTaskRunner subscribeTaskRunner; private SubscribeTaskRunner subscribeTaskRunner;
@Autowired @Autowired
private DeviceStatusManager deviceStatusManager; private DeviceStatusTaskRunner deviceStatusTaskRunner;
private Device getDeviceByDeviceIdFromDb(String deviceId) { private Device getDeviceByDeviceIdFromDb(String deviceId) {
return deviceMapper.getDeviceByDeviceId(deviceId); return deviceMapper.getDeviceByDeviceId(deviceId);
@ -132,7 +132,7 @@ public class DeviceServiceImpl implements IDeviceService, CommandLineRunner {
List<Device> devicesInDb = getAll(); List<Device> devicesInDb = getAll();
if (devicesInDb.isEmpty()) { if (devicesInDb.isEmpty()) {
redisCatchStorage.removeAllDevice(); redisCatchStorage.removeAllDevice();
deviceStatusManager.clear(); deviceStatusTaskRunner.clear();
}else { }else {
List<Device> devicesInRedis = redisCatchStorage.getAllDevices(); List<Device> devicesInRedis = redisCatchStorage.getAllDevices();
if (!devicesInRedis.isEmpty()) { if (!devicesInRedis.isEmpty()) {
@ -152,7 +152,7 @@ public class DeviceServiceImpl implements IDeviceService, CommandLineRunner {
// 重置 cseq 计数 // 重置 cseq 计数
redisCatchStorage.resetAllCSEQ(); redisCatchStorage.resetAllCSEQ();
// 处理设备状态 // 处理设备状态
Set<String> allDeviceIds = deviceStatusManager.getAll(); Set<String> allDeviceIds = deviceStatusTaskRunner.getAll();
if (!allDeviceIds.isEmpty()) { if (!allDeviceIds.isEmpty()) {
// 除了记录的设备以外 其他设备全部离线 // 除了记录的设备以外 其他设备全部离线
List<Device> onlineDevice = getAllOnlineDevice(userSetting.getServerId()); List<Device> onlineDevice = getAllOnlineDevice(userSetting.getServerId());
@ -233,7 +233,7 @@ public class DeviceServiceImpl implements IDeviceService, CommandLineRunner {
for (Device device : offlineDevices) { for (Device device : offlineDevices) {
device.setOnLine(false); device.setOnLine(false);
redisCatchStorage.updateDevice(device); redisCatchStorage.updateDevice(device);
deviceStatusManager.remove(device.getDeviceId()); deviceStatusTaskRunner.removeTask(device.getDeviceId());
} }
} }
@ -244,7 +244,7 @@ public class DeviceServiceImpl implements IDeviceService, CommandLineRunner {
if (subscribeTaskRunner.containsKey(SubscribeTaskForMobilPosition.getKey(device))) { if (subscribeTaskRunner.containsKey(SubscribeTaskForMobilPosition.getKey(device))) {
subscribeTaskRunner.removeSubscribe(SubscribeTaskForMobilPosition.getKey(device)); subscribeTaskRunner.removeSubscribe(SubscribeTaskForMobilPosition.getKey(device));
} }
deviceStatusManager.remove(device.getDeviceId()); deviceStatusTaskRunner.removeTask(device.getDeviceId());
// 离线释放所有 ssrc // 离线释放所有 ssrc
List<SsrcTransaction> ssrcTransactions = sessionManager.getSsrcTransactionByDeviceId(device.getDeviceId()); List<SsrcTransaction> ssrcTransactions = sessionManager.getSsrcTransactionByDeviceId(device.getDeviceId());
if (ssrcTransactions != null && !ssrcTransactions.isEmpty()) { if (ssrcTransactions != null && !ssrcTransactions.isEmpty()) {
@ -279,18 +279,11 @@ public class DeviceServiceImpl implements IDeviceService, CommandLineRunner {
@EventListener @EventListener
public void onApplicationEvent(DeviceOfflineEvent event) { public void onApplicationEvent(DeviceOfflineEvent event) {
log.info("[设备状态] 到期, 编号: {}", event.getDeviceId()); log.info("[设备状态] 到期, 编号: {}", event.getDeviceId());
Device device = getDeviceByDeviceId(event.getDeviceId()); offline(event.getDeviceId(), "保活到期", true);
Boolean deviceStatus = getDeviceStatus(device);
if (deviceStatus != null && deviceStatus) {
log.info("[设备离线] 主动探测发现设备在线,暂不处理 device{}", event.getDeviceId());
online(device);
return;
}
offline(device);
} }
@Override @Override
public void online(Device device) { public void online(Device device, SipTransactionInfo sipTransactionInfo) {
log.info("[设备上线] deviceId{}->{}:{}", device.getDeviceId(), device.getIp(), device.getPort()); log.info("[设备上线] deviceId{}->{}:{}", device.getDeviceId(), device.getIp(), device.getPort());
Device deviceInRedis = redisCatchStorage.getDevice(device.getDeviceId()); Device deviceInRedis = redisCatchStorage.getDevice(device.getDeviceId());
Device deviceInDb = getDeviceByDeviceIdFromDb(device.getDeviceId()); Device deviceInDb = getDeviceByDeviceIdFromDb(device.getDeviceId());
@ -308,6 +301,13 @@ public class DeviceServiceImpl implements IDeviceService, CommandLineRunner {
device.setHeartBeatInterval(60); device.setHeartBeatInterval(60);
device.setPositionCapability(0); device.setPositionCapability(0);
} }
if (sipTransactionInfo != null) {
device.setSipTransactionInfo(sipTransactionInfo);
}else {
if (deviceInRedis != null) {
device.setSipTransactionInfo(deviceInRedis.getSipTransactionInfo());
}
}
// 第一次上线 或则设备之前是离线状态--进行通道同步和设备信息查询 // 第一次上线 或则设备之前是离线状态--进行通道同步和设备信息查询
if (deviceInDb == null) { if (deviceInDb == null) {
@ -371,17 +371,28 @@ public class DeviceServiceImpl implements IDeviceService, CommandLineRunner {
} }
// 设备状态任务添加 // 设备状态任务添加
long expiresTime = Math.min(device.getExpires(), device.getHeartBeatInterval() * device.getHeartBeatCount()) * 1000L; long expiresTime = Math.min(device.getExpires(), device.getHeartBeatInterval() * device.getHeartBeatCount()) * 1000L;
deviceStatusManager.add(device.getDeviceId(), expiresTime + System.currentTimeMillis()); deviceStatusTaskRunner.addTask(device.getDeviceId(), expiresTime + System.currentTimeMillis());
} }
@Override @Override
public void offline(Device device) { @Transactional
public void offline(String deviceId, String reason, boolean check) {
Device device = getDeviceByDeviceIdFromDb(deviceId);
if (device == null) { if (device == null) {
log.warn("[设备不存在]"); log.warn("[设备不存在] device{}", deviceId);
return; return;
} }
String deviceId = device.getDeviceId();
log.info("[设备离线] device{} 心跳间隔: {},心跳超时次数: {} 上次心跳时间:{} 上次注册时间: {}", deviceId, // 主动查询设备状态, 没有HostAddress无法发送请求可能是手动添加的设备
if (check && device.getHostAddress() != null) {
Boolean deviceStatus = getDeviceStatus(device);
if (deviceStatus != null && deviceStatus) {
log.info("[设备离线] 主动探测发现设备在线,暂不处理 device{}", deviceId);
online(device, null);
return;
}
}
log.info("[设备离线] {}, device{} 心跳间隔: {},心跳超时次数: {} 上次心跳时间:{} 上次注册时间: {}", reason, deviceId,
device.getHeartBeatInterval(), device.getHeartBeatCount(), device.getKeepaliveTime(), device.getRegisterTime()); device.getHeartBeatInterval(), device.getHeartBeatCount(), device.getKeepaliveTime(), device.getRegisterTime());
device.setOnLine(false); device.setOnLine(false);
cleanOfflineDevice(device); cleanOfflineDevice(device);
@ -807,8 +818,8 @@ public class DeviceServiceImpl implements IDeviceService, CommandLineRunner {
if (subscribeTaskRunner.containsKey(SubscribeTaskForMobilPosition.getKey(device))) { if (subscribeTaskRunner.containsKey(SubscribeTaskForMobilPosition.getKey(device))) {
removeMobilePositionSubscribe(device, null); removeMobilePositionSubscribe(device, null);
} }
if (deviceStatusManager.contains(deviceId)) { if (deviceStatusTaskRunner.containsKey(deviceId)) {
deviceStatusManager.remove(deviceId); deviceStatusTaskRunner.removeTask(deviceId);
} }
List<CommonGBChannel> commonGBChannels = commonGBChannelMapper.queryByDataTypeAndDeviceIds(1, List.of(device.getId())); List<CommonGBChannel> commonGBChannels = commonGBChannelMapper.queryByDataTypeAndDeviceIds(1, List.of(device.getId()));
@ -956,7 +967,7 @@ public class DeviceServiceImpl implements IDeviceService, CommandLineRunner {
updateDevice(deviceInDb); updateDevice(deviceInDb);
long expiresTime = Math.min(device.getExpires(), device.getHeartBeatInterval() * device.getHeartBeatCount()) * 1000L; long expiresTime = Math.min(device.getExpires(), device.getHeartBeatInterval() * device.getHeartBeatCount()) * 1000L;
deviceStatusManager.add(device.getDeviceId(), expiresTime + System.currentTimeMillis()); deviceStatusTaskRunner.addTask(device.getDeviceId(), expiresTime + System.currentTimeMillis());
} }
} }
@ -1185,9 +1196,9 @@ public class DeviceServiceImpl implements IDeviceService, CommandLineRunner {
try { try {
sipCommander.deviceStatusQuery(device, (code, msg, data) -> { sipCommander.deviceStatusQuery(device, (code, msg, data) -> {
if ("ONLINE".equalsIgnoreCase(data.trim())) { if ("ONLINE".equalsIgnoreCase(data.trim())) {
online(device); online(device, null);
}else { }else {
offline(device); offline(device.getDeviceId(), "设备状态查询结果:" + data.trim(), true);
} }
if (callback != null) { if (callback != null) {
callback.run(code, msg, data); callback.run(code, msg, data);

View File

@ -215,8 +215,7 @@ public class CatalogDataManager implements CommandLineRunner {
redisTemplate.delete(key); redisTemplate.delete(key);
} }
//每5秒执行一次, 发现数据5秒未更新则移除数据并认为数据接收超时 @Scheduled(fixedDelay = 5, timeUnit = TimeUnit.SECONDS) //每5秒执行一次, 发现数据5秒未更新则移除数据并认为数据接收超时
@Scheduled(fixedDelay = 5, timeUnit = TimeUnit.SECONDS)
private void timerTask(){ private void timerTask(){
if (dataMap.isEmpty()) { if (dataMap.isEmpty()) {
return; return;

View File

@ -4,20 +4,23 @@ import com.genersoft.iot.vmp.conf.UserSetting;
import com.genersoft.iot.vmp.gb28181.bean.Device; import com.genersoft.iot.vmp.gb28181.bean.Device;
import com.genersoft.iot.vmp.gb28181.event.EventPublisher; import com.genersoft.iot.vmp.gb28181.event.EventPublisher;
import com.genersoft.iot.vmp.storager.IRedisCatchStorage; import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
import com.genersoft.iot.vmp.utils.redis.RedisUtil;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.ObjectUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.Scheduled; import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
import java.util.Set; import java.util.Set;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.lang.Thread;
@Slf4j @Slf4j
@Component @Component
public class DeviceStatusManager { public class DeviceStatusTaskRunner {
@Autowired @Autowired
private RedisTemplate<String, String> redisTemplate; private RedisTemplate<String, String> redisTemplate;
@ -38,9 +41,9 @@ public class DeviceStatusManager {
} }
/** /**
* 状态过期检查, 每秒检查一次 系统启动10秒后开始检查 * 状态过期检查
*/ */
@Scheduled(fixedDelay = 1, initialDelay = 10, timeUnit = TimeUnit.SECONDS) @Scheduled(fixedDelay = 1, timeUnit = TimeUnit.SECONDS)
public void expirationCheck(){ public void expirationCheck(){
long now = System.currentTimeMillis(); long now = System.currentTimeMillis();
// 获取已过期的 deviceId (Score 介于 0 现在之间) // 获取已过期的 deviceId (Score 介于 0 现在之间)
@ -53,7 +56,7 @@ public class DeviceStatusManager {
for (String deviceId : expiredIds) { for (String deviceId : expiredIds) {
Thread.startVirtualThread(() -> { Thread.startVirtualThread(() -> {
// 获取详情后删除缓存 // 获取详情后删除缓存
// Device device = redisCatchStorage.getDevice(deviceId); Device device = redisCatchStorage.getDevice(deviceId);
// redisCatchStorage.removeDevice(deviceId); // redisCatchStorage.removeDevice(deviceId);
// 发送 Spring 异步事件 // 发送 Spring 异步事件
eventPublisher.deviceOfflineEventPublish(deviceId); eventPublisher.deviceOfflineEventPublish(deviceId);
@ -62,15 +65,15 @@ public class DeviceStatusManager {
} }
} }
public void add(String deviceId, long expireTime) { public void addTask(String deviceId, long expireTime) {
redisTemplate.opsForZSet().add(redisKey(), deviceId, expireTime); redisTemplate.opsForZSet().add(redisKey(), deviceId, expireTime);
} }
public void remove(String deviceId) { public void removeTask(String deviceId) {
redisTemplate.opsForZSet().remove(redisKey(), deviceId); redisTemplate.opsForZSet().remove(redisKey(), deviceId);
} }
public boolean contains(String deviceId) { public boolean containsKey(String deviceId) {
if (ObjectUtils.isEmpty(deviceId)) { if (ObjectUtils.isEmpty(deviceId)) {
return false; return false;
} }

View File

@ -23,7 +23,6 @@ import gov.nist.javax.sip.message.SIPResponse;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.util.ObjectUtils; import org.springframework.util.ObjectUtils;
@ -39,9 +38,6 @@ import java.security.NoSuchAlgorithmException;
import java.text.ParseException; import java.text.ParseException;
import java.util.Calendar; import java.util.Calendar;
import java.util.Locale; import java.util.Locale;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.TimeUnit;
/** /**
* SIP命令类型 REGISTER请求 * SIP命令类型 REGISTER请求
@ -67,7 +63,6 @@ public class RegisterRequestProcessor extends SIPRequestProcessorParent implemen
@Autowired @Autowired
private UserSetting userSetting; private UserSetting userSetting;
@Override @Override
public void afterPropertiesSet() throws Exception { public void afterPropertiesSet() throws Exception {
// 添加消息处理的订阅 // 添加消息处理的订阅
@ -120,9 +115,9 @@ public class RegisterRequestProcessor extends SIPRequestProcessorParent implemen
device.setTransport("TCP".equalsIgnoreCase(transport) ? "TCP" : "UDP"); device.setTransport("TCP".equalsIgnoreCase(transport) ? "TCP" : "UDP");
sipSender.transmitRequest(request.getLocalAddress().getHostAddress(), registerOkResponse); sipSender.transmitRequest(request.getLocalAddress().getHostAddress(), registerOkResponse);
device.setRegisterTime(DateUtil.getNow()); device.setRegisterTime(DateUtil.getNow());
deviceService.online(device); deviceService.online(device, null);
} else { } else {
deviceService.offline(device); deviceService.offline(deviceId, "主动注销", false);
} }
return; return;
}else { }else {
@ -130,7 +125,6 @@ public class RegisterRequestProcessor extends SIPRequestProcessorParent implemen
if (!ObjectUtils.isEmpty(device.getPassword()) || !ObjectUtils.isEmpty(sipConfig.getPassword())) { if (!ObjectUtils.isEmpty(device.getPassword()) || !ObjectUtils.isEmpty(sipConfig.getPassword())) {
password = (!ObjectUtils.isEmpty(device.getPassword())) ? device.getPassword() : sipConfig.getPassword(); password = (!ObjectUtils.isEmpty(device.getPassword())) ? device.getPassword() : sipConfig.getPassword();
} }
// 如果设置了一个无密码的设备那么这里就会自动跳动后续会直接注册成功
} }
}else { }else {
if (ObjectUtils.isEmpty(sipConfig.getPassword())) { if (ObjectUtils.isEmpty(sipConfig.getPassword())) {
@ -231,11 +225,10 @@ public class RegisterRequestProcessor extends SIPRequestProcessorParent implemen
log.info("[注册成功] deviceId: {}->{}", deviceId, requestAddress); log.info("[注册成功] deviceId: {}->{}", deviceId, requestAddress);
device.setRegisterTime(DateUtil.getNow()); device.setRegisterTime(DateUtil.getNow());
SipTransactionInfo sipTransactionInfo = new SipTransactionInfo((SIPResponse) response); SipTransactionInfo sipTransactionInfo = new SipTransactionInfo((SIPResponse) response);
device.setSipTransactionInfo(sipTransactionInfo); deviceService.online(device, sipTransactionInfo);
deviceService.online(device);
} else { } else {
log.info("[注销成功] deviceId: {}->{}", deviceId, requestAddress); log.info("[注销成功] deviceId: {}->{}", deviceId, requestAddress);
deviceService.offline(device); deviceService.offline(deviceId, "主动注销", false);
} }
} catch (SipException | NoSuchAlgorithmException | ParseException e) { } catch (SipException | NoSuchAlgorithmException | ParseException e) {
log.error("未处理的异常 ", e); log.error("未处理的异常 ", e);
@ -263,5 +256,4 @@ public class RegisterRequestProcessor extends SIPRequestProcessorParent implemen
return response; return response;
} }
} }

View File

@ -5,7 +5,7 @@ import com.genersoft.iot.vmp.conf.UserSetting;
import com.genersoft.iot.vmp.gb28181.bean.Device; import com.genersoft.iot.vmp.gb28181.bean.Device;
import com.genersoft.iot.vmp.gb28181.bean.Platform; import com.genersoft.iot.vmp.gb28181.bean.Platform;
import com.genersoft.iot.vmp.gb28181.service.IDeviceService; import com.genersoft.iot.vmp.gb28181.service.IDeviceService;
import com.genersoft.iot.vmp.gb28181.task.deviceStatus.DeviceStatusManager; import com.genersoft.iot.vmp.gb28181.task.deviceStatus.DeviceStatusTaskRunner;
import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent; import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent;
import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.IMessageHandler; import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.IMessageHandler;
import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.notify.NotifyMessageHandler; import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.notify.NotifyMessageHandler;
@ -49,7 +49,7 @@ public class KeepaliveNotifyMessageHandler extends SIPRequestProcessorParent imp
private IDeviceService deviceService; private IDeviceService deviceService;
@Autowired @Autowired
private DeviceStatusManager statusTaskRunner; private DeviceStatusTaskRunner statusTaskRunner;
@Autowired @Autowired
private UserSetting userSetting; private UserSetting userSetting;
@ -71,7 +71,7 @@ public class KeepaliveNotifyMessageHandler extends SIPRequestProcessorParent imp
RemoteAddressInfo remoteAddressInfo = SipUtils.getRemoteAddressFromRequest(request, userSetting.getSipUseSourceIpAsRemoteAddress()); RemoteAddressInfo remoteAddressInfo = SipUtils.getRemoteAddressFromRequest(request, userSetting.getSipUseSourceIpAsRemoteAddress());
if (device.getIp() == null || !device.getIp().equalsIgnoreCase(remoteAddressInfo.getIp()) || device.getPort() != remoteAddressInfo.getPort()) { if (device.getIp() == null || !device.getIp().equalsIgnoreCase(remoteAddressInfo.getIp()) || device.getPort() != remoteAddressInfo.getPort()) {
log.info("[收到心跳] 地址变化, {}({}), {}:{}->{}:{}", device.getName(), device.getDeviceId(), device.getIp(), device.getPort(), remoteAddressInfo.getIp(), remoteAddressInfo.getPort()); log.info("[收到心跳] 地址变化, {}({}), {}:{}->{}", device.getName(), device.getDeviceId(), remoteAddressInfo.getIp(), remoteAddressInfo.getPort(), request.getLocalAddress().getHostAddress());
device.setPort(remoteAddressInfo.getPort()); device.setPort(remoteAddressInfo.getPort());
device.setHostAddress(IpPortUtil.concatenateIpAndPort(remoteAddressInfo.getIp(), String.valueOf(remoteAddressInfo.getPort()))); device.setHostAddress(IpPortUtil.concatenateIpAndPort(remoteAddressInfo.getIp(), String.valueOf(remoteAddressInfo.getPort())));
device.setIp(remoteAddressInfo.getIp()); device.setIp(remoteAddressInfo.getIp());
@ -83,11 +83,11 @@ public class KeepaliveNotifyMessageHandler extends SIPRequestProcessorParent imp
if (device.isOnLine()) { if (device.isOnLine()) {
taskQueue.add(device); taskQueue.add(device);
long expiresTime = Math.min(device.getExpires(), device.getHeartBeatInterval() * device.getHeartBeatCount()) * 1000L; long expiresTime = Math.min(device.getExpires(), device.getHeartBeatInterval() * device.getHeartBeatCount()) * 1000L;
statusTaskRunner.add(device.getDeviceId(), expiresTime + System.currentTimeMillis()); statusTaskRunner.addTask(device.getDeviceId(), expiresTime + System.currentTimeMillis());
} else { } else {
if (userSetting.getGbDeviceOnline() == 1) { if (userSetting.getGbDeviceOnline() == 1) {
// 对于已经离线的设备判断他的注册是否已经过期 // 对于已经离线的设备判断他的注册是否已经过期
deviceService.online(device); deviceService.online(device, null);
} }
} }
} }

View File

@ -29,7 +29,6 @@ import java.util.Collections;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.ConcurrentLinkedQueue;
import java.lang.Thread;
/** /**
* 目录查询的回复 * 目录查询的回复