#android #linux #nfc #rfid
#Android #linux #nfc #rfid
Вопрос:
Я пытаюсь отправить сообщение NDEF со своего телефона на мой Raspberry Pi, используя nfcpy.
Я подключил PN532 и уже могу распечатать некоторую информацию о теге.
Используя мое приложение для Android, я могу отправить сообщение на другой телефон, но Pi его не получает.
import time
import nfc
import ndef
from threading import Thread
from nfc.clf import RemoteTarget
with nfc.ContactlessFrontend('tty:AMA0') as clf:
tag = clf.connect(rdwr={'on-connect': lambda tag: False })
print(tag)
for record in tag.ndef.record:
print(record)
clf.close()
package com.example.t1000;
import android.bluetooth.BluetoothAdapter;
import android.content.Context;
import android.content.Intent;
import android.net.wifi.WifiManager;
import android.nfc.NdefMessage;
import android.nfc.NdefRecord;
import android.nfc.NfcAdapter;
import android.nfc.NfcEvent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
import android.widget.Toast;
public class NFCSender extends AppCompatActivity implements NfcAdapter.CreateNdefMessageCallback {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_nfcsender);
Intent intent = getIntent();
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("Now Sending: ");
stringBuilder.append(intent.getStringExtra(MainActivity.EXTRA_MYMAC));
String displayedMessage = stringBuilder.toString();
TextView textView = (TextView) findViewById(R.id.textView);
textView.setText(displayedMessage);
}
@Override
public NdefMessage createNdefMessage(NfcEvent event) {
Intent intent = getIntent();
NdefRecord ndefRecord = NdefRecord.createMime("text/plain", intent.getStringExtra(MainActivity.EXTRA_MYMAC).getBytes());
NdefMessage ndefMessage = new NdefMessage(ndefRecord);
return ndefMessage;
}
}
При поднесении одного из вложенных тегов к считывателю я получаю ошибку :
Traceback (most recent call last):
File "readTag.py", line 11, in <module>
for record in tag.ndef.record:
AttributeError: 'NoneType' object has no attribute 'record'
В отличие от этого, прикосновение к считывателю моим телефоном вообще не выдает ошибку, хотя оно по-прежнему выдает меня Type4ATag MIU=255 FWT=0.038664
в качестве вывода.
После этого ошибка появляется только при снятии телефона:
Traceback (most recent call last):
File "readTag.py", line 11, in <module>
for record in tag.ndef.record:
File "/home/pi/.local/lib/python2.7/site-packages/nfc/tag/__init__.py", line 278, in ndef
if ndef.has_changed:
File "/home/pi/.local/lib/python2.7/site-packages/nfc/tag/__init__.py", line 130, in has_changed
ndef_data = self._read_ndef_data()
File "/home/pi/.local/lib/python2.7/site-packages/nfc/tag/tt4.py", line 289, in _read_ndef_data
if not (hasattr(self, "_ndef_file") or self._discover_ndef()):
File "/home/pi/.local/lib/python2.7/site-packages/nfc/tag/tt4.py", line 231, in _discover_ndef
if not self._select_ndef_application():
File "/home/pi/.local/lib/python2.7/site-packages/nfc/tag/tt4.py", line 197, in _select_ndef_application
self.tag.send_apdu(0, 0xA4, 0x04, 0x00, self._aid)
File "/home/pi/.local/lib/python2.7/site-packages/nfc/tag/tt4.py", line 488, in send_apdu
apdu = self.transceive(apdu)
File "/home/pi/.local/lib/python2.7/site-packages/nfc/tag/tt4.py", line 437, in transceive
data = self._dep.exchange(data, timeout)
File "/home/pi/.local/lib/python2.7/site-packages/nfc/tag/tt4.py", line 123, in exchange
data = self.clf.exchange(data, (data[1] amp; 0x3F) * self.fwt)
File "/home/pi/.local/lib/python2.7/site-packages/nfc/clf/__init__.py", line 1051, in exchange
rcvd_data = exchange(self.target, send_data, timeout)
File "/home/pi/.local/lib/python2.7/site-packages/nfc/clf/pn53x.py", line 667, in send_cmd_recv_rsp
raise nfc.clf.TimeoutError
nfc.clf.TimeoutError
Ответ №1:
Итак, я, наконец, нашел свою ошибку, которая заключается в том, что я просто забыл поставить
NfcAdapter nfcAdapter = NfcAdapter.getDefaultAdapter(this);
nfcAdapter.setNdefPushMessageCallback(this, this);
для моего метода onCreate после этого он работает просто отлично.
Комментарии:
1. как вы подключили свой raspberry pi к pn532, через uart или i2c?
2. Я использовал Uart, если вам все еще интересно