16be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton/* 26be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton * Copyright (C) 2010 The Android Open Source Project 36be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton * 46be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton * Licensed under the Apache License, Version 2.0 (the "License"); 56be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton * you may not use this file except in compliance with the License. 66be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton * You may obtain a copy of the License at 76be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton * 86be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton * http://www.apache.org/licenses/LICENSE-2.0 96be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton * 106be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton * Unless required by applicable law or agreed to in writing, software 116be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton * distributed under the License is distributed on an "AS IS" BASIS, 126be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 136be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton * See the License for the specific language governing permissions and 146be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton * limitations under the License. 156be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton */ 166be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton 174e21e1d21a877cce4db5ec8c5786604cc10f2d7eJeff Hamiltonpackage android.nfc.tech; 186be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton 196be655c768a82716612c00fdd156254d8dc00f42Jeff Hamiltonimport android.nfc.Tag; 206be655c768a82716612c00fdd156254d8dc00f42Jeff Hamiltonimport android.os.Bundle; 216be655c768a82716612c00fdd156254d8dc00f42Jeff Hamiltonimport android.os.RemoteException; 226be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton 23ce3224cda51f946871daa1e11e3976e25c59e6faJeff Hamiltonimport java.io.IOException; 24ce3224cda51f946871daa1e11e3976e25c59e6faJeff Hamilton 256be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton/** 2674fe6c6b245ebe7d3b3d96962c32980d88dca4f5Nick Pelly * Provides access to NFC-B (ISO 14443-3B) properties and I/O operations on a {@link Tag}. 276be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton * 2874fe6c6b245ebe7d3b3d96962c32980d88dca4f5Nick Pelly * <p>Acquire a {@link NfcB} object using {@link #get}. 2974fe6c6b245ebe7d3b3d96962c32980d88dca4f5Nick Pelly * <p>The primary NFC-B I/O operation is {@link #transceive}. Applications must 3074fe6c6b245ebe7d3b3d96962c32980d88dca4f5Nick Pelly * implement their own protocol stack on top of {@link #transceive}. 3139cf3a445e507f219ecc8a476f6038f095d9d520Nick Pelly * 3239cf3a445e507f219ecc8a476f6038f095d9d520Nick Pelly * <p class="note"><strong>Note:</strong> Methods that perform I/O operations 3339cf3a445e507f219ecc8a476f6038f095d9d520Nick Pelly * require the {@link android.Manifest.permission#NFC} permission. 346be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton */ 356be655c768a82716612c00fdd156254d8dc00f42Jeff Hamiltonpublic final class NfcB extends BasicTagTechnology { 366be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton /** @hide */ 37a559aa4759309606cd201e7e39844c3363a72b24Martijn Coenen public static final String EXTRA_APPDATA = "appdata"; 38a559aa4759309606cd201e7e39844c3363a72b24Martijn Coenen /** @hide */ 39a559aa4759309606cd201e7e39844c3363a72b24Martijn Coenen public static final String EXTRA_PROTINFO = "protinfo"; 406be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton 41a559aa4759309606cd201e7e39844c3363a72b24Martijn Coenen private byte[] mAppData; 42a559aa4759309606cd201e7e39844c3363a72b24Martijn Coenen private byte[] mProtInfo; 436be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton 444e21e1d21a877cce4db5ec8c5786604cc10f2d7eJeff Hamilton /** 4574fe6c6b245ebe7d3b3d96962c32980d88dca4f5Nick Pelly * Get an instance of {@link NfcB} for the given tag. 4674fe6c6b245ebe7d3b3d96962c32980d88dca4f5Nick Pelly * <p>Returns null if {@link NfcB} was not enumerated in {@link Tag#getTechList}. 4774fe6c6b245ebe7d3b3d96962c32980d88dca4f5Nick Pelly * This indicates the tag does not support NFC-B. 4874fe6c6b245ebe7d3b3d96962c32980d88dca4f5Nick Pelly * <p>Does not cause any RF activity and does not block. 494e21e1d21a877cce4db5ec8c5786604cc10f2d7eJeff Hamilton * 5074fe6c6b245ebe7d3b3d96962c32980d88dca4f5Nick Pelly * @param tag an NFC-B compatible tag 5174fe6c6b245ebe7d3b3d96962c32980d88dca4f5Nick Pelly * @return NFC-B object 524e21e1d21a877cce4db5ec8c5786604cc10f2d7eJeff Hamilton */ 534e21e1d21a877cce4db5ec8c5786604cc10f2d7eJeff Hamilton public static NfcB get(Tag tag) { 544e21e1d21a877cce4db5ec8c5786604cc10f2d7eJeff Hamilton if (!tag.hasTech(TagTechnology.NFC_B)) return null; 554e21e1d21a877cce4db5ec8c5786604cc10f2d7eJeff Hamilton try { 564e21e1d21a877cce4db5ec8c5786604cc10f2d7eJeff Hamilton return new NfcB(tag); 574e21e1d21a877cce4db5ec8c5786604cc10f2d7eJeff Hamilton } catch (RemoteException e) { 584e21e1d21a877cce4db5ec8c5786604cc10f2d7eJeff Hamilton return null; 594e21e1d21a877cce4db5ec8c5786604cc10f2d7eJeff Hamilton } 604e21e1d21a877cce4db5ec8c5786604cc10f2d7eJeff Hamilton } 614e21e1d21a877cce4db5ec8c5786604cc10f2d7eJeff Hamilton 62ce3224cda51f946871daa1e11e3976e25c59e6faJeff Hamilton /** @hide */ 634e21e1d21a877cce4db5ec8c5786604cc10f2d7eJeff Hamilton public NfcB(Tag tag) throws RemoteException { 644e21e1d21a877cce4db5ec8c5786604cc10f2d7eJeff Hamilton super(tag, TagTechnology.NFC_B); 654e21e1d21a877cce4db5ec8c5786604cc10f2d7eJeff Hamilton Bundle extras = tag.getTechExtras(TagTechnology.NFC_B); 66a559aa4759309606cd201e7e39844c3363a72b24Martijn Coenen mAppData = extras.getByteArray(EXTRA_APPDATA); 67a559aa4759309606cd201e7e39844c3363a72b24Martijn Coenen mProtInfo = extras.getByteArray(EXTRA_PROTINFO); 68a559aa4759309606cd201e7e39844c3363a72b24Martijn Coenen } 69a559aa4759309606cd201e7e39844c3363a72b24Martijn Coenen 70a559aa4759309606cd201e7e39844c3363a72b24Martijn Coenen /** 7174fe6c6b245ebe7d3b3d96962c32980d88dca4f5Nick Pelly * Return the Application Data bytes from ATQB/SENSB_RES at tag discovery. 7274fe6c6b245ebe7d3b3d96962c32980d88dca4f5Nick Pelly * 7374fe6c6b245ebe7d3b3d96962c32980d88dca4f5Nick Pelly * <p>Does not cause any RF activity and does not block. 7474fe6c6b245ebe7d3b3d96962c32980d88dca4f5Nick Pelly * 7574fe6c6b245ebe7d3b3d96962c32980d88dca4f5Nick Pelly * @return Application Data bytes from ATQB/SENSB_RES bytes 76a559aa4759309606cd201e7e39844c3363a72b24Martijn Coenen */ 77a559aa4759309606cd201e7e39844c3363a72b24Martijn Coenen public byte[] getApplicationData() { 78a559aa4759309606cd201e7e39844c3363a72b24Martijn Coenen return mAppData; 796be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton } 806be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton 816be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton /** 8274fe6c6b245ebe7d3b3d96962c32980d88dca4f5Nick Pelly * Return the Protocol Info bytes from ATQB/SENSB_RES at tag discovery. 8374fe6c6b245ebe7d3b3d96962c32980d88dca4f5Nick Pelly * 8474fe6c6b245ebe7d3b3d96962c32980d88dca4f5Nick Pelly * <p>Does not cause any RF activity and does not block. 8574fe6c6b245ebe7d3b3d96962c32980d88dca4f5Nick Pelly * 8674fe6c6b245ebe7d3b3d96962c32980d88dca4f5Nick Pelly * @return Protocol Info bytes from ATQB/SENSB_RES bytes 876be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton */ 88a559aa4759309606cd201e7e39844c3363a72b24Martijn Coenen public byte[] getProtocolInfo() { 89a559aa4759309606cd201e7e39844c3363a72b24Martijn Coenen return mProtInfo; 906be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton } 91a559aa4759309606cd201e7e39844c3363a72b24Martijn Coenen 92ce3224cda51f946871daa1e11e3976e25c59e6faJeff Hamilton /** 9374fe6c6b245ebe7d3b3d96962c32980d88dca4f5Nick Pelly * Send raw NFC-B commands to the tag and receive the response. 9474fe6c6b245ebe7d3b3d96962c32980d88dca4f5Nick Pelly * 9574fe6c6b245ebe7d3b3d96962c32980d88dca4f5Nick Pelly * <p>Applications must not append the EoD (CRC) to the payload, 9674fe6c6b245ebe7d3b3d96962c32980d88dca4f5Nick Pelly * it will be automatically calculated. 9774fe6c6b245ebe7d3b3d96962c32980d88dca4f5Nick Pelly * <p>Applications must not send commands that manage the polling 9874fe6c6b245ebe7d3b3d96962c32980d88dca4f5Nick Pelly * loop and initialization (SENSB_REQ, SLOT_MARKER etc). 9974fe6c6b245ebe7d3b3d96962c32980d88dca4f5Nick Pelly * 100faca12adc62d148505fadfd286e6a2752c197fa0Martijn Coenen * <p>Use {@link #getMaxTransceiveLength} to retrieve the maximum number of bytes 101faca12adc62d148505fadfd286e6a2752c197fa0Martijn Coenen * that can be sent with {@link #transceive}. 102faca12adc62d148505fadfd286e6a2752c197fa0Martijn Coenen * 10374fe6c6b245ebe7d3b3d96962c32980d88dca4f5Nick Pelly * <p>This is an I/O operation and will block until complete. It must 10474fe6c6b245ebe7d3b3d96962c32980d88dca4f5Nick Pelly * not be called from the main application thread. A blocked call will be canceled with 10574fe6c6b245ebe7d3b3d96962c32980d88dca4f5Nick Pelly * {@link IOException} if {@link #close} is called from another thread. 106ce3224cda51f946871daa1e11e3976e25c59e6faJeff Hamilton * 10739cf3a445e507f219ecc8a476f6038f095d9d520Nick Pelly * <p class="note">Requires the {@link android.Manifest.permission#NFC} permission. 10839cf3a445e507f219ecc8a476f6038f095d9d520Nick Pelly * 109ce3224cda51f946871daa1e11e3976e25c59e6faJeff Hamilton * @param data bytes to send 110ce3224cda51f946871daa1e11e3976e25c59e6faJeff Hamilton * @return bytes received in response 11174fe6c6b245ebe7d3b3d96962c32980d88dca4f5Nick Pelly * @throws TagLostException if the tag leaves the field 11274fe6c6b245ebe7d3b3d96962c32980d88dca4f5Nick Pelly * @throws IOException if there is an I/O failure, or this operation is canceled 113ce3224cda51f946871daa1e11e3976e25c59e6faJeff Hamilton */ 114ce3224cda51f946871daa1e11e3976e25c59e6faJeff Hamilton public byte[] transceive(byte[] data) throws IOException { 115ce3224cda51f946871daa1e11e3976e25c59e6faJeff Hamilton return transceive(data, true); 116ce3224cda51f946871daa1e11e3976e25c59e6faJeff Hamilton } 117faca12adc62d148505fadfd286e6a2752c197fa0Martijn Coenen 118faca12adc62d148505fadfd286e6a2752c197fa0Martijn Coenen /** 119faca12adc62d148505fadfd286e6a2752c197fa0Martijn Coenen * Return the maximum number of bytes that can be sent with {@link #transceive}. 120faca12adc62d148505fadfd286e6a2752c197fa0Martijn Coenen * @return the maximum number of bytes that can be sent with {@link #transceive}. 121faca12adc62d148505fadfd286e6a2752c197fa0Martijn Coenen */ 122faca12adc62d148505fadfd286e6a2752c197fa0Martijn Coenen public int getMaxTransceiveLength() { 123faca12adc62d148505fadfd286e6a2752c197fa0Martijn Coenen return getMaxTransceiveLengthInternal(); 124faca12adc62d148505fadfd286e6a2752c197fa0Martijn Coenen } 1256be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton} 126