void NdefRecord::print() { Serial.println(F(" NDEF Record")); Serial.print(F(" TNF 0x"));Serial.print(_tnf, HEX);Serial.print(" "); switch (_tnf) { case TNF_EMPTY: Serial.println(F("Empty")); break; case TNF_WELL_KNOWN: Serial.println(F("Well Known")); break; case TNF_MIME_MEDIA: Serial.println(F("Mime Media")); break; case TNF_ABSOLUTE_URI: Serial.println(F("Absolute URI")); break; case TNF_EXTERNAL_TYPE: Serial.println(F("External")); break; case TNF_UNKNOWN: Serial.println(F("Unknown")); break; case TNF_UNCHANGED: Serial.println(F("Unchanged")); break; case TNF_RESERVED: Serial.println(F("Reserved")); break; default: Serial.println(); } Serial.print(F(" Type Length 0x"));Serial.print(_typeLength, HEX);Serial.print(" ");Serial.println(_typeLength); Serial.print(F(" Payload Length 0x"));Serial.print(_payloadLength, HEX);;Serial.print(" ");Serial.println(_payloadLength); if (_idLength) { Serial.print(F(" Id Length 0x"));Serial.println(_idLength, HEX); } Serial.print(F(" Type "));PrintHexChar(_type, _typeLength); // TODO chunk large payloads so this is readable Serial.print(F(" Payload "));PrintHexChar(_payload, _payloadLength); if (_idLength) { Serial.print(F(" Id "));PrintHexChar(_id, _idLength); } Serial.print(F(" Record is "));Serial.print(getEncodedSize());Serial.println(" bytes"); }
// Note if buffer % blockSize != 0, last block will not be written void DumpHex(const byte * data, const long numBytes, const unsigned int blockSize) { int i; for (i = 0; i < (numBytes / blockSize); i++) { PrintHexChar(data, blockSize); data += blockSize; } }
NdefMessage::NdefMessage(const byte * data, const int numBytes) { #ifdef NDEF_DEBUG Serial.print(F("Decoding "));Serial.print(numBytes);Serial.println(F(" bytes")); PrintHexChar(data, numBytes); //DumpHex(data, numBytes, 16); #endif _recordCount = 0; int index = 0; while (index <= numBytes) { // decode tnf - first byte is tnf with bit flags // see the NFDEF spec for more info byte tnf_byte = data[index]; bool mb = (tnf_byte & 0x80) != 0; bool me = (tnf_byte & 0x40) != 0; bool cf = (tnf_byte & 0x20) != 0; bool sr = (tnf_byte & 0x10) != 0; bool il = (tnf_byte & 0x8) != 0; byte tnf = (tnf_byte & 0x7); NdefRecord record = NdefRecord(); record.setTnf(tnf); index++; int typeLength = data[index]; int payloadLength = 0; if (sr) { index++; payloadLength = data[index]; } else { payloadLength = ((0xFF & data[++index]) << 24) | ((0xFF & data[++index]) << 16) | ((0xFF & data[++index]) << 8) | (0xFF & data[++index]); } int idLength = 0; if (il) { index++; idLength = data[index]; } index++; record.setType(&data[index], typeLength); index += typeLength; if (il) { record.setId(&data[index], idLength); index += idLength; } record.setPayload(&data[index], payloadLength); index += payloadLength; addRecord(record); if (me) break; // last message } }