// 读计量数据 = 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); }
public string SendData(TaskArge arge) { this._frame = new Frame(arge); byte[] data = this._frame.GetBytes(); this._channel.Send(data); return(ConvertHelper.GetHex(data)); }
/// <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; } }
//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); } }
public string SendData(TaskArge data) { //System.Console.WriteLine(this._meterId + "发送数据"); return(this._protocol.SendData(data)); }
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]} ")); } } } }
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(); } }
/// <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); }