こんにちは、
私はPaxデバイスで開発中で、Mifare ULTRALIGHT C(MF0ICU2)を管理したいと考えています。
PaxデバイスはカスタムのPayDroid OSを使用しており、標準的なAndroidではありません。そのため、私はNFCのAndroidライブラリを持っていません。
IPCCをライブラリ経由で公開するNeptuneLiteAPIというものをインストールする必要があります。
まず、命名規則と標準規格について少し混乱しています。APIが話している内容:
通常、Ultralight Cは14443 Type Aですが、このオプションではカードを読み取れず、「M1カード」オプションで読み取れます。M1カードとは何ですか?クラシック1kのことですか?
ドキュメントにはAPDUを使い、この種の呼び出しを実行するコマンドを公開する必要があると書かれています
カードの読み書き(M1機能付き)に成功し、ライブラリはカード対応の互換性モードを使うデフォルトの読み書き方法を公開します
今、認証を設定し、APDUコマンドを使ってチップにコマンドを送ろうとしています。
以下は私が使えるコードの簡略化です
iPicc = getDal().getPicc(piccType);
iPicc.open();
while(){
PiccCardInfo cardInfo = iPicc.detect(EDetectMode.ONLY_M);
if(cardInfo!=null){
//Read : works
byte[] page0=iPicc.m1Read((byte) 0);
// Write : works
iPicc.m1Write((byte)(13),hexStringToByteArray("AAAAAAAA000000000000000000000000"));
}
執筆に関しては3つの方法があります。
もし私の理解が正しければ、Mifare Ultralight CはAPDUを尊重していないのに、APDUしか方法がないということですか?
あるウェブサイトで、「FF」クラスを使うとチップに直接指示を送れるとわかりました。
しかし、どのコマンドを送信すればいいのか分からず、いくつか試してみた。
エラーが発生しています(残念ながら、これらは標準的なものではなく、NeptuneLiteAPiです)。
でも不思議なことに、カードの直前で検出され読み書きに成功しているので、カードはしっかり「コネクテッド」されているのです。
直接命令、APDU命令、CRC計算など、いくつかのコマンドを試しましたが、どれも機能しませんでした。
//byte[] cmd2 = iPicc.isoCommand(cardInfo.getCID(), CryptageUtils.hexStringToByteArray("30")); // PICC#97(unexpected error)
//byte[] cmd2 = iPicc.isoCommand(cardInfo.getCID(), CryptageUtils.hexStringToByteArray("3004")); // PICC#97(unexpected error)
//byte[] cmd2 = iPicc.isoCommand(cardInfo.getCID(), CryptageUtils.hexStringToByteArray("3000")); // PICC#97(unexpected error)
//byte[] cmd2 = iPicc.isoCommand(cardInfo.getCID(), CryptageUtils.hexStringToByteArray("3000A802")); // Avec CRC => No specific card in sensing area, or card is not activated PICC#3(not search card error)
//byte[] cmd2 = iPicc.isoCommand(cardInfo.getCID(), CryptageUtils.hexStringToByteArray("300002A8")); // Avec CRC inversé => No specific card in sensing area, or card is not activated PICC#3(not search card error)
//byte[] cmd2 = iPicc.cmdExchange(CryptageUtils.hexStringToByteArray("3000A802"),17); // Card is not activated. PICC#3(not search card error)
// byte[] cmd2 = iPicc.isoCommand(cardInfo.getCID(), CryptageUtils.hexStringToByteArray("30000000")); // No specific card in sensing area, or card is not activated PICC#3(not search card error)
//byte[] cmd2 = iPicc.isoCommand(cardInfo.getCID(), CryptageUtils.hexStringToByteArray("ff300000")); // No specific card in sensing area, or card is not activated PICC#3(not search card error)
//byte[] cmd2 = iPicc.isoCommand(cardInfo.getCID(), CryptageUtils.hexStringToByteArray("ff30000F")); // No specific card in sensing area, or card is not activated PICC#3(not search card error)
//byte[] cmd2 = iPicc.isoCommand(cardInfo.getCID(), CryptageUtils.hexStringToByteArray("FFCA00000004")); // No specific card in sensing area, or card is not activated PICC#3(not search card error)
//byte[] cmd2 = iPicc.isoCommand(cardInfo.getCID(), CryptageUtils.hexStringToByteArray("3000000004")); // No specific card in sensing area, or card is not activated PICC#3(not search card error)
//byte[] cmd2 = iPicc.isoCommand(cardInfo.getCID(), CryptageUtils.hexStringToByteArray("3001")); // No specific card in sensing area, or card is not activated PICC#3(not search card error)
もしどなたか助けてくれたり、正しい道に導いていただけるなら、本当にありがたいです。
よろしくお願いいたします。
こんにちは@thibaut @Antoine1 @Erableto 、
この問題の解決策は見つかりましたか?私も同じ問題に直面しました。Mifare Ultralight EV1ではカウンターが読み取れません。主にcmdExchangeで試しましたが、NeptuneLiteライブラリの他の方法も試しましたが、PICC#3や#97のようなエラーが必ず出ます。
質問の答えは見つかりましたか?
なぜなら、私たちも同じ問題を抱えているからです。
よろしくお願いします。
こんにちは、ティボー。解決できましたか?私もあなたと同じことをしていますが、Mifare Classic 1kを使っていて、同じ問題を抱えています。私も助けを求めています。
進展があれば随時ご報告します。一緒にやり遂げられるといいな。
よろしくお願いします。