/// <summary>
        /// 根据MeterDisassemblyTaskResultInfo组合成任务结果文件内容
        /// 换表和销户的任务结果
        /// </summary>
        /// <param name="resultinfo"></param>
        /// <returns></returns>
        private static String GetResultFileContent_Replase(MeterDisassemblyTaskResultInfo resultinfo)
        {
            List <String> contentlist = new List <string> {
            };

            /*TaskID=XX(当前的任务ID)
             * TaskType=1(0-退购,1-换表,2-销户)
             * TechnicianID =XX(上门工程师的ID)
             * MeterAddress=012017062001(表通信地址,射频卡表是LAPIS中的meterbasicinfo里面的communicationaddress)
             * MeterStatue=0/1 (表计的状态,0-损坏,1-正常)
             * UsedValue=XX (配合MeterStatue,如果表计正常,则UsedValue指总使用金额/量。如果表计损坏,则UsedValue指当前机械读数)
             * RemainValue=XX(配合MeterStatue,如果表计正常,则RemainValue指剩余金额/量。如果表计损坏,保持为0,返回LAPIS由系统计算)
             * OldMeterTotalDialReading=XX(表计中的总使用量,如果表计正常,则表示标识00000010总使用量。如果表计损坏,则指当前机械读数)
             * Result=0/1 (任务是否成功,0-失败,1-成功)
             * Feedback= (工程师反馈的任务结果信息)
             * Date=20XX-XX-XX (操作日期)*/
            String filestr = Const_TaskID + "=" + resultinfo.TaskID.ToString();

            contentlist.Add(filestr);
            filestr = Const_TaskType + "=" + ((Int32)resultinfo.TaskType).ToString();
            contentlist.Add(filestr);
            filestr = Const_TechnicianID + "=" + resultinfo.TechnicianID.ToString();
            contentlist.Add(filestr);

            filestr = Const_MeterAddress + "=" + resultinfo.MeterAddress;
            contentlist.Add(filestr);
            String resstr = (resultinfo.MeterStatue) ? "1" : "0";

            filestr = Const_MeterStatue + "=" + resstr;
            contentlist.Add(filestr);

            filestr = Const_UsedValue + "=" + resultinfo.TotalComsumedValue.ToString("F2");
            contentlist.Add(filestr);
            filestr = Const_RemainValue + "=" + resultinfo.RemainValue.ToString("F2");
            contentlist.Add(filestr);

            filestr = Const_OldMeterTotalDialReading + "=" + resultinfo.OldMeterTotalDialReading.ToString("F2");
            contentlist.Add(filestr);


            resstr  = (resultinfo.TaskResult == (Int32)eTaskResult.Failed) ? "0" : "1";
            filestr = Const_Result + "=" + resstr;
            contentlist.Add(filestr);

            filestr = Const_Feedback + "=" + resultinfo.Feedback;
            contentlist.Add(filestr);

            resstr  = resultinfo.OperateFinishTime.ToString("yyyy-MM-dd");
            filestr = Const_Date + "=" + resstr;
            contentlist.Add(filestr);

            String reslutfile = DataFormatProcessor.ListToString(contentlist, Environment.NewLine);

            return(reslutfile);
        }
        /// <summary>
        /// 获取文件名
        /// 根据任务类型和对应的参数
        /// </summary>
        /// <param name="type"></param>
        /// <param name="refundtaskinfo"></param>
        /// <param name="resultinfo"></param>
        /// <param name="isResultFile">true-结果文件名,false-任务文件名</param>
        /// <returns></returns>
        private static String GetFileName(eTaskType type,
                                          RefundTask refundtaskinfo, MeterDisassemblyTaskBase resultinfo, Boolean isResultFile = true)
        {
            List <String> namelist = new List <string> {
            };

            String str = String.Empty;

            //先根据任务类型
            switch (type)
            {
            case eTaskType.CloseCustomer:
                str = (isResultFile) ? Const_TaskFileResultName_CancelAccountResult : Const_TaskFileName_CancelAccountTask;
                break;

            case eTaskType.Refund:
                str = (isResultFile) ? Const_TaskFileResultName_RefundResult : Const_TaskFileName_RefundTask;
                break;

            case eTaskType.ReplaceMeter:
                str = (isResultFile) ? Const_TaskFileResultName_ReplaceMeterResult : Const_TaskFileName_ReplaceMeterTask;
                break;

            default:
                return(null);
            }
            namelist.Add(str);

            if (type == eTaskType.Refund)
            {
                if (refundtaskinfo == null)
                {
                    return(null);
                }
                //获取 TechnicianID
                namelist.Add(refundtaskinfo.TechnicianID.ToString());
                //获取 TaskID
                namelist.Add(refundtaskinfo.TaskID.ToString());
            }
            else
            {
                if (resultinfo == null)
                {
                    return(null);
                }
                //获取 TechnicianID
                namelist.Add(resultinfo.TechnicianID.ToString());
                //获取 TaskID
                namelist.Add(resultinfo.TaskID.ToString());
            }
            String reslutfilename = DataFormatProcessor.ListToString(namelist, "_");

            reslutfilename = reslutfilename + ".bin";
            return(reslutfilename);
        }
        /// <summary>
        /// 根据RefundTaskInfo组合成任务文件内容
        /// 仅退购的任务
        /// </summary>
        /// <param name="refundtaskinfo"></param>
        /// <returns></returns>
        private static String GetTaskFileContent_Refund(RefundTaskInfo refundtaskinfo)
        {
            if (refundtaskinfo == null)
            {
                return(null);
            }
            List <String> contentlist = new List <string> {
            };

            /*TaskID=XX(当前的任务ID)
             * TaskType=0:退购,1:换表,2:销户
             * TechnicianID =XX(上门工程师的ID)
             * MeterAddress=012017062001(表通信地址)
             * TIDTestingToken=XXXX XXXX XXXX XXXX XXXX(测试TID的TOKEN,值为0)
             * RefundToken=XXXX XXXX XXXX XXXX XXXX(撤销金额的TOKEN)
             * RefundValue=0.00(根据用户走量还是走金额,从交易记录中获取对应的值)
             * MeterProtocolType=XX (表通信协议类型,eMeterProtocolType)
             * DecimalParameter=脉冲当量小数位数;计量模式;价格精度小数位数;结算精度小数位数;是否显示K
             * SetMeterKeyParam=XXXXXXXXXXXXX (STS卡表在开启或关闭红外的时候需要这个设置密钥来制卡)
             */

            String filestr = Const_TaskID + "=" + refundtaskinfo.TaskID.ToString();

            contentlist.Add(filestr);
            filestr = Const_TaskType + "=0";
            contentlist.Add(filestr);

            filestr = Const_RefundTradeID + "=" + refundtaskinfo.RefundTradeID.ToString();
            contentlist.Add(filestr);

            filestr = Const_TechnicianID + "=" + refundtaskinfo.TechnicianID.ToString();
            contentlist.Add(filestr);

            filestr = Const_MeterAddress + "=" + refundtaskinfo.MeterAddress;
            contentlist.Add(filestr);

            filestr = Const_TIDTestingToken + "=" + refundtaskinfo.TIDTestingToken;
            contentlist.Add(filestr);
            filestr = Const_RefundValue + "=" + refundtaskinfo.RefundValue.ToString("F2");
            contentlist.Add(filestr);

            filestr = Const_MeterProtocolType + "=" + ((Int32)refundtaskinfo.ProtocolType).ToString();
            contentlist.Add(filestr);

            filestr = Const_DecimalParameter + "=" + refundtaskinfo.DecimalParameter;
            contentlist.Add(filestr);

            filestr = Const_SetMeterKeyParam + "=" + refundtaskinfo.SetMeterKeyParam;
            contentlist.Add(filestr);

            String reslutfile = DataFormatProcessor.ListToString(contentlist, Environment.NewLine);

            return(reslutfile);
        }
        /// <summary>
        /// 初始化密钥
        /// 在解密任务文件和加密任务结果文件之前一定需要执行一次初始化密钥
        /// </summary>
        private static void InitKey(String encryptionkey)
        {
            //计算密钥
            Byte[] keybytes = new Byte[16];
            Byte[] key      = DataFormatProcessor.StringToBytes(encryptionkey);

            Array.Copy(key, 0, keybytes, 0, key.Length);

            //初始化AES密钥
            m_aes.InitKey(keybytes);
            return;
        }
        /// <summary>
        /// 获取任务类型
        /// </summary>
        /// <param name="filestr"></param>
        /// <param name="tasktype"></param>
        /// <returns></returns>
        private static Boolean GetTaskType(String filestr, ref eTaskType tasktype)
        {
            if (String.IsNullOrEmpty(filestr))
            {
                return(false);
            }
            //分割内容
            List <String> filelist = new List <string> {
            };
            Boolean bl             = DataFormatProcessor.StringToList(filestr, Environment.NewLine, ref filelist);

            if (!bl || filelist.Count < 1)
            {
                return(false);
            }

            //构建dic<key-String, value-String>,key是等号左边,value是等号右边数据
            m_dicFileCon = new Dictionary <string, string> {
            };
            foreach (String str in filelist)
            {
                List <String> list = new List <string> {
                };
                bl = DataFormatProcessor.StringToList(str, "=", ref list, false, true);
                if (!bl)
                {
                    return(false);
                }
                if (list.Count == 1)
                {
                    list.Add("");
                }
                if (m_dicFileCon.Keys.Contains(list[0]))
                {
                    m_dicFileCon[list[0]] = list[1];
                }
                else
                {
                    m_dicFileCon.Add(list[0], list[1]);
                }
            }

            //获取任务类型
            if (!m_dicFileCon.ContainsKey(Const_TaskType))
            {
                return(false);
            }
            String typestr = m_dicFileCon[Const_TaskType];

            tasktype = (eTaskType)Convert.ToInt32(typestr);
            return(true);
        }
        /// <summary>
        /// 根据RefundTaskInfo组合成任务结果文件内容
        /// 仅退购的任务结果
        /// </summary>
        /// <param name="resultinfo"></param>
        /// <returns></returns>
        private static String GetResultFileContent_Refund(RefundTaskResultInfo refundtaskinfo)
        {
            if (refundtaskinfo == null)
            {
                return(null);
            }
            List <String> contentlist = new List <string> {
            };

            /*TaskID=XX(当前的任务ID)
             * TaskType=0:退购,1:换表,2:销户
             * TechnicianID =XX(上门工程师的ID)
             * MeterAddress=012017062001(表通信地址)
             * TaskFinished=0/1 (任务是否完成)
             * AllowRefund=0/1 (是否允许退购,0:禁止,1:允许)
             * TaskProcess=FinishedStep;Step1Value;Step2Value;………. (以分号划分,第一个数据为总完成的步骤数,后面数据为每个步骤的值)
             */
            String filestr = Const_TaskID + "=" + refundtaskinfo.TaskID.ToString();

            contentlist.Add(filestr);
            filestr = Const_TaskType + "=0";
            contentlist.Add(filestr);

            filestr = Const_RefundTradeID + "=" + refundtaskinfo.RefundTradeID.ToString();
            contentlist.Add(filestr);

            filestr = Const_TechnicianID + "=" + refundtaskinfo.TechnicianID.ToString();
            contentlist.Add(filestr);

            filestr = Const_MeterAddress + "=" + refundtaskinfo.MeterAddress;
            contentlist.Add(filestr);

            filestr = Const_TaskFinished + "=" + (refundtaskinfo.TaskFinished ? "1" : "0");
            contentlist.Add(filestr);

            filestr = Const_AllowRefund + "=" + (refundtaskinfo.EnableRefund ? "1" : "0");
            contentlist.Add(filestr);

            filestr = Const_TaskProcess + "=" + refundtaskinfo.TaskProcess;
            contentlist.Add(filestr);

            String reslutfile = DataFormatProcessor.ListToString(contentlist, Environment.NewLine);

            return(reslutfile);
        }
        /// <summary>
        /// 根据MeterDisassemblyTaskResultInfo组合成任务文件内容
        /// 换表和销户的任务
        /// </summary>
        /// <param name="resultinfo"></param>
        /// <returns></returns>
        private static String GetTaskFileContent_Replase(MeterDisassemblyTaskInfo resultinfo)
        {
            List <String> contentlist = new List <string> {
            };

            /*TaskID=XX(当前的任务ID)
             * TaskType=1(0-退购,1-换表,2-销户)
             * TechnicianID =XX(上门工程师的ID)
             * MeterAddress=012017062001(表通信地址,射频卡表是LAPIS中的meterbasicinfo里面的communicationaddress)
             * AreaCode=m_runparam.CurrentOperator.AreaCode
             * MeterProtocolType=XX (表通信协议类型,eMeterProtocolType)
             * DecimalParameter=脉冲当量小数位数;计量模式;价格精度小数位数;结算精度小数位数;货币符号;是否显示K*/

            String filestr = Const_TaskID + "=" + resultinfo.TaskID.ToString();

            contentlist.Add(filestr);
            filestr = Const_TaskType + "=" + ((Int32)resultinfo.TaskType).ToString();
            contentlist.Add(filestr);
            filestr = Const_TechnicianID + "=" + resultinfo.TechnicianID.ToString();
            contentlist.Add(filestr);

            filestr = Const_MeterAddress + "=" + resultinfo.MeterAddress;
            contentlist.Add(filestr);
            filestr = Const_AreaCode + "=" + resultinfo.AreaCode.ToString();
            contentlist.Add(filestr);

            filestr = Const_MeterProtocolType + "=" + ((Int32)resultinfo.MeterProtocolType).ToString();
            contentlist.Add(filestr);
            filestr = Const_DecimalParameter + "=" + resultinfo.DecimalParameter;
            contentlist.Add(filestr);

            //增加STS设置参数密钥
            filestr = Const_SetMeterKeyParam + "=" + resultinfo.SetMeterKeyParam;
            contentlist.Add(filestr);

            String reslutfile = DataFormatProcessor.ListToString(contentlist, Environment.NewLine);

            return(reslutfile);
        }
示例#8
0
 public static string HexString(this byte[] bytes, int len)
 {
     return(DataFormatProcessor.BytesToHexString(bytes, len));
 }
        /// <summary>
        /// 加密任务结果内容
        /// </summary>
        /// <param name="filestr"></param>
        /// <returns></returns>
        private static String EncryptInfo(String filestr)
        {
            //使用 DataFormatProcessor获取 4字节
            Byte[] validdata = DataFormatProcessor.StringToBytes(filestr);
            if (validdata == null || validdata.Length < 1)
            {
                return(null);
            }
            //总长度
            Int32 allLen = validdata.Length;

            //原文
            Byte[] rawbytes = new Byte[Const_AESEncryptLen];
            //密文
            Byte[] endata     = null;
            String Ciphertext = String.Empty;

            if (allLen <= Const_AESEncryptLen) //小于等于16字节
            {
                Array.Copy(validdata, 0, rawbytes, 0, validdata.Length);
                //AES加密
                m_aes.Encrypt(rawbytes, ref endata);

                //转换为HEX string
                Ciphertext = DataFormatProcessor.BytesToHexString(endata);

                return(Ciphertext);
            }
            //原始数据大于16字节,分段传输
            //已发送的长度
            Int32 sentDataTableLen = 0;
            //剩余需要发送的长度
            Int32 lastDataTableLen = allLen;

            rawbytes = new Byte[] { };
            List <String> CiphertextList = new List <string> {
            };

            //检查当前剩下还没发送的数据长度,是否超过32K
            while (lastDataTableLen > Const_AESEncryptLen) //超过时,分段发送
            {
                endata   = null;
                rawbytes = new Byte[Const_AESEncryptLen];
                Array.Copy(validdata, sentDataTableLen, rawbytes, 0, Const_AESEncryptLen);
                //随后 已发送长度增加32K
                sentDataTableLen += Const_AESEncryptLen;
                lastDataTableLen -= Const_AESEncryptLen;

                //AES加密
                m_aes.Encrypt(rawbytes, ref endata);
                //转换为HEX string
                Ciphertext = DataFormatProcessor.BytesToHexString(endata);
                CiphertextList.Add(Ciphertext);
            }
            endata = null;
            //如果剩余不足32K, 直接全部发送,并且通知客户端已经发送完毕
            rawbytes = new Byte[Const_AESEncryptLen];
            Array.Copy(validdata, sentDataTableLen, rawbytes, 0, lastDataTableLen);
            //AES加密
            m_aes.Encrypt(rawbytes, ref endata);

            //转换为HEX string
            Ciphertext = DataFormatProcessor.BytesToHexString(endata);
            CiphertextList.Add(Ciphertext);


            return(DataFormatProcessor.ListToString(CiphertextList, ""));
        }
        /// <summary>
        /// 解密任务文件内容
        /// </summary>
        /// <param name="encryptstr"></param>
        /// <returns></returns>
        private static String DencryptTaskFileInfo(String encryptstr)
        {
            //转化成字节数组,已加密
            Byte[] encryptBytes = DataFormatProcessor.HexStringToBytes(encryptstr);
            if (encryptBytes == null || encryptBytes.Length < 1)
            {
                return(null);
            }

            //总长度
            Int32 allLen = encryptBytes.Length;

            //密文
            Byte[] rawbytes = new Byte[Const_AESEncryptLen];
            //原文
            Byte[] endata     = null;
            String Ciphertext = String.Empty;

            String  datastr = String.Empty;
            String  value   = String.Empty;
            Boolean bl      = false;

            if (allLen <= Const_AESEncryptLen) //小于等于16字节
            {
                Array.Copy(encryptBytes, 0, rawbytes, 0, encryptBytes.Length);
                //AES加密
                m_aes.Decrypt(rawbytes, ref endata);

                //转换为HEX string
                datastr = DataFormatProcessor.BytesToString(endata);
                bl      = DataFormatProcessor.GetStringPair(datastr, '\0', ref Ciphertext, ref value);
                if (!bl || String.IsNullOrEmpty(Ciphertext))
                {
                    Ciphertext = datastr;
                }

                return(Ciphertext);
            }
            //原始数据大于16字节,分段解密
            //已解密的长度
            Int32 sentDataTableLen = 0;
            //剩余需要解密的长度
            Int32 lastDataTableLen = allLen;

            rawbytes = new Byte[] { };
            List <String> CiphertextList = new List <string> {
            };

            //检查当前剩下还没解密的数据长度,是否超过16
            while (lastDataTableLen > Const_AESEncryptLen)
            {
                endata   = null;
                rawbytes = new Byte[Const_AESEncryptLen];
                Array.Copy(encryptBytes, sentDataTableLen, rawbytes, 0, Const_AESEncryptLen);
                //随后 已发送长度增加16
                sentDataTableLen += Const_AESEncryptLen;
                lastDataTableLen -= Const_AESEncryptLen;

                //AES加密
                m_aes.Decrypt(rawbytes, ref endata);
                //转换为HEX string
                datastr = DataFormatProcessor.BytesToString(endata);
                bl      = DataFormatProcessor.GetStringPair(datastr, '\0', ref Ciphertext, ref value);
                if (!bl || String.IsNullOrEmpty(Ciphertext))
                {
                    Ciphertext = datastr;
                }
                CiphertextList.Add(Ciphertext);
            }
            endata = null;

            rawbytes = new Byte[Const_AESEncryptLen];
            Array.Copy(encryptBytes, sentDataTableLen, rawbytes, 0, lastDataTableLen);
            //AES加密
            m_aes.Decrypt(rawbytes, ref endata);

            //转换为HEX string
            datastr = DataFormatProcessor.BytesToString(endata);
            bl      = DataFormatProcessor.GetStringPair(datastr, '\0', ref Ciphertext, ref value);
            if (!bl || String.IsNullOrEmpty(Ciphertext))
            {
                Ciphertext = datastr;
            }

            CiphertextList.Add(Ciphertext);

            return(DataFormatProcessor.ListToString(CiphertextList, ""));
        }