Beispiel #1
0
        public override void DidDetectTags(NFCNdefReaderSession session, INFCNdefTag[] tags)
        {
            try
            {
                var nFCNdefTag = tags[0];
                session.ConnectToTag(nFCNdefTag, CompletionHandler);
                string         dominio        = "http://boxweb.azurewebsites.net/";
                string         user           = MainViewModel.GetInstance().User.UserId.ToString();
                string         tag_id         = "";
                string         url            = dominio + "index3.aspx?user_id=" + user + "&tag_id=" + tag_id;
                NFCNdefPayload payload        = NFCNdefPayload.CreateWellKnownTypePayload(url);
                NFCNdefMessage nFCNdefMessage = new NFCNdefMessage(new NFCNdefPayload[] { payload });
                nFCNdefTag.WriteNdef(nFCNdefMessage, delegate
                {
                    session.InvalidateSession();
                });
                //Task task = App.DisplayAlertAsync(user_id_tag);

                //AppDelegate.user_id_tag = "?";
                //PopupNavigation.Instance.PopAsync();


                //session.InvalidateSession();
                //session.Dispose();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);
                session.Dispose();
                session.InvalidateSession();
            }

            MainViewModel.GetInstance().Home = new HomeViewModel();
            Xamarin.Forms.Application.Current.MainPage = new MasterPage();
        }
Beispiel #2
0
        public void ReadValues(NFCNdefMessage message, NSError error)
        {
            try
            {
                if (MainPage.currentPage == "Read From Node") //If current page is read page
                {
                    NFCNdefPayload messageRecord = message.Records[0];

                    ReadNFC.DisplayValues(messageRecord.Payload.ToArray()); //Encrypt nonce and create reply
                    Session.InvalidateSession();
                }
                else // If current page is write page
                {
                    string test = "sjkdsakdjdksad";
                    //byte[] bytes = Encoding.ASCII.GetBytes(test);
                    byte[] bytes = WriteNFC.CreateRequest();


                    NFCNdefPayload writePayload = new NFCNdefPayload(NFCTypeNameFormat.Unknown, NSData.FromArray(new byte[0]), NSData.FromArray(new byte[0]), NSData.FromArray(bytes));
                    NFCNdefMessage writeMessage = new NFCNdefMessage(new NFCNdefPayload[] { writePayload });
                    tag.WriteNdef(writeMessage, delegate { Console.WriteLine("Write"); });
                    System.Threading.Thread.Sleep(300);
                    Session.InvalidateSession();
                }
            }
            catch
            {
                Console.WriteLine("Did not contain a message");
            }
        }
Beispiel #3
0
        private void OnNdefRed(NFCNdefMessage message, NSError error)
        {
            if (message == null)
            {
                OnNfcTagRead?.Invoke(this, null);
                return;
            }
            NfcTagInfo tagInfo = new NfcTagInfo();

            tagInfo.Records = GetRecords(message.Records);

            OnNfcTagRead?.Invoke(this, tagInfo);
        }
Beispiel #4
0
 public void DidDetectTags(NFCNdefReaderSession session, INFCNdefTag[] tags)
 {
     try
     {
         string user_id_tag = AppDelegate.user_id_tag;
         if (user_id_tag == "?")
         {
             Task task = App.DisplayAlertAsync("¡Primero escanea este Tag para escribirlo!");
             session.InvalidateSession();
             session.Dispose();
             AppDelegate.user_id_tag = "?";
         }
         else
         {
             if ((Convert.ToInt32(user_id_tag) == Convert.ToInt32(MainViewModel.GetInstance().User.UserId.ToString())) || (0 == Convert.ToInt32(user_id_tag)))
             {
                 var nFCNdefTag = tags[0];
                 session.ConnectToTag(nFCNdefTag, CompletionHandler);
                 string         dominio        = "http://boxweb.azurewebsites.net/";
                 string         user           = MainViewModel.GetInstance().User.UserId.ToString();
                 string         tag_id         = "";
                 string         url            = dominio + "index3.aspx?user_id=" + user + "&tag_id=" + tag_id;
                 NFCNdefPayload payload        = NFCNdefPayload.CreateWellKnownTypePayload(url);
                 NFCNdefMessage nFCNdefMessage = new NFCNdefMessage(new NFCNdefPayload[] { payload });
                 nFCNdefTag.WriteNdef(nFCNdefMessage, delegate
                 {
                     Console.WriteLine("ok");
                 });
                 //Task task = App.DisplayAlertAsync(user_id_tag);
             }
             else
             {
                 Task task2 = App.DisplayAlertAsync("¡Este Tag esta vinculado con otro usuario!");
                 session.Dispose();
                 session.InvalidateSession();
                 AppDelegate.user_id_tag = "?";
             }
             AppDelegate.user_id_tag = "?";
             PopupNavigation.Instance.PopAsync();
             session.InvalidateSession();
             _tagSession.InvalidateSession();
             Thread.Sleep(4000);
         }
     }
     catch (Exception ex)
     {
         Console.Write(ex);
         modo_escritura = false;
     }
 }
Beispiel #5
0
        private void ManageWriteTextOperation(NFCNdefReaderSession session, INFCNdefTag[] tags)
        {
            var nFCNdefTag = tags[0];

            session.ConnectToTag(nFCNdefTag, (error) => OnNfcTagTextWriten(this, false));

            NFCNdefPayload payload        = NFCNdefPayload.CreateWellKnownTypePayload(textToWrite, NSLocale.CurrentLocale);
            NFCNdefMessage nFCNdefMessage = new NFCNdefMessage(new NFCNdefPayload[] { payload });

            nFCNdefTag.WriteNdef(nFCNdefMessage, delegate
            {
                OnNfcTagTextWriten(this, true);
            });
        }
Beispiel #6
0
        public async Task WriteNdefAsync(NdefMessage ndefMessage)
        {
            try
            {
                await _lockSemaphore.WaitAsync();

                if (!_isSessionEnabled)
                {
                    throw new Exception("NFC is not enabled");
                }

                var tcs = new TaskCompletionSource <object>();

                var iosNdefMessage = new NFCNdefMessage(ndefMessage.ToList().Select(record => new NFCNdefPayload
                                                                                    (
                                                                                        format: (NFCTypeNameFormat)record.TypeNameFormat,
                                                                                        type: NSData.FromArray(record.Type),
                                                                                        identifier: NSData.FromArray(record.Id),
                                                                                        payload: NSData.FromArray(record.Payload)
                                                                                    )).ToArray());
                _tag.WriteNdef(iosNdefMessage, (error) =>
                {
                    if (error != null)
                    {
                        throw new Exception(error.Description);
                    }

                    tcs.SetResult(null);
                });

                await tcs.Task;
            }
            finally
            {
                _lockSemaphore.Release();
            }
        }
Beispiel #7
0
        /// <summary>
        /// Converte an iOS <see cref="NFCNdefMessage"/> into an array of bytes
        /// </summary>
        /// <param name="message">iOS <see cref="NFCNdefMessage"/></param>
        /// <returns>Array of bytes</returns>
        public static byte[] ToByteArray(this NFCNdefMessage message)
        {
            var records = message?.Records;

            // Empty message: single empty record
            if (records == null || records.Length == 0)
            {
                records = new NFCNdefPayload[] { null };
            }

            var m = new MemoryStream();

            for (var i = 0; i < records.Length; i++)
            {
                var record         = records[i];
                var typeNameFormat = record?.TypeNameFormat ?? NFCTypeNameFormat.Empty;
                var payload        = record?.Payload;
                var id             = record?.Identifier;
                var type           = record?.Type;

                var flags = (byte)typeNameFormat;

                // Message begin / end flags. If there is only one record in the message, both flags are set.
                if (i == 0)
                {
                    flags |= 0x80;                          // MB (message begin = first record in the message)
                }
                if (i == records.Length - 1)
                {
                    flags |= 0x40;                          // ME (message end = last record in the message)
                }
                // cf (chunked records) not supported yet

                // SR (Short Record)?
                if (payload == null || payload.Length < 255)
                {
                    flags |= 0x10;
                }

                // ID present?
                if (id != null && id.Length > 0)
                {
                    flags |= 0x08;
                }

                m.WriteByte(flags);

                // Type length
                if (type != null)
                {
                    m.WriteByte((byte)type.Length);
                }
                else
                {
                    m.WriteByte(0);
                }

                // Payload length 1 byte (SR) or 4 bytes
                if (payload == null)
                {
                    m.WriteByte(0);
                }
                else
                {
                    if ((flags & 0x10) != 0)
                    {
                        // SR
                        m.WriteByte((byte)payload.Length);
                    }
                    else
                    {
                        // No SR (Short Record)
                        var payloadLength = (uint)payload.Length;
                        m.WriteByte((byte)(payloadLength >> 24));
                        m.WriteByte((byte)(payloadLength >> 16));
                        m.WriteByte((byte)(payloadLength >> 8));
                        m.WriteByte((byte)(payloadLength & 0x000000ff));
                    }
                }

                // ID length
                if (id != null && (flags & 0x08) != 0)
                {
                    m.WriteByte((byte)id.Length);
                }

                // Type length
                if (type != null && type.Length > 0)
                {
                    m.Write(type.ToArray(), 0, (int)type.Length);
                }

                // ID data
                if (id != null && id.Length > 0)
                {
                    m.Write(id.ToArray(), 0, (int)id.Length);
                }

                // Payload data
                if (payload != null && payload.Length > 0)
                {
                    m.Write(payload.ToArray(), 0, (int)payload.Length);
                }
            }

            return(m.ToArray());
        }
Beispiel #8
0
        /// <summary>
        /// Writes or clears a TAG
        /// </summary>
        /// <param name="session"><see cref="NFCTagReaderSession"/></param>
        /// <param name="tag"><see cref="INFCNdefTag"/></param>
        /// <param name="tagInfo"><see cref="ITagInfo"/></param>
        /// <param name="clearMessage">Clear message</param>
        void ExecuteWriteOrClear(NFCTagReaderSession session, INFCNdefTag tag, ITagInfo tagInfo, bool clearMessage = false)
        {
            tag.QueryNdefStatus((status, capacity, error) =>
            {
                if (error != null)
                {
                    Invalidate(session, error.LocalizedDescription);
                    return;
                }

                if (status == NFCNdefStatus.ReadOnly)
                {
                    Invalidate(session, UIMessages.NFCErrorReadOnlyTag);
                    return;
                }

                if (Convert.ToInt32(capacity) < NFCUtils.GetSize(tagInfo.Records))
                {
                    Invalidate(session, UIMessages.NFCErrorCapacityTag);
                    return;
                }

                NFCNdefMessage message = null;
                if (!clearMessage)
                {
                    session.AlertMessage = UIMessages.NFCSuccessWrite;

                    var records = new List <NFCNdefPayload>();
                    for (var i = 0; i < tagInfo.Records.Length; i++)
                    {
                        var record = tagInfo.Records[i];
                        if (GetiOSPayload(record) is NFCNdefPayload ndefPayload)
                        {
                            records.Add(ndefPayload);
                        }
                    }

                    if (records.Any())
                    {
                        message = new NFCNdefMessage(records.ToArray());
                    }
                }
                else
                {
                    session.AlertMessage = UIMessages.NFCSuccessClear;
                    message = GetEmptyNdefMessage();
                }

                if (message != null)
                {
                    tag.WriteNdef(message, (error) =>
                    {
                        if (error != null)
                        {
                            Invalidate(session, error.LocalizedDescription);
                            return;
                        }

                        tagInfo.Records = GetRecords(message.Records);
                        OnMessagePublished?.Invoke(tagInfo);
                        Invalidate(NfcSession);
                    });
                }
                else
                {
                    Invalidate(session, UIMessages.NFCErrorWrite);
                }
            });
        }
 public NfcDefTag(NFCNdefMessage tag)
 {
     Records = tag.Records.Select(r => new AppleNdefRecord(r)).ToArray();
 }
Beispiel #10
0
 public NfcTag(NFCNdefMessage tag, IEnumerable <NFCNdefPayload> rcs)
 {
     Records = rcs.Select(r => new IOSNfcRecord(r)).ToArray();
 }