Ejemplo n.º 1
0
        // 读计量数据 = 0x901F,
        //历史计量数据1 = 0xD120,
        //历史计量数据2 = 0xD121,
        //历史计量数据3 = 0xD122,
        //历史计量数据4 = 0xD123,
        //历史计量数据5 = 0xD124,
        //历史计量数据6 = 0xD125,
        //历史计量数据7 = 0xD126,
        //历史计量数据8 = 0xD127,
        //历史计量数据9 = 0xD128,
        //历史计量数据10 = 0xD129,
        //历史计量数据11 = 0xD12A,
        //历史计量数据12 = 0xD12B,
        //读价格表 = 0x8102,
        //读结算日 = 0x8103,
        //读抄表日 = 0x8104,
        //读购入金额 = 0x8105,
        //读密钥版本号 = 0x8106,
        //读地址 = 0x810A,



        private void ReadDataCmdSend(DataItem item)
        {
            TaskArge data = new TaskArge(meterId, item, ControlCode.ReadData);
            string   str  = "发送:" + meter.SendData(data);

            SetTextDo(str);
        }
Ejemplo n.º 2
0
        public string SendData(TaskArge arge)
        {
            this._frame = new Frame(arge);
            byte[] data = this._frame.GetBytes();
            this._channel.Send(data);

            return(ConvertHelper.GetHex(data));
        }
Ejemplo n.º 3
0
 /// <summary>
 /// 数据帧构造函数
 /// </summary>
 /// <param name="task"></param>
 public Frame(TaskArge task)
 {
     this.Adress      = task.IoTMac;
     this.ControlCode = task.ControlCode;
     this.DataItem    = task.Data;
     mkey             = task.MKey;
     if (this.DataItem != null)
     {
         this.dataLength = this.DataItem.Length;
     }
 }
Ejemplo n.º 4
0
        //Semaphore _semaphore = new Semaphore(10, 10);

        /// <summary>
        /// 上报数据并接收主站指令
        /// </summary>
        private void ReportData()
        {
            //FE FE 68 30 39 61 51 23 35 51 04 21 1E C0 01 20 40 14 16 22 04 15 20 18 56 42 37 18 56 02 00 18 56 02 00 18 56 02 00 23 00 00 00 6F 16
            DataItem_C001 item_C001 = new DataItem_C001(ser++, DateTime.Now, this.TotalAmount, LJMoney, CurrentBalance, this.LastTotal, _st1, _st2);
            TaskArge      taskArge  = new TaskArge(this.Mac, item_C001, ControlCode.CTR_6, MKey);
            //连接服务器
            Stopwatch watch = new Stopwatch();

            watch.Start();
            byte[] buffer = null;
            try
            {
                this.tcpClient = new System.Net.Sockets.TcpClient();
                this.tcpClient.Connect(this.hostname, this.port);
                Socket socket = tcpClient.Client;
                Notice(string.Format("{0} 表连接服务器完成.\r", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")));

                if (!ReportToZhuZhan(watch, socket))
                {
                    return;
                }

                Frame  frame = new Frame(taskArge);
                string message;

                //等待主站指令
                Notice(string.Format("================================\r"));

                watch.Restart();
                while (true)
                {
                    if (watch.ElapsedMilliseconds >= 1000 * 20)
                    {
                        //20秒内没有收到任何主站指令,关闭连接并结束本次通信
                        this.tcpClient.Close();
                        Notice(string.Format("{0} 关闭表连接\r\n--------------------------------\r", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")));
                        this._reportWatch.Restart();
                        break;
                    }
                    //if (this._reportWatch.ElapsedMilliseconds >= this.周期 * 60 * 1000)
                    //{
                    //    //上报数据周期到
                    //    watch.Restart();
                    //    if (!ReportToZhuZhan(watch,socket))
                    //    {
                    //        return;
                    //    }
                    //}
                    //检查数据
                    if (socket.Poll(10, SelectMode.SelectRead))
                    {
                        int dLength = socket.Available;
                        Thread.Sleep(100);
                        if (dLength != socket.Available)
                        {
                            dLength = socket.Available;
                        }
                        buffer = new byte[dLength];
                        socket.Receive(buffer);
                        Notice(string.Format("{1:yyyy-MM-dd HH:mm:ss} 接收到主站数据:{0}\r", MyDataConvert.BytesToHexStr(buffer), DateTime.Now));
                        Thread.Sleep(10);
                        // _semaphore.WaitOne();
                        //解析接收到的数据
                        try
                        {
                            taskArge = JieXi(buffer, out message);
                            //  _semaphore.Release();
                            Notice(string.Format("控制码:{0} 指令:{1}\r", taskArge.ControlCode, taskArge.Data.IdentityCode));
                        }
                        catch (Exception ex)
                        {
                            // _semaphore.Release();
                            throw ex;
                        }

                        if (taskArge != null && (((byte)taskArge.ControlCode) & 0x80) == 0x00)
                        {
                            //接收到主站请求数据
                            taskArge = CreateAnswerData(taskArge);
                            frame    = new Frame(taskArge);
                            buffer   = frame.GetBytes();
                            socket.Send(buffer);
                            Notice(string.Format("{0:yyyy-MM-dd HH:mm:ss}从站应答完成。\r", DateTime.Now));
                            watch.Restart();
                        }
                    }
                }
            }
            catch (Exception e)
            {
                Notice(string.Format("{1:yyyy-MM-dd HH:mm:ss} 程序异常:{0}\r", e.Message, DateTime.Now));

                Debug.Print(e.Message);
            }
        }
Ejemplo n.º 5
0
 public string SendData(TaskArge data)
 {
     //System.Console.WriteLine(this._meterId + "发送数据");
     return(this._protocol.SendData(data));
 }
Ejemplo n.º 6
0
        private bool _lastDowith = false;      //上一条上报数据是否处理完成,已处理完成则丢弃
        /// <summary>
        /// 处理主动上报数据
        /// </summary>
        /// <param name="control"></param>
        /// <param name="data"></param>
        public void ReportData(string mac, byte control, byte[] data, IotProtocolType protocolType)
        {
            lock (this._meterLink)
            {
                this._reportWatch.Restart();
                CY.IoTM.Protocol.Frame frame = null;
                if (protocolType == IotProtocolType.RanQiBiao)
                {
                    //燃气表协议
                    //解密数据
                    byte[]        desData   = Encryption.Decry(data, MKey);
                    DataItem_C001 item_C001 = new DataItem_C001(desData);
                    if (this._lastReportData == null || this._lastReportData.ReadDate != item_C001.ReadDate)
                    {
                        this._lastReportData = item_C001;
                        _lastDowith          = false;
                    }
                    //else if (_lastDowith)
                    //{
                    //    //上报的数据重复,并上条记录已处理过
                    //    return;
                    //}

                    //解析并应答
                    DataItem_C001_Answer itemAnswer = new DataItem_C001_Answer(item_C001.SER);
                    TaskArge             taskArge   = new TaskArge(mac, itemAnswer, ControlCode.CTR_7, MKey);
                    frame = new Protocol.Frame(taskArge);
                    if (this._reportWatch.ElapsedMilliseconds < Answer_YanShi)
                    {
                        Thread.Sleep(Answer_YanShi - (int)this._reportWatch.ElapsedMilliseconds);
                    }
                    this._meterLink.Send(frame.GetBytes());//应答数据
                    //检查上线的表是否登记到系统中
                    if (this.meter == null)
                    {
                        Log.getInstance().Write(MsgType.Information, "表:" + mac + " 在系统中未登记。");
                        Log.getInstance().Write(new OneMeterDataLogMsg(mac, "表:" + mac + "  在系统中未登记。"));
                        return;
                    }
                    Thread.Sleep(300);

                    //将接收到抄表数据提交给数据中心处理
                    Stopwatch _watch = new Stopwatch();
                    _watch.Start();
                    ReportData(item_C001);
                    //new Thread(new ParameterizedThreadStart(ReportData)).Start(item_C001);
                    Console.WriteLine("处理表:{0} 上报数据总用时:{1} 毫秒", mac, _watch.ElapsedMilliseconds);

                    //Log.getInstance().Write(MsgType.Information, "处理表:" + this.MAC + " 上报数据总用时:" + _watch.ElapsedMilliseconds + " 毫秒");
                    //Log.getInstance().Write(new OneMeterDataLogMsg(this.MAC, "处理表:" + this.MAC + " 上报数据总用时:" + _watch.ElapsedMilliseconds + " 毫秒" + "; 时间:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")));
                    _lastDowith = true;
                    //_watch.Stop();
                }
                else if (protocolType == IotProtocolType.LCD)
                {
                    //LCD屏协议
                    if (data[0] == 0xc0 && data[1] == 0x02)
                    {
                        //下载
                        DataItem_C002 item_C002 = new DataItem_C002(data);
                        Log.getInstance().Write(new OneMeterDataLogMsg(mac, $"[{this._meterLink.socketHandle}]接收到LCD下载请求,文件名:{item_C002.FileName} 文件长度:{item_C002.FileLength} 请求段号:{item_C002.CurrentSegmentsIndex}"));

                        MemoryStream stream = new MemoryStream();
                        string       str    = ADFileCacheService.getInstance().ReadFileSeg(stream, item_C002.FileName.Substring(0, 4), item_C002.FileName, item_C002.FileLength, item_C002.TotalSegments, item_C002.CurrentSegmentsIndex, item_C002.DataLength);


                        DataItem answerItem = null;
                        TaskArge answerArge = null;
                        if (str != "")
                        {
                            //没有读取到要下载的文件,返回异常应答信息
                            answerItem = new DataItem_C002_Answer_Err(item_C002.SER);
                            answerArge = new TaskArge(mac, answerItem, ControlCode.CTR_8);
                            //TODO:记录异常应答记录
                        }
                        else
                        {
                            byte[] tmp = new byte[stream.Length];
                            stream.Position = 0;
                            stream.Read(tmp, 0, tmp.Length);
                            answerItem = new DataItem_C002_Answer(item_C002.SER, item_C002.FileName, item_C002.FileLength, item_C002.TotalSegments, item_C002.CurrentSegmentsIndex, tmp);
                            answerArge = new TaskArge(mac, answerItem, ControlCode.CTR_7, IotProtocolType.LCD);
                        }
                        //发送应答数据
                        frame = new Protocol.Frame(answerArge);
                        //if (this._reportWatch.ElapsedMilliseconds < Answer_YanShi)
                        //    Thread.Sleep(Answer_YanShi - (int)this._reportWatch.ElapsedMilliseconds);

                        this._meterLink.Send(frame.GetBytes());//应答数据
                        if (this.meter == null)
                        {
                            Log.getInstance().Write(MsgType.Information, "表:" + mac + " 在系统中未登记。");
                            Log.getInstance().Write(new OneMeterDataLogMsg(mac, "表:" + mac + "  在系统中未登记。"));
                            return;
                        }
                    }
                    else
                    {
                        Log.getInstance().Write(new OneMeterDataLogMsg(mac, $"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}接收到错误的请求指令:{data[0]} {data[1]} "));
                    }
                }
            }
        }
Ejemplo n.º 7
0
        private void Execute(List <Task> taskList)
        {
            Task tmp = null;

            if (taskList != null)
            {
                int iTimes = 0;
                foreach (Task task in taskList)
                {
                    //检查任务是否在失败队列中,在失败队列中超过6次,不再发送
                    tmp = GetFailTask(task.TaskID);
                    if (tmp != null && tmp.Counter > 6)
                    {
                        continue;
                    }

                    if (task.TaskState == TaskState.Waitting)
                    {
                        List <Command> commandList = null;
                        if (task.CommandList.Count == 0)
                        {
                            continue;
                        }

                        commandList = task.CommandList;
                        for (int i = 0; i < commandList.Count; i++)
                        {
                            Command cmd = commandList[i];
                            if (isRunning == false)
                            {
                                return;
                            }
                            Thread.Sleep(1000);
                            #region 发送命令
                            if (cmd.CommandState == CommandState.Waitting)
                            {
                                iTimes = 0;
ReStart:
                                if (IsReSend == true)
                                {
                                    i        = CurCommandIndex;
                                    cmd      = commandList[i];
                                    IsReSend = false;
                                }
                                this._currentCommand = new ExecuteCommand(cmd, task, this.tms);


                                //创建发送帧
                                #region  广告命令 不加密 透明传输
                                if (task.TaskType == TaskType.TaskType_发布广告)
                                {
                                    //广告命令 不加密 透明传输
                                    TaskArge taskArge = new TaskArge(this.meter.Mac, _currentCommand.getDataItem(this.meter.LastTopUpSer), (ControlCode)cmd.ControlCode, IotProtocolType.LCD, null);
                                    this._meterLink.Send(new Protocol.Frame(taskArge).GetBytes());//发送请求指令

                                    Log.getInstance().Write(DateTime.Now.ToString() + " 主站向表【" + this.MAC + "】发送广告指令:" + i.ToString() + " " + taskArge.Data.IdentityCode + " 控制码:" + ((byte)taskArge.ControlCode).ToString("X2"), MsgType.Information);
                                    Log.getInstance().Write(new OneMeterDataLogMsg(this.MAC, "主站向表【" + this.MAC + "】发送广告指令:" + i.ToString() + " " + taskArge.Data.IdentityCode + " 控制码:" + ((byte)taskArge.ControlCode).ToString("X2") + "; 时间:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")));
                                }
                                #endregion

                                #region   其他命令 加密 传输
                                else
                                {
                                    TaskArge taskArge = new TaskArge(this.meter.Mac, _currentCommand.getDataItem(this.meter.LastTopUpSer), (ControlCode)cmd.ControlCode, MKey);
                                    this._meterLink.Send(new Protocol.Frame(taskArge).GetBytes());//发送请求指令
                                    Log.getInstance().Write(DateTime.Now.ToString() + " 主站向表【" + this.MAC + "】发送指令:" + taskArge.Data.IdentityCode + " 控制码:" + ((byte)taskArge.ControlCode).ToString("X2"), MsgType.Information);
                                    Log.getInstance().Write(new OneMeterDataLogMsg(this.MAC, "主站向表【" + this.MAC + "】发送指令:" + taskArge.Data.IdentityCode + " 控制码:" + ((byte)taskArge.ControlCode).ToString("X2") + "; 时间:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")));
                                }
                                #endregion   其他命令 加密 传输


                                if (!this._currentCommand.IsFinished && !_semaphore.WaitOne(SigeWaittingTime, false))
                                {
                                    iTimes++;
                                    if (iTimes > 2)
                                    {
                                        Log.getInstance().Write("向表【" + this.MAC + "】发送的任务执行失败.", MsgType.Information);
                                        Log.getInstance().Write(new OneMeterDataLogMsg(this.MAC, "向表【" + this.MAC + "】发送的任务执行失败."));
                                        if (tmp == null)
                                        {
                                            task.Counter++;
                                            this._failTaskList.Add(task);
                                        }
                                        else
                                        {
                                            tmp.Counter++;
                                        }

                                        goto End;
                                    }
                                    else
                                    {
                                        goto ReStart;
                                    }
                                }
                                if (this.IsReSend)
                                {
                                    goto ReStart;
                                }
                            }
                            Thread.Sleep(100);
                            #endregion 发送命令
                            if (cmd.CommandState == CommandState.Failed)
                            {
                                task.TaskState = TaskState.Failed;
                                break;
                            }
                        }
                    }
                    //处理任务,只要有指令执行失败,本次任务不能完成。
                    if (task.TaskState != TaskState.Failed)
                    {
                        task.TaskState = TaskState.Finished;
                    }
                    else
                    {
                        if (tmp == null)
                        {
                            task.Counter++;
                            this._failTaskList.Add(task);
                        }
                        else
                        {
                            tmp.Counter++;
                        }
                    }

                    TaskCompletes(task);
                }
End:
                this._reportWatch.Restart();
            }
        }
Ejemplo n.º 8
0
 /// <summary>
 /// 控制表(读取、设置表相关数据)
 /// </summary>
 /// <param name="arge"></param>
 /// <returns></returns>
 public RecordData Control(TaskArge arge)
 {
     this._frame = new Frame(arge);
     this._channel.Send(this._frame.GetBytes());
     return(null);
 }