设备链接状态检测与提示 - (第十六讲)
视频讲解如下:
工程源码下载:GPS定位系统系列教程源码下载
判断设备是否在线的原理很简单,就是判断设备的心跳是否存在,正常情况下,下位机设备是会定时上报心跳包的,当上位机接收到心跳包的时候,上位机会复位计数器,重新计数,如果没有接收到心跳包,当计数器达到某个阈值时,系统则认为设备离线了。
1、代码修改
修改的代码主要有三个文件,如下图:

Machine.cs
该文件主要设置心跳包的超时阈值,代码如下,为了方便演示,博主这里设置了5秒
/// <summary>
/// 网络状态
/// <para>0:断线</para>
/// <para>1:连接</para>
/// <para>2:通讯异常</para>
/// </summary>
public int socketstate
{
get
{
if (string.IsNullOrEmpty(ClientIP)) return 0;
// 5秒内未接收到任何数据,则会强制设置成离线。
if (DateTime.Now - lasttime > TimeSpan.FromSeconds(5))
{
ClientIP = null;
return 0;
}
if (string.IsNullOrEmpty(errmsg)) return 1;
return 2;
}
}
HomeController.cs
在控制器中新增一个API,供前端进行链接状态请求:
/// <summary>
/// 获取设备链接状态
/// </summary>
/// <returns></returns>
public ActionResult GetSocket()
{
AjaxResult res = new AjaxResult() { Success = false };
try
{
// 由于初始化的时候,设置的设备类型是1,设备号也是1,所以这边查询的时候也要按这个参数查询
Link.Equipment.GpsModel sense = Link.Res.Socs.FirstOrDefault(v => v.equi == 1 && v.equino.ByteToInt() == 1) as Link.Equipment.GpsModel;
if (sense != null)
{
res.Data = (sense.socketstate == 1) ? 1 : 0;
res.Success = true;
}
else throw new Exception($"未查询到设备");
}
catch (Exception e)
{
res.ErrorCode = e.Message;
}
return Content(res.ToJson());
}
Index.cshtml
最后是我们的前端,新增一个label,来显示设备在线、离线的状态信息:
<label id="devid" style="font-size: 18px;"> 在线 </label>
我们每秒请求一次状态
/* 设备链接状态检测 */
setInterval(function () {
$.post('Home/GetSocket', null, function (resJson) {
var res = JSON.parse(resJson);
if (res.Success) {
if (res.Data == 1)
{
document.getElementById('devid').innerHTML = '在线';
}
else
{
document.getElementById('devid').innerHTML = '离线';
}
}
});
}, 1000);
2、效果演示
