예제 #1
0
        private int SetParameters(PktType type, string cmd, string parameters)
        {
            int ret = WritePacket(true, type, Encoding.ASCII.GetBytes(cmd), Encoding.ASCII.GetBytes(parameters));

            if (ret != 0)
            {
                return(ret);
            }
            ret = ReadByte();
            if (ret == EOT)
            {
                return(PacketNotAccepted);           //Packet was not accepted by device
            }
            byte[] Recv = null;
            ret = ReadPacket(out Recv, type);
            if (ret < 0)
            {
                return(ret);
            }
            if (type == PktType.SI && !CheckEOT(2000))
            {
                return(ReadEOTTimeOut);
            }
            return(Recv[2]);
            //if (Recv[3] == 0x30) return Recv[3];// == '0'
            //else return ExecFail;
        }
예제 #2
0
        void client_DataReceived(Client sender, ReceiveBuffer e)
        {
            try
            {
                DataPacket.Packet pkt    = DataPacket.DataParser(e.BufStream, e.pkt);
                PktType           header = pkt.type;
                UpdateCompLogMsg(sender.name + " - Received data: " + pkt.ToString());
                switch (header)
                {
                case PktType.AUTH:
                    UpdateReceivedImage(pkt.fingerPrint);
                    UpdateCompMatchedUser(sender.RunAuth(pkt));
                    //sender.RunAuth(pkt);
                    break;

                case PktType.PASSENGER:
                    sender.RunPassenger(pkt);
                    break;

                case PktType.ORDER:
                    sender.RunOrder(pkt);
                    break;

                case PktType.ONCE:
                    UpdateReceivedImage(pkt.fingerPrint);
                    UpdateCompMatchedUser(sender.RunAtOnce(pkt));
                    break;
                }
            }
            catch (Exception ee)
            {
                UpdateCompLogMsg(ee.Message);
            }
        }
예제 #3
0
 public static MemoryStream NewPkt(PktType p)
 {
     var ms = new MemoryStream();
     ms.WriteShort(_Header);
     ms.WriteShort((int)p);
     ms.WriteInt((int)ms.Length - HeadLength);
     return ms;
 }
예제 #4
0
 private int WritePacket(bool IsSync, PktType type, byte[] MsgId, byte[] data)
 {
     if (_CommMode != UsbMode.ACM && _IsOpen == true)
     {
         return(InstanceofHID.WritePacket(IsSync, type, MsgId, data));
     }
     if (_CommMode == UsbMode.ACM && _IsOpen == true)
     {
         return(InstanceofVC.WritePacket(IsSync, type, MsgId, data));
     }
     else
     {
         return(-1);
     }
 }
예제 #5
0
 public int WritePacket(bool IsSync, PktType type, byte[] DataIn)
 {
     if (_CommMode != UsbMode.ACM && _IsOpen == true)
     {
         return(InstanceofHID.WritePacket(IsSync, type, DataIn));
     }
     if (_CommMode == UsbMode.ACM && _IsOpen == true)
     {
         return(InstanceofVC.WritePacket(IsSync, type, DataIn));
     }
     else
     {
         return(-1);
     }
 }
예제 #6
0
 private int ReadPacket(out byte[] data, PktType Type)
 {
     data = null;
     if (_CommMode != UsbMode.ACM && _IsOpen == true)
     {
         return(InstanceofHID.ReadPacket(out data, Type));
     }
     if (_CommMode == UsbMode.ACM && _IsOpen == true)
     {
         return(InstanceofVC.ReadPacket(out data, Type));
     }
     else
     {
         return(-1);
     }
 }
예제 #7
0
        static bool ParseHeader(byte[] buf, int offset, int buflen, out int len, out PktType pt)
        {
            len = 0;
            pt = PktType.ErrClose;
            if (buflen - offset < HeadLength) {
                return false;
            }
            var h = buf.GetShort(ref offset);
            pt = (PktType)buf.GetShort(ref offset);
            len = buf.GetInt(ref offset);

            if (h != _Header) {
                pt = PktType.ErrClose;
                return true;
            }
            offset += len;
            if (offset > buflen) {
                return false;
            }

            return true;
        }
예제 #8
0
        public int Getter(PktType type, string cmd, string parameters, out byte[] dataout)
        {
            dataout = null;
            int ret = WritePacket(true, type, Encoding.ASCII.GetBytes(cmd), Encoding.ASCII.GetBytes(parameters));

            if (ret != 0)
            {
                return(ret);
            }
            ret = ReadByte();
            if (ret == EOT)
            {
                return(PacketNotAccepted);           //Packet was accepted by device, go on
            }
            byte[] Recv = null;
            ret = ReadPacket(out Recv, type);
            if (type == PktType.SI && !CheckEOT(2000))
            {
                return(ReadEOTTimeOut);
            }
            dataout = Recv;
            //new List<byte>(time).GetRange(3, time.Length).ToArray();
            return(ret > 0 ? 0 : ret);
        }
        public void WriteAndReadMessage(PktType type, string head, string body, out string responseOut, bool keepWaitting = true, int readTimeOut = 0)
        {
            string prefix = String.Empty;
            string suffix = String.Empty;

            responseOut = String.Empty;

            if (type == PktType.SI)
            {
                prefix = Convert.ToChar(0x0F).ToString();
                suffix = Convert.ToChar(0x0E).ToString();
            }
            else if (type == PktType.STX)
            {
                prefix = Convert.ToChar(0x02).ToString();
                suffix = Convert.ToChar(0x03).ToString();
            }

            string packed_meaasge = prefix + head + body + suffix;
            byte   lrc            = DataManager.LRCCalculator(Encoding.ASCII.GetBytes(packed_meaasge), packed_meaasge.Length);

            if (_serialPort.BytesToRead > 0)
            {
                _serialPort.DiscardInBuffer();
            }

            if (_serialPort.BytesToWrite > 0)
            {
                _serialPort.DiscardOutBuffer();
            }

            // Sending message
            try
            {
                _serialPort.Write(packed_meaasge + Convert.ToChar(lrc).ToString());

                /*
                 * if (OnDataSent != null)
                 * {
                 *  byte[] data_sent = Encoding.ASCII.GetBytes(packed_meaasge + Convert.ToChar(lrc).ToString());
                 *  OnDataSent(this, data_sent);
                 * }
                 */
            }
            catch (Exception ex)
            {
                throw new System.Exception(string.Format("Sending message failed: {0}", ex.Message));
            }

            // Check if ACK is received
            try
            {
                byte[] controlCode = new byte[1];
                _serialPort.Read(controlCode, 0, 1);

                if (OnDataReceived != null)
                {
                    OnDataReceived(this, controlCode);
                }

                switch (controlCode[0])
                {
                case 0x06:
                case 0x04:
                    break;

                case 0x15:
                    // NAK
                    throw new System.Exception("Received NAK from reader: Incorrect LRC.");

                default:
                    // Unknown
                    throw new System.Exception("Unknown response: 0x" + controlCode[0].ToString("X2"));
                }
            }
            catch (TimeoutException)
            {
                // Reader no response;
                throw new System.TimeoutException("Timeout: No ACK");
            }
            catch (Exception ex)
            {
                throw new System.Exception(string.Format("Waitting ACK failed: {0}", ex.Message));
            }

            if (!keepWaitting)
            {
                return;
            }

            int response_length = 0;

            byte[] readBuffer = new byte[_serialPort.ReadBufferSize];
            byte   bPrefix, bSuffix;

            if (type == PktType.SI)
            {
                bPrefix = 0x0F;
                bSuffix = 0x0E;
            }
            else
            {
                bPrefix = 0x02;
                bSuffix = 0x03;
            }

            try
            {
                // Waitting for reply from reader
                Stopwatch s = new Stopwatch();
                if (readTimeOut > 0)
                {
                    s.Start();
                }
                while (s.Elapsed <= TimeSpan.FromMilliseconds(readTimeOut))
                {
                    if (_serialPort.BytesToRead == 0)
                    {
                        continue;
                    }
                    int bytes = _serialPort.BytesToRead;
                    _serialPort.Read(readBuffer, response_length, bytes);
                    response_length += bytes;

                    if (response_length > 2 && readBuffer[0] == bPrefix && readBuffer[response_length - 2] == bSuffix)
                    {
                        if (OnDataReceived != null)
                        {
                            byte[] localBuffer = new byte[response_length];
                            Array.Copy(readBuffer, localBuffer, response_length);
                            OnDataReceived(this, localBuffer);
                        }

                        // LRC check
                        if (readBuffer[response_length - 1] == DataManager.LRCCalculator(readBuffer, response_length - 1))
                        {
                            // Send ACK
                            _serialPort.Write(Convert.ToChar(0x06).ToString());
                            if (OnDataSent != null)
                            {
                                byte[] ack = Encoding.ASCII.GetBytes(Convert.ToChar(0x06).ToString());
                                OnDataSent(this, ack);
                            }
                            responseOut = Encoding.ASCII.GetString(readBuffer, 1, response_length - 3);
                        }
                        else
                        {
                            // Send NAK
                            _serialPort.Write(Convert.ToChar(0x15).ToString());
                            if (OnDataSent != null)
                            {
                                byte[] nak = Encoding.ASCII.GetBytes(Convert.ToChar(0x15).ToString());
                                OnDataSent(this, nak);
                            }
                        }
                        return;
                    }
                }
                s.Reset();

                // Timeout
                throw new System.TimeoutException("Timeout: No response");
            }
            catch (Exception ex)
            {
                throw new System.Exception(string.Format("Waitting response failed: {0}", ex.Message));
            }
        }
예제 #10
0
        internal void OnPkt(EasyAdapter adapter, PktType tp, byte[] buf, int offset, int length)
        {
            _bufhelper.Init(buf, offset, length);

            int ii = (int)tp;
            if ((ii >= 0) && (ii < _calls.Length)) {
                var f = _calls[ii];
                if (f != null) {
                    f(adapter, buf, offset, length);
                }
            }
        }
예제 #11
0
 void OnRpcAck(PktType t, EasyAdapter adapter, byte[] buf, int offset, int length)
 {
     int msgid = _bufhelper.ReadInt();
     int source = _bufhelper.ReadInt();
     int destination = _bufhelper.ReadInt();
     EasyAdapter dest = null;
     _AllAdapters.TryGetValue(destination, out dest);
     if (adapter != null) {
         var ms = PktHelper.NewPkt(t);
         ms.Write(buf, offset, length);
         PktHelper.ClosePkt(ms);
         dest.WriteStream(ms);
     }
 }
예제 #12
0
 void OnPkt(PktType pt, byte[] buf, int offset, int length)
 {
     _bufhelper.Init(buf, offset, length);
     int ii = (int)pt;
     if ((ii >= 0) && (ii < _calls.Length)) {
         var f = _calls[ii];
         if (f != null) {
             f(buf, offset, length);
         }
     }
 }
예제 #13
0
 void OnPkt(PktType pt, byte[] buf, int offset, int length)
 {
     broker.OnPkt(this, pt, buf, offset, length);
 }