/// <summary> /// 手动发送一条铱星数据 /// </summary> private void IridiumManualSend() { //if (_iridium.ShowPackageInformation) { ShowHistory(Environment.NewLine + Now + "MT operation begin, try to connect Iridium server...", false); } tsbtSend.Enabled = false; SendIMEI = tscbIMEI.Text.Trim(); if (string.IsNullOrEmpty(tstbData.Text.Trim())) { SendContent = null; } else { SendContent = CustomConvert.GetBytes(tstbData.Text.Trim()); } SendMTMSN = mtmsn++; performSend(); Task task = new Task(() => { Thread.Sleep(5000); BeginInvoke((MyInvoker) delegate { tsbtSend.Enabled = true; }); }); task.Start(); }
/// <summary> /// 处理卫星服务器发过来的通讯信息数据。type=data,cmd=destination,data=数据内容 /// </summary> /// <returns></returns> private string HandleDataRequest() { var ret = ""; TX300 x300 = new TX300(); x300.Content = CustomConvert.GetBytes(data); x300.package_to_msg(); HandleDataStatus(x300); return(ret); }
protected void Encode_Click(object sender, EventArgs e) { var str = hex.Value.Trim(); if (null == str || "" == str) { return; } var data = CustomConvert.GetBytes(str); base64.InnerText = Convert.ToBase64String(data); base64Encode.InnerText = HttpUtility.UrlEncode(base64.InnerText); }
/// <summary> /// 处理铱星模块发送回来的MO信息 /// </summary> /// <param name="data"></param> private void HandleIridiumModelMOPayload(IridiumData data) { // 如果是正式的协议则以正常的方式处理 if (data.Length >= TX300Items.header_length) { // TX300通讯协议首字节必定大于等于17 // 卫星通讯协议首字节必定等于01 if (data.Payload[0] >= 17 && ProtocolTypes.IsTX300(data.Payload[2]) && TerminalTypes.IsTX300(data.Payload[3])) { // 根据卫星号码查询终端的Sim卡号码并将其填入包头结构里 using (var bll = new TerminalBLL()) { var terminal = bll.Find(f => f.TB_Satellite.CardNo.Equals(data.IMEI) && f.Delete == false); if (null != terminal) { var sim = terminal.Sim; sim += sim.Length < 11 ? "000" : ""; sim = "0" + sim; var s = CustomConvert.GetBytes(sim); Buffer.BlockCopy(s, 0, data.Payload, 9, s.Length); s = null; // 更新命令的MTMSN状态为返回状态 HandleData(new Sockets.AsyncUserDataBuffer() { Buffer = data.Payload, DataType = Sockets.AsyncUserDataType.ReceivedData, IP = "", PackageType = Sockets.AsyncDataPackageType.SAT, Port = 0, ReceiveTime = DateTime.Now, SocketHandle = 0 }); } else { ShowUnhandledMessage("Unbind satellite report data: " + CustomConvert.GetHex(data.Payload)); } } } else { HandleIridiumNewProtocolPackage(data); } // 统计铱星的接收数据次数和数据长度 HandleIridiumMOFlow(data); } data.Dispose(); }
/// <summary> /// 将Sim号码组成TX协议中的字节串 /// </summary> /// <param name="sim"></param> /// <returns></returns> private byte[] SimToByte(string sim) { if (sim[0] == '8' && sim[1] == '9' && sim.Length == 8) { sim = format("0{0}000", sim); } else if (sim[0] == '9' && sim.Length == 8) { sim = format("0{0}000", sim); } else if (sim.Length == 11) { sim = format("0{0}", sim); } return(CustomConvert.GetBytes(sim)); }
/// <summary> /// 手动分析指定的铱星数据包 /// </summary> private void IridiumManualAnalysePackage() { //uint shor = IririumMTMSN.CalculateMTMSN(DateTime.Now, mtmsn++); //byte[] b = BitConverter.GetBytes(shor); //ShowHistory("short: " + shor + ", byte: " + CustomConvert.GetHex(b) + ", to: " + CustomConvert.GetHex(CustomConvert.reserve(b)), false); //if (shor == 0) //{ shor = 1; } var temp = CustomConvert.GetBytes(tstbData.Text.Trim()); var len = temp.Length; var buffer = new IridiumBuffer(); buffer.socket = null; buffer.length = len; buffer.buffer = new byte[len]; Buffer.BlockCopy(temp, 0, buffer.buffer, 0, len); _iridium.AddQueue(buffer); temp = null; }
private void SendData(string target, string content, bool asHex) { TXSQ txsq = new TXSQ(); txsq.OriginAddress = tstbOrigin.Text; txsq.Type.TransferType = 1; txsq.TargetAddress = target; txsq.Reply = 0; txsq.Message = asHex ? CustomConvert.GetBytes(content) : ASCIIEncoding.ASCII.GetBytes(content); //tsmiSendAsHexData.Checked ? CustomConvert.GetBytes(str) : ASCIIEncoding.ASCII.GetBytes(str); txsq.Package(); //ShowHistory(CustomConvert.GetHex(txsq.Content)); DataPackage data = _handler.GetBlankDataPackage(); data.Data = txsq.Content; data.Time = DateTime.Now; data.Type = DataType.Send; _handler.AddMessage(data); }
private void tsbtTest_Click(object sender, EventArgs e) { if (string.IsNullOrEmpty(tstbData.Text)) { return; } try { var tmp = CustomConvert.GetBytes(tstbData.Text); HandleReceivedData(tmp); return; var data = _handler.GetBlankDataPackage(); data.Time = DateTime.Now; data.Type = DataType.Received; data.Data = CustomConvert.GetBytes(tstbData.Text); _handler.AddMessage(data); } catch (Exception convertError) { ShowHistory("数据转换错误:" + convertError.Message); } }
private void HandleIridiumCommand(TB_Command obj, CommandBLL bll) { if (null != OnIridiumSend) { IridiumDataEvent e = new IridiumDataEvent(); e.Data = new IridiumData() { Payload = CustomConvert.GetBytes(obj.Content), IMEI = obj.TB_Terminal.TB_Satellite.CardNo, MTMSN = GetIridiumMTMSN() }; e.Data.Payload[2] = ProtocolTypes.SATELLITE; OnIridiumSend(this, e); // 更新命令发送状态 bll.Update(f => f.id == obj.id, act => { act.Status = (byte)CommandStatus.SatelliteHandled; }); if (obj.TB_Terminal.Satellite != (int?)null) { HandleIridiumMTFlow(obj.TB_Terminal.Satellite.Value, obj.Content.Length / 2); } } }
/// <summary> /// 查询指定日期范围内的运转时间并补偿相应的数量 /// </summary> /// <param name="averagable"></param> /// <returns></returns> private string HandleQueryEquipmentWorktime(bool averagable = true) { var ret = "{}"; var id = ParseInt(Utility.Decrypt(data)); var obj = EquipmentInstance.Find(f => f.id == id && f.Deleted == false); if (null != obj) { var date = DateTime.Parse(GetParamenter("date") + " 00:00:00"); // 如果不是求平均值则将日期往前推一天 //if (!averagable) { date = date.AddDays(-1); } var date1 = DateTime.Parse(GetParamenter("date1") + " 23:59:59"); List <WorktimeChart> avg = new List <WorktimeChart>(); List <WorktimeChart> work = new List <WorktimeChart>(); DateTime dt = date; // 循环每天一个节点 while (dt.Ticks < date1.Ticks) { avg.Add(new WorktimeChart() { date = dt.ToString("yyyy/MM/dd"), x = Utility.DateTimeToJavascriptDate(dt.Date), y = 0, min = 0 }); work.Add(new WorktimeChart() { date = dt.ToString("yyyy/MM/dd"), x = Utility.DateTimeToJavascriptDate(dt.Date), y = 0, min = 0 }); dt = dt.AddDays(1); } var macid = EquipmentInstance.GetFullNumber(obj); var cmds = new string[] { "0x1000", "0x600B" }; var runtimes = DataInstance.FindList(f => f.mac_id.Equals(macid) && cmds.Contains(f.command_id) && f.receive_time >= date && f.receive_time <= date1).OrderBy(o => o.receive_time); var list = new List <Worktime>(); if (null != runtimes) { long today = 0; long timeInterval = 0; foreach (var r in runtimes) { bool gps = r.command_id.Equals("0x1000"); if (today == 0) { dt = r.receive_time.Value; } else { // 计算与上一条数据的实际接收时间之间的时间差 timeInterval = (long)(r.receive_time.Value - dt).TotalSeconds; } var t = Utility.DateTimeToJavascriptDate(r.receive_time.Value.Date); // 日期不同则重置日期和运转时间 if (today != t) { today = t; } byte[] temp = null; int index = 0; if (gps) { if (r.protocol_type == ProtocolTypes.SATELLITE) { temp = CustomConvert.GetBytes(r.message_content); index = 13; } } else { temp = CustomConvert.GetBytes(r.message_content); index = 0; } // 增加一个节点 Worktime wt = new Worktime(); wt.date = r.receive_time.Value.ToString("yyyy/MM/dd HH:mm:ss"); wt.worktime = null == temp ? 0 : BitConverter.ToUInt32(temp, index); var bin = !gps ? "00000000" : CustomConvert.IntToDigit(temp[4], CustomConvert.BIN, 8); // 如果list已经有数据则计算与上一条数据之间的差值 var cnt = list.Count; if (cnt > 0) { if (wt.worktime < list[cnt - 1].worktime) { // 当前运转时间小于前一条时,小计为0 wt.interval = 0; } else { // 差值 wt.interval = !gps ? 0 : (wt.worktime - list[cnt - 1].worktime); // 计算差值与实际两条数据的接收时间差值的对比 if (wt.interval > timeInterval) { // 如果运转时间差超过了这两条数据接收时间的差值,则记为0 wt.interval = 0; } // 计算运转时间之间的差值 2016/08/15 15:00 if (wt.interval > 0) { uint hour = (uint)r.receive_time.Value.Hour, min = (uint)r.receive_time.Value.Minute; // 凌晨0点的运转时间需要分开到两个日期里 if (hour == 0) { // 时间间隔大于0点已过的分钟数,则需要把时间差分开到两个日期里 if (wt.interval > min) { list[cnt - 1].interval += wt.interval - min; wt.interval = min; } } } // 补偿的分钟 if (wt.interval > 0) { uint ad = 0; if (wt.interval > 60) { ad = wt.interval / 60; } else { ad = 1; } if (bin[6] == '1') { ad += 1; } wt.added = ad; } else { wt.interval = 0; } // 所用的小时 wt.hours = wt.interval > 0 ? (wt.interval > 60 ? wt.interval / 60 : 1) : 0; } } else { // 第一条数据小计为0 wt.interval = 0; } list.Add(wt); // 更新本日最后的运转时间 var wk = work.FirstOrDefault(f => f.x == today); if (null != wk) { //if (wk.min == 0) { wk.min = run; } wk.min = wt.worktime; } }// end of foreach // 工作时间总计 var totalWorkMins = list.Sum(s => s.interval); // 补偿的分钟 var totalAddMins = list.Sum(s => s.added); // 所用的小时数 var totalUsedHours = list.Sum(s => s.hours); // 工作效率 var compensate = totalWorkMins / 60.0 / totalUsedHours; // 最终增加的小时数 var finalAdded = totalAddMins / 60.0 * compensate; // 计算每日运转时间 foreach (var f in work) { f.y = Math.Round(list.Where(w => w.date.Contains(f.date)).Sum(s => s.interval) / 60.0, 2); f.add = finalAdded; } // 有工作时间的天数里平均加入补偿的小时数 var per = finalAdded / work.Count(c => c.y > 0); //per = Math.Round(per, 2); // 加入补偿 foreach (var w in work) { //if (!averagable) { w.y += w.y > 0 ? per : 0; // 如果超过24小时则直接设为24小时 2016/08/15 15:16 if (w.y >= 24) { w.y = 24; } } if (averagable) { w.y = Math.Round(w.y, 2); } } // 计算平均值 var avgg = Math.Round(work.Sum(s => s.y) * 1.0 / work.Count, 2); foreach (var a in avg) { a.y = avgg; } } if (averagable) { ret = string.Format("{0}\"Average\":{1},\"Worktime\":{2}{3}", "{", JsonConverter.ToJson(avg), JsonConverter.ToJson(work), "}"); } else { ret = JsonConverter.ToJson(work); } } return(ret); }
/// <summary> /// 查询指定设备在指定日期范围内每日运转时间 /// </summary> /// <returns></returns> private string HandleEquipmentWorktime(bool averagable = true) { var ret = "{}"; var id = ParseInt(Utility.Decrypt(data)); var obj = EquipmentInstance.Find(f => f.id == id && f.Deleted == false); if (null != obj) { var date = DateTime.Parse(GetParamenter("date") + " 00:00:00"); // 如果不是求平均值则将日期往前推一天 //if (!averagable) { date = date.AddDays(-1); } var date1 = DateTime.Parse(GetParamenter("date1") + " 23:59:59"); List <WorktimeChart> avg = new List <WorktimeChart>(); List <WorktimeChart> work = new List <WorktimeChart>(); DateTime dt = date; // 循环每天一个节点 while (dt.Ticks < date1.Ticks) { avg.Add(new WorktimeChart() { date = dt.ToString("yyyy/MM/dd"), x = Utility.DateTimeToJavascriptDate(dt.Date), y = 0, min = 0 }); work.Add(new WorktimeChart() { date = dt.ToString("yyyy/MM/dd"), x = Utility.DateTimeToJavascriptDate(dt.Date), y = 0, min = 0 }); dt = dt.AddDays(1); } var macid = EquipmentInstance.GetFullNumber(obj); var cmds = new string[] { "0x1000", "0x1001", "0x5000", "0x6004", "0x600B", "0xCC00" }; var runtimes = DataInstance.FindList(f => f.mac_id.Equals(macid) && cmds.Contains(f.command_id) && f.receive_time >= date.AddDays(-1) && f.receive_time <= date1.AddDays(1)).OrderBy(o => o.receive_time); var list = new List <WorkTime>(); if (null != runtimes) { long today = 0; foreach (var r in runtimes) { var t = Utility.DateTimeToJavascriptDate(r.receive_time.Value.Date); // 日期不同则重置日期和运转时间 if (today != t) { today = t; } byte[] temp = null; int index = 0; if (r.command_id.Equals("0x1000")) { if (r.protocol_type == ProtocolTypes.SATELLITE) { temp = CustomConvert.GetBytes(r.message_content); index = 13; } } else if (r.command_id.Equals("0x1001")) { temp = CustomConvert.GetBytes(r.message_content); index = 37; } else if (r.command_id.Equals("0x5000")) { // 只有装载机和电装的挖掘机才能有5000命令的总运转时间 if (r.terminal_type >= TerminalTypes.DXE) { temp = CustomConvert.GetBytes(r.message_content); index = 0; } } else if (r.command_id.Equals("0x600B")) { temp = CustomConvert.GetBytes(r.message_content); index = 0; } else if (r.command_id.Equals("0xCC00")) { temp = CustomConvert.GetBytes(r.message_content); index = 12; } else { temp = CustomConvert.GetBytes(r.message_content); byte tp = r.terminal_type.Value; index = tp == TerminalTypes.DH ? 2 : (tp == TerminalTypes.DX ? 5 : 1); } // 增加一个节点 WorkTime wt = new WorkTime(); wt.date = r.receive_time.Value.ToString("yyyy/MM/dd HH:mm:ss"); wt.time = null == temp ? 0 : BitConverter.ToUInt32(temp, index); // 如果list已经有数据则计算与上一条数据之间的差值 var cnt = list.Count; if (cnt > 0) { if (wt.time < list[cnt - 1].time) { // 当前运转时间小于前一条时,小计为0 wt.subtotal = 0; } else { // 否则小计为差值 wt.subtotal = wt.time - list[cnt - 1].time; // 每日凌晨1点之前,如果计算的时间差超过了当前时间的分钟数,则只计算分钟数 if (r.receive_time.Value.Hour < 1 && wt.subtotal > r.receive_time.Value.Minute) { // 每日1时之前计算的时间差大于已经过去了的分钟数则将差值算到前一天最后一条数据里 if (cnt > 0) { list[cnt - 1].subtotal += (uint)(wt.subtotal - r.receive_time.Value.Minute); } wt.subtotal = (uint)r.receive_time.Value.Minute; } // 小于0时算作0 if (wt.subtotal < 0) { wt.subtotal = 0; } // 如果与上一条日期的分钟数相差12个小时以上则记为0 DateTime lst = DateTime.Parse(list[cnt - 1].date); if ((lst - r.receive_time.Value).Duration().TotalMinutes >= DAY_MINUTES / 2) { wt.subtotal = 0; } // 大于24小时算作0 if (wt.subtotal >= DAY_MINUTES) { wt.subtotal = 0; } } } else { // 第一条数据小计为0 wt.subtotal = 0; } list.Add(wt); // 更新本日最后的运转时间 var wk = work.FirstOrDefault(f => f.x == today); if (null != wk) { //if (wk.min == 0) { wk.min = run; } wk.min = wt.time; } }// end of foreach // 计算每日运转时间 foreach (var f in work) { f.y = Math.Round(list.Where(w => w.date.Contains(f.date)).Sum(s => s.subtotal) / 60.0, 2); } // 计算平均值 var avgg = Math.Round(work.Sum(s => s.y) * 1.0 / work.Count, 2); foreach (var a in avg) { a.y = avgg; } } if (averagable) { ret = string.Format("{0}\"Average\":{1},\"Worktime\":{2}{3}", "{", JsonConverter.ToJson(avg), JsonConverter.ToJson(work), "}"); } else { ret = JsonConverter.ToJson(work); } } return(ret); }
/// <summary> /// 检索是否有TCP在线终端的命令待发送。 /// 条件: /// 1、预定发送时间在30s以内 /// 2、命令的状态为等待发送状态(等待发送或等待重发) /// 3、终端为TCP链接状态的 /// </summary> /// <returns></returns> public void CheckGSMCommand() { if (null == _server) { return; } var bll = new CommandBLL(); try { // 取出当前30s内的新命令 var list = bll.FindList(f => f.ScheduleTime >= DateTime.Now.AddSeconds(-30) && GsmStatus.Take(2).Contains(f.Status.Value) && f.TB_Terminal.OnlineStyle != (byte)LinkType.SATELLITE).ToList(); foreach (var cmd in list) { var sim = cmd.DestinationNo; if (sim[0] == '8' || sim[0] == '9') { sim = sim.Substring(0, 8); } // 0==链接不存在1=发送成功2=网络处理错误3=强制SMS发送 byte ret = 0; CommandStatus cs = (CommandStatus)cmd.Status; // 所有GSM命令都强制SMS方式发送 if (cs == CommandStatus.WaitingForSMS) { // 强制SMS发送的 ret = 3; } else { if (cmd.TB_Terminal.OnlineStyle == (byte)LinkType.TCP) { // 0==链接不存在1=发送成功2=网络处理错误 ret = _server.Send(cmd.TB_Terminal.Socket.Value, CustomConvert.GetBytes(cmd.Content)); } } if (ret != 1) { // 非强制SMS发送时,先保存一下命令的发送状态为等待SMS发送状态 if (ret < 3) { UpdateGsmCommand(cmd, CommandStatus.WaitingForSMS, bll); ShowUnhandledMessage(Now + "Send Command(TCP: Fail, force this command to SMS): " + cmd.Content); } else { // url直链方式发送短信时,直接可以发送 byte type = byte.Parse(ConfigurationManager.AppSettings["SMS_SUBMIT_TYPE"]); if (type == SMSUtility.SUBMIT_BY_URL) { // TCP链接丢失,重新用SMS方式发送 bool b = CommandUtility.SendSMSCommand(cmd); if (b) { SaveTerminalData((int?)null == cmd.Terminal ? -1 : cmd.Terminal.Value, sim, AsyncDataPackageType.SMS, 1, false, DateTime.Now); } ShowUnhandledMessage(Now + "Send Command(SMS: " + (b ? "Success" : "Fail") + "): " + cmd.Content); } } } else { // 保存TCP方式的命令发送结果 SaveTerminalData((int?)null == cmd.Terminal ? -1 : cmd.Terminal.Value, sim, AsyncDataPackageType.TCP, cmd.Content.Length / 2, false, DateTime.Now); ShowUnhandledMessage(Now + "Send command(" + (1 == ret ? CommandStatus.SentByTCP : CommandStatus.TCPNetworkError) + "): " + cmd.Content); UpdateGsmCommand(cmd, (1 == ret ? CommandStatus.SentByTCP : CommandStatus.TCPNetworkError), bll); } } // 待发送的命令发送完之后,清理超时的命令 ClearTimedoutCommands(bll); } finally { bll.Close(); } }
/// <summary> /// 查询指定条件 /// </summary> /// <param name="query"></param> /// <param name="time1"></param> /// <param name="time2"></param> private void Query(Work query) { var cmds = new List <string>(); cmds.Add("0x1000"); cmds.Add("0x600B"); using (var bll = new DataBLL()) { Expression <Func <TB_HISTORIES, bool> > expression = PredicateExtensions.True <TB_HISTORIES>(); if (!string.IsNullOrEmpty(query.MacId)) { expression = expression.And(a => a.mac_id.Contains(query.MacId)); } expression = expression.And(a => cmds.Contains(a.command_id)); expression = expression.And(a => a.receive_time >= query.Time1 && a.receive_time <= query.Time2); var list = bll.FindList <TB_HISTORIES>(expression, "receive_time").ToList <TB_HISTORIES>(); var html = ""; int TotalAddedMinutes = 0, TotalWorkedMinutes = 0, TotalUsedHour = 0; if (null == list || list.Count() < 1) { html = "<tr><td colspan=\"13\" class=\"in-tab-title-b\">No records, you can change condition and try again.</td></tr>"; } else { uint lastworktime = 0; string macid = ""; byte maccount = 0; for (int i = 0, len = list.Count(); i < len; i++) { var obj = list[i]; if (!macid.Equals(obj.mac_id)) { macid = obj.mac_id; maccount++; } var data = CustomConvert.GetBytes(obj.message_content); var worktime = BitConverter.ToUInt32(data, obj.command_id.Equals("0x1000") ? 13 : 0); int interval = (int)(i == 0 ? 0 : (worktime - lastworktime)); // 两条数据之间接收时间之差 long minInterval = (long)((i == 0) ? 0 : (obj.receive_time.Value - list[i - 1].receive_time.Value).TotalSeconds); if (interval > minInterval) { // 如果这条数据与上一条数据的工作时间之差大于了这两条数据的接收时间之差则将其算做0 interval = 0; } TotalWorkedMinutes += obj.command_id.Equals("0x600B") ? 0 : (interval > 0 ? interval : 0); var bin = obj.command_id.Equals("0x600B") ? "00000000" : CustomConvert.IntToDigit(data[4], CustomConvert.BIN, 8); string eng, engflag; if (obj.command_id.Equals("0x600B")) { eng = EquipmentBLL.eng_off; engflag = "0"; } else if (data[1] == 0x40 || data[1] == 0x0F || data[1] == 0xFF) { eng = EquipmentBLL.eng_lock; engflag = "0"; } else { eng = (bin[6] == '1' ? EquipmentBLL.eng_on : EquipmentBLL.eng_off); engflag = (bin[6] == '1' ? "1" : "0"); } int added = (interval > 0 ? (obj.command_id.Equals("0x600B") ? 0 : (interval > 60 ? interval / 60 : 1)) : 0) + (engflag.Equals("1") ? 1 : 0); TotalAddedMinutes += added; TotalUsedHour += interval > 0 ? (obj.command_id.Equals("0x600B") ? 0 : (interval > 60 ? interval / 60 : 1)) : 0; html += "<tr>" + "<td class=\"in-tab-title-b\">" + (i + 1) + "</td>" + "<td class=\"in-tab-title-rb textoverflow\" style=\"text-align: left; \">" + obj.receive_time.Value.ToString("yyyy/MM/dd HH:mm:ss") + "</td>" + "<td class=\"in-tab-title-b\" style=\"text-align: right;\">" + EquipmentBLL.GetRuntime((int?)worktime) + "</td>" + "<td class=\"in-tab-title-b\" style=\"text-align: right;\">" + string.Format("{0:0,00}", worktime) + "</td>" + "<td class=\"in-tab-title-b\" style=\"text-align: right;\">" + (interval > 60 ? ("<font color=\"#FF0000\">" + interval + "</font>") : interval.ToString()) + "</td>" + "<td class=\"in-tab-title-rb\" style=\"text-align: right;\">" + added + "</td>" + "<td class=\"in-tab-title-b\" style=\"text-align: left;\">" + obj.command_id + "</td>" + "<td class=\"in-tab-title-b\" style=\"text-align: left;\">" + obj.terminal_id + "</td>" + "<td class=\"in-tab-title-rb textoverflow\" style=\"text-align: left;\">" + obj.mac_id + "</td>" + "<td class=\"in-tab-title-b\" style=\"text-align: center; width: 30px;\">" + eng + "</td>" + "<td class=\"in-tab-title-b\" style=\"text-align: center; width: 30px;\">" + engflag + "</td>" + "<td class=\"in-tab-title-b\" style=\"text-align: left;\">" + obj.message_content + "</td>" + "<td class=\"in-tab-title-b\"></td>" + "</tr>"; lastworktime = worktime; if (i == len - 1) { var compensate = (TotalWorkedMinutes / 60.0) / TotalUsedHour; var finalAdded = TotalAddedMinutes / 60.0 * compensate; var finalWork = worktime / 60.0 + finalAdded; string summary = "<tr>" + "<td class=\"in-tab-title-rb textoverflow\">" + obj.mac_id + "</td>" + "<td class=\"in-tab-title-rb\" style=\"text-align: right;\">" + EquipmentBLL.GetRuntime((int?)worktime) + "</td>" + "<td class=\"in-tab-title-b\" style=\"text-align: right;\">" + EquipmentBLL.GetRuntime(TotalWorkedMinutes) + "</td>" + "<td class=\"in-tab-title-b\" style=\"text-align: right;\">" + TotalUsedHour + "</td>" + "<td class=\"in-tab-title-rb\" style=\"text-align: right;\">" + compensate + "</td>" + "<td class=\"in-tab-title-b\" style=\"text-align: right;\">" + TotalAddedMinutes + "/" + EquipmentBLL.GetRuntime((int?)TotalAddedMinutes) + "</td>" + "<td class=\"in-tab-title-b\" style=\"text-align: right;\">" + finalAdded + "</td>" + "<td class=\"in-tab-title-rb\" style=\"text-align: right;\">" + finalWork + "</td>" + "<td class=\"in-tab-title-b\"></td>" + "</tr>"; tbodySummary.InnerHtml += summary; if (query.Id > 0) { // 只查询到一个设备时才更新统计数据,否则不需要更新 if (maccount <= 1) { new EquipmentBLL().Update(f => f.id == query.Id, act => { // 实际工作小时数 act.WorkHours = TotalWorkedMinutes / 60.0; // 粗略计算工作小时数 act.UsedHours = TotalUsedHour; // 工作效率 act.HourWorkEfficiency = compensate; // 补偿的小时数 act.AddedHours = TotalAddedMinutes / 60.0; // 实际补偿的小时数 act.CompensatedHours = finalAdded; }); } } } } } if (checkAnalyseDailyWork.Checked) { tbodyBody.InnerHtml = html; } } }
/// <summary> /// 查询历史记录并开始画图 /// </summary> /// <param name="target"></param> private void chart(Stream target) { byte[,] times = new byte[24, 60 / _interval]; Int64 total_seconds = 0; // 初始化数组 for (int i = 0; i < times.GetLength(0); i++) { for (int j = 0; j < times.GetLength(1); j++) { times[i, j] = 10; } } // 获取数据库中今日启动情况 var data = new DataBLL(); var list = data.FindList(h => h.receive_time >= _start && h.receive_time <= _end && h.mac_id.Equals(_equipment) && (h.command_id.Equals("0x5000") || h.command_id.Equals("0x1000"))).OrderBy(o => o.receive_time); // 当日开机时间默认为凌晨零点。 TimeSpan lastOpen = new TimeSpan(_start.Ticks), lastClose; var lastIsOpen = true; var terType = 0; foreach (var obj in list) { // 非卫星方式回来的1000命令不处理 if (obj.command_id.Equals("0x1000")) { if (obj.protocol_type != ProtocolTypes.SATELLITE) { continue; } if (obj.message_content.Substring(0, 2) != "01") { continue; } } if (terType == 0) { var t = new TerminalBLL().Find(find => obj.terminal_id.IndexOf(find.Sim) >= 0); if (null != t) { terType = (byte)t.Type; } } string str = ""; DateTime dt; int hh, mm; //while (sdr.Read()) //{ if (obj.protocol_type == ProtocolTypes.SATELLITE) { byte[] msgc = CustomConvert.GetBytes(obj.message_content); string bin = CustomConvert.IntToDigit(msgc[4], CustomConvert.BIN, 8); msgc = null; str = bin[6] == '1' ? "F000" : "0000"; } else { str = terType == TerminalTypes.DX ? obj.message_content.Substring(0, 4) : (obj.message_content.Substring(8, 2) == "00" ? "F000" : "0000"); } dt = obj.receive_time.Value; hh = Convert.ToInt32(dt.ToString("HH")); mm = Convert.ToInt32(dt.ToString("mm")) / _interval; // 开机 if (0 < str.CompareTo("0000")) { times[hh, mm] = 1; lastOpen = new TimeSpan(dt.Ticks); lastIsOpen = true; } else { times[hh, mm] = 0; lastClose = new TimeSpan(dt.Ticks); if (lastIsOpen) { lastIsOpen = false; total_seconds += (long)(lastClose - lastOpen).Duration().TotalSeconds; } } //} } // 格式化显示今日的总开机时间 total_seconds = total_seconds / 60; string total_runtime = (total_seconds / 60) + " h " + (total_seconds % 60) + " m"; // 添加表格 bool is_open = false; int hn, mn; // 查看日期是否跟今天相同 DateTime date = DateTime.Parse(_date); if (date < DateTime.Now) { hn = 23; mn = 60 / _interval; } else { hn = Convert.ToInt32(DateTime.Now.ToString("HH")); mn = Convert.ToInt32(DateTime.Now.ToString("mm")) / _interval; } Bitmap b = new Bitmap(_width, _height); Graphics g = Graphics.FromImage(b); // 填充白色背景 g.Clear(Color.White); Pen p = new Pen(Color.FromArgb(0x00, 0x99, 0xCC)); Font f = new System.Drawing.Font("Arial", 9); Brush br = new SolidBrush(Color.FromArgb(0x00, 0x99, 0xCC)); int font_height = (int)g.MeasureString(_date, f).Height; // 画日期提示 g.DrawString(_date + ": " + total_runtime, f, br, 0, 0); // 画方框 g.DrawRectangle(p, 0, font_height, b.Width + 1, _barHeight); // 每一个区域块的宽度 int per_width = b.Width / (times.GetLength(0) * times.GetLength(1)); int ct = 0; bool kedu = false; for (int i = 0; i < times.GetLength(0); i++) { kedu = false; for (int j = 0; j < times.GetLength(1); j++) { if (times[i, j] == 1) { is_open = true; } if (times[i, j] == 0) { is_open = false; } if (i == hn) { if (j >= mn) { is_open = false; } } Rectangle r = new Rectangle(ct * per_width, font_height, per_width, _barHeight); if (is_open) { // 填充为实心区域 g.FillRectangle(br, r); // 画底部实线 g.DrawLine(p, r.Left, r.Top + _barHeight, r.Left + r.Width, r.Top + _barHeight); } else { // 画顶部实线 g.DrawLine(p, r.Left, r.Top, r.Left + r.Width, r.Top); // 画底部实线 g.DrawLine(p, r.Left, r.Top + _barHeight, r.Left + r.Width, r.Top + _barHeight); } //if (i % 4 == 0) { if (!kedu) { kedu = true; // 画刻度 g.DrawLine(p, r.Left, r.Top + _barHeight, r.Left, b.Height); // 显示刻度数字 g.DrawString(i.ToString("00"), new Font("tahoma", 8), br, r.Left + 1, r.Top + _barHeight + 1); } } // 画最右边的竖线 if (i == times.GetUpperBound(0) && j == times.GetUpperBound(1)) { g.DrawLine(p, r.Left + r.Width, r.Top, r.Left + r.Width, b.Height); } ct++; } } b.Save(target, ImageFormat.Png); p.Dispose(); g.Dispose(); b.Dispose(); }