태그 (AS3953 칩 + 마이크로 컨트롤러)와 스마트 폰 (Android 4.1.2를 실행하는 Samsung Galaxy Fame)으로 구성된 NFC 환경을 개발 중입니다.Android NFC writeNdefMessage가 IOException을 발생시킵니다. 태그가 ndef가 아닙니다.
NDEF 메시지를 읽는 동안 태그에 메시지를 쓰는 데 어려움이 있습니다. 대부분의 코드를 http://tapintonfc.blogspot.de/2012/07/the-above-footage-from-our-nfc-workshop.html 에서 복사 한 후 supportedTechs()에서 IsoDep, NfcA 및 Ndef 태그 techlist를 검색하여 ISO14443A 태그 유형 4를 허용하도록 수정했습니다.
public WriteResponse writeTag(NdefMessage message, Tag tag) {
try {
Ndef ndef = Ndef.get(tag);
if (ndef != null) {
Log.d(TAG, "writeTag: tag type: "+ndef.getType());
ndef.connect();
Log.d(TAG, "writeTag: connected!");
if (!ndef.isWritable()) {
return new WriteResponse(0, "Tag is read-only");
}
if (ndef.getMaxSize() < message.toByteArray().length) {
return new WriteResponse(0, "size error");
}
Log.d(TAG, "writeTag: write ndef...");
ndef.writeNdefMessage(message);
Log.d(TAG, "writeTag: wrote ndef!");
if (writeProtect)
ndef.makeReadOnly();
return new WriteResponse(1, "Wrote message to pre-formatted tag.");
} else {
Log.d(TAG, "writeTag: ndef==null!");
return new WriteResponse(0, "writeTag: ndef==null!");
}
} catch (Exception e) {
Log.d(TAG, "writeTag: exception: " + e.toString());
return new WriteResponse(0, "Failed to write tag");
}
}
로그 캣 보여줍니다 : 그들 모두 이후 앱이 writeTag()에 계속 나와 당신이 IOException를 볼 수있는 태그를 말하는 슬로우됩니다
11:08:46.400: onNewIntent 11:08:46.400: supportedTechs: techlist: android.nfc.tech.IsoDep,android.nfc.tech.NfcA,android.nfc.tech.Ndef, 11:08:46.400: supportedTechs: tech is supported! 11:08:46.400: writeTag: tag type: org.nfcforum.ndef.type4 11:08:46.410: writeTag: connected! 11:08:46.410: writeTag: write ndef... 11:08:46.490: writeTag: exception: java.io.IOException: Tag is not ndef
은 아니다 모순 NDEF하는 techlist. 추가로 안드로이드 코드를 살펴보면 writeNdefMessage()는 TagService와 ServiceHandle을 태그에서 가져 오려고합니다. 이것은 예외가 발생하므로 실패 (어떤 메시지가 지금까지 기록되지) :
public void writeNdefMessage(NdefMessage msg) throws IOException, FormatException {
...
INfcTag tagService = mTag.getTagService();
...
int serviceHandle = mTag.getServiceHandle();
if (tagService.isNdef(serviceHandle)) {
...
}
else {
throw new IOException("Tag is not ndef");
}
...
}
그에 대한 해결 방법이 있습니까 또는 태그의 나의 종류의 전혀 가능하다? 태그를 프로그래밍 중이므로 다른쪽에 오류가있을 수도 있지만 은 Java 문제인 것 같습니다.
편집 1 :
내가 어떤 연결을 열었다가 안 그렇게하기 전에 기술에 연결하지 마십시오. ndef.connect() 전에 연결을 열면 IllegalStateException가 발생합니다 : 먼저 다른 기술을 닫으십시오!
ISO14443A Level-4에 AS3953을 구성하여 태그 유형 4 블록 만 마이크로 컨트롤러에 으로 전달합니다. I- 블록 만 처리되지만 다른 명령이 있어도 μC는 로직 분석으로는 그렇지 않은 SPI 포트를 통해 을 읽어야합니다. 내가 ndef 파일을 읽는다고 말했고 나는 그것을 4KB 파일에 대해 으로 테스트했다. 다음 단계를 만들어 로직 분석을 보면 (모두 긍정적 인 9000-코드를 반환) :
(c=command, r=response) (corrected due to renaming mistake) select by name: c: 02 00 a4 04 00 07 d2 76 00 00 85 01 01 00 r: 02 90 00 select by id - select cc file c: 03 00 a4 00 0c 02 e1 03 r: 03 90 00 read 0x0f bytes of cc file c: 02 00 b0 00 00 0f r: 02 00 0f 20 00 3b 00 34 04 06 e1 04 0f ff 00 00 90 00 select by id - select ndef file c: 03 00 a4 00 0c 02 e1 04 r: 03 90 00 read 0x02 bytes (first 2 bytes are apdu-size) c: 02 00 b0 00 00 02 r: 02 0f d3 90 00 read 0x3b bytes (frame size) of first part of ndef file (external type, jpeg image as payload) c: 03 00 b0 00 02 3b r: 03 c4 0c 00 00 0f c1 64 65 2e 74 65 73 74 61 70 70 3a 61 01 ff d8 ff e0 00 10 4a 46 49 46 00 01 01 01 00 60 00 60 00 00 ff db 00 43 00 49 32 36 40 36 2d 49 40 3b 40 52 4d 49 56 6d 90 00 [ndef file] read 0x26 bytes of last part of ndef file c: 03 00 b0 0f ae 27 r: 03 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 FF D9 00 00 90 00
을 내가 NfcAdapter.ACTION_TAG_DISCOVERED 의도를 필터링 활동을 시작 쓰기 같은 응용 프로그램을 사용하여. 링크 된 예제에서와 마찬가지로 휴대폰은 onResume()을 호출하는 태그에 접촉합니다. mNfcAdapter.enableForegroundDispatch (...);
SPI 통신을 로그 할 때 위와 동일한 읽기 절차가 수행됩니다. LogCat 은 작동 의도 디스패처를 보여주기 때문에 IOException에서 앱이 멈추고 연결을 닫은 후 바로 안드로이드가 태그를 다시 발견하여 읽는 것으로 바뀌 었습니다.
편집 2 :
최초의 인터럽트 중 하나에 대한 힌트가 AS3953 자체에 의해 처리되는 선택 해제 명령 문제가있을 수 있습니다 : 그것은 지금 작동
(count * interrupt) 3 * power up 1 * Wake-up IRQ at entry in ACTIVE(*) state 1 * Deselect command 1 * Wake-up IRQ at entry in ACTIVE(*) state 1 * IRQ due to start of receive
Ndef 기술로 연결하기 전에 다른 기술 (NfcA 또는 IsoDep)에 대해 connect()를 실행합니까? –
직접 모드에서 AS3953을 사용 중이며 microcrontroller에서 ISO 14443-4/ISO 7816-4 명령을 처리한다고 가정합니다. NFC Forum Type 4 태그에 필요한 모든 명령을 올바르게 처리하지 못했을 수 있습니까? –
원래 게시물에 몇 가지 정보를 추가했습니다. 직접 모드 란 무엇을 의미합니까? 대부분의 프로토콜 스택 (즉, 최대 ISO14443A-4)은 AS3953 자체에서 수행됩니다. 어떤 명령이 처리되지 않으면 rx 버퍼를 적어도 읽는 SPI 명령이 있어야합니다 – Eric