9 static const char *
const TAG =
"pn532.mifare_ultralight";
13 ESP_LOGD(TAG,
"Not NDEF formatted");
14 return make_unique<nfc::NfcTag>(uid, nfc::NFC_FORUM_TYPE_2);
17 uint8_t message_length;
18 uint8_t message_start_index;
20 return make_unique<nfc::NfcTag>(uid, nfc::NFC_FORUM_TYPE_2);
22 ESP_LOGVV(TAG,
"message length: %d, start: %d", message_length, message_start_index);
24 if (message_length == 0) {
25 return make_unique<nfc::NfcTag>(uid, nfc::NFC_FORUM_TYPE_2);
27 std::vector<uint8_t> data;
28 for (uint8_t page = nfc::MIFARE_ULTRALIGHT_DATA_START_PAGE; page < nfc::MIFARE_ULTRALIGHT_MAX_PAGE; page++) {
29 std::vector<uint8_t> page_data;
31 ESP_LOGE(TAG,
"Error reading page %d", page);
32 return make_unique<nfc::NfcTag>(uid, nfc::NFC_FORUM_TYPE_2);
34 data.insert(data.end(), page_data.begin(), page_data.end());
36 if (data.size() >= (message_length + message_start_index))
40 data.erase(data.begin(), data.begin() + message_start_index);
41 data.erase(data.begin() + message_length, data.end());
43 return make_unique<nfc::NfcTag>(uid, nfc::NFC_FORUM_TYPE_2, data);
48 PN532_COMMAND_INDATAEXCHANGE,
56 if (!this->
read_response(PN532_COMMAND_INDATAEXCHANGE, data) || data[0] != 0x00) {
59 data.erase(data.begin());
61 data.erase(data.begin() + 4, data.end());
63 ESP_LOGVV(TAG,
"Pages %d-%d: %s", page_num, page_num + 4,
nfc::format_bytes(data).c_str());
69 std::vector<uint8_t> data;
71 return !(data[0] == 0xFF && data[1] == 0xFF && data[2] == 0xFF && data[3] == 0xFF);
77 std::vector<uint8_t> data;
85 std::vector<uint8_t> data;
86 for (
int page = 4; page < 6; page++) {
87 std::vector<uint8_t> page_data;
91 data.insert(data.end(), page_data.begin(), page_data.end());
93 if (data[0] == 0x03) {
94 message_length = data[1];
95 message_start_index = 2;
97 }
else if (data[5] == 0x03) {
98 message_length = data[6];
99 message_start_index = 7;
108 auto encoded = message->
encode();
110 uint32_t message_length = encoded.size();
113 if (buffer_length > capacity) {
114 ESP_LOGE(TAG,
"Message length exceeds tag capacity %d > %d", buffer_length, capacity);
118 encoded.insert(encoded.begin(), 0x03);
119 if (message_length < 255) {
120 encoded.insert(encoded.begin() + 1, message_length);
122 encoded.insert(encoded.begin() + 1, 0xFF);
123 encoded.insert(encoded.begin() + 2, (message_length >> 8) & 0xFF);
124 encoded.insert(encoded.begin() + 2, message_length & 0xFF);
126 encoded.push_back(0xFE);
128 encoded.resize(buffer_length, 0);
131 uint8_t current_page = nfc::MIFARE_ULTRALIGHT_DATA_START_PAGE;
133 while (index < buffer_length) {
134 std::vector<uint8_t> data(encoded.begin() + index, encoded.begin() + index + nfc::MIFARE_ULTRALIGHT_PAGE_SIZE);
138 index += nfc::MIFARE_ULTRALIGHT_PAGE_SIZE;
146 uint8_t pages = (capacity / nfc::MIFARE_ULTRALIGHT_PAGE_SIZE) + nfc::MIFARE_ULTRALIGHT_DATA_START_PAGE;
148 std::vector<uint8_t> blank_data = {0x00, 0x00, 0x00, 0x00};
150 for (
int i = nfc::MIFARE_ULTRALIGHT_DATA_START_PAGE; i < pages; i++) {
159 std::vector<uint8_t> data({
160 PN532_COMMAND_INDATAEXCHANGE,
162 nfc::MIFARE_CMD_WRITE_ULTRALIGHT,
165 data.insert(data.end(), write_data.begin(), write_data.end());
167 ESP_LOGE(TAG,
"Error writing page %d", page_num);
171 std::vector<uint8_t> response;
172 if (!this->
read_response(PN532_COMMAND_INDATAEXCHANGE, response)) {
173 ESP_LOGE(TAG,
"Error writing page %d", page_num);
virtual bool write_data(const std::vector< uint8_t > &data)=0
virtual bool read_response(uint8_t command, std::vector< uint8_t > &data)=0
bool read_mifare_ultralight_page_(uint8_t page_num, std::vector< uint8_t > &data)
bool find_mifare_ultralight_ndef_(uint8_t &message_length, uint8_t &message_start_index)
bool clean_mifare_ultralight_()
std::unique_ptr< nfc::NfcTag > read_mifare_ultralight_tag_(std::vector< uint8_t > &uid)
bool is_mifare_ultralight_formatted_()
std::vector< uint8_t > encode()
bool write_mifare_ultralight_page_(uint8_t page_num, std::vector< uint8_t > &write_data)
bool write_mifare_ultralight_tag_(std::vector< uint8_t > &uid, nfc::NdefMessage *message)
uint32_t get_mifare_ultralight_buffer_size(uint32_t message_length)
bool write_command_(const std::vector< uint8_t > &data)
uint16_t read_mifare_ultralight_capacity_()
std::string format_bytes(std::vector< uint8_t > &bytes)