2014-04-14 2 views
6

태그 (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 
+0

Ndef 기술로 연결하기 전에 다른 기술 (NfcA 또는 IsoDep)에 대해 connect()를 실행합니까? –

+0

직접 모드에서 AS3953을 사용 중이며 microcrontroller에서 ISO 14443-4/ISO 7816-4 명령을 처리한다고 가정합니다. NFC Forum Type 4 태그에 필요한 모든 명령을 올바르게 처리하지 못했을 수 있습니까? –

+0

원래 게시물에 몇 가지 정보를 추가했습니다. 직접 모드 란 무엇을 의미합니까? 대부분의 프로토콜 스택 (즉, 최대 ISO14443A-4)은 AS3953 자체에서 수행됩니다. 어떤 명령이 처리되지 않으면 rx 버퍼를 적어도 읽는 SPI 명령이 있어야합니다 – Eric

답변

3

합니다. 구성 단어 을 검사하고 설정하는 시작 루틴이 AS3953에 대해 너무 높은 전송 속도로 전송되었다는 것을 알았습니다. 이것은 읽기에 효과가 있었지만 태그에 쓰기 위해 이 섞여 있어야합니다.

이것이 유일한 이유가 확실하지 않은 경우 확실하게 알 수 없습니다. 또한 waterlight 인터럽트가 너무 늦게 처리되는 것처럼 32Byte FIFO의 느린 읽기와 함께 문제가 있습니다. 로직 분석 및 예외에서 쓰기 명령을 찾을 수 없으므로 간단히 이 안드로이드 측에있을 것으로 예상했습니다 충분히 이유를 설명하지 않았다. 그래서 빈 NDEF 메시지를 읽는 해결 방법이 있어야한다 - 태그가 내가 쓸하려는 경우 처음에 읽을 되나 아니라 왜

덕분에, 나는 아직도 unterstand 더 디버깅을위한 마이클 롤랜드에 많이하지 않습니다 쓰기 과정이 빨리 완료됩니다.

지금은 펌웨어에서 작업해야하며 더 이상 문제를 예측할 수는 없지만 실제 문제 (ndef.writeNdefMessage())가 성공적으로 반환됩니다.

관련 문제