设备时间超前于服务器时Rest请求无法获取最新状态,如何进行时间同步?
问题原因
你所使用的摄像机事件状态查询接口内置了时间校验逻辑,当设备时间超前于请求发起方的时间时,接口会认为你查询的时间范围内没有新事件,或者直接判定请求非法,因此不会返回最新数据。
解决方案
方案1:主动同步设备时间(代码层面解决)
大部分同协议安防摄像机都支持通过CGI接口设置设备时间,你可以在调用状态查询接口前,先调用时间设置接口将服务器当前时间同步到设备,再执行状态查询即可。参考代码如下:
// 设备时间同步方法 public void SyncDeviceTime(Device obj) { // 按设备要求的格式拼接当前时间,注意时区和设备保持一致 string currentTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); var syncClient = new RestClient($"http://{obj.Address}/stw-cgi/system.cgi?msubmenu=time&action=set&time={Uri.EscapeDataString(currentTime)}"); syncClient.Timeout = 5000; var syncRequest = new RestRequest(Method.GET); syncRequest.Credentials = new NetworkCredential(obj.User, obj.Password); syncClient.Execute(syncRequest); } // 调整后的状态查询逻辑 public void GetStatusDevice(Device obj) { // 可按设备维度加缓存,比如每个设备每24小时同步一次,无需每次查询都同步 SyncDeviceTime(obj); var client = new RestClient($"http://{obj.Address}/stw-cgi/eventstatus.cgi?msubmenu=eventstatus&action=check"); client.Timeout = 5000; var request = new RestRequest(Method.GET); request.Credentials = new NetworkCredential(obj.User, obj.Password); IRestResponse response = client.Execute(request); Console.WriteLine(response.Content); }
方案2:调整查询参数规避时间校验
你可以在状态查询接口的请求参数中增加更早的起始时间参数,覆盖设备可能的时间超前误差,无需修改设备配置:
public void GetStatusDevice(Device obj) { // 提前1小时作为查询起始时间,可根据设备最大时间误差调整偏移量 string startTime = Uri.EscapeDataString(DateTime.Now.AddHours(-1).ToString("yyyy-MM-dd HH:mm:ss")); var client = new RestClient($"http://{obj.Address}/stw-cgi/eventstatus.cgi?msubmenu=eventstatus&action=check&starttime={startTime}"); client.Timeout = 5000; var request = new RestRequest(Method.GET); request.Credentials = new NetworkCredential(obj.User, obj.Password); IRestResponse response = client.Execute(request); Console.WriteLine(response.Content); }
方案3:全局配置NTP同步(运维层面解决)
如果设备属于你方可控范围,直接在设备管理后台配置公共NTP时间同步服务,让所有设备自动和标准时间校准,从根源上避免时间差问题,不需要调整业务代码。
注意事项
- 同步设备时间时要保证服务器时区和设备时区配置一致,避免同步后仍存在固定小时级时间差
- 可根据业务场景调整时间偏移量,若设备最大时间超前误差不超过2小时,可将方案2的
AddHours(-1)改成AddHours(-2) - 建议给接口调用增加异常捕获和重试逻辑,避免网络波动导致同步或查询失败
内容的提问来源于stack exchange,提问作者Felipe Silverio
相关产品推荐
相关产品推荐

