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); }
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); }
/// <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); }
/// <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); }
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); }
/// <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); }
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); }
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); }
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("------------------------------------------------------------"); }