private DataItem getCYReadDataAskItem(byte[] buffer) { IdentityCode identityCode = MyDataConvert.get数据表示符(buffer); DataItem item = null; switch (identityCode) { case IdentityCode.读时钟: item = new DataItem_C200(buffer); break; case IdentityCode.读切断报警参数: item = new DataItem_C201(buffer); break; case IdentityCode.读服务器信息: item = new DataItem_C202(buffer); break; case IdentityCode.读上传周期: item = new DataItem_C203(buffer); break; case IdentityCode.读公称流量: item = new DataItem_C204(buffer); break; } return(item); }
private DataItem getCYWriteDataAskItem(byte[] buffer) { IdentityCode identityCode = MyDataConvert.get数据表示符(buffer); DataItem item = null; switch (identityCode) { case IdentityCode.设置服务器信息: item = new DataItem_C104(buffer); break; case IdentityCode.设置上传周期: item = new DataItem_C105(buffer); break; case IdentityCode.设置切断报警参数: item = new DataItem_C103(buffer); break; case IdentityCode.修正表数据: item = new DataItem_C102(buffer); break; case IdentityCode.设置公称流量: item = new DataItem_C101(buffer); break; case IdentityCode.换表: item = new DataItem_C107(buffer); break; } return(item); }
private Task GetDuiShiTask(ITaskManage iTaskManage) { Task task = new Task(); task.MeterMac = this.MAC; task.TaskDate = DateTime.Now; task.TaskID = Guid.NewGuid().ToString(); //用于和指令进行进行关联 task.TaskState = TaskState.Waitting; task.TaskType = TaskType.TaskType_校时; //点火任务(DH),换表登记(HB)、开阀(KF)、关阀(GF)、充值(CZ)、调整价格(TJ) Command cmd = new Command(); //1.校时 byte ser = this.meter.LastTopUpSer; // Convert.ToByte(new Random().Next(0, 255)); DataItem_A015 item_A015 = new DataItem_A015(ser); // cmd.TaskID = task.TaskID; cmd.Identification = ((UInt16)item_A015.IdentityCode).ToString("X2"); cmd.ControlCode = (byte)ControlCode.WriteData;//写操作 cmd.DataLength = Convert.ToByte(item_A015.Length); cmd.DataCommand = MyDataConvert.BytesToHexStr(item_A015.GetBytes()); cmd.Order = 1; task.CommandList.Add(cmd); iTaskManage.SetDuiShiTask(task, cmd); return(task); }
public byte[] GetBytes() { int index = 2; byte[] arr = new byte[15 + this.dataLength]; arr[0] = 0xfe; arr[1] = 0xfe; arr[2] = 0x68; arr[3] = 0x30; //地址域 byte[] _key = MyDataConvert.StrToToHexByte(this.Adress.PadLeft(14, '0')); for (int i = 6; i >= 0; i--) { arr[index + i + 2] = _key[6 - i]; } //byte[] adress = BCD.S2BArr(this.Adress); //for (int i = 3; i < 10; i++) { // arr[i] = adress[i - 3]; //} //控制码 arr[index + 9] = (byte)this.ControlCode; //数据长度 arr[index + 10] = (byte)this.dataLength; //数据域 byte[] dataItemArr = this.DataItem.GetBytes(); byte[] desData; if (mkey == null) //广告任务命令不加密 { desData = new byte[dataItemArr.Length]; dataItemArr.CopyTo(desData, 0); } else { desData = Encryption.Encry(this.DataItem.GetBytes(), mkey); } //desData = Encryption.Encry(dataItemArr, mkey); for (int i = 0; i < desData.Length; i++) { arr[index + i + 11] = desData[i]; } //校验码 byte cs = 0x00; for (int i = index; i < index + dataLength + 11; i++) { cs += Convert.ToByte(arr[i]); } arr[index + 11 + this.dataLength] = cs; //结束符 arr[index + 12 + this.dataLength] = 0x16; return(arr); }
/// <summary> /// 设置调价计划 /// </summary> /// <param name="info"></param> /// <param name="meter"></param> /// <returns></returns> public string SetPricingPlan(PricingPlan info, IoT_PricingMeter meter) { string result = ""; try { MongoDBHelper <Task> mongo_task = new MongoDBHelper <Task>(); Task task = new Task(); task.MeterMac = meter.MeterNo.Trim(); task.TaskDate = QuShi.getDate(); task.TaskID = Guid.NewGuid().ToString(); //用于和指令进行进行关联 task.TaskState = TaskState.Waitting; task.TaskType = TaskType.TaskType_调整价格; // //读取表信息 info.MeterNo = meter.MeterNo.Trim(); info.TaskID = task.TaskID; //写任务 mongo_task.Insert(CollectionNameDefine.TaskCollectionName, task); meter.TaskID = task.TaskID; //2.设置调价计划数据 DataItem_A010 item_A010 = null; CT ct = new CT(info.MeterType == "00" ? MeterType.气量表 : MeterType.金额表, (bool)info.IsUsedLadder, (JieSuanType)Convert.ToInt16(info.SettlementType.ToString()), ((int)info.Ladder) <= 0 ? 1 : (int)info.Ladder); item_A010 = new DataItem_A010(Convert.ToByte(new Random().Next(0, 255)), ct, DateTime.Now); item_A010.Price1 = (decimal)info.Price1; item_A010.Price2 = (decimal)info.Price2; item_A010.Price3 = (decimal)info.Price3; item_A010.Price4 = (decimal)info.Price4; item_A010.Price5 = (decimal)info.Price5; item_A010.UseGas1 = (decimal)info.Gas1; item_A010.UseGas2 = (decimal)info.Gas2; item_A010.UseGas3 = (decimal)info.Gas3; item_A010.UseGas4 = (decimal)info.Gas4; item_A010.StartDate = Convert.ToDateTime(info.UseDate); Command cmd = new Command(); cmd.TaskID = task.TaskID; cmd.Identification = ((UInt16)item_A010.IdentityCode).ToString("X2"); cmd.ControlCode = (byte)ControlCode.WriteData;//设置参数 cmd.DataLength = Convert.ToByte(item_A010.Length); cmd.DataCommand = MyDataConvert.BytesToHexStr(item_A010.GetBytes()); cmd.Order = 1; CommandDA.Insert(cmd); new PricingPlanDA().NewPricingPlan(info); //注:该函数如何进行事务处理,保证所有数据更新都成功。 } catch (Exception e) { result = e.Message; } return(result); }
/// <summary> /// 添加修正任务 /// </summary> /// <param name="correctRecord"></param> /// <returns></returns> public string AddCorrentTask(CorrectRecord correctRecord, out Task returnTask) { string result = ""; returnTask = null; try { //先删除未执行的任务 DeleteUnRunTask(correctRecord.MeterNo.Trim()); MongoDBHelper <Meter> mongo = new MongoDBHelper <Meter>(); //1、记录修正信息 result = mongo.Insert(CollectionNameDefine.MeterCorrectRecord, correctRecord); if (result != "") { return(result); } //2、创建修正任务指令 //创建一个任务 MongoDBHelper <Task> mongo_task = new MongoDBHelper <Task>(); Task task = new Task(); task.MeterMac = correctRecord.MeterNo.Trim(); task.TaskDate = QuShi.getDate(); task.TaskID = Guid.NewGuid().ToString(); //用于和指令进行进行关联 task.TaskState = TaskState.Waitting; task.TaskType = TaskType.TaskType_校准; //点火任务(DH),换表登记(HB)、开阀(KF)、关阀(GF)、充值(CZ)、调整价格(TJ) //写任务 result = mongo_task.Insert(CollectionNameDefine.TaskCollectionName, task); if (result != "") { return(result); } Command cmd = new Command(); //1.写校正指令 byte ser = Convert.ToByte(new Random().Next(0, 255)); DataItem_C102 item_C102 = new DataItem_C102(ser, correctRecord.TotalTopUp - correctRecord.SettlementBalance, correctRecord.SettlementBalance, correctRecord.LastSettlementDayLJGas); cmd.TaskID = task.TaskID; cmd.Identification = ((UInt16)item_C102.IdentityCode).ToString("X2"); cmd.ControlCode = (byte)ControlCode.CYWriteData;//创源写操作 cmd.DataLength = Convert.ToByte(item_C102.Length); cmd.DataCommand = MyDataConvert.BytesToHexStr(item_C102.GetBytes()); cmd.Order = 1; //返回修正任务 result = CommandDA.Insert(cmd); returnTask = task; task.CommandList.Add(cmd); if (result != "") { return(result); } } catch (Exception e) { return(e.Message); } return(""); }
/// <summary> /// 主站请求写数据对象 /// </summary> /// <param name="buffer"></param> /// <returns></returns> private DataItem getWriteDataAskItem(byte[] buffer) { IdentityCode identityCode = MyDataConvert.get数据表示符(buffer); DataItem item = null; switch (identityCode) { case IdentityCode.写价格表: item = new DataItem_A010(buffer); break; case IdentityCode.写结算日: item = new DataItem_A011(buffer); break; case IdentityCode.写购入金额: item = new DataItem_A013(buffer); break; case IdentityCode.写新密钥: item = new DataItem_A014(buffer); break; case IdentityCode.写标准时间: item = new DataItem_A015(buffer); break; case IdentityCode.写阀门控制: item = new DataItem_A017(buffer); break; case IdentityCode.出厂启用: item = new DataItem_A019(buffer); break; case IdentityCode.写地址: item = new DataItem_A018(buffer); break; case IdentityCode.写表底数: item = new DataItem_A016(buffer); break; default: break; } return(item); }
/// <summary> /// 设置报警参数任务 /// </summary> /// <param name="info"></param> /// <param name="meter"></param> /// <returns></returns> public string SetWariningParameter(IoT_SetAlarm info, IoT_AlarmMeter meter) { string result = ""; try { MongoDBHelper <Task> mongo_task = new MongoDBHelper <Task>(); Task task = new Task(); task.MeterMac = meter.MeterNo.Trim(); task.TaskDate = QuShi.getDate(); task.TaskID = Guid.NewGuid().ToString(); //用于和指令进行进行关联 task.TaskState = TaskState.Waitting; task.TaskType = TaskType.TaskType_设置报警参数; // //写任务 mongo_task.Insert(CollectionNameDefine.TaskCollectionName, task); meter.TaskID = task.TaskID; //3.设置报警参数 DataItem_C103 item_C103 = new DataItem_C103(Convert.ToByte(new Random().Next(0, 255)), new WaringSwitchSign(info.SwitchTag)); item_C103.长期未与服务器通讯报警时间 = Convert.ToByte(info.Par1); item_C103.燃气漏泄切断报警时间 = Convert.ToByte(info.Par2); item_C103.燃气流量过载切断报警时间 = Convert.ToByte(info.Par3); item_C103.异常大流量值 = MyDataConvert.TwoBCDStrToDecimal(info.Par4); item_C103.异常大流量切断报警时间 = Convert.ToByte(info.Par5); item_C103.异常微小流量切断报警时间 = Convert.ToByte(info.Par6); item_C103.持续流量切断报警时间 = Convert.ToByte(info.Par7); item_C103.长期未使用切断报警时间 = Convert.ToByte(info.Par8); //item_C103.长期未使用切断报警时间 = Convert.ToByte(info.Par7); Command cmd = new Command(); cmd.TaskID = task.TaskID; cmd.Identification = ((UInt16)item_C103.IdentityCode).ToString("X2"); cmd.ControlCode = (byte)ControlCode.CYWriteData;//设置参数 cmd.DataLength = Convert.ToByte(item_C103.Length); cmd.DataCommand = MyDataConvert.BytesToHexStr(item_C103.GetBytes()); cmd.Order = 3; CommandDA.Insert(cmd); } catch (Exception e) { result = e.Message; } return(result); }
/// <summary> /// 创建充值任务 /// </summary> /// <param name="topup">充值数据对象</param> /// <param name="taskID"></param> /// <returns></returns> public string TopUp(IoT_MeterTopUp topup, out string taskID) { //创建一个任务 string result = ""; MongoDBHelper <Task> mongo_task = new MongoDBHelper <Task>(); Task task = new Task(); task.MeterMac = topup.MeterNo.Trim(); task.TaskDate = QuShi.getDate(); task.TaskID = Guid.NewGuid().ToString(); //用于和指令进行进行关联 task.TaskState = TaskState.Waitting; task.TaskType = TaskType.TaskType_充值; //点火任务(DH),换表登记(HB)、开阀(KF)、关阀(GF)、充值(CZ)、调整价格(TJ) //写任务 result = mongo_task.Insert(CollectionNameDefine.TaskCollectionName, task); taskID = task.TaskID; if (result != "") { return(result); } //创建命令 Command cmd = new Command(); byte ser = Convert.ToByte(topup.Ser);//new Random().Next(0, 255)); DataItem_A013 item_A013 = new DataItem_A013(ser, ser, (decimal)topup.Amount); cmd.TaskID = task.TaskID; cmd.Identification = ((UInt16)item_A013.IdentityCode).ToString("X2"); cmd.ControlCode = (byte)ControlCode.WriteData;//写操作 cmd.DataLength = Convert.ToByte(item_A013.Length); cmd.DataCommand = MyDataConvert.BytesToHexStr(item_A013.GetBytes()); cmd.Order = 1; result = CommandDA.Insert(cmd); if (result != "") { return(result); } return(""); }
/// <summary> /// 获取定义的key /// </summary> /// <param name="companyID"></param> /// <returns></returns> private string getKey(string companyID) { IoT_SystemPar par = new SystemParManageService().getSystemPar(companyID); byte[] keys = { 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88 }; if ((bool)par.AutoKey) { Random random = new Random(DateTime.Now.Millisecond); random.NextBytes(keys); } else { if (par.MKey != null || par.MKey.Length == 16) { try { byte[] tmp = MyDataConvert.StrToToHexByte(par.MKey); for (int i = 0; i < 8; i++) { keys[i] = tmp[i]; } } catch { goto END; } } } END: StringBuilder sb = new StringBuilder(); for (int i = 0; i < 8; i++) { sb.Append(string.Format("{0:X2}", keys[i])); } return(sb.ToString()); }
/// <summary> /// 设置结算日 /// </summary> /// <param name="settlementDay"></param> /// <param name="meter"></param> /// <returns></returns> public string SetSettlementDay(IoT_SetSettlementDay settlementDay, IoT_SettlementDayMeter meter) { string result = ""; try { MongoDBHelper <Task> mongo_task = new MongoDBHelper <Task>(); Task task = new Task(); task.MeterMac = meter.MeterNo.Trim(); task.TaskDate = QuShi.getDate(); task.TaskID = Guid.NewGuid().ToString(); //用于和指令进行进行关联 task.TaskState = TaskState.Waitting; task.TaskType = TaskType.TaskType_设置结算日期; // //写任务 mongo_task.Insert(CollectionNameDefine.TaskCollectionName, task); meter.TaskID = task.TaskID; //2.设置上传周期 int JSDay = (int)settlementDay.SettlementDay; int JSMonth = (int)settlementDay.SettlementMonth; DataItem_A011 item_A011 = new DataItem_A011(Convert.ToByte(new Random().Next(0, 255)), JSDay, JSMonth); Command cmd = new Command(); cmd.TaskID = task.TaskID; cmd.Identification = ((UInt16)item_A011.IdentityCode).ToString("X2"); cmd.ControlCode = (byte)ControlCode.WriteData;//设置参数 cmd.DataLength = Convert.ToByte(item_A011.Length); cmd.DataCommand = MyDataConvert.BytesToHexStr(item_A011.GetBytes()); cmd.Order = 1; CommandDA.Insert(cmd); } catch (Exception e) { result = e.Message; } return(result); }
private bool ReportToZhuZhan(Stopwatch watch, Socket socket) { watch.Start(); DataItem_C001 item_C001 = new DataItem_C001(ser++, DateTime.Now, this.TotalAmount, this.TotalTopUp - this.CurrentBalance, this.CurrentBalance, this.LastTotal, this._st1, this._st2); TaskArge taskArge = new TaskArge(this.Mac, item_C001, ControlCode.CTR_6, MKey); Frame frame = new Frame(taskArge); int iTime = 1; byte[] buffer = frame.GetBytes(); while (socket.Poll(100, SelectMode.SelectWrite)) { socket.Send(buffer); break; } Notice(string.Format("{1:yyyy-MM-dd HH:mm:ss} 第{0}次发送上报数据请求帧\r", iTime, DateTime.Now)); string message; //等待应答 while (true) { Thread.Sleep(100); 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)); taskArge = JieXi(buffer, out message); if (taskArge != null && taskArge.ControlCode == ControlCode.CTR_7) { Notice(string.Format("第{0}次发送上报数据请求完成。\r", iTime)); } Notice(string.Format("本次上报数据总用时:{0}毫秒\r", watch.ElapsedMilliseconds)); this._reportWatch.Restart(); break; } else if (socket.Poll(100, SelectMode.SelectError)) { } if (watch.ElapsedMilliseconds >= 1000 * 10) { if (iTime >= 3) { //接收不到主站应答,本次上报结束 this.tcpClient.Close(); this.tcpClient = null; return(false); } iTime++; buffer = frame.GetBytes(); socket.Send(buffer); Notice(string.Format("{1:yyyy-MM-dd HH:mm:ss}接收到主站应答数据:{0}\r", MyDataConvert.BytesToHexStr(buffer), DateTime.Now)); watch.Restart(); } } return(true); }
//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); } }
/// <summary> /// 发布广告 /// </summary> /// <param name="ap">广告发布信息</param> /// <param name="listMeter">广告用户列表</param> /// <param name="aDItems">广告内容列表</param> /// <param name="type">发布类型</param> /// <returns></returns> public string PublishAD(ADPublish ap, List <ADPublisMeter> listMeter, List <ADItem> aDItems, PublishType type) { //创建一个任务 ser++; MongoDBHelper <Task> mongo_task = new MongoDBHelper <Task>(); // DataItem_C109(byte ser, ADPublishOperatorCode operatorCode,byte fileCount,List<ADFile> fileList) //发布文件列表 List <Common.Item.ADFile> fileList = new List <Common.Item.ADFile>(); //操作码 ADPublishOperatorCode operatorCode = type == PublishType.NewPublish ? ADPublishOperatorCode.ReDefineList : ADPublishOperatorCode.AddList; //文件条数 byte fileCount = (byte)aDItems.Count; foreach (ADItem item in aDItems) { Common.Item.ADFile aDfile = new Common.Item.ADFile((int)item.OrderID, item.StoreName, (DateTime)item.BDate, (DateTime)item.EDate, (int)item.Length, (int)item.FileLength); fileList.Add(aDfile); } foreach (ADPublisMeter meter in listMeter) { Task task = new Task(); task.MeterMac = meter.MeterNo.Trim(); task.TaskDate = QuShi.getDate(); task.TaskID = Guid.NewGuid().ToString(); //用于和指令进行进行关联 task.TaskState = TaskState.Waitting; task.TaskType = TaskType.TaskType_发布广告; //广告文件(GGF) task.TaskSource = string.Format("{0}|{1}|{2}", meter.AP_ID, meter.UserID, meter.CompanyID); mongo_task.Insert(CollectionNameDefine.TaskCollectionName, task); //meter.TaskID = task.TaskID; //设置任务编号 //准备指令 Command cmd = new Command(); DataItem_C109 item_c109 = new DataItem_C109(ser, operatorCode, fileCount, fileList); cmd.Identification = ((UInt16)item_c109.IdentityCode).ToString("X2");; cmd.ControlCode = (byte)ControlCode.CYWriteData;//设置参数 byte[] tmp = item_c109.GetBytes(); cmd.DataLength = Convert.ToByte(tmp.Length); cmd.DataCommand = MyDataConvert.BytesToHexStr(tmp); //指令内容 cmd.Order = (byte)1; cmd.TaskID = task.TaskID; CommandDA.Insert(cmd); } //Command cmd = new Command(); //byte ser = Convert.ToByte(new Random().Next(0, 255)); //byte fileid = (byte)adfile.id;//广告命令 只存储文件编号 //byte[] contentAllBytes = new byte[1]; //contentAllBytes[0] = fileid; ////1.文件发送 //DataItem_C108 item_C108 = new DataItem_C108(ser, adfile.FileName, 1, 1, 1, 1, contentAllBytes);// //cmd.TaskID = task.TaskID; //cmd.Identification = ((UInt16)item_C108.IdentityCode).ToString("X2"); ; //cmd.ControlCode = (byte)ControlCode.CYWriteData;//设置参数 //cmd.DataLength = Convert.ToByte(contentAllBytes.Length); //cmd.DataCommand = MyDataConvert.BytesToHexStr(item_C108.GetBytes()); ; //文件内容 //cmd.Order = (byte)1; //CommandDA.Insert(cmd); //1.文件配置发送指令 //cmd = new Command(); //DataItem_C109 item_C109 = new DataItem_C109(Convert.ToByte(new Random().Next(0, 255)), adddfile.FileNO, adddfile.FileName, adddfile.DTStart, adddfile.DTEnd, adddfile.PollTime, adddfile.OpShowStatus, adddfile.OpDeleteStatus);// //cmd.TaskID = task.TaskID; //cmd.Identification = ((UInt16)item_C109.IdentityCode).ToString("X2"); //cmd.ControlCode = (byte)ControlCode.CYWriteData;//设置参数 //cmd.DataLength = Convert.ToByte(item_C109.Length); //cmd.DataCommand = MyDataConvert.BytesToHexStr(item_C109.GetBytes()); //cmd.Order = (byte)(2); //CommandDA.Insert(cmd); return("");//返回空表示成功 }
/// <summary> /// 换表申请指令 /// </summary> /// <returns></returns> public string SubmitASK(string taskID, IoT_Meter meter, decimal LJGas) { /*数据标识DI,序号SER,当前累计用量(金额),当前剩余用量(气量/金额),本阶梯周期已使用累计用量(气量)*/ //创建一个任务 MongoDBHelper <Task> mongo_task = new MongoDBHelper <Task>(); Task task = new Task(); task.MeterMac = meter.MeterNo.Trim(); task.TaskDate = QuShi.getDate(); task.TaskID = taskID; //用于和指令进行进行关联 task.TaskState = TaskState.Waitting; task.TaskType = TaskType.TaskType_换表登记; //点火任务(DH),换表登记(HB)、开阀(KF)、关阀(GF)、充值(CZ)、调整价格(TJ) //写任务 mongo_task.Insert(CollectionNameDefine.TaskCollectionName, task); Command cmd = new Command(); byte ser = Convert.ToByte(new Random().Next(0, 255)); cmd = new Command(); //1.写密钥 //DataItem_A014 item_A014 = new DataItem_A014(ser, (byte)meter.MKeyVer, meter.MKey);// //cmd.TaskID = task.TaskID; //cmd.Identification = ((UInt16)item_A014.IdentityCode).ToString("X2"); //cmd.ControlCode = (byte)ControlCode.WriteData;//写操作 //cmd.DataLength = Convert.ToByte(item_A014.Length); //cmd.DataCommand = MyDataConvert.BytesToHexStr(item_A014.GetBytes()); //cmd.Order = 1; //CommandDA.Insert(cmd); ////2.设置上传周期 //DataItem_C105 item_C105 = new DataItem_C105(Convert.ToByte(new Random().Next(0, 255)), ReportCycleType.天周期, 1, 23, 59); //cmd = new Command(); //cmd.TaskID = task.TaskID; //cmd.Identification = ((UInt16)item_C105.IdentityCode).ToString("X2"); //cmd.ControlCode = (byte)ControlCode.CYWriteData;//设置参数 //cmd.DataLength = Convert.ToByte(item_C105.Length); //cmd.DataCommand = MyDataConvert.BytesToHexStr(item_C105.GetBytes()); //cmd.Order = 2; //CommandDA.Insert(cmd); ////3.设置报警参数 //DataItem_C103 item_C103 = new DataItem_C103(Convert.ToByte(new Random().Next(0, 255)), new WaringSwitchSign() { 长期未使用切断报警 = true, 长期未与服务器通讯报警 = true }); //cmd = new Command(); //cmd.TaskID = task.TaskID; //cmd.Identification = ((UInt16)item_C103.IdentityCode).ToString("X2"); //cmd.ControlCode = (byte)ControlCode.CYWriteData;//设置参数 //cmd.DataLength = Convert.ToByte(item_C103.Length); //cmd.DataCommand = MyDataConvert.BytesToHexStr(item_C103.GetBytes()); //cmd.Order = 3; //CommandDA.Insert(cmd); //4.写价格表 DataItem_A010 item_A010 = null; CT ct = new CT(meter.MeterType == "00" ? MeterType.气量表 : MeterType.金额表, (bool)meter.IsUsed, (JieSuanType)Convert.ToInt16(meter.SettlementType.ToString()), meter.Ladder == null ? 1 : (int)meter.Ladder); item_A010 = new DataItem_A010(Convert.ToByte(new Random().Next(0, 255)), ct, DateTime.Now); item_A010.Price1 = (decimal)meter.Price1; item_A010.Price2 = (decimal)meter.Price2; item_A010.Price3 = (decimal)meter.Price3; item_A010.Price4 = (decimal)meter.Price4; item_A010.Price5 = (decimal)meter.Price5; item_A010.UseGas1 = (decimal)meter.Gas1; item_A010.UseGas2 = (decimal)meter.Gas2; item_A010.UseGas3 = (decimal)meter.Gas3; item_A010.UseGas4 = (decimal)meter.Gas4; item_A010.StartDate = DateTime.Now; cmd = new Command(); cmd.TaskID = task.TaskID; cmd.Identification = ((UInt16)item_A010.IdentityCode).ToString("X2"); cmd.ControlCode = (byte)ControlCode.WriteData;//设置参数 cmd.DataLength = Convert.ToByte(item_A010.Length); cmd.DataCommand = MyDataConvert.BytesToHexStr(item_A010.GetBytes()); cmd.Order = 4; CommandDA.Insert(cmd); //5.写结算日 DataItem_A011 item_a011 = new DataItem_A011(Convert.ToByte(new Random().Next(0, 255)), Convert.ToByte(meter.SettlementDay)); item_a011.JieSuanMonth = 1;//根据系统定义取值 cmd = new Command(); cmd.TaskID = task.TaskID; cmd.Identification = ((UInt16)item_a011.IdentityCode).ToString("X2"); cmd.ControlCode = (byte)ControlCode.WriteData;//设置参数 cmd.DataLength = Convert.ToByte(item_a011.Length); cmd.DataCommand = MyDataConvert.BytesToHexStr(item_a011.GetBytes()); cmd.Order = 5; CommandDA.Insert(cmd); //6.写换表指令 DataItem_C107 item_C107 = new DataItem_C107(Convert.ToByte(new Random().Next(0, 255)), 0.0m, (decimal)meter.TotalTopUp, LJGas); cmd = new Command(); cmd.TaskID = task.TaskID; cmd.Identification = ((UInt16)item_C107.IdentityCode).ToString("X2"); cmd.ControlCode = (byte)ControlCode.CYWriteData;//设置参数 cmd.DataLength = Convert.ToByte(item_C107.Length); cmd.DataCommand = MyDataConvert.BytesToHexStr(item_C107.GetBytes()); cmd.Order = 6; CommandDA.Insert(cmd); return(""); }
public byte[] GetBytes() { int index = 2; byte[] arr = new byte[15 + (this._protocolType == IotProtocolType.LCD ? 1 : 0) + this.dataLength]; arr[0] = 0xfe; arr[1] = 0xfe; arr[2] = 0x68; //arr[3] = 0x30; arr[3] = (byte)this._protocolType; //地址域 byte[] _key = MyDataConvert.StrToToHexByte(this.Adress.PadLeft(14, '0')); for (int i = 6; i >= 0; i--) { arr[index + i + 2] = _key[6 - i]; } //byte[] adress = BCD.S2BArr(this.Adress); //for (int i = 3; i < 10; i++) { // arr[i] = adress[i - 3]; //} //控制码 arr[index + 9] = (byte)this.ControlCode; //数据长度 arr[index + 10] = (byte)(this.dataLength & 0xff); int iOffset = 11; //定义从包头(0x68)到数据区域字节数 if (this._protocolType == IotProtocolType.LCD) { iOffset = 12; arr[index + 11] = (byte)((this.dataLength >> 8) & 0xff); } //数据域 byte[] dataItemArr = this.DataItem.GetBytes(); byte[] desData; if (mkey == null || this._protocolType == IotProtocolType.LCD) //广告任务命令不加密 { desData = new byte[dataItemArr.Length]; dataItemArr.CopyTo(desData, 0); } else { desData = Encryption.Encry(this.DataItem.GetBytes(), mkey); } //desData = Encryption.Encry(dataItemArr, mkey); for (int i = 0; i < desData.Length; i++) { arr[index + i + iOffset] = desData[i]; } //校验码 byte cs = 0x00; for (int i = index; i < index + dataLength + iOffset; i++) { cs += Convert.ToByte(arr[i]); } arr[index + iOffset + this.dataLength] = cs; //结束符 arr[index + iOffset + 1 + this.dataLength] = 0x16; return(arr); }
/// <summary> /// 设置上传周期 /// </summary> /// <param name="info"></param> /// <param name="meter"></param> /// <returns></returns> public string SetUploadCycle(IoT_SetUploadCycle info, IoT_UploadCycleMeter meter) { string result = ""; try { MongoDBHelper <Task> mongo_task = new MongoDBHelper <Task>(); Task task = new Task(); task.MeterMac = meter.MeterNo.Trim(); task.TaskDate = QuShi.getDate(); task.TaskID = Guid.NewGuid().ToString(); //用于和指令进行进行关联 task.TaskState = TaskState.Waitting; task.TaskType = TaskType.TaskType_设置上传周期; // //写任务 mongo_task.Insert(CollectionNameDefine.TaskCollectionName, task); meter.TaskID = task.TaskID; /*上传周期模式: * 00:以月为周期,在每个月的XX日YY时ZZ分上传数据; * 01:以XX天为周期,在每XX天的YY时ZZ分上传数据,起点为每月的01日00时00分; * 02:以YY时为周期,在每YY小时的ZZ分上传数据,起点为每天的00时00分; * 03:以燃气表启动开始计时,以XX日YY时ZZ分上传数据 */ ReportCycleType cycleType = ReportCycleType.时周期; if (info.ReportType == "00") { cycleType = ReportCycleType.月周期; } else if (info.ReportType == "01") { cycleType = ReportCycleType.天周期; } else if (info.ReportType == "02") { cycleType = ReportCycleType.时周期; } else if (info.ReportType == "03") { cycleType = ReportCycleType.周期采集; } /*周期参数, * DD 天 范围:00-31 * HH 小时 范围:00-23 * MM 分钟 范围:00-59*/ int DD = 1; int HH = 23; int MM = 59; try { DD = Convert.ToInt32(info.Par.Substring(0, 2)); HH = Convert.ToInt32(info.Par.Substring(2, 2)); MM = Convert.ToInt32(info.Par.Substring(4, 2)); } catch { } //2.设置上传周期 DataItem_C105 item_C105 = new DataItem_C105(Convert.ToByte(new Random().Next(0, 255)), cycleType, DD, HH, MM); item_C105.type = (ReportCycleType)Convert.ToByte(info.ReportType); item_C105.XX = Convert.ToUInt16(info.Par.Substring(0, 2)); item_C105.YY = Convert.ToUInt16(info.Par.Substring(2, 2)); item_C105.ZZ = Convert.ToUInt16(info.Par.Substring(4, 2)); Command cmd = new Command(); cmd.TaskID = task.TaskID; cmd.Identification = ((UInt16)item_C105.IdentityCode).ToString("X2"); cmd.ControlCode = (byte)ControlCode.CYWriteData;//设置参数 cmd.DataLength = Convert.ToByte(item_C105.Length); cmd.DataCommand = MyDataConvert.BytesToHexStr(item_C105.GetBytes()); cmd.Order = 2; CommandDA.Insert(cmd); } catch (Exception e) { result = e.Message; } return(result); }