Я занимаюсь разработкой приложения 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;
}
}