代码之家  ›  专栏  ›  技术社区  ›  ilanyu

如何通过Android上的NFC向M1卡发送7位命令?

  •  1
  • ilanyu  · 技术社区  · 7 年前

    transceive() 方法但是 方法具有 byte[] 0b1000000 (短帧)到我的M1卡。如何将其发送到M1卡?

     /**
     * Send raw NfcA data to a tag and receive the response.
     *
     * <p>This is equivalent to connecting to this tag via {@link NfcA}
     * and calling {@link NfcA#transceive}. Note that all MIFARE Classic
     * tags are based on {@link NfcA} technology.
     *
     * <p>Use {@link #getMaxTransceiveLength} to retrieve the maximum number of bytes
     * that can be sent with {@link #transceive}.
     *
     * <p>This is an I/O operation and will block until complete. It must
     * not be called from the main application thread. A blocked call will be canceled with
     * {@link IOException} if {@link #close} is called from another thread.
     *
     * <p class="note">Requires the {@link android.Manifest.permission#NFC} permission.
     *
     * @see NfcA#transceive
     */
    public byte[] transceive(byte[] data) throws IOException {
        return transceive(data, true);
    }
    

    我的代码是:

     /**
     * Write a block of 16 byte data to tag.
     * @param sectorIndex The sector to where the data should be written
     * @param blockIndex The block to where the data should be written
     * @param data 16 byte of data.
     * @param key The MIFARE Classic key for the given sector.
     * @param useAsKeyB If true, key will be treated as key B
     * for authentication.
     * @return The return codes are:<br />
     * <ul>
     * <li>0 - Everything went fine.</li>
     * <li>1 - Sector index is out of range.</li>
     * <li>2 - Block index is out of range.</li>
     * <li>3 - Data are not 16 bytes.</li>
     * <li>4 - Authentication went wrong.</li>
     * <li>-1 - Error while writing to tag.</li>
     * </ul>
     * @see #authenticate(int, byte[], boolean)
     */
    public int writeBlock(int sectorIndex, int blockIndex, byte[] data,
            byte[] key, boolean useAsKeyB) {
        if (getSectorCount()-1 < sectorIndex) {
            return 1;
        }
        if (mMFC.getBlockCountInSector(sectorIndex)-1 < blockIndex) {
            return 2;
        }
        if (data.length != 16) {
            return 3;
        }
        int block = mMFC.sectorToBlock(sectorIndex) + blockIndex;
    
        // write chinese card
        if (block == 0) {
            // Write block.
            try {
                mMFC.transceive(new byte[]{(byte)0x50, (byte)0x00, (byte)0x57, (byte)0xCD});
                mMFC.transceive(new byte[]{(byte)0x40}); // TODO: here need send 0b1000000(7 bit) , not 0b01000000(8 bit)
                mMFC.transceive(new byte[]{(byte)0x43});
                mMFC.writeBlock(block, data);
            } catch (IOException e) {
                Log.e(LOG_TAG, "Error while writing block to tag.", e);
                return -1;
            }
            return 0;
        }
    
        if (!authenticate(sectorIndex, key, useAsKeyB)) {
            return 4;
        }
        // Write block.
        try {
            mMFC.writeBlock(block, data);
        } catch (IOException e) {
            Log.e(LOG_TAG, "Error while writing block to tag.", e);
            return -1;
        }
        return 0;
    }
    
    1 回复  |  直到 7 年前
        1
  •  0
  •   Michael Roland    7 年前

    你想做的事在Android上是不可能的。Android NFC API不提供任何直接发送短帧(ISO/IEC 14443-3 A类中定义的7位帧)的方法。

    事实上 transceive() NfcA 不仅发送作为其参数传递的字节数组。相反,它还将导致CRC校验和自动附加到帧。因此,您只能使用 收发器() 方法

    任何