Exemple #1
0
 /// <summary>
 /// 重发指令
 /// </summary>
 private void ReSendCommand()
 {
     if (!(this._RetryCommandList == null || this._RetryCommandList.Count == 0))
     {
         bool     bIfSucc = false;
         TimeSpan tSpan   = DateTime.Now - this._LastReSendTime;
         if (tSpan.TotalSeconds >= this._ReSendSeconds)
         {
             try
             {
                 for (int i = this._RetryCommandList.Count - 1; i >= 0; i--)
                 {
                     Model.RetryCommand objCommand = (Model.RetryCommand) this._RetryCommandList[i];
                     if (objCommand != null)
                     {
                         if (objCommand.TryTimes < this._ReSendMaxTimes)
                         {
                             byte[] bArrBag = ScaleConverter.HexStr2ByteArr(objCommand.CommandHexStr);
                             bIfSucc = SendCommand(bArrBag, out string strErrMsg);
                             DoNotice(string.Format("{0}{1}(重发第{2}次)", "发送主机应答指令", (bIfSucc ? "成功" : "失败"), objCommand.TryTimes), bArrBag);
                             objCommand.TryTimes += 1;
                             if (objCommand.TryTimes >= this._ReSendMaxTimes)
                             {
                                 this._RetryCommandList.RemoveAt(i);
                             }
                             else
                             {
                                 this._RetryCommandList[i] = objCommand.Clone();
                             }
                         }
                         else
                         {
                             this._RetryCommandList.RemoveAt(i);
                         }
                     }
                     else
                     {
                         this._RetryCommandList.RemoveAt(i);
                     }
                 }
                 this._LastReSendTime = DateTime.Now;
             }
             catch (Exception err)
             {
                 string strErr = err.Message;
             }
         }
     }
 }
Exemple #2
0
        private bool ProcessOne(byte[] bufFrame, out string strErrMsg)
        {
            bool bIfSucc = false;

            strErrMsg = "";
            Package.ECommandType eResponseType = Package.GetResponseType(bufFrame, out strErrMsg);
            switch (eResponseType)
            {
            case Package.ECommandType.SwipingCard:
                SwipingCardData objSwipingCardData = new SwipingCardData();
                IList <string>  listResponseData   = new List <string>();
                bIfSucc = Package.ParseBag_SwipingCard(bufFrame, ref objSwipingCardData, out strErrMsg);
                if (bIfSucc)
                {
                    SwipingCardData objSent = (objSwipingCardData != null) ? (SwipingCardData)objSwipingCardData.Clone() : null;
                    _OnReceiveSwipingCard?.Invoke(objSent, strErrMsg);

                    DoNotice(string.Format("接收刷卡数据正确"), bufFrame);

                    //保存记录
                    SaveSwipingCardData(objSent);

                    //响应
                    byte[] bArrTargetAddress  = new byte[5];
                    byte[] bArrOrigialAddress = new byte[5];
                    Array.Copy(bufFrame, 5, bArrTargetAddress, 0, bArrTargetAddress.Length);
                    Array.Copy(bufFrame, 10, bArrOrigialAddress, 0, bArrOrigialAddress.Length);

                    //55 AA 00 0B 20 01 00 00 00 00 06 12 34 00 01 1E  主机链路层ACK
                    byte[] bArrBag = Package.BuildBag_MainDeviceACK(bArrTargetAddress, bArrOrigialAddress);
                    bIfSucc = SendCommand(bArrBag, out strErrMsg);
                    DoNotice(string.Format("{0}{1}", "发送主机链路层ACK指令", (bIfSucc ? "成功" : "失败")), bArrBag);

                    /*
                     * Thread.Sleep(50);//停顿数50毫秒
                     *
                     * //55 FF 00 0C 21 06 12 34 00 01 01 00 00 00 00 00 xx 主机应答
                     * byte[] bArrBag2 = Package.BuildBag_MainDeviceResponse(bArrTargetAddress, bArrOrigialAddress);
                     * bIfSucc = SendCommand(bArrBag2, out strErrMsg);
                     * DoNotice(string.Format("{0}{1}", "发送主机应答指令", (bIfSucc ? "成功" : "失败")), bArrBag2);
                     * if (!(bArrBag2 == null || bArrBag2.Length == 0))
                     * {
                     *  this._LastReSendTime = DateTime.Now;
                     *  this._RetryCommandList.Add(new Model.RetryCommand(ScaleConverter.ByteArr2HexStr(bArrBag2).Replace(" ", ""), 1));
                     * }
                     * //55 AA 00 0B 21 06 12 34 00 01 01 00 00 00 00 XX 刷卡头链路层ACK
                     */

                    bIfSucc = true;
                }
                break;

            case Package.ECommandType.CardHeadDeviceACK:
                try
                {
                    if (!(this._RetryCommandList == null || this._RetryCommandList.Count == 0))
                    {
                        string strBuffHexStr    = "";
                        string strCommandHexStr = "";
                        for (int i = this._RetryCommandList.Count - 1; i >= 0; i--)
                        {
                            Model.RetryCommand objCommand = (Model.RetryCommand) this._RetryCommandList[i];
                            if (objCommand != null)
                            {
                                strCommandHexStr = objCommand.CommandHexStr.Substring(10, 20);
                                strBuffHexStr    = ScaleConverter.ByteArr2HexStr(bufFrame).Replace(" ", "").Substring(10, 20);
                                if (string.Compare(strCommandHexStr, strBuffHexStr) == 0)
                                {
                                    this._RetryCommandList.RemoveAt(i);
                                }
                            }
                        }
                    }
                }
                catch (Exception err)
                {
                    strErrMsg = err.Message;
                }
                DoNotice(string.Format("接收刷卡头链路层ACK指令"), bufFrame);
                bIfSucc = true;
                break;

            case Package.ECommandType.PingResponse:
                DeviceAddress objDeviceAddress = new DeviceAddress();
                bIfSucc = Package.ParseBag_PingResponse(bufFrame, ref objDeviceAddress, out strErrMsg);
                if (bIfSucc)
                {
                    DeviceAddress objSent = (objDeviceAddress != null) ? (DeviceAddress)objDeviceAddress.Clone() : null;
                    _OnPingResponse?.Invoke(objSent, strErrMsg);
                    //响应
                    byte[] bArrTargetAddress  = new byte[5];
                    byte[] bArrOrigialAddress = new byte[5];
                    Array.Copy(bufFrame, 5, bArrTargetAddress, 0, bArrTargetAddress.Length);
                    Array.Copy(bufFrame, 10, bArrOrigialAddress, 0, bArrOrigialAddress.Length);

                    //Thread.Sleep(50);//停顿数50毫秒

                    //55 FF 00 0D 93 01 00 00 00 00 06 12 34 00 00 41 98 FE  从机PING应答
                    //55 AA 00 0B 93 01 00 00 00 00 06 12 34 00 00 09 AA   主机链路层应答

                    byte[] bArrBag = Package.BuildBag_MainDeviceACK4Ping(bArrTargetAddress, bArrOrigialAddress);
                    bIfSucc = SendCommand(bArrBag, out strErrMsg);
                    //DoNotice(string.Format("{0}{1}", "发送主机链路层ACK指令", (bIfSucc ? "成功" : "失败")), bArrBag);

                    //_OnPingNotice?.Invoke(string.Format("发送Ping指令{0}", (bIfSucc ? "成功" : "失败")), bArrBag);
                    //if (_OnPingNotice != null) _OnPingNotice(string.Format("发送主机链路层ACK指令{0}", (bIfSucc ? "成功" : "失败")), bArrBag);
                }
                break;

            case Package.ECommandType.MainDeviceACK4PingResponse:
                DeviceAddress objDeviceAddress1 = new DeviceAddress();
                bIfSucc = Package.ParseBag_MainDeviceACK4PingResponse(bufFrame, ref objDeviceAddress1, out strErrMsg);
                if (bIfSucc)
                {
                    DeviceAddress objSent = (objDeviceAddress1 != null) ? (DeviceAddress)objDeviceAddress1.Clone() : null;
                    _OnMainDeviceACK4PingResponse?.Invoke(objSent, strErrMsg);
                }
                break;

            default:
                strErrMsg = "无效数据";
                bIfSucc   = false;
                break;
            }
            return(bIfSucc);
        }