示例#1
0
        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);
        }
示例#2
0
        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);
        }
示例#3
0
        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);
        }
示例#4
0
        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);
        }
示例#6
0
        /// <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("");
        }
示例#7
0
        /// <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);
        }
示例#9
0
        /// <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("");
        }
示例#10
0
        /// <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());
        }
示例#11
0
        /// <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);
        }
示例#12
0
        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);
        }
示例#13
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);
            }
        }
示例#14
0
        /// <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("");//返回空表示成功
        }
示例#15
0
        /// <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("");
        }
示例#16
0
        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);
        }
示例#17
0
        /// <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);
        }