Не удается декодировать сообщение NF C - PullRequest
0 голосов
/ 15 апреля 2020

Я занимаюсь разработкой приложения Xamarin Forms, которое открывает представление с моделью представления, определяемой данными, передаваемыми через тег NF C с использованием пакета Plugins.NF C. У меня есть функциональность, чтобы закодировать идентификатор для тега, а также прочитать тег. Моя проблема в том, что, кажется, что при чтении тега NF C я ничего не могу сделать с полученной строкой, поскольку она выдает ошибку из-за того, что я считаю, что она неправильно декодируется.

У меня есть попробовал два различных метода структурирования данных на чипе NF C, таких как объект JSON, а также просто идентификатор объекта. Что странно, когда я устанавливаю точку останова после чтения тега, строка выглядит нормально и отображается, и JsonLint даже отвечает, что JSON является действительным, когда я пытался использовать JSON в теге. Ошибка выдается, как только я начинаю использовать строку содержимого тега любым способом. Когда я пытался использовать JSON в теге и go для его десериализации, я получал сообщение об ошибке при синтаксическом анализе в строке 0 позиции 0.

Когда я при попытке использовать идентификатор (int) в теге, когда я пытаюсь разобрать его, я получаю сообщение об ошибке «Входная строка была не в правильном формате» Теперь я определил, что это должно быть что-то с кодированием / декодированием NF C, потому что, если я использую приложение для записи чего-либо в тег, оно работает безупречно, но когда я пишу в тег в моем приложении, тогда возникает проблема.

Это функция для чтения тег. Обратите внимание на закомментированный код как предыдущие попытки декодирования.

async void Current_OnMessageReceived(ITagInfo tagInfo)
    {
        if (tagInfo == null)
        {
            await ShowAlert("No tag found");
            return;
        }

        // Customized serial number
        var identifier = tagInfo.Identifier;
        var serialNumber = NFCUtils.ByteArrayToHexString(identifier, ":");
        var title = !string.IsNullOrWhiteSpace(serialNumber) ? $"Tag [{serialNumber}]" : "Tag Info";

        if (!tagInfo.IsSupported)
        {
            await ShowAlert("Unsupported tag (app)", title);
        }
        else if (tagInfo.IsEmpty)
        {
            await ShowAlert("Empty tag", title);
        }
        else
        {
            IDatabaseManager db = TinyIoCContainer.Current.Resolve<IDatabaseManager>() as IDatabaseManager;
            //var first = tagInfo.Records[0];
            //string msg = first.Message;
            //string msgHex = NFCUtils.ByteArrayToHexString(tagInfo.Records[0].Payload);
            //string msg = Convert.ToString(msgHex);
            //string msg = NFCUtils.GetMessage(tagInfo.Records[0]);
            string msg = NFCUtils.GetMessage(tagInfo.Records[0]);
            try
            { 
                //tring messageEncoded = Encoding.UTF8.GetString(tagInfo.Records[0].Payload);
                int cardId = int.Parse(msg);
                var card = await db.GetCard(cardId);
                //Entities.Card card = JsonConvert.DeserializeObject<Entities.Card>(msg);
                var model = await CardModel.FromCard(card);
                await Application.Current.MainPage.Navigation.PushAsync(new ViewCardPage(model));
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }
        }
    }

И вот функция, которая записывает в тег

void Current_OnTagDiscovered(ITagInfo tagInfo, bool format)
    {
        if (!CrossNFC.Current.IsWritingTagSupported)
        {
            return;
        }

        try
        {
            var record = new NFCNdefRecord
            {
                TypeFormat = NFCNdefTypeFormat.WellKnown,
                MimeType = "text/plain",
                Payload = NFCUtils.EncodeToByteArray(selectedCard.Card.Id.ToString())
                //Payload = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(selectedCard.Card);)
            };

            if (!format && record == null)
                throw new Exception("Record can't be null.");

            tagInfo.Records = new[] { record };

            //if (format)
            //{ 
            //  CrossNFC.Current.ClearMessage(tagInfo);
            //}

            CrossNFC.Current.PublishMessage(tagInfo, false);
        }
        catch (System.Exception ex)
        {
            //await ShowAlert(ex.Message);
            return;
        }
    }

Reading tag breakpoint hit

1 Ответ

0 голосов
/ 16 апреля 2020

Похоже, что это может быть проблемой с пакетом Plugin.NF C. Обходной путь, который я нашел, состоял в том, что, если я использую URI, а не текст, он был закодирован правильно.

...