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-V (ISO 15693) properties and I/O operations on a {@link Tag}. 276be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton * 2874fe6c6b245ebe7d3b3d96962c32980d88dca4f5Nick Pelly * <p>Acquire a {@link NfcV} object using {@link #get}. 2974fe6c6b245ebe7d3b3d96962c32980d88dca4f5Nick Pelly * <p>The primary NFC-V 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 NfcV extends BasicTagTechnology { 367eb32a442722a7147cb0d9e92d118e6f7852ea0eMartijn Coenen /** @hide */ 377eb32a442722a7147cb0d9e92d118e6f7852ea0eMartijn Coenen public static final String EXTRA_RESP_FLAGS = "respflags"; 387eb32a442722a7147cb0d9e92d118e6f7852ea0eMartijn Coenen 397eb32a442722a7147cb0d9e92d118e6f7852ea0eMartijn Coenen /** @hide */ 407eb32a442722a7147cb0d9e92d118e6f7852ea0eMartijn Coenen public static final String EXTRA_DSFID = "dsfid"; 417eb32a442722a7147cb0d9e92d118e6f7852ea0eMartijn Coenen 427eb32a442722a7147cb0d9e92d118e6f7852ea0eMartijn Coenen private byte mRespFlags; 437eb32a442722a7147cb0d9e92d118e6f7852ea0eMartijn Coenen private byte mDsfId; 447eb32a442722a7147cb0d9e92d118e6f7852ea0eMartijn Coenen 454e21e1d21a877cce4db5ec8c5786604cc10f2d7eJeff Hamilton /** 4674fe6c6b245ebe7d3b3d96962c32980d88dca4f5Nick Pelly * Get an instance of {@link NfcV} for the given tag. 4774fe6c6b245ebe7d3b3d96962c32980d88dca4f5Nick Pelly * <p>Returns null if {@link NfcV} was not enumerated in {@link Tag#getTechList}. 4874fe6c6b245ebe7d3b3d96962c32980d88dca4f5Nick Pelly * This indicates the tag does not support NFC-V. 4974fe6c6b245ebe7d3b3d96962c32980d88dca4f5Nick Pelly * <p>Does not cause any RF activity and does not block. 504e21e1d21a877cce4db5ec8c5786604cc10f2d7eJeff Hamilton * 5174fe6c6b245ebe7d3b3d96962c32980d88dca4f5Nick Pelly * @param tag an NFC-V compatible tag 5274fe6c6b245ebe7d3b3d96962c32980d88dca4f5Nick Pelly * @return NFC-V object 534e21e1d21a877cce4db5ec8c5786604cc10f2d7eJeff Hamilton */ 544e21e1d21a877cce4db5ec8c5786604cc10f2d7eJeff Hamilton public static NfcV get(Tag tag) { 554e21e1d21a877cce4db5ec8c5786604cc10f2d7eJeff Hamilton if (!tag.hasTech(TagTechnology.NFC_V)) return null; 564e21e1d21a877cce4db5ec8c5786604cc10f2d7eJeff Hamilton try { 574e21e1d21a877cce4db5ec8c5786604cc10f2d7eJeff Hamilton return new NfcV(tag); 584e21e1d21a877cce4db5ec8c5786604cc10f2d7eJeff Hamilton } catch (RemoteException e) { 594e21e1d21a877cce4db5ec8c5786604cc10f2d7eJeff Hamilton return null; 604e21e1d21a877cce4db5ec8c5786604cc10f2d7eJeff Hamilton } 614e21e1d21a877cce4db5ec8c5786604cc10f2d7eJeff Hamilton } 624e21e1d21a877cce4db5ec8c5786604cc10f2d7eJeff Hamilton 63ce3224cda51f946871daa1e11e3976e25c59e6faJeff Hamilton /** @hide */ 644e21e1d21a877cce4db5ec8c5786604cc10f2d7eJeff Hamilton public NfcV(Tag tag) throws RemoteException { 654e21e1d21a877cce4db5ec8c5786604cc10f2d7eJeff Hamilton super(tag, TagTechnology.NFC_V); 664e21e1d21a877cce4db5ec8c5786604cc10f2d7eJeff Hamilton Bundle extras = tag.getTechExtras(TagTechnology.NFC_V); 677eb32a442722a7147cb0d9e92d118e6f7852ea0eMartijn Coenen mRespFlags = extras.getByte(EXTRA_RESP_FLAGS); 687eb32a442722a7147cb0d9e92d118e6f7852ea0eMartijn Coenen mDsfId = extras.getByte(EXTRA_DSFID); 697eb32a442722a7147cb0d9e92d118e6f7852ea0eMartijn Coenen } 707eb32a442722a7147cb0d9e92d118e6f7852ea0eMartijn Coenen 7174fe6c6b245ebe7d3b3d96962c32980d88dca4f5Nick Pelly /** 7274fe6c6b245ebe7d3b3d96962c32980d88dca4f5Nick Pelly * Return the Response Flag bytes from tag discovery. 7374fe6c6b245ebe7d3b3d96962c32980d88dca4f5Nick Pelly * 7474fe6c6b245ebe7d3b3d96962c32980d88dca4f5Nick Pelly * <p>Does not cause any RF activity and does not block. 7574fe6c6b245ebe7d3b3d96962c32980d88dca4f5Nick Pelly * 7674fe6c6b245ebe7d3b3d96962c32980d88dca4f5Nick Pelly * @return Response Flag bytes 7774fe6c6b245ebe7d3b3d96962c32980d88dca4f5Nick Pelly */ 787eb32a442722a7147cb0d9e92d118e6f7852ea0eMartijn Coenen public byte getResponseFlags() { 797eb32a442722a7147cb0d9e92d118e6f7852ea0eMartijn Coenen return mRespFlags; 807eb32a442722a7147cb0d9e92d118e6f7852ea0eMartijn Coenen } 817eb32a442722a7147cb0d9e92d118e6f7852ea0eMartijn Coenen 8274fe6c6b245ebe7d3b3d96962c32980d88dca4f5Nick Pelly /** 8374fe6c6b245ebe7d3b3d96962c32980d88dca4f5Nick Pelly * Return the DSF ID bytes from tag discovery. 8474fe6c6b245ebe7d3b3d96962c32980d88dca4f5Nick Pelly * 8574fe6c6b245ebe7d3b3d96962c32980d88dca4f5Nick Pelly * <p>Does not cause any RF activity and does not block. 8674fe6c6b245ebe7d3b3d96962c32980d88dca4f5Nick Pelly * 8774fe6c6b245ebe7d3b3d96962c32980d88dca4f5Nick Pelly * @return DSF ID bytes 8874fe6c6b245ebe7d3b3d96962c32980d88dca4f5Nick Pelly */ 897eb32a442722a7147cb0d9e92d118e6f7852ea0eMartijn Coenen public byte getDsfId() { 907eb32a442722a7147cb0d9e92d118e6f7852ea0eMartijn Coenen return mDsfId; 916be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton } 92ce3224cda51f946871daa1e11e3976e25c59e6faJeff Hamilton 93ce3224cda51f946871daa1e11e3976e25c59e6faJeff Hamilton /** 9474fe6c6b245ebe7d3b3d96962c32980d88dca4f5Nick Pelly * Send raw NFC-V commands to the tag and receive the response. 9574fe6c6b245ebe7d3b3d96962c32980d88dca4f5Nick Pelly * 9674fe6c6b245ebe7d3b3d96962c32980d88dca4f5Nick Pelly * <p>Applications must not append the CRC to the payload, 9774fe6c6b245ebe7d3b3d96962c32980d88dca4f5Nick Pelly * it will be automatically calculated. The application does 9874fe6c6b245ebe7d3b3d96962c32980d88dca4f5Nick Pelly * provide FLAGS, CMD and PARAMETER bytes. 9974fe6c6b245ebe7d3b3d96962c32980d88dca4f5Nick Pelly * 100faca12adc62d148505fadfd286e6a2752c197fa0Martijn Coenen * <p>Use {@link #getMaxTransceiveLength} to retrieve the maximum amount 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 /** 120faca12adc62d148505fadfd286e6a2752c197fa0Martijn Coenen * Return the maximum number of bytes that can be sent with {@link #transceive}. 121faca12adc62d148505fadfd286e6a2752c197fa0Martijn Coenen * @return the maximum number of bytes that can be sent with {@link #transceive}. 122faca12adc62d148505fadfd286e6a2752c197fa0Martijn Coenen */ 123faca12adc62d148505fadfd286e6a2752c197fa0Martijn Coenen public int getMaxTransceiveLength() { 124faca12adc62d148505fadfd286e6a2752c197fa0Martijn Coenen return getMaxTransceiveLengthInternal(); 125faca12adc62d148505fadfd286e6a2752c197fa0Martijn Coenen } 1266be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton} 127