protected async override void DoWork() { if (!isInit) { await Init(); } Timer.Period = 1000 * 30; //UdpCommunication.UpdSendMessage("hello world!"); await Task.Run(() => { //UDP连接监测 UdpCommunication.ReConnMonitorUPD(); //如果未初始化则继续初始化UDP通讯 if (!UdpCommunication._IsUdpInit) { UdpCommunication._IsUdpInit = UdpCommunication.InitUpdServer(); if (UdpCommunication._IsUdpInit) { Task.Run(() => { AsynRecive(); }); } } }); }
/// <summary> /// 泊位状态检测事件(设备上传) /// </summary> /// <param name="deviceNo">设备编号</param> /// <param name="reviceMsg">泊位状态检测数据帧</param> /// <param name="remotePoint">数据来源的IP地址及端口</param> /// <returns></returns> public async Task DeviceStateChange(string deviceNo, string reviceMsg, IPEndPoint remotePoint) { try { string[] szCommand = reviceMsg.Split(','); string tstamp = szCommand[4]; //时间戳 string seqno = szCommand[5]; //帧序号(设备入网请求、泊位状态检测事件、设备心跳=》以上命令中才存在帧序号) //查询设备是否存在,存在则更新设备状态 var modelInfo = await _deviceInfo.FirstOrDefaultAsync(d => d.DeviceNo == deviceNo); if (modelInfo != null) { //获取消息部分内容 string message = GetMsgContent(reviceMsg); string[] szMsg = message.Split(','); //更新数据库设备信息 modelInfo.MagStatus = int.Parse(szMsg[1]); modelInfo.RadaStatus = int.Parse(szMsg[2]); modelInfo.SynStatus = int.Parse(szMsg[3]); modelInfo.NbSignal = szMsg[4]; modelInfo.Temperature = int.Parse(szMsg[5]); modelInfo.MagneticXYZ = string.Format("{0},{1},{2}", szMsg[6], szMsg[7], szMsg[8]); modelInfo.RadarXYZ = string.Format("{0},{1},{2}", szMsg[9], szMsg[10], szMsg[11]); modelInfo.Distance = int.Parse(szMsg[12]); modelInfo.BatVoltage = szMsg[13]; modelInfo.FwVer = szMsg[14]; modelInfo.HwVer = szMsg[15]; modelInfo.DevHealth = int.Parse(szMsg[16]); modelInfo.healthT = int.Parse(szMsg[17]); modelInfo.DeviceStatus = 1; modelInfo.StatusUpdateTime = DateTime.Now; //更新设备信息 await _deviceInfo.UpdateAsync(modelInfo); } //回复指令 string command = SendCommands.RStateDetection(deviceNo, tstamp, seqno); bool bRet = UdpCommunication.UpdSendMessage(command, remotePoint); if (bRet) { //更新指令回复信息 var cmdModel = await _commandLog.FirstOrDefaultAsync(c => c.DeviceNo == deviceNo && c.Tstamp == tstamp); if (cmdModel != null) { string rMsg = GetMsgContent(command); cmdModel.ResultMessage = rMsg; cmdModel.CmdStatus = 2; await _commandLog.UpdateAsync(cmdModel); } } } catch (Exception ex) { Logger.Error(ex.Message); } }
/// <summary> /// 设备请求入网(设备上传) /// </summary> /// <param name="deviceNo">设备编号</param> /// <param name="reviceMsg">请求入网帧</param> /// <param name="remotePoint">数据来源的IP地址及端口</param> /// <returns></returns> public async Task AccessNetwork(string deviceNo, string reviceMsg, IPEndPoint remotePoint) { try { string[] szCommand = reviceMsg.Split(','); string tstamp = szCommand[4]; //时间戳 string seqno = szCommand[5]; //帧序号(设备入网请求、泊位状态检测事件、设备心跳=》以上命令中才存在帧序号) //回复指令 string command = ""; //查询设备是否注册,如果未注册则请求入网失败 var modelInfo = await _deviceInfo.FirstOrDefaultAsync(d => d.DeviceNo == deviceNo); if (modelInfo == null) { command = SendCommands.RAccessNetwork(deviceNo, tstamp, seqno, false); } else { //获取消息部分内容 string message = GetMsgContent(reviceMsg); string[] szMsg = message.Split(','); //更新数据库设备信息 modelInfo.NbSignal = szMsg[1]; modelInfo.DevHealth = int.Parse(szMsg[2]); modelInfo.BatVoltage = szMsg[3]; modelInfo.FwVer = szMsg[4]; modelInfo.HwVer = szMsg[5]; modelInfo.healthT = int.Parse(szMsg[6]); modelInfo.DeviceStatus = 1; modelInfo.StatusUpdateTime = DateTime.Now; //更新设备信息 await _deviceInfo.UpdateAsync(modelInfo); //获取回复指令 command = SendCommands.RAccessNetwork(deviceNo, tstamp, seqno, true); } bool bRet = UdpCommunication.UpdSendMessage(command, remotePoint); if (bRet) { //更新指令回复信息 var cmdModel = await _commandLog.FirstOrDefaultAsync(c => c.DeviceNo == deviceNo && c.Tstamp == tstamp); if (cmdModel != null) { string rMsg = GetMsgContent(command); cmdModel.ResultMessage = rMsg; cmdModel.CmdStatus = 2; await _commandLog.UpdateAsync(cmdModel); } } } catch (Exception ex) { Logger.Error(ex.Message); } }
/// <summary> /// 传感器波动数据(设备上传) /// </summary> /// <param name="deviceNo">设备编号</param> /// <param name="reviceMsg">传感器波动数据帧</param> /// <param name="remotePoint">数据来源的IP地址及端口</param> /// <returns></returns> public async Task SensorFluctuation(string deviceNo, string reviceMsg, IPEndPoint remotePoint) { try { string[] szCommand = reviceMsg.Split(','); string tstamp = szCommand[4]; //时间戳 //查询设备是否存在,存在则更新设备状态 var modelInfo = await _deviceInfo.FirstOrDefaultAsync(d => d.DeviceNo == deviceNo); if (modelInfo != null) { //获取消息部分内容 string message = GetMsgContent(reviceMsg); string[] szMsg = message.Split(','); SensorWave_Log model = new SensorWave_Log { DeviceNo = deviceNo, Tstamp = tstamp, Magnetic10 = string.Format("{0},{1},{2},{3},{4},{5},{6},{7},{8},{9}", szMsg[0], szMsg[1], szMsg[2], szMsg[3], szMsg[4], szMsg[5], szMsg[6], szMsg[7], szMsg[8], szMsg[9]), MagneticXYZ = string.Format("{0},{1},{2}", szMsg[10], szMsg[11], szMsg[12]), SmoothXYZ = string.Format("{0},{1},{2}", szMsg[13], szMsg[14], szMsg[15]), RadarDataXYZ = string.Format("{0},{1},{2}", szMsg[16], szMsg[17], szMsg[18]), Distance = int.Parse(szMsg[19]), BerthStatus = int.Parse(szMsg[20]), AddTime = DateTime.Now }; await _sensorWaveLog.InsertAsync(model); } //回复指令 string command = SendCommands.RSensorFluctuation(deviceNo, tstamp); bool bRet = UdpCommunication.UpdSendMessage(command, remotePoint); if (bRet) { //更新指令回复信息 var cmdModel = await _commandLog.FirstOrDefaultAsync(c => c.DeviceNo == deviceNo && c.Tstamp == tstamp); if (cmdModel != null) { string rMsg = GetMsgContent(command); cmdModel.ResultMessage = rMsg; cmdModel.CmdStatus = 2; await _commandLog.UpdateAsync(cmdModel); } } } catch (Exception ex) { Logger.Error(ex.Message); } }
/// <summary> /// 自检测异常报警数据(设备上传) /// </summary> /// <param name="deviceNo">设备编号</param> /// <param name="reviceMsg">自检测异常报警数据帧</param> /// <param name="remotePoint">数据来源的IP地址及端口</param> /// <returns></returns> public async Task SelfCheckingAlarm(string deviceNo, string reviceMsg, IPEndPoint remotePoint) { try { string[] szCommand = reviceMsg.Split(','); string tstamp = szCommand[4]; //时间戳 //查询设备是否存在,存在则更新设备状态 var modelInfo = await _deviceInfo.FirstOrDefaultAsync(d => d.DeviceNo == deviceNo); if (modelInfo != null) { //获取消息部分内容 string message = GetMsgContent(reviceMsg); string[] szMsg = message.Split(','); //更新设备报警数据 modelInfo.NbSignalCode = int.Parse(szMsg[0]); modelInfo.SensorCode = int.Parse(szMsg[1]); modelInfo.FlashCode = int.Parse(szMsg[2]); modelInfo.BatteryCode = int.Parse(szMsg[3]); modelInfo.StatusUpdateTime = DateTime.Now; await _deviceInfo.UpdateAsync(modelInfo); } //回复指令 string command = SendCommands.RSelfCheckingAlarm(deviceNo, tstamp); bool bRet = UdpCommunication.UpdSendMessage(command, remotePoint); if (bRet) { //更新指令回复信息 var cmdModel = await _commandLog.FirstOrDefaultAsync(c => c.DeviceNo == deviceNo && c.Tstamp == tstamp); if (cmdModel != null) { string rMsg = GetMsgContent(command); cmdModel.ResultMessage = rMsg; cmdModel.CmdStatus = 2; await _commandLog.UpdateAsync(cmdModel); } } } catch (Exception ex) { Logger.Error(ex.Message); } }
public AsyncBackgroundTask(AbpTimer timer) : base(timer) { Timer.Period = 3000; Logger = NullLogger.Instance; _deviceIPEndPort = IocManager.Instance.Resolve <IRepository <Device_IPEndPort> >(); _commandLog = IocManager.Instance.Resolve <IRepository <Command_Log> >(); _deviceInfo = IocManager.Instance.Resolve <IRepository <Device_Info> >(); _heartBeatLog = IocManager.Instance.Resolve <IRepository <Heartbeat_Log> >(); _sensorWaveLog = IocManager.Instance.Resolve <IRepository <SensorWave_Log> >(); _deviceCheckParam = IocManager.Instance.Resolve <IRepository <Device_CheckParam> >(); //初始化UDP通讯配置 _UdpConfig = IocManager.Instance.Resolve <UdpParamConfig>(); int.TryParse(_UdpConfig.Port, out UdpCommunication._Port); UdpCommunication._IpAddress = _UdpConfig.IpAddress; //初始化UDP通讯监测 UdpCommunication._IsUdpInit = UdpCommunication.InitUpdServer(); }
/// <summary> /// 设备心跳(设备上传) /// </summary> /// <param name="deviceNo">设备编号</param> /// <param name="reviceMsg">设备心跳数据帧</param> /// <param name="remotePoint">数据来源的IP地址及端口</param> /// <returns></returns> public async Task DeviceHeartbeat(string deviceNo, string reviceMsg, IPEndPoint remotePoint) { try { string[] szCommand = reviceMsg.Split(','); string tstamp = szCommand[4]; //时间戳 string seqno = szCommand[5]; //帧序号(设备入网请求、泊位状态检测事件、设备心跳=》以上命令中才存在帧序号) //查询设备是否存在,存在则更新设备状态 var modelInfo = await _deviceInfo.FirstOrDefaultAsync(d => d.DeviceNo == deviceNo); if (modelInfo != null) { //获取消息部分内容 string message = GetMsgContent(reviceMsg); string[] szMsg = message.Split(','); //如果设备存在则插入设备心跳记录 Heartbeat_Log model = new Heartbeat_Log { DeviceNo = deviceNo, Tstamp = tstamp, DeviceState = int.Parse(szMsg[1]), NbSignal = szMsg[2], Temperature = int.Parse(szMsg[3]), BatVoltage = szMsg[4], FwVer = szMsg[5], HwVer = szMsg[6], DevHealth = int.Parse(szMsg[7]), HbeatT = int.Parse(szMsg[8]), NbSendN = int.Parse(szMsg[9]), BbRecvN = int.Parse(szMsg[10]), SampleN = int.Parse(szMsg[11]), RebootN = int.Parse(szMsg[12]), NbRebootN = int.Parse(szMsg[13]), NoackN = int.Parse(szMsg[14]), AddTime = DateTime.Now }; await _heartBeatLog.InsertAsync(model); //更新设备信息 modelInfo.DeviceStatus = 1; modelInfo.NbSignal = szMsg[2]; modelInfo.Temperature = int.Parse(szMsg[3]); modelInfo.BatVoltage = szMsg[4]; modelInfo.FwVer = szMsg[5]; modelInfo.HwVer = szMsg[6]; modelInfo.DevHealth = int.Parse(szMsg[7]); modelInfo.healthT = int.Parse(szMsg[8]); modelInfo.StatusUpdateTime = DateTime.Now; await _deviceInfo.UpdateAsync(modelInfo); } //回复指令 string command = SendCommands.RDeviceHeartbeat(deviceNo, tstamp, seqno); bool bRet = UdpCommunication.UpdSendMessage(command, remotePoint); if (bRet) { //更新指令回复信息 var cmdModel = await _commandLog.FirstOrDefaultAsync(c => c.DeviceNo == deviceNo && c.Tstamp == tstamp && c.CommandType == szCommand[3]); if (cmdModel != null) { string rMsg = GetMsgContent(command); cmdModel.ResultMessage = rMsg; cmdModel.CmdStatus = 2; await _commandLog.UpdateAsync(cmdModel); } } } catch (Exception ex) { Logger.Error(ex.Message); } }