2014-04-14 15 views
6

Tôi đang phát triển môi trường NFC bao gồm thẻ (chip vi điều khiển AS3953) và điện thoại thông minh (Samsung Galaxy Fame runnung Android 4.1.2).Android NFC writeNdefMessage ném Thẻ IOException không phải là ndef

Khi đọc tin nhắn NDEF hoạt động, tôi bị kẹt khi viết tin nhắn vào thẻ. Tôi đã sao chép hầu hết mã từ http://tapintonfc.blogspot.de/2012/07/the-above-footage-from-our-nfc-workshop.html và sửa đổi nó để chấp nhận ISO14443A Loại thẻ 4 bằng cách tìm kiếm danh sách công nghệ thẻ cho IsoDep, NfcA và Ndef trong supportedTechs(). Vì tất cả trong số họ được liệt kê các ứng dụng tiếp tục writeTag():

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"); 
} 
} 

LogCat cho thấy:

 
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 

Như bạn có thể thấy một IOException được ném nói rằng thẻ không phải là NDEF điều này mâu thuẫn sự danh sách công nghệ. Nhìn xa hơn vào mã android writeNdefMessage() cố gắng lấy một TagService và ServiceHandle từ thẻ để khớp chúng. Điều này không nên ngoại lệ được ném (không có thông báo bằng văn bản cho đến nay):

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"); 
} 
... 
} 

Có một cách giải quyết cho rằng hoặc là nó không thể thực hiện ở tất cả với loại của tôi về thẻ? Vì tôi cũng đang lập trình thẻ, lỗi này có thể ở phía bên kia, nhưng nó có vẻ là một vấn đề Java.


Sửa 1:

Tôi không kết nối với công nghệ nào trước vì vậy không nên có bất kỳ kết nối mở. Nếu Tôi mở kết nối trước khi ndef.connect() có IllegalStateException: Đóng công nghệ khác trước!

Tôi đã định cấu hình AS3953 thành ISO14443A Cấp-4 để chỉ các Loại thẻ 4 khối được chuyển tiếp tới bộ vi điều khiển. Chỉ có I-Blocks được xử lý nhưng ngay cả khi có các lệnh khác, µC phải đọc nó ra qua cổng SPI không phải là trường hợp bằng phân tích logic. Như tôi đã nói đọc tập tin ndef hoạt động và tôi đã thử nghiệm nó cho tệp 4KB. Nhìn vào việc phân tích logic bước sau được thực hiện (tất cả trả lại một dương 9000-code):

 
(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 

Sử dụng cùng một ứng dụng cho các văn bản tôi bắt đầu hoạt động để lọc intents NfcAdapter.ACTION_TAG_DISCOVERED. Giống như trong ví dụ được liên kết, điện thoại chạm vào thẻ gọi onResume() làm mNfcAdapter.enableForegroundDispatch (...);

Khi tôi ghi nhật ký SPI, quy trình đọc giống như trên đã được thực hiện. Kể từ khi LogCat cho thấy một người điều phối ý định làm việc, tôi đoán ứng dụng dừng tại IOException, đóng kết nối và ngay lập tức đi qua để đọc ra khi android tìm thấy thẻ một lần nữa.


Chỉnh sửa 2:

Có thể có một gợi ý là một trong những ngắt đầu tiên ban hành một lệnh Deselect đó được xử lý bởi bản thân 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

Bạn có đưa ra kết nối() cho bất kỳ công nghệ nào khác (NfcA hoặc IsoDep) trước khi kết nối với công nghệ Ndef không? –

+0

Tôi cho rằng bạn đang sử dụng AS3953 ở chế độ trực tiếp và bạn xử lý các lệnh ISO 14443-4/ISO 7816-4 trên vi điều khiển. Nó có thể được rằng bạn không đúng cách xử lý tất cả các lệnh cần thiết cho một thẻ NFC Forum Type 4? –

+0

Tôi đã thêm một số thông tin trong bài đăng gốc. Bạn có ý nghĩa gì bởi chế độ trực tiếp? Hầu hết các giao thức stack (cụ thể là lên đến ISO14443A-4) được thực hiện bởi chính AS3953. Nếu bất kỳ lệnh nào không được xử lý thì phải có một lệnh SPI đọc bộ đệm rx ít nhất – Eric

Trả lời

3

Nó hoạt động ngay bây giờ. Tôi đã tìm ra rằng một thói quen khởi động kiểm tra và thiết lập từ cấu hình được truyền với tốc độ truyền quá cao đối với AS3953. Điều này làm việc để đọc nhưng một cái gì đó phải được trộn lẫn để ghi vào thẻ.

Tôi không thể chắc chắn nếu đây là lý do duy nhất khiến nó không hoạt động. Ngoài ra còn có một vấn đề với đọc chậm của 32Byte FIFO như ngắt mạch nước được xử lý quá muộn - Tôi chỉ đơn giản là mong đợi vấn đề được ở phía android vì tôi không thể tìm thấy lệnh viết trong phân tích logic và ngoại lệ không mô tả lý do đủ.

Cảm ơn rất nhiều về Michael Roland để gỡ lỗi thêm, tôi vẫn không hiểu tại sao thẻ là đọc lúc đầu nếu tôi muốn viết thư nhưng cũng phải có cách giải quyết thông báo trống rỗng quá trình viết sẽ được thực hiện nhanh chóng.

Hiện tại tôi phải làm việc trên chương trình cơ sở và không thể dự báo thêm bất kỳ sự cố nào nhưng vấn đề thực tế (ndef.writeNdefMessage()) trả về thành công.

Các vấn đề liên quan