NfcB.java revision 4e21e1d21a877cce4db5ec8c5786604cc10f2d7e
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/**
266be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton * A low-level connection to a {@link Tag} using the NFC-B technology, also known as
276be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton * ISO1443-3B.
286be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton *
294e21e1d21a877cce4db5ec8c5786604cc10f2d7eJeff Hamilton * <p>You can acquire this kind of connection with {@link #get}.
306be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton * Use this class to send and receive data with {@link #transceive transceive()}.
316be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton *
326be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton * <p>Applications must implement their own protocol stack on top of
336be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton * {@link #transceive transceive()}.
346be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton *
356be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton * <p class="note"><strong>Note:</strong>
366be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton * Use of this class requires the {@link android.Manifest.permission#NFC}
376be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton * permission.
386be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton */
396be655c768a82716612c00fdd156254d8dc00f42Jeff Hamiltonpublic final class NfcB extends BasicTagTechnology {
406be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton    /** @hide */
41a559aa4759309606cd201e7e39844c3363a72b24Martijn Coenen    public static final String EXTRA_APPDATA = "appdata";
42a559aa4759309606cd201e7e39844c3363a72b24Martijn Coenen    /** @hide */
43a559aa4759309606cd201e7e39844c3363a72b24Martijn Coenen    public static final String EXTRA_PROTINFO = "protinfo";
446be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton
45a559aa4759309606cd201e7e39844c3363a72b24Martijn Coenen    private byte[] mAppData;
46a559aa4759309606cd201e7e39844c3363a72b24Martijn Coenen    private byte[] mProtInfo;
476be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton
484e21e1d21a877cce4db5ec8c5786604cc10f2d7eJeff Hamilton    /**
494e21e1d21a877cce4db5ec8c5786604cc10f2d7eJeff Hamilton     * Returns an instance of this tech for the given tag. If the tag doesn't support
504e21e1d21a877cce4db5ec8c5786604cc10f2d7eJeff Hamilton     * this tech type null is returned.
514e21e1d21a877cce4db5ec8c5786604cc10f2d7eJeff Hamilton     *
524e21e1d21a877cce4db5ec8c5786604cc10f2d7eJeff Hamilton     * @param tag The tag to get the tech from
534e21e1d21a877cce4db5ec8c5786604cc10f2d7eJeff Hamilton     */
544e21e1d21a877cce4db5ec8c5786604cc10f2d7eJeff Hamilton    public static NfcB get(Tag tag) {
554e21e1d21a877cce4db5ec8c5786604cc10f2d7eJeff Hamilton        if (!tag.hasTech(TagTechnology.NFC_B)) return null;
564e21e1d21a877cce4db5ec8c5786604cc10f2d7eJeff Hamilton        try {
574e21e1d21a877cce4db5ec8c5786604cc10f2d7eJeff Hamilton            return new NfcB(tag);
584e21e1d21a877cce4db5ec8c5786604cc10f2d7eJeff Hamilton        } catch (RemoteException e) {
594e21e1d21a877cce4db5ec8c5786604cc10f2d7eJeff Hamilton            return null;
604e21e1d21a877cce4db5ec8c5786604cc10f2d7eJeff Hamilton        }
614e21e1d21a877cce4db5ec8c5786604cc10f2d7eJeff Hamilton    }
624e21e1d21a877cce4db5ec8c5786604cc10f2d7eJeff Hamilton
63ce3224cda51f946871daa1e11e3976e25c59e6faJeff Hamilton    /** @hide */
644e21e1d21a877cce4db5ec8c5786604cc10f2d7eJeff Hamilton    public NfcB(Tag tag) throws RemoteException {
654e21e1d21a877cce4db5ec8c5786604cc10f2d7eJeff Hamilton        super(tag, TagTechnology.NFC_B);
664e21e1d21a877cce4db5ec8c5786604cc10f2d7eJeff Hamilton        Bundle extras = tag.getTechExtras(TagTechnology.NFC_B);
67a559aa4759309606cd201e7e39844c3363a72b24Martijn Coenen        mAppData = extras.getByteArray(EXTRA_APPDATA);
68a559aa4759309606cd201e7e39844c3363a72b24Martijn Coenen        mProtInfo = extras.getByteArray(EXTRA_PROTINFO);
69a559aa4759309606cd201e7e39844c3363a72b24Martijn Coenen    }
70a559aa4759309606cd201e7e39844c3363a72b24Martijn Coenen
71a559aa4759309606cd201e7e39844c3363a72b24Martijn Coenen    /**
72a559aa4759309606cd201e7e39844c3363a72b24Martijn Coenen     * Returns the Application Data bytes from the ATQB/SENSB_RES
73a559aa4759309606cd201e7e39844c3363a72b24Martijn Coenen     * bytes discovered at tag discovery.
74a559aa4759309606cd201e7e39844c3363a72b24Martijn Coenen     */
75a559aa4759309606cd201e7e39844c3363a72b24Martijn Coenen    public byte[] getApplicationData() {
76a559aa4759309606cd201e7e39844c3363a72b24Martijn Coenen        return mAppData;
776be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton    }
786be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton
796be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton    /**
80a559aa4759309606cd201e7e39844c3363a72b24Martijn Coenen     * Returns the Protocol Info bytes from the ATQB/SENSB_RES
81a559aa4759309606cd201e7e39844c3363a72b24Martijn Coenen     * bytes discovered at tag discovery.
826be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton     */
83a559aa4759309606cd201e7e39844c3363a72b24Martijn Coenen    public byte[] getProtocolInfo() {
84a559aa4759309606cd201e7e39844c3363a72b24Martijn Coenen        return mProtInfo;
856be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton    }
86a559aa4759309606cd201e7e39844c3363a72b24Martijn Coenen
87ce3224cda51f946871daa1e11e3976e25c59e6faJeff Hamilton    /**
88ce3224cda51f946871daa1e11e3976e25c59e6faJeff Hamilton     * Send data to a tag and receive the response.
89ce3224cda51f946871daa1e11e3976e25c59e6faJeff Hamilton     * <p>
90ce3224cda51f946871daa1e11e3976e25c59e6faJeff Hamilton     * This method will block until the response is received. It can be canceled
91ce3224cda51f946871daa1e11e3976e25c59e6faJeff Hamilton     * with {@link #close}.
92ce3224cda51f946871daa1e11e3976e25c59e6faJeff Hamilton     * <p>Requires {@link android.Manifest.permission#NFC} permission.
93ce3224cda51f946871daa1e11e3976e25c59e6faJeff Hamilton     *
94ce3224cda51f946871daa1e11e3976e25c59e6faJeff Hamilton     * @param data bytes to send
95ce3224cda51f946871daa1e11e3976e25c59e6faJeff Hamilton     * @return bytes received in response
96ce3224cda51f946871daa1e11e3976e25c59e6faJeff Hamilton     * @throws IOException if the target is lost or connection closed
97ce3224cda51f946871daa1e11e3976e25c59e6faJeff Hamilton     */
98ce3224cda51f946871daa1e11e3976e25c59e6faJeff Hamilton    public byte[] transceive(byte[] data) throws IOException {
99ce3224cda51f946871daa1e11e3976e25c59e6faJeff Hamilton        return transceive(data, true);
100ce3224cda51f946871daa1e11e3976e25c59e6faJeff Hamilton    }
1016be655c768a82716612c00fdd156254d8dc00f42Jeff Hamilton}
102