Ejemplo n.º 1
0
        public string WriteMsg()
        {
            UserDataAll += SerialNumber.ToString("X").PadLeft(4, '0');
            UserDataAll += SendTime.ToString("yyMMddHHmmss").PadLeft(12, '0');
            UserDataAll += Iden_F1.GetHexStr();
            VersionL     = (byte)HexStringUtility.StrToByteArray(VersionC).Length;
            UserDataAll += VersionL.ToString("X").PadLeft(2, '0');
            UserDataAll += HexStringUtility.StrToHexString(VersionC);

            byte[]             UserDataBytesAllTmp;
            WaterBaseMessage[] MsgListTmp;
            string             msg = WaterBaseMessageService.GetMsgList_WriteMsg(this, UserDataAll, out UserDataBytesAllTmp, out MsgListTmp);

            if (msg == "")
            {
                UserDataBytesAll = UserDataBytesAllTmp;
                MsgList          = MsgListTmp;
            }
            else
            {
                if (ShowLog)
                {
                    logHelper.Error(msg);
                }
            }
            return(msg);
        }
Ejemplo n.º 2
0
        private void btnReOpen_Click(object sender, EventArgs e)
        {
            if (this.dataGridView1.SelectedRows.Count < 1)
            {
                MessageBox.Show("请选择一行记录!");
                return;
            }
            string SerialNumber   = this.dataGridView1.SelectedRows[0].Cells["SerialNumber"].Value.ToString();
            string UserNo         = this.dataGridView1.SelectedRows[0].Cells["UserNo"].Value.ToString();
            string UserName       = this.dataGridView1.SelectedRows[0].Cells["UserName"].Value.ToString();
            string IdentityNumber = this.dataGridView1.SelectedRows[0].Cells["IdentityNumber"].Value.ToString();

            byte[] newUserName = null;
            newUserName = HexStringUtility.StrToByteArray("".PadRight(16, ' '));

            string DeviceList = this.dataGridView1.SelectedRows[0].Cells["DeviceList"].Value.ToString();

            string ResidualWater    = this.dataGridView1.SelectedRows[0].Cells["ResidualWater"].Value.ToString();
            string ResidualElectric = this.dataGridView1.SelectedRows[0].Cells["ResidualElectric"].Value.ToString();
            string TotalWater       = this.dataGridView1.SelectedRows[0].Cells["TotalWater"].Value.ToString();
            string TotalElectric    = this.dataGridView1.SelectedRows[0].Cells["TotalElectric"].Value.ToString();
            string showInfo         = "确定重新开卡当前选择用户卡?" + Environment.NewLine + "卡号:" + UserNo + ",用户名:" + UserName +
                                      Environment.NewLine + "身份证号:" + IdentityNumber;

            if ((MessageBox.Show(showInfo, "重新开卡", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2)) == DialogResult.Yes)
            {
                Log(getDateStr() + "开始重新开卡");

                if (!SeedIC())
                {
                    Log("寻卡失败");
                    Log(getDateStr() + "结束重新开卡");
                    return;
                }

                string SerialNumberNew = getSnr().ToString("X");

                //保存远程服务器数据库
                string           str    = DataTransfer.ReOpenCardUser(SerialNumber, SerialNumberNew);
                JavaScriptObject result = (JavaScriptObject)JavaScriptConvert.DeserializeObject(str);
                if (bool.Parse(result["Result"].ToString()))
                {
                    MessageBox.Show("取消挂失成功!");
                    SearchCardUser();
                }
                else
                {
                    string txt = result["Message"].ToString();
                    MessageBox.Show(txt);
                    myLogger.Error(txt);
                    Log(txt);
                    Log(getDateStr() + "结束重新开卡");
                    return;
                }

                int    mode           = 4;         //以B密码认证
                int    sec            = 1;         //扇区
                int    block          = 0;
                string key            = getKeyA(); //读卡密码
                string result_WriteIC = "";
                string result_AuthIC  = "";

                //设置扇区1内容
                sec = 1;
                //认证卡密码B
                result_AuthIC = CardCommon.AuthIC(icdev, mode, sec, key);
                if (result_AuthIC == InfoSys.StrAuthSuccess)
                {
                    //写数据块0,数据块0为卡类型(1字节)、用户卡号(4字节)
                    block          = 0;
                    result_WriteIC = CardCommon.WriteIC(icdev, sec, block, (InfoSys.CardTypeUser + UserNo.PadLeft(8, '0')).PadRight(32, '0'));
                    if (result_WriteIC != "")
                    {
                        Log("重新写卡扇区" + sec + "数据块" + block + "写入失败");
                        Log(getDateStr() + "结束重新开卡");
                        return;
                    }

                    //写数据块1,数据块1为用户名(16字节)
                    block          = 1;
                    result_WriteIC = CardCommon.WriteIC(icdev, sec, block, HexStringUtility.ByteArrayToHexString(newUserName));
                    if (result_WriteIC != "")
                    {
                        Log("重新写卡扇区" + sec + "数据块" + block + "写入失败");
                        Log(getDateStr() + "结束重新开卡");
                        return;
                    }

                    //写数据块2,数据块2为身份证号(9字节)、联系电话(6字节)
                    block          = 2;
                    result_WriteIC = CardCommon.WriteIC(icdev, sec, block, (IdentityNumber + "0" + Telephone).PadRight(32, '0'));
                    if (result_WriteIC != "")
                    {
                        Log("重新写卡扇区" + sec + "数据块" + block + "写入失败");
                        Log(getDateStr() + "结束重新开卡");
                        return;
                    }

                    //写数据块3,密码eeeeeeeeeeee
                    block = 3;
                    CardCommon.WritePWD(icdev, sec, block, getKeyA(), InfoSys.KeyControl, getKeyB());
                }
                else
                {
                    Log("重新写卡扇区" + sec + "数据块" + block + "写入失败");
                    Log(getDateStr() + "结束重新开卡");
                    return;
                }

                //设置扇区2内容
                sec = 2;
                //认证卡密码B
                result_AuthIC = CardCommon.AuthIC(icdev, mode, sec, key);
                AuthLog(InfoSys.CardTypeStrUser, InfoSys.MethodOpenCard, sec, result_AuthIC);
                if (result_AuthIC == InfoSys.StrAuthSuccess)
                {
                    //写数据块0,剩余可用水量(4字节)剩余可用电量(4字节)累计用水量(4字节)累计用电量(4字节)
                    block = 0;
                    double d1 = Tools.StringToDouble(ResidualWater, 0);
                    double d2 = Tools.StringToDouble(ResidualElectric, 0);
                    double d3 = Tools.StringToDouble(TotalWater, 0);
                    double d4 = Tools.StringToDouble(TotalElectric, 0);
                    result_WriteIC = CardCommon.WriteIC(icdev, sec, block,
                                                        d1.ToString().PadLeft(8, '0') +
                                                        d2.ToString().PadLeft(8, '0') +
                                                        d3.ToString().PadLeft(8, '0') +
                                                        d4.ToString().PadLeft(8, '0'));
                    if (result_WriteIC != "")
                    {
                        Log("重新写卡扇区" + sec + "数据块" + block + "写入失败");
                        Log(getDateStr() + "结束重新开卡");
                        return;
                    }

                    string[] s           = { "", "", "", "" };
                    string[] DeviceLists = DeviceList.Split(',');

                    for (int i = 0; i < DeviceLists.Length; i++)
                    {
                        s[i] = DeviceLists[i];
                    }

                    string data = "";
                    //写数据块1,地址码1(7字节)地址码2(7字节)
                    block          = 1;
                    data           = (s[0] + s[1]).PadRight(32, '0');
                    result_WriteIC = CardCommon.WriteIC(icdev, sec, block, data);
                    if (result_WriteIC != "")
                    {
                        Log("重新写卡扇区" + sec + "数据块" + block + "写入失败");
                        Log(getDateStr() + "结束重新开卡");
                        return;
                    }

                    //写数据块2,地址码1(7字节)地址码2(7字节)
                    block          = 2;
                    data           = (s[2] + s[3]).PadRight(32, '0');
                    result_WriteIC = CardCommon.WriteIC(icdev, sec, block, data);
                    if (result_WriteIC != "")
                    {
                        Log("重新写卡扇区" + sec + "数据块" + block + "写入失败");
                        Log(getDateStr() + "结束重新开卡");
                        return;
                    }

                    //写数据块3,密码eeeeeeeeeeee
                    block = 3;
                    CardCommon.WritePWD(icdev, sec, block, getKeyA(), InfoSys.KeyControl, getKeyB());
                }

                Log("重新开卡完成");
                Log(getDateStr() + "结束重新开卡");
            }
        }
        public bool processPacket(byte[] buffer, int offset, int length)
        {
            int pos = 0;

            while (pos < length)
            {
                try
                {
                    if (buffer[pos] == HexStringUtility.StrToByteArray(ProtocolKey.ReceiveHeartThrob)[0] || length - pos < 14)
                    {
                        if (userToken.DeviceInfo != null && userToken.DeviceList != null)
                        {
                            userToken.DeviceList.Online        = 1;
                            userToken.DeviceList.LastUpdate    = DateTime.Now;
                            userToken.DeviceList.Remark        = FormatHelper.ByteArrayToHexString(buffer, offset + pos, length - pos);
                            userToken.DeviceList.TerminalState = "心跳";
                            updateDeviceList(userToken.DeviceList);
                            string FullDeviceNo = DeviceModule.GetFullDeviceNoByID(userToken.DeviceList.Id);
                            OnlineDeviceService.AddOnline(FullDeviceNo, userToken.DeviceList);
                            DeviceEvent deviceEvent = new DeviceEvent();
                            deviceEvent.DeviceNo  = userToken.DeviceInfo.DeviceNo;
                            deviceEvent.EventTime = userToken.DeviceList.LastUpdate;
                            deviceEvent.EventType = userToken.DeviceList.TerminalState;
                            deviceEvent.Remark    = "";
                            deviceEvent.RawData   = FormatHelper.ByteArrayToHexString(buffer, offset + pos, length - pos);
                            proxySendDeviceList(userToken.DeviceList, deviceEvent);
                        }
                        byte[] data = HexStringUtility.StrToByteArray("%");
                        send(data, 0, data.Length);
                        if (SysCache.ShowInfoLog)
                        {
                            string info1 = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + ":[" + userToken.ConnectedSocket.RemoteEndPoint.ToString() + "]响应(信息不对):" + "长度不到14";
                            LogHelper.Info(info1);
                            ShowLogData.add(info1);
                        }

                        if (length - pos < 14)
                        {
                            break;
                        }
                        else
                        {
                            pos += 1;
                        }
                    }
                    else if (buffer[pos] == BaseProtocol.BeginChar)
                    {
                        int    bodyLength = buffer[pos + 1]; //长度
                        byte[] bs         = new byte[5 + bodyLength];
                        Array.Copy(buffer, pos, bs, 0, bs.Length);

                        processCommandBase(bs);

                        pos += 5 + bodyLength;
                    }
                    else if (buffer[pos] == WaterBaseProtocol.BeginChar[0] && buffer[pos + 1] == WaterBaseProtocol.BeginChar[1])
                    {
                        byte[] bs_UpOrDown_Length = new byte[2];
                        Array.Copy(buffer, pos + 11, bs_UpOrDown_Length, 0, 2);

                        string str_UpOrDown_Length = HexStringUtility.ByteArrayToHexString(bs_UpOrDown_Length).ToUpper();
                        string str_Length          = str_UpOrDown_Length.Substring(1, 3);
                        int    bodyLength          = Convert.ToInt32(str_Length, 16); //正文长度

                        int baseLength = 0;                                           //其它长度
                        baseLength += 2;                                              //帧起始符
                        baseLength += 6;                                              //中心站及遥测站
                        baseLength += 2;                                              //密码
                        baseLength += 1;                                              //功能码
                        baseLength += 2;                                              //报文上下行表示及长度
                        baseLength += 1;                                              //报文起始符
                        baseLength += 1;                                              //报文结束符
                        baseLength += 2;                                              //校验码
                        byte[] bs = new byte[baseLength + bodyLength];
                        Array.Copy(buffer, pos, bs, 0, bs.Length);

                        processCommandWater(bs);

                        pos += baseLength + bodyLength;
                    }
                    else
                    {
                        pos += 1;
                    }
                }
                catch (Exception ex)
                {
                    if (userToken.DeviceInfo != null && userToken.DeviceList != null)
                    {
                        userToken.DeviceList.Online        = 1;
                        userToken.DeviceList.LastUpdate    = DateTime.Now;
                        userToken.DeviceList.Remark        = FormatHelper.ByteArrayToHexString(buffer, offset, length);
                        userToken.DeviceList.TerminalState = "心跳";
                        updateDeviceList(userToken.DeviceList);
                        string FullDeviceNo = DeviceModule.GetFullDeviceNoByID(userToken.DeviceList.Id);
                        OnlineDeviceService.AddOnline(FullDeviceNo, userToken.DeviceList);
                        DeviceEvent deviceEvent = new DeviceEvent();
                        deviceEvent.DeviceNo  = userToken.DeviceInfo.DeviceNo;
                        deviceEvent.EventTime = userToken.DeviceList.LastUpdate;
                        deviceEvent.EventType = userToken.DeviceList.TerminalState;
                        deviceEvent.Remark    = "";
                        deviceEvent.RawData   = FormatHelper.ByteArrayToHexString(buffer, offset + pos, length - pos);
                        proxySendDeviceList(userToken.DeviceList, deviceEvent);
                    }
                    byte[] data = HexStringUtility.StrToByteArray("%");
                    send(data, 0, data.Length);
                    if (SysCache.ShowInfoLog)
                    {
                        string info1 = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + ":[" + userToken.ConnectedSocket.RemoteEndPoint.ToString() + "]响应(信息不对):" + "【错误】【pos:" + pos + "】:" + ex.Message;
                        LogHelper.Info(info1);
                        ShowLogData.add(info1);
                    }
                    break;
                }
            }
            return(true);
        }