質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
NFC

無線通信

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

Q&A

解決済

1回答

1921閲覧

SubscribeForMessage() が呼び出されません

pectin

総合スコア95

NFC

無線通信

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

0グッド

0クリップ

投稿2017/05/07 21:00

編集2017/05/09 09:21

###SubscribeForMessage()が呼ばれず、データの読み取りができません
文字列が書かれたカードをもらったのですが、中身に書かれたデータの読み出しができない状態で困っています。

現状は、
DeviceArrived() と DeviceDeparted() イベントは呼び出されるので、
カードをタッチしたか、離したかは動作しているようです。

書かれたデータを読み取るには、
SubscribeForMessage()
を使えばよいと思っていますが、このイベントがいつまでたっても呼び出されません。
第一引数に messageType を指定しますが、ここに何を指定してよいのかもわからない状態です。

任意のデータを読み取る方法を教えてください。
SubscribeForMessage() を使うこと自体が間違っている場合は、他の方法を教えてください。
(ProximityDevice ではなく、他の API やライブラリを使うなど...)

また、不足している情報がありましたら、その旨をお申し付けいただければと思います。

NFC の実装自体が初めてですので理解不足の点があると思いますが、ご存知の方がいらっしゃいましたら、教えていただけると助かります。

よろしくお願いします。

###該当のソースコード

public partial class MainWindow : Window { ProximityDevice _device; public MainWindow() { InitializeComponent(); _device = ProximityDevice.GetDefault(); if (_device != null) { _device.DeviceArrived += ProximityDeviceArrived; _device.DeviceDeparted += ProximityDeviceDeparted; this._device.SubscribeForMessage("NDEF", messageReceived); } } private void ProximityDeviceDeparted(ProximityDevice sender) { // ここは呼び出されます System.Diagnostics.Debug.WriteLine("ProximityDeviceDeparted"); } private void ProximityDeviceArrived(ProximityDevice sender) { // ここは呼び出されます System.Diagnostics.Debug.WriteLine("ProximityDeviceArrived"); } private void messageReceived(Windows.Networking.Proximity.ProximityDevice device, Windows.Networking.Proximity.ProximityMessage message) { // ここが呼び出されません System.Diagnostics.Debug.WriteLine(message.DataAsString); } }

###開発環境
VisualStudio 2017 community
C#
Windows8.1 向け WPF アプリケーション
(WindowsAPI が使えるように Windows.winmd と System.Runtime.WindowsRuntime は参照できるようにしてあります)

カードの形式は MIFARE です(借り物なので問い合わせて得られた情報ですが...)

動作端末のスペックは
SO/IEC 14443A, ISO/IEC 14443B PCD 106 kbps to 848 kbps
ISO/IEC 14443A, ISO/IEC 14443B PICC 106 kbps to 424 kbps
ISO/IEC 15693/ICODE reader
NFC-IP1 and NFC-IP2 protocols, 106 kbps to 424 kbps
MIFARE reader encryption mechanism
NFC Forum Types 1-4 card reader
MIFARE and Felica
です。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

aquaS

2017/05/08 22:40

ProximityDevice でググると色々実装例が出てくるようですが、どれも駄目でした?
pectin

2017/05/09 09:13 編集

ありがとうございます。 http://plainspoken8.rssing.com/chan-5534506/all_p3.html http://blog.kassyi.com/2015/08/android-beam-in-windows10.html などを参考にして見たのですがダメでした。 カードを貸してくれた会社に詳細を問い合わせたところ、Mifare 形式だと言われましたが、ubscribeForMessage() のパラメータを変えることで読み出せるものなのでしょうか? タブレット端末のスペックには SO/IEC 14443A, ISO/IEC 14443B PCD 106 kbps to 848 kbps ISO/IEC 14443A, ISO/IEC 14443B PICC 106 kbps to 424 kbps ISO/IEC 15693/ICODE reader NFC-IP1 and NFC-IP2 protocols, 106 kbps to 424 kbps MIFARE reader encryption mechanism NFC Forum Types 1-4 card reader MIFARE and Felica とありましたので、内蔵リーダは対応してそうです。 こちらの情報で何か教えていただける事があれば教えていただけませんでしょうか?
aquaS

2017/05/09 13:36

引用されている最初のページでは、messageTypeに "NDEF:MIME.text/plain" を設定しているようですが、試されてますよね。
pectin

2017/05/09 19:48

はい、NDEF:MIME.text/plain も試して見ましたが同じく呼ばれることはありませんでした。カードも端末も支給品なのですが、念のために端末内蔵のリーダがそのカードに対応しているかを確認して見ます。
guest

回答1

0

自己解決

結果を記載します。
問い合わせて判明したことは、

  • カードに書き込まれている内容は NDEF フォーマットではなかった
  • winscard.dll を使うことで読み出すことができているようです

(正確には先方から読み出し用の .dll が提供されました)

  • NDEF フォーマット以外では ProximityDevice.GetDefault() は呼ばれない可能性がある

(https://hiro99ma.blogspot.jp/2012/12/nfpnfpndef.html)

とのことで、先方から必要な情報が提供されなかったことが主の原因でした。

提供された .dll の中身を見ると SCardDisconnect などの文字列が見つかったため winscard.dll を使っていると判断しました。

ProximityDevice 系が NDEF フォーマット以外で使えないようですが、検索して見ると情報量としては圧倒的に winscard.dll が多かったので、NFC 関連の実装は winscard.dll を使うのが主流かどうかは気になるところです。

もし同じようなことで困った人の目に止まった際に参考になれば幸いです。

最後に気にかけていただいた aquaS さん、ありがとうございました。
(システム上、ベストアンサーや高評価がつけられないようです。すみません)

投稿2017/05/10 04:19

編集2017/05/10 04:21
pectin

総合スコア95

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

aquaS

2017/05/10 13:07

良かったです
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問