예제 #1
0
        private bool WriteNFC(Ndef ndef, string mensagem)
        {
            bool retorno = false;

            try
            {
                if (ndef != null)
                {
                    ndef.Connect();
                    NdefRecord mimeRecord = null;

                    Java.Lang.String str = new Java.Lang.String(mensagem);

                    mimeRecord = NdefRecord.CreateMime
                                     ("UTF-8", str.GetBytes(Charset.ForName("UTF-8")));

                    ndef.WriteNdefMessage(new NdefMessage(mimeRecord));
                    ndef.Close();
                    retorno = true;
                }
                else
                {
                    retorno = FormatNFC(ndef);
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
                throw new System.Exception("Não foi possível ler o cartão.");
            }

            return(retorno);
        }
예제 #2
0
        private Boolean FormatNFC(Ndef ndef)
        {
            bool retorno = false;

            NdefFormatable ndefFormatable = NdefFormatable.Get(ndef.Tag);

            Java.Lang.String msg = new Java.Lang.String(MENSAGEM_PADRAO);
            try
            {
                if (ndefFormatable == null)
                {
                    return(retorno);
                }

                if (!ndefFormatable.IsConnected)
                {
                    ndefFormatable.Connect();
                }
                ndefFormatable.Format(new NdefMessage(NdefRecord.CreateMime
                                                          ("UTF-8", msg.GetBytes(Charset.ForName("UTF-8")))));
                ndefFormatable.Close();
                retorno = true;
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
                throw new System.Exception("Não foi possível ler o cartão.");
            }

            return(retorno);
        }
예제 #3
0
        /// <summary>
        /// Transforms a <see cref="NFCNdefRecord"/> into an Android <see cref="NdefRecord"/>
        /// </summary>
        /// <param name="record">Object <see cref="NFCNdefRecord"/></param>
        /// <returns>Android <see cref="NdefRecord"/></returns>
        NdefRecord GetAndroidNdefRecord(NFCNdefRecord record)
        {
            if (record == null)
            {
                return(null);
            }

            NdefRecord ndefRecord = null;

            switch (record.TypeFormat)
            {
            case NFCNdefTypeFormat.WellKnown:
                var languageCode = record.LanguageCode;
                if (string.IsNullOrWhiteSpace(languageCode))
                {
                    languageCode = Configuration.DefaultLanguageCode;
                }
                if (languageCode.Length > 5)
                {
                    languageCode = languageCode.Substring(0, 5);                                                //max support 5 chars like en-US or de-AT
                }
                ndefRecord = NdefRecord.CreateTextRecord(languageCode, Encoding.UTF8.GetString(record.Payload));
                //no need to force it to 2 letters only
                //ndefRecord = NdefRecord.CreateTextRecord(languageCode.Substring(0, 2), Encoding.UTF8.GetString(record.Payload));
                break;

            case NFCNdefTypeFormat.Mime:
                ndefRecord = NdefRecord.CreateMime(record.MimeType, record.Payload);
                break;

            case NFCNdefTypeFormat.Uri:
                ndefRecord = NdefRecord.CreateUri(Encoding.UTF8.GetString(record.Payload));
                break;

            case NFCNdefTypeFormat.External:
                ndefRecord = NdefRecord.CreateExternal(record.ExternalDomain, record.ExternalType, record.Payload);
                break;

            case NFCNdefTypeFormat.Empty:
                ndefRecord = GetEmptyNdefRecord();
                break;

            case NFCNdefTypeFormat.Unknown:
            case NFCNdefTypeFormat.Unchanged:
            case NFCNdefTypeFormat.Reserved:
            default:
                break;
            }
            return(ndefRecord);
        }
예제 #4
0
        /// <summary>
        /// Transforms a <see cref="NFCNdefRecord"/> into an Android <see cref="NdefRecord"/>
        /// </summary>
        /// <param name="record">Object <see cref="NFCNdefRecord"/></param>
        /// <returns>Android <see cref="NdefRecord"/></returns>
        NdefRecord GetAndroidNdefRecord(NFCNdefRecord record)
        {
            if (record == null)
            {
                return(null);
            }

            NdefRecord ndefRecord = null;

            switch (record.TypeFormat)
            {
            case NFCNdefTypeFormat.WellKnown:
                var languageCode = record.LanguageCode;
                if (string.IsNullOrWhiteSpace(languageCode))
                {
                    languageCode = Configuration.DefaultLanguageCode;
                }
                ndefRecord = NdefRecord.CreateTextRecord(languageCode.Substring(0, 2), Encoding.UTF8.GetString(record.Payload));
                break;

            case NFCNdefTypeFormat.Mime:
                ndefRecord = NdefRecord.CreateMime(record.MimeType, record.Payload);
                break;

            case NFCNdefTypeFormat.Uri:
                ndefRecord = NdefRecord.CreateUri(Encoding.UTF8.GetString(record.Payload));
                break;

            case NFCNdefTypeFormat.External:
                ndefRecord = NdefRecord.CreateExternal(record.ExternalDomain, record.ExternalType, record.Payload);
                break;

            case NFCNdefTypeFormat.Empty:
                ndefRecord = GetEmptyNdefRecord();
                break;

            case NFCNdefTypeFormat.Unknown:
            case NFCNdefTypeFormat.Unchanged:
            case NFCNdefTypeFormat.Reserved:
            default:
                break;
            }
            return(ndefRecord);
        }
예제 #5
0
        public NFCMessage NdefFormatable_FormatTag(Tag tag)
        {
            if (!tag.GetTechList().Contains(Tech_NdefFormatable))
            {
                return(NFCMessage.NFC_UN_FORMATABLE_TAG);
            }
            NdefFormatable ndefFormatable = NdefFormatable.Get(tag);

            if (ndefFormatable == null)
            {
                return(NFCMessage.NFC_CANT_FORMAT);
            }
            ndefFormatable.Connect();
            NdefRecord  record  = NdefRecord.CreateMime("text/plain", Encoding.ASCII.GetBytes("New"));
            NdefMessage message = new NdefMessage(new NdefRecord[] { record });

            ndefFormatable.Format(message);
            ndefFormatable.Close();
            OnFormatting_NdefTag?.Invoke();
            return(NFCMessage.NFC_TAG_FORMATED);
        }
        /**
         *
         * Método faz a gravação de uma nova mensagem no cartão.
         *
         * Essa nova mensagem será códificada usando o padrão UTF-8.
         *
         * @param ndef = Contém as informações do cartão que esta sendo lido.
         * @param mensagem = Mensagem que será gravada no cartão
         *
         * @throws IOException
         * @throws FormatException
         *
         * @return boolean =>  True = Mensagem Gravada / False = Erro ao gravar mensagem
         *
         * */
        public bool GavarMensagemCartao(Ndef ndef, string mensagem)
        {
            bool retorno = false;

            try
            {
                if (ndef != null)
                {
                    ndef.Connect();
                    NdefRecord mimeRecord = null;

                    Java.Lang.String str = new Java.Lang.String(mensagem);

                    mimeRecord = NdefRecord.CreateMime
                                     ("UTF-8", str.GetBytes(Charset.ForName("UTF-8")));

                    ndef.WriteNdefMessage(new NdefMessage(mimeRecord));
                    ndef.Close();
                    retorno = true;
                }
                else
                {
                    retorno = FormataCartao(ndef);
                }
            }
            catch (System.FormatException e)
            {
                throw new System.FormatException(e.Message);
            }
            catch (IOException e)
            {
                throw new IOException(e.Message);
            }
            finally
            {
                this.GravaTempoFinal();
            }

            return(retorno);
        }
예제 #7
0
        /// <summary>
        /// Transforms a <see cref="NFCNdefRecord"/> into an Android <see cref="NdefRecord"/>
        /// </summary>
        /// <param name="record">Object <see cref="NFCNdefRecord"/></param>
        /// <returns>Android <see cref="NdefRecord"/></returns>
        NdefRecord GetAndroidNdefRecord(NFCNdefRecord record)
        {
            if (record == null)
            {
                return(null);
            }

            NdefRecord ndefRecord = null;

            switch (record.TypeFormat)
            {
            case NFCNdefTypeFormat.WellKnown:
                ndefRecord = NdefRecord.CreateTextRecord(Locale.Default.ToLanguageTag(), Encoding.UTF8.GetString(record.Payload));
                break;

            case NFCNdefTypeFormat.Mime:
                ndefRecord = NdefRecord.CreateMime(record.MimeType, record.Payload);
                break;

            case NFCNdefTypeFormat.Uri:
                ndefRecord = NdefRecord.CreateUri(Encoding.UTF8.GetString(record.Payload));
                break;

            case NFCNdefTypeFormat.External:
                ndefRecord = NdefRecord.CreateExternal(record.ExternalDomain, record.ExternalType, record.Payload);
                break;

            case NFCNdefTypeFormat.Empty:
                ndefRecord = GetEmptyNdefRecord();
                break;

            case NFCNdefTypeFormat.Unknown:
            case NFCNdefTypeFormat.Unchanged:
            case NFCNdefTypeFormat.Reserved:
            default:
                break;
            }
            return(ndefRecord);
        }
        /**
         *
         * Método faz a formatação do cartão.
         *
         * A formatação do cartão só é necessario na sua primeira gravação.
         *
         * Após já existir algum valor gravado no cartão, não será possível formata-lo
         * novamente.
         *
         * @param ndef = Contém as informações do cartão que esta sendo lido.
         *
         * @throws IOException
         * @throws FormatException
         *
         * @return boolean =>  True = Cartão Formatado / False = Cartão não formatado
         *
         * */
        public bool FormataCartao(Ndef ndef)
        {
            bool retorno = false;

            NdefFormatable ndefFormatable = NdefFormatable.Get(ndef.Tag);

            Java.Lang.String msg = new Java.Lang.String(MENSAGEM_PADRAO);
            try
            {
                if (ndefFormatable == null)
                {
                    return(retorno);
                }

                if (!ndefFormatable.IsConnected)
                {
                    ndefFormatable.Connect();
                }
                ndefFormatable.Format(new NdefMessage(NdefRecord.CreateMime
                                                          ("UTF-8", msg.GetBytes(Charset.ForName("UTF-8")))));
                ndefFormatable.Close();
                retorno = true;
            }
            catch (IOException e)
            {
                throw new IOException(e.Message);
            }
            catch (System.FormatException e)
            {
                throw new System.FormatException(e.Message);
            }
            finally
            {
                this.GravaTempoFinal();
            }


            return(retorno);
        }
예제 #9
0
        public bool WriteMimeMedia(string mimeType, byte[] mimeData, object tag)
        {
            if (!(tag is Tag))
            {
                return(false);
            }
            if (string.IsNullOrEmpty(mimeType) || mimeData.Length == 0)
            {
                return(false);
            }

            WriteResult writeResult = WriteResult.FAILED;

            try
            {
                NdefRecord  mimeRecord  = NdefRecord.CreateMime(mimeType, mimeData);
                NdefMessage ndefMessage = new NdefMessage(new NdefRecord[] { mimeRecord });
                writeResult = WriteTag(ndefMessage, (Tag)tag);
            }
            catch { }
            return(writeResult == WriteResult.OK);
        }
예제 #10
0
        private NdefRecord GetAndroidNdefRecord(NfcNdefRecord record)
        {
            if (record == null)
            {
                return(null);
            }

            NdefRecord ndefRecord = null;

            switch (record.TypeFormat)
            {
            case NfcNdefTypeFormat.WellKnown:
                ndefRecord = NdefRecord.CreateTextRecord("en", Encoding.UTF8.GetString(record.Payload));
                break;

            case NfcNdefTypeFormat.Mime:
                ndefRecord = NdefRecord.CreateMime(record.MimeType, record.Payload);
                break;

            case NfcNdefTypeFormat.Uri:
                ndefRecord = NdefRecord.CreateUri(Encoding.UTF8.GetString(record.Payload));
                break;

            case NfcNdefTypeFormat.Empty:
                byte[] empty = Array.Empty <byte>();
                ndefRecord = new NdefRecord(NdefRecord.TnfEmpty, empty, empty, empty);
                break;

            case NfcNdefTypeFormat.External:
            case NfcNdefTypeFormat.Unknown:
            case NfcNdefTypeFormat.Unchanged:
            case NfcNdefTypeFormat.Reserved:
            default:
                break;
            }
            return(ndefRecord);
        }
예제 #11
0
        void NewTagDetected(NFC.TagInfo?info)
        {
            ClearItems();
            var item = new List <IListItem>();

            item.Add(new StatusHeaderListItem("Waiting For Tag..."));
            //item.Add(new DataItem("hi", "text"));
            var lst = FindViewById <Android.Widget.ListView>(Resource.Id.lstview);

            lst.Adapter = new ListViewAdapter(this, item);
            UpdateStatus("New Tag Detected!");
            Terminal.WriteLine("New Tag Detected!");
            if (info == null)
            {
                Terminal.WriteLine("Tag Info Returned Null"); UpdateStatus("Tag Info Returned Null!"); return;
            }
            Terminal.WriteLine("------------------------------------------------------------");
            string Tech = " | ";

            foreach (var tec in info.Value.TechList)
            {
                Tech += tec.Replace("android.nfc.tech.", "") + " | ";
            }
            Terminal.WriteLine("TechList > " + Tech);
            AddHeader(new HeaderListItem("Tag Info"));
            AddItem(new DataItem("Serial Number", info.Value.UID()));
            AddItem(new DataItem("Tech List", Tech));
            foreach (var tec in info.Value.TechList)
            {
                switch (tec)
                {
                case NFC.Tech_IsoDep:
                    if (info.Value.IsoDep == null)
                    {
                        return;
                    }
                    Terminal.WriteLine("\n");
                    Terminal.WriteLine($"Tag Tec = [{tec.Replace("android.nfc.tech.", "")}]");
                    AddHeader(new HeaderListItem($"Tech = [{tec.Replace("android.nfc.tech.", "")}]"));
                    AddItem(new DataItem("Max Transcive Length", $"{info.Value.IsoDep.MaxTransceiveLength} bytes"));
                    AddItem(new DataItem("Timeout", $"{info.Value.IsoDep.Timeout} ms"));
                    break;

                case NFC.Tech_MifareClassic:
                    if (info.Value.MifareClassic == null)
                    {
                        return;
                    }
                    Terminal.WriteLine("\n");
                    Terminal.WriteLine($"Tag Tec = [{tec.Replace("android.nfc.tech.", "")}]");
                    AddHeader(new HeaderListItem($"Tech = [{tec.Replace("android.nfc.tech.", "")}]"));
                    AddItem(new DataItem("Type", $"{info.Value.MifareClassic.Type}"));
                    AddItem(new DataItem("Size", $"{info.Value.MifareClassic.Size} bytes"));
                    AddItem(new DataItem("Block Count", $"{info.Value.MifareClassic.BlockCount} blocks"));
                    AddItem(new DataItem("Sector Count", $"{info.Value.MifareClassic.SectorCount} sectors"));
                    AddItem(new DataItem("Max Transcive Length", $"{info.Value.MifareClassic.MaxTransceiveLength} bytes"));
                    AddItem(new DataItem("Timeout", $"{info.Value.MifareClassic.Timeout} ms"));
                    info.Value.MifareClassic.Connect();
                    var res = NFC.MifareClassic_AuthenticateSectorWithKeyA(info.Value.MifareClassic, 1, null);
                    Terminal.WriteLine($"Auth > {res}");
                    if (State == WaitingState.Write_Mifare)
                    {
                        if (res == NFC.NFCMessage.NFC_AUTH_OK)
                        {
                            Terminal.WriteLine($"Writing Mifare > {TxtMsg.Text}");
                            NFC.MifareClassic_WriteBlock(info.Value.MifareClassic, info.Value.MifareClassic.SectorToBlock(1), Encoding.UTF8.GetBytes(TxtMsg.Text));
                            Android.Support.V7.App.AlertDialog.Builder msg = new Android.Support.V7.App.AlertDialog.Builder(this);
                            msg.SetTitle("Success!!!");
                            msg.SetMessage("Tag Written Successfully...");
                            msg.SetPositiveButton("OK", (s, a) => { });
                            msg.SetCancelable(true);
                            msg.Create().Show();
                            TxtState.Text = "Written Mifare";
                        }
                        else
                        {
                            Android.Support.V7.App.AlertDialog.Builder msg = new Android.Support.V7.App.AlertDialog.Builder(this);
                            msg.SetTitle("Error!!!");
                            msg.SetMessage("Failed To Write Tag...");
                            msg.SetPositiveButton("OK", (s, a) => { });
                            msg.SetCancelable(true);
                            msg.Create().Show();
                            TxtState.Text = "Failed Write Mifare";
                        }
                    }
                    if (State == WaitingState.None)
                    {
                        if (res == NFC.NFCMessage.NFC_AUTH_OK)
                        {
                            var rm = NFC.MifareClassic_ReadBlock(info.Value.MifareClassic, info.Value.MifareClassic.SectorToBlock(1));
                            Terminal.WriteLine($"Reading Mifare > {Encoding.UTF8.GetString(rm)}");
                            AddItem(new DataItem("Reading", Encoding.UTF8.GetString(rm)));
                        }
                    }
                    info.Value.MifareClassic.Close();
                    break;

                case NFC.Tech_MifareUltralight:
                    if (info.Value.MifareUltralight == null)
                    {
                        return;
                    }
                    Terminal.WriteLine("\n");
                    Terminal.WriteLine($"Tag Tec = [{tec.Replace("android.nfc.tech.", "")}]");
                    AddHeader(new HeaderListItem($"Tech = [{tec.Replace("android.nfc.tech.", "")}]"));
                    AddItem(new DataItem("Type", $"{info.Value.MifareUltralight.Type}"));
                    AddItem(new DataItem("Max Transcive Length", $"{info.Value.MifareUltralight.MaxTransceiveLength} bytes"));
                    AddItem(new DataItem("Timeout", $"{info.Value.MifareUltralight.Timeout} ms"));
                    break;

                case NFC.Tech_Ndef:
                    if (info.Value.Ndef == null)
                    {
                        return;
                    }
                    Terminal.WriteLine("\n");
                    Terminal.WriteLine($"Tag Tec = [{tec.Replace("android.nfc.tech.", "")}]");
                    AddHeader(new HeaderListItem($"Tech = [{tec.Replace("android.nfc.tech.", "")}]"));
                    AddItem(new DataItem("Type", $"{info.Value.Ndef.Type}"));
                    AddItem(new DataItem("Writable", $"{info.Value.Ndef.IsWritable}"));
                    AddItem(new DataItem("Can Make Read-Only", $"{info.Value.Ndef.CanMakeReadOnly()}"));
                    AddItem(new DataItem("Max Size", $"{info.Value.Ndef.MaxSize} bytes"));
                    AddHeader(new HeaderListItem($"Ndef Message..."));
                    info.Value.Ndef.Connect();
                    if (State == WaitingState.Write_Ndef)
                    {
                        Terminal.WriteLine($"Writing Ndef > {TxtMsg.Text}");
                        NdefRecord record = NdefRecord.CreateMime("text/plain", Encoding.ASCII.GetBytes(TxtMsg.Text));
                        //NdefRecord record = NdefRecord.CreateTextRecord("", "SomeTxt");
                        NdefMessage message = new NdefMessage(new NdefRecord[] { record });
                        NFC.Ndef_WriteMessage(info.Value.Ndef, message);
                        Android.Support.V7.App.AlertDialog.Builder msg = new Android.Support.V7.App.AlertDialog.Builder(this);
                        msg.SetTitle("Success!!!");
                        msg.SetMessage("Tag Written Successfully...");
                        msg.SetPositiveButton("OK", (s, a) => { });
                        msg.SetCancelable(true);
                        msg.Create().Show();
                        TxtState.Text = "Written Ndef";
                    }
                    if (State == WaitingState.None)
                    {
                        int i = 0;
                        foreach (var msg in NFC.Ndef_ReadMessage(info.Value.Ndef).GetRecords())
                        {
                            Terminal.WriteLine($"Reading Ndef Msg [{i}] > {Encoding.ASCII.GetString(msg.GetPayload())}");
                            AddItem(new DataItem($"Record [{i}] - [UFT-8] [{ msg.ToMimeType()}]", $"{Encoding.UTF8.GetString(msg.GetPayload())}"));
                            i++;
                        }
                    }
                    info.Value.Ndef.Close();
                    break;

                case NFC.Tech_NdefFormatable:
                    if (info.Value.NdefFormatable == null)
                    {
                        return;
                    }
                    Terminal.WriteLine("\n");
                    Terminal.WriteLine($"Tag Tec = [{tec.Replace("android.nfc.tech.", "")}]");
                    AddHeader(new HeaderListItem($"Tech = [{tec.Replace("android.nfc.tech.", "")}]"));
                    if (State == WaitingState.Format_Ndef)
                    {
                        var res1 = NFC.NdefFormatable_FormatTag(info.Value.NdefFormatable.Tag);
                        Terminal.WriteLine($"Ndef Format > {res1}");
                        if (res1 == NFC.NFCMessage.NFC_TAG_FORMATED)
                        {
                            Android.Support.V7.App.AlertDialog.Builder msg = new Android.Support.V7.App.AlertDialog.Builder(this);
                            msg.SetTitle("Success!!!");
                            msg.SetMessage("Tag Formatted Successfully...");
                            msg.SetPositiveButton("OK", (s, a) => { });
                            msg.SetCancelable(true);
                            msg.Create().Show();
                            TxtState.Text = "Formated Ndef";
                        }
                        else
                        {
                            Android.Support.V7.App.AlertDialog.Builder msg = new Android.Support.V7.App.AlertDialog.Builder(this);
                            msg.SetTitle("Error!!!");
                            msg.SetMessage("Failed To Format Tag...");
                            msg.SetPositiveButton("OK", (s, a) => { });
                            msg.SetCancelable(true);
                            msg.Create().Show();
                            TxtState.Text = "Failed Format Ndef";
                        }
                    }
                    if (State == WaitingState.None)
                    {
                    }
                    break;

                case NFC.Tech_NfcA:
                    if (info.Value.NfcA == null)
                    {
                        return;
                    }
                    Terminal.WriteLine("\n");
                    Terminal.WriteLine($"Tag Tec = [{tec.Replace("android.nfc.tech.", "")}]");
                    info.Value.NfcA.Connect();
                    AddHeader(new HeaderListItem($"Tech = [{tec.Replace("android.nfc.tech.", "")}]"));
                    AddItem(new DataItem("Max Transcive Length", $"{info.Value.NfcA.MaxTransceiveLength} bytes"));
                    AddItem(new DataItem("Timeout", $"{info.Value.NfcA.Timeout} ms"));
                    AddItem(new DataItem("Sak", $"{info.Value.NfcA.Sak}"));
                    AddItem(new DataItem("Atqa", $"{Encoding.ASCII.GetString(info.Value.NfcA.GetAtqa())}"));
                    info.Value.NfcA.Close();
                    break;

                case NFC.Tech_NfcB:
                    if (info.Value.NfcB == null)
                    {
                        return;
                    }
                    Terminal.WriteLine("\n");
                    Terminal.WriteLine($"Tag Tec = [{tec.Replace("android.nfc.tech.", "")}]");
                    info.Value.NfcB.Connect();
                    AddHeader(new HeaderListItem($"Tech = [{tec.Replace("android.nfc.tech.", "")}]"));
                    AddItem(new DataItem("Max Transcive Length", $"{info.Value.NfcB.MaxTransceiveLength} bytes"));
                    AddItem(new DataItem("Application Data", $"{Encoding.ASCII.GetString(info.Value.NfcB.GetApplicationData())}"));
                    AddItem(new DataItem("Protocol Info", $"{Encoding.ASCII.GetString(info.Value.NfcB.GetProtocolInfo())}"));
                    info.Value.NfcB.Close();
                    break;

                case NFC.Tech_NfcBarcode:
                    if (info.Value.NfcBarcode == null)
                    {
                        return;
                    }
                    Terminal.WriteLine("\n");
                    Terminal.WriteLine($"Tag Tec = [{tec.Replace("android.nfc.tech.", "")}]");
                    info.Value.NfcBarcode.Connect();
                    AddHeader(new HeaderListItem($"Tech = [{tec.Replace("android.nfc.tech.", "")}]"));
                    AddItem(new DataItem("Type", $"{info.Value.NfcBarcode.Type}"));
                    AddItem(new DataItem("Barcode", $"{Encoding.ASCII.GetString(info.Value.NfcBarcode.GetBarcode())}"));
                    info.Value.NfcBarcode.Close();
                    break;

                case NFC.Tech_NfcF:
                    if (info.Value.NfcF == null)
                    {
                        return;
                    }
                    Terminal.WriteLine("\n");
                    Terminal.WriteLine($"Tag Tec = [{tec.Replace("android.nfc.tech.", "")}]");
                    info.Value.NfcF.Connect();
                    AddHeader(new HeaderListItem($"Tech = [{tec.Replace("android.nfc.tech.", "")}]"));
                    AddItem(new DataItem("Manufacturer", $"{Encoding.ASCII.GetString(info.Value.NfcF.GetManufacturer())}"));
                    AddItem(new DataItem("System Code", $"{Encoding.ASCII.GetString(info.Value.NfcF.GetSystemCode())}"));
                    AddItem(new DataItem("Max Transcive Length", $"{info.Value.NfcF.MaxTransceiveLength} bytes"));
                    AddItem(new DataItem("Timeout", $"{info.Value.NfcF.Timeout} ms"));
                    info.Value.NfcF.Close();
                    break;

                case NFC.Tech_NfcV:
                    Terminal.WriteLine("\n");
                    if (info.Value.NfcV == null)
                    {
                        return;
                    }
                    info.Value.NfcV.Connect();
                    AddHeader(new HeaderListItem($"Tech = [{tec.Replace("android.nfc.tech.", "")}]"));
                    AddItem(new DataItem("Dsf Id", $"{info.Value.NfcV.DsfId}"));
                    AddItem(new DataItem("Response Flags", $"{info.Value.NfcV.ResponseFlags}"));
                    AddItem(new DataItem("Max Transcive Length", $"{info.Value.NfcV.MaxTransceiveLength} bytes"));
                    info.Value.NfcV.Close();
                    break;
                }
            }
            if (TxtState.Text.Contains("Waiting"))
            {
                Android.Support.V7.App.AlertDialog.Builder msg = new Android.Support.V7.App.AlertDialog.Builder(this);
                if (State == WaitingState.Format_Ndef)
                {
                    msg.SetTitle("Failed To Format Tag!!!");
                    msg.SetMessage("Tag You Tapped Dosen't Supports 'NdefFormatable' Technology...");
                    msg.SetPositiveButton("OK", (s, a) => { });
                    msg.SetCancelable(true);
                    msg.Create().Show();
                    TxtState.Text = "Failed To Format";
                }
                else if (State == WaitingState.Write_Mifare)
                {
                    msg.SetTitle("Failed To Write Tag!!!");
                    msg.SetMessage("Tag You Tapped Dosen't Supports 'MifareClassic' Technology...");
                    msg.SetPositiveButton("OK", (s, a) => { });
                    msg.SetCancelable(true);
                    msg.Create().Show();
                    TxtState.Text = "Failed To Write";
                }
                else if (State == WaitingState.Write_Ndef)
                {
                    msg.SetTitle("Failed To Write Tag!!!");
                    msg.SetMessage("Tag You Tapped Dosen't Supports 'Ndef' Technology...");
                    msg.SetPositiveButton("OK", (s, a) => { });
                    msg.SetCancelable(true);
                    msg.Create().Show();
                    TxtState.Text = "Failed To Write";
                }
            }
            else
            {
                TxtMsg.Text = "";
            }
            State = WaitingState.None;
            Terminal.WriteLine("------------------------------------------------------------");
        }