简体   繁体   中英

How to send an NDEF Message from an Android phone to the Pi

I'm trying to send an NDEF message from my phone to my Raspberry Pi, using nfcpy.

I have connected a PN532 and am able to print some info about the Tag already.

Using my Android Appplication I'm able to send the message to another phone, but the Pi doesn't receive it.

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;
    }
}

When holding one of the enclosed Tags to the reader the error i receive is :

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'

Contrary to that, touching the reader with my phone doesnt give an Error at all, though it still give me Type4ATag MIU=255 FWT=0.038664 as output.

After that the error only appears when taking phone away:


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] & 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

So, I finally found my mistake, which is that i just forgot to put

NfcAdapter nfcAdapter = NfcAdapter.getDefaultAdapter(this);
nfcAdapter.setNdefPushMessageCallback(this, this);

to my onCreate method, after that it works just fine.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM