Ejemplo n.º 1
0
        /// <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();
        }
Ejemplo n.º 2
0
        /// <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);
        }
Ejemplo n.º 3
0
        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);
        }
Ejemplo n.º 4
0
 /// <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();
 }
Ejemplo n.º 5
0
        /// <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));
        }
Ejemplo n.º 6
0
        /// <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;
        }
Ejemplo n.º 7
0
        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);
        }
Ejemplo n.º 8
0
        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);
            }
        }
Ejemplo n.º 9
0
 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);
        }
Ejemplo n.º 11
0
        /// <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);
        }
Ejemplo n.º 12
0
        /// <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(); }
        }
Ejemplo n.º 13
0
        /// <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;
                }
            }
        }
Ejemplo n.º 14
0
        /// <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();
        }