/* * Potentially useful links * https://stackoverflow.com/questions/36270238/android-nfc-ndef-writendefmessage-throws-ioexception-and-erases-tag-data * https://stackoverflow.com/questions/40288795/android-nfca-connect-nfca-transceive-nfca-settimeout-and-nfca-getmaxtran * https://stackoverflow.com/questions/29718618/get-the-data-payload-of-a-tag * https://stackoverflow.com/questions/42819027/nfca-transceive-commands-documentation-nfc-a-iso-14443-3a* */ public void Callback(object obj) { if (obj is Intent intent) { Logging.Log(LogType.Information, $"Callback object is of type 'Intent'"); Tag rawTag = intent.GetParcelableExtra(NfcAdapter.ExtraTag) as Tag; NfcA tag = NfcA.Get(rawTag); tag.Connect(); byte[] result = tag.Transceive(CommandFactory.Instance().GetByteCommand(NfcByteCommand.Select)); if (!(result[0] == (byte)0x90 && result[1] == (byte)0x00)) { throw new IOException("could not select applet"); } result = tag.Transceive(CommandFactory.Instance().GetByteCommand(NfcByteCommand.GetString)); int len = result.Length; if (!(result[len - 2] == (byte)0x90 && result[len - 1] == (byte)0x00)) { throw new RuntimeException("could not retrieve msisdn"); } byte[] data = new byte[len - 2]; Array.Copy(result, data, len - 2); var str = Encoding.Default.GetString(data).Trim(); tag.Close(); } }
private bool isMIFARETag(Tag tag) { bool returnVar = false; ArrayList arr = new ArrayList(); arr.AddRange(tag.GetTechList()); if (arr.Contains("android.nfc.tech.NfcA")) { NfcA nfc_A = NfcA.Get(tag); byte[] atqa = nfc_A.GetAtqa(); int Sak = int.Parse(nfc_A.Sak.ToString()); switch (atqa[1]) { case 0x00: if (atqa[0] == 0x44 || atqa[0] == 0x42 || atqa[0] == 0x02 || atqa[0] == 0x04) { if (Sak == 0x20) { returnVar = true; detectedTag = "MIFARE_PLUS_SL3"; } else if (Sak == 0x10) { returnVar = true; detectedTag = "MIFARE_PLUS_SL2"; } } break; case 0x03: if (atqa[0] == 0x44 || atqa[0] == 0x4) { returnVar = true; detectedTag = "MIFARE_DESFIRE"; } break; default: break; } } return(returnVar); }
public (TagInfo?, NFCMessage) ReadInfo(Tag tag) { if (tag == null) { return(null, NFCMessage.NFC_NULL_TAG); } return(new TagInfo { Uid = tag.GetId(), Tag = tag, IsoDep = IsoDep.Get(tag), MifareClassic = MifareClassic.Get(tag), MifareUltralight = MifareUltralight.Get(tag), NfcV = NfcV.Get(tag), Ndef = Ndef.Get(tag), NdefFormatable = NdefFormatable.Get(tag), NfcA = NfcA.Get(tag), NfcB = NfcB.Get(tag), NfcF = NfcF.Get(tag), NfcBarcode = NfcBarcode.Get(tag), TechList = tag.GetTechList() }, NFCMessage.NFC_NO_ERROR); }
protected override void OnNewIntent(Intent intent) { base.OnNewIntent(intent); Toast.MakeText(this, "Leyendo NFC", ToastLength.Short).Show(); var tag = intent.GetParcelableExtra(NfcAdapter.ExtraTag) as Tag; /*if (_inWriteMode) * { * _inWriteMode = false; * * if (tag == null) * { * return; * } * * // These next few lines will create a payload (consisting of a string) * // and a mimetype. NFC record are arrays of bytes. * var payload = Encoding.ASCII.GetBytes("YeeSaurio"); * var mimeBytes = Encoding.ASCII.GetBytes("application/NFCFighters"); * var apeRecord = new NdefRecord(NdefRecord.TnfMimeMedia, mimeBytes, new byte[0], payload); * var ndefMessage = new NdefMessage(new[] { apeRecord }); * * if (!TryAndWriteToTag(tag, ndefMessage)) * { * // Maybe the write couldn't happen because the tag wasn't formatted? * TryAndFormatTagWithMessage(tag, ndefMessage); * } * } * * /*string[] techList = tag.GetTechList(); * info.Text = ""; * foreach (string tech in techList) * { * info.Text += "\n\t" + tech; * }*/ NfcA nfca = NfcA.Get(tag); NdefFormatable ndeff = NdefFormatable.Get(tag); IsoDep iso = IsoDep.Get(tag); MifareUltralight mifU = MifareUltralight.Get(tag); /*try * { * nfca.Connect(); * short s = nfca.Sak; * byte[] a = nfca.GetAtqa(); * string atqa = Encoding.ASCII.GetString(a); * info.Text += "\nSAK = " + s + "\nATQA = " + atqa; * nfca.Close(); * } catch (Exception e) * { * Toast.MakeText(this, "NfcA" + e.Message, ToastLength.Short).Show(); * }*/ /*try * { * iso.Connect(); * * iso.Close(); * } * catch (Exception e) * { * Toast.MakeText(this, "IsoDep" + e.Message, ToastLength.Short).Show(); * }*/ /*try * { * ndeff.Connect(); * //info.Text += "\nType: " + ndeff.GetType(); * //info.Text += "\nConnected: " + ndeff.IsConnected; * var rawMsgs = intent.GetParcelableArrayExtra(NfcAdapter.ExtraNdefMessages); * var msg = (NdefMessage)rawMsgs[0]; * var record = msg.GetRecords()[0]; * * info.Text += "\n\tNdefFormatted: " + Encoding.ASCII.GetString(record.GetPayload()); * ndeff.Close(); * } * catch (Exception e) * { * Toast.MakeText(this, "NdefFormatted " + e.Message, ToastLength.Short).Show(); * }*/ try { mifU.Connect(); byte[] mPag = mifU.ReadPages(12); StringBuilder aux = new StringBuilder(); String cont_mpag = ""; for (int i = 0; i < mPag.Length; i++) { aux.Append(mPag[i]); } cont_mpag = aux.ToString(); //info.Text = Charset.AvailableCharsets().ToString(); //var mifM = new String(cont_mpag, Charset.ForName("US-ASCII")); string mifM = Encoding.ASCII.GetString(mPag); info.Text += "\nTu personaje es " + mifM; mifU.Close(); } catch (Exception e) { //Toast.MakeText(this, "MifareUltralight" + e.Message, ToastLength.Short).Show(); } }
public static string GetManufacturer(Tag tag) { string mifareInfo = ""; string[] techtags = tag.GetTechList(); foreach (string s in techtags) { if (s.ToLower().IndexOf("mifareultralight") != -1) { return("MifareUltralight"); } else if (s.ToLower().IndexOf("mifareclassic") != -1) { mifareInfo = "Mifare Classic"; MifareClassic mifareClassicTag = MifareClassic.Get(tag); //Get MIFARE CLASSIC tag if (mifareClassicTag != null) { if (mifareClassicTag.Type == MifareClassic.TypePlus) { mifareInfo = "Mifare Plus"; } else if (mifareClassicTag.Type == MifareClassic.TypePro) { mifareInfo = "Mifare Pro"; } } return(mifareInfo); } else if (s.ToLower().IndexOf("nfca") != -1) { NfcA nfc_A = NfcA.Get(tag); if (nfc_A != null) { byte[] atqa = nfc_A.GetAtqa(); if (atqa.Length >= 2) { Int32.TryParse(nfc_A.Sak.ToString(), out int Sak); switch (atqa[1]) { case 0x00: if (atqa[0] == 0x44 || atqa[0] == 0x42 || atqa[0] == 0x02 || atqa[0] == 0x04) { if (Sak == 0x20) { mifareInfo = "Mifare Plus SL3"; } else if (Sak == 0x10) { mifareInfo = "Mifare Plus SL2"; } else if (Sak == 0x00) { mifareInfo = "Mifare EM"; } } break; case 0x03: if (atqa[0] == 0x44 || atqa[0] == 0x4) { mifareInfo = "Mifare Desfire"; } break; default: break; } } } } else if (IsFelicaTag(tag)) { mifareInfo = "Felica"; } } return(mifareInfo); }