2016-08-25 8 views
1

XamarinとAndroid開発の初心者です。私はNFCタグ、特にST M24LR64Eを持っています。 Google PlayのSTアプリを使用してデータのブロックを確認できます。私のXamarinアプリでは、TagLostExceptionを取得せずにタグにメッセージを送信できません。タグIDを問わず問合せできますが、データの単一ブロックを読み取ろうとすると例外が発生します。どんな方向にも感謝します。XamarinとST M24LRタグを使用したNFC-V「タグロスト」例外

byte[] response = new byte[] { 0x0A }; 

byte[] cmd = new byte[] 
{ 
    (byte) 0x26, 
    (byte) 0x01, 
    0x00 
}; 
response = nfcv.Transceive(cmd); 

byte[] single = new byte[] 
{ 
    (byte) 0x40, // FLAGS 
    (byte) 0x20, // READ_SINGLE_BLOCK 
    0, 0, 0, 0, 0, 0, 0, 0, 
    (byte) (0 & 0x0ff) 
}; 
Array.Copy(id, 0, single, 2, 8); 
response = nfcv.Transceive(single); 

最初のTransceive()はOKで、10バイト戻ってきます。データのブロックを読み込もうとするとすぐに、私はTagLostExceptionを取得します。

+0

あなたは私の答えからREAD_SINGLE_BLOCKコマンドをコピーしたようです([here](http://stackoverflow.com/a/38783006/2425802参照))。残念ながら、その答えに使用されたフラグのバイトは間違っていました。アドレス指定されたバージョンを示すには、0x20(0x40ではなく)を使用する必要があります。 'id'は' tag.GetId() '(または' nfcv.GetTag()。GetId() ')から取得したタグUIDを含んでいると仮定します。 –

+0

また、Androidはすでにお客様のINVENTORYリクエストを実行しているため、再発行する必要はありません。 'NfcV'オブジェクトからのインベントリ要求によって、Androidが取得したすべての情報を取得できます。 –

+0

ありがとうございます@MichaelRoland - しかし、フラグを0x20に変更すると、まだタグが失われた例外が生成されています。 – AndySousa

答えて

1

NfcVタグ技術では、TagLostExceptionは、リーダーがタグと通信できなくなったか、コマンドがエラーになったことを示している可能性があります。

そのmanualによれば、M24LR64EのみREAD_SINGLE_BLOCKコマンドの拡張版(プロトコル拡張フラグのセット)をサポート:

M24LR64E-Rが正しく動作するためProtocol_extension_flagが1に設定されるべきです。 Protocol_extension_flagが0の場合、M24LR64E-Rはエラーコードで応答します。

したがって、ご使用のREAD_SINGLE_BLOCKコマンドのバージョンは、タグと互換性がありません。 Protocol Extensionフラグを設定し、16ビットのブロック番号を指定する必要があります。動作するはずのバージョンは次のとおりです。

int blockNumber = 0; 
byte[] readSingleBlock = new byte[] { 
     (byte) 0x28, // Flags: Addressed (bit 5), Protocol Extension (bit 3) 
     (byte) 0x20, // Command: READ_SINGLE_BLOCK 
     0, 0, 0, 0, 0, 0, 0, 0, // placeholder for UID 
     (byte) (blockNumber & 0x0ff), 
     (byte) ((blockNumber >> 8) & 0x0ff) 
}; 
byte[] id = nfcv.GetTag().GetId(); 
Array.Copy(id, 0, readSingleBlock, 2, 8); 
response = nfcv.Transceive(readSingleBlock); 

あなたはINVENTORYコマンドを使用して、高データ・レート(DATA_RATEフラグセット)を使用しているので、あなたもREAD_SINGLE_BLOCKコマンドを使用して、高データ・レートを使用する場合があります。その場合は、フラグ値0x2A0x28ではなく)を使用します。

最後に、INVENTORYコマンドなどのアンチコリジョン/列挙コマンドをNfcXタグテクノロジオブジェクトに送信しないようにしてください。これはうまくいくかもしれませんが、ANdroid NFCスタックの内部状態は、既にあなたのためにこれらのコマンドを実行しており、列挙されたタグを追跡しているので混乱するかもしれません。

  • tag.GetId()はあなたにタグのUIDを与える:あなたはTagオブジェクトからINVENTORY要求とNfcVオブジェクトを介して取得されるすべての情報を得ることができます。
  • nfcv.GetDsfId()は、タグのDSFIDを提供します。
  • nfcv.GetResponseFlags()は、INVENTORY応答のフラグバイトを提供します。
+0

ありがとうございました。それは私の問題を解決し、その後いくつかは、最初に動作するようになったので、すべてが良いと確信できるようになりました。再度、感謝します – AndySousa

関連する問題