web-dev-qa-db-ja.com

Windows Phone 8 NFCを使用してMifareタグを読み取りますか?

Windows Phone 8 NFC Mifare Ultralight/Classicベースのタグをサポートしていますか?このコードを使用して、Nokia Lumia920のNFCデバイスにアクセスします(コード例は- NDEFタグリーダー– NFC NDEFタグリーダー

public partial class MainPage : PhoneApplicationPage
{
    public MainPage()
    {
        InitializeComponent();
        ProximityDevice device = ProximityDevice.GetDefault();
        device.DeviceArrived += DeviceArrived;
        device.DeviceDeparted += DeviceDeparted;
        device.SubscribeForMessage("NDEF", MessageReceived);
    }

    private void DeviceArrived(ProximityDevice sender)
    {
        // this event occurs when I am tapping any of my tags (tried 5 different Mifare Ultralight/Classic)
    }

    private void DeviceDeparted(ProximityDevice sender)
    {
        // this event occurs when I am moving away any tag
    }

    private void MessageReceived(ProximityDevice sender, ProximityMessage message)
    {
        // this event is never fired!!! :(
    }
}

WP8のNFCに欠陥がありますか、それともこのコードは間違っていますか?

更新:このドキュメントから NFCフォーラムタイプタグ MifareUltralightはNDEFと互換性があることがわかります。 Androidデバイスは、このタイプのタグを簡単に読み取ることができます。

15
A-student

MifrareはWP8とLumia920でサポートされています。ここで推測していますが、Mifare NFCタグがNDEFにフォーマット/初期化されていない可能性があります。 NFCタグを購入するときに、NFCタグをNDEFフォーマットにするように依頼できます。

Lumia 920チップ(NXP PN544ファミリー)は、(少なくとも)次のタグタイプをサポートします。

  • タイプ1:トパーズファミリー
  • タイプ2:Mifare Ultralightファミリー、my-d-move、NTag
  • タイプ3:フェリカファミリー
  • タイプ4:Desfireファミリー
  • 標準化されていない:Mifare標準

NFCタグについてNDEFフォーマット:

  • WP8は、これらのタグへのNDEFレベルのアクセスのみをサポートします。つまり、タグはNDEF形式であるか、既存のNDEFメッセージを持っている必要があります(空の場合もあります)。フォーマットされていないNFCタグでAPIを使用しようとすると、機能しません(WP8には低レベルのタグタイプ固有のコマンド/アクセスのサポートがないため)
  • タグをNDEF形式にする場合は、次のオプションがあります。タグを注文するときに、タグをNDEF形式にするように要求する(または空のNDEFメッセージとロック解除するタグを含める)場合は、NFCUSBを使用します。 PC用のリーダー/ライターハードウェア、またはNFC書き込みアプリでSymbian/MeeGo/Android NFCデバイスを使用する

よろしくお願いいたします。
-ジャスティンエンジェル
NokiaでのWindowsPhone開発者エクスペリエンスのプリンシパルエンジニア

14
JustinAngel

あなたが投稿したコードは、NFCタグからの [〜#〜] ndef [〜#〜] メッセージを読むことになっています。

MifareはNFCタグでも使用されますが、類似性はここで終わります。それは 完全に異なるプロトコル 独自の(独自の)データ形式です。

したがって、このコードは実際には間違っていません(WP8のNFCは一般的に「欠陥がある」))が、Mifareタグを読み取ることを期待している場合、このアプローチは機能しません。

WP8でMifareタグを読み取ることができるかどうかはわかりません。これは、ハードウェア(Mifareは一部の非ISOフレームを使用するため)とAPIサポートによって異なります。 Googleで簡単に検索すると、Java SDK for old Nokia phoneはMifareをサポートしているため、ハードウェアサポートが存在する可能性があります。ただし、WP8には何も見つからなかったため、おそらくこれが必要になります。それが機能する場合、いくつかの広範なコーディング。

何が必要かを理解するには、DeviceArrivedイベント(リーダーがISO NFCタグ)を検出したことを意味します)を取得した後、カードのUIDを取得する必要があります。これは標準のISO機能なので、非常に簡単です。

次に、Mifare認証と読み取り/書き込みセクターコマンドをタグに直接送信する機能が必要です。これらのコマンドはISO標準ではないため、これは物事がよりトリッキーで読者に依存する場所です。この段階を通過するには、プロトコルのドキュメントと、電話用の実用的なMifareテストツールが本当に必要でした。最後に、ほとんどのMifareカードは、少なくとも1つのセクターキーを知らない限り完全に読み取れません。また、アプリケーションデータ形式も独自仕様(カード発行会社に固有)であるため、すべての作業を行った後でも、有用な情報を入手できるとは限りません。カード...

5
mdb

Windows Phone 8アプリは、非常に高レベルのライブラリにのみアクセスでき、NDEF形式ではないタグを読み取ることはできません。

MIFARE ULタグは、NFC Forum NDEF Type 2標準を使用する必要があります。これは、タグの48バイトのユーザーメモリが小さいため単純化されています。

低レベルのリーダー/ライターを使用している場合は、データの大部分を変更せずにULタグをNDEFに準拠させることができますが、犠牲にする必要があります。

  • 3ページのOTPメモリの4バイトすべて(NDEF機能コンテナ用)
  • ユーザーがプログラム可能なメモリの最初の6バイト(少なくとも6バイト、最初の2ページをきれいに埋めるために8にパディングする必要がある場合があります)。

タグは次のようにフォーマットされています:(参照-www.nfc-forum.org/specs/spec_list/#tagtypes)

  • ページ3、バイト0〜3:CC [マジックナンバー、バージョン、ユーザーMEMサイズ、読み取り/書き込み]
  • ページ4、バイト0-1:NDEFメッセージTLVヘッダー[タイプ、長さ](タイプExternalRtdを推奨)
  • ページ4、バイト2〜3:レコード記述子(レコードタイプを指定する文字列を含み、スペースを節約するために1バイトの長さにするか、きちんとしたパディングのために3バイトの長さにすることをお勧めします)
  • ページ5、バイト0-1または3:レコード記述子
  • ページの残り/バイトは記録/データです

例:タグのメッセージタイプはExternalRtdで、レコードタイプは「abc」です(NDEFに完全に準拠するには、レコードタイプは技術的に「urn:nfc:ext:companyname.com:typename」の形式である必要がありますが、使用する余裕はありません。そのくらいのスペース)

[ページ番号、バイト番号]、値、コメント

  • [3、0]、0xE1、マジックナンバー
  • [3、1]、0x10、NDEFバージョン番号、メジャーバージョン1、マイナーバージョン0。
  • [3、2]、0x06、タグのユーザーメモリサイズ/8。この場合は6、6 * 8 = 48なので
  • [3、3]、0x00、読み取り/書き込みが許可されています。 0x00 =書き込み許可、0x0F =読み取り専用
  • [4、0]、0x03、TLVのT、タイプ。この場合、NDEFメッセージ。
  • [4、1]、0x2E、TLVのL、長さ。この場合、タグの残りの部分は46バイトです。
  • [4、2]、0xD4、MB_ME_CF_SR_IL_TNFを記録します。この場合、11010100(最初のレコード、最後のレコード、チャンクではなく、ショートメッセージであり、ヘッダーにIDがなく、タイプは「外部タイプ」です)
  • [4、3]、0x03、レコードタイプの長さ。この場合3(タイプ「abc」は3の長さ)
  • [5、0]、0x28、ペイロードの長さ、タグの残りの部分。この場合40。
  • [5、1]、0x61、タイ​​プの最初のバイト、0x61 = 97 = 'a'
  • [5、2]、0x61、タイ​​プの2番目のバイト、0x62 = 98 = 'b'
  • [5、3]、0x61、タイ​​プの3番目のバイト、0x63 = 99 = 'c'

  • タグの残りの40バイト(6〜11ページ)がペイロードです。

電話機がタグを読み取って残りを実行できるようにタグを初期化するだけの場合は、CCを書き込み、LがゼロでVがないTLVのみを書き込みます(4,0 = 0x03および4,1 = 0x00 )。

3
Ryan

同様の問題があり、eBayでNFCタグのパックを購入しましたが、NDEF形式ではありませんでした。WP8はNDEF形式のタグしか利用できないため、形式を設定する方法を見つける必要がありました。 。TwitterでNFC装備Android電話を持っている人を見つけました。彼は私のためにこれらのタグをフォーマットしました。WindowsPhone8でもこれができないのは残念です。

ここで、公式のWPdevユーザーボイスページで低レベルのNFC API機能に投票できます:
低レベルのNFC NDEFフォーマットおよび(ロック解除)タグのAPIを提供

1
Martin Suchan