12 std::vector<uint8_t> data;
16 return make_unique<nfc::NfcTag>(uid, nfc::NFC_FORUM_TYPE_2);
20 ESP_LOGW(TAG,
"Not NDEF formatted");
21 return make_unique<nfc::NfcTag>(uid, nfc::NFC_FORUM_TYPE_2);
24 uint8_t message_length;
25 uint8_t message_start_index;
27 ESP_LOGW(TAG,
"Couldn't find NDEF message");
28 return make_unique<nfc::NfcTag>(uid, nfc::NFC_FORUM_TYPE_2);
30 ESP_LOGVV(TAG,
"NDEF message length: %u, start: %u", message_length, message_start_index);
32 if (message_length == 0) {
33 return make_unique<nfc::NfcTag>(uid, nfc::NFC_FORUM_TYPE_2);
36 const uint8_t read_length = message_length + message_start_index > 12 ? message_length + message_start_index - 12 : 0;
39 ESP_LOGE(TAG,
"Error reading tag data");
40 return make_unique<nfc::NfcTag>(uid, nfc::NFC_FORUM_TYPE_2);
44 data.erase(data.begin(), data.begin() + message_start_index + nfc::MIFARE_ULTRALIGHT_PAGE_SIZE);
46 return make_unique<nfc::NfcTag>(uid, nfc::NFC_FORUM_TYPE_2, data);
50 const uint8_t read_increment = nfc::MIFARE_ULTRALIGHT_READ_SIZE * nfc::MIFARE_ULTRALIGHT_PAGE_SIZE;
51 std::vector<uint8_t> response;
53 for (uint8_t i = 0; i * read_increment < num_bytes; i++) {
55 PN532_COMMAND_INDATAEXCHANGE,
58 uint8_t(i * nfc::MIFARE_ULTRALIGHT_READ_SIZE + start_page),
63 if (!this->
read_response(PN532_COMMAND_INDATAEXCHANGE, response) || response[0] != 0x00) {
66 uint16_t bytes_offset = (i + 1) * read_increment;
67 auto pages_in_end_itr = bytes_offset <= num_bytes ? response.end() : response.end() - (bytes_offset - num_bytes);
69 if ((pages_in_end_itr > response.begin()) && (pages_in_end_itr <= response.end())) {
70 data.insert(data.end(), response.begin() + 1, pages_in_end_itr);
74 char data_buf[nfc::FORMAT_BYTES_BUFFER_SIZE];
81 const uint8_t p4_offset = nfc::MIFARE_ULTRALIGHT_PAGE_SIZE;
83 return (page_3_to_6.size() > p4_offset + 3) &&
84 ((page_3_to_6[p4_offset + 0] != 0xFF) || (page_3_to_6[p4_offset + 1] != 0xFF) ||
85 (page_3_to_6[p4_offset + 2] != 0xFF) || (page_3_to_6[p4_offset + 3] != 0xFF));
98 uint8_t &message_start_index) {
99 const uint8_t p4_offset = nfc::MIFARE_ULTRALIGHT_PAGE_SIZE;
101 if (!(page_3_to_6.size() > p4_offset + 5)) {
105 if (page_3_to_6[p4_offset + 0] == 0x03) {
106 message_length = page_3_to_6[p4_offset + 1];
107 message_start_index = 2;
109 }
else if (page_3_to_6[p4_offset + 5] == 0x03) {
110 message_length = page_3_to_6[p4_offset + 6];
111 message_start_index = 7;
120 auto encoded =
message->encode();
122 uint32_t message_length = encoded.size();
125 if (buffer_length > capacity) {
126 ESP_LOGE(TAG,
"Message length exceeds tag capacity %" PRIu32
" > %" PRIu32, buffer_length, capacity);
130 encoded.insert(encoded.begin(), 0x03);
131 if (message_length < 255) {
132 encoded.insert(encoded.begin() + 1, message_length);
134 encoded.insert(encoded.begin() + 1, 0xFF);
135 encoded.insert(encoded.begin() + 2, (message_length >> 8) & 0xFF);
136 encoded.insert(encoded.begin() + 2, message_length & 0xFF);
138 encoded.push_back(0xFE);
140 encoded.resize(buffer_length, 0);
143 uint8_t current_page = nfc::MIFARE_ULTRALIGHT_DATA_START_PAGE;
145 while (index < buffer_length) {
146 std::vector<uint8_t> data(encoded.begin() + index, encoded.begin() + index + nfc::MIFARE_ULTRALIGHT_PAGE_SIZE);
150 index += nfc::MIFARE_ULTRALIGHT_PAGE_SIZE;
171 std::vector<uint8_t> data({
172 PN532_COMMAND_INDATAEXCHANGE,
174 nfc::MIFARE_CMD_WRITE_ULTRALIGHT,
179 ESP_LOGE(TAG,
"Error writing page %u", page_num);
183 std::vector<uint8_t> response;
184 if (!this->
read_response(PN532_COMMAND_INDATAEXCHANGE, response)) {
185 ESP_LOGE(TAG,
"Error writing page %u", page_num);
char * format_bytes_to(char *buffer, std::span< const uint8_t > bytes)
Format bytes to buffer with ' ' separator (e.g., "04 11 22 33"). Returns buffer for inline use.