6 static const char *
const TAG =
"nfc.ndef_message";
9 ESP_LOGV(TAG,
"Building NdefMessage with %zu bytes", data.size());
11 while (index <= data.size()) {
12 uint8_t tnf_byte = data[index++];
13 bool me = tnf_byte & 0x40;
14 bool sr = tnf_byte & 0x10;
15 bool il = tnf_byte & 0x08;
16 uint8_t tnf = tnf_byte & 0x07;
18 ESP_LOGVV(TAG,
"me=%s, sr=%s, il=%s, tnf=%d", YESNO(me), YESNO(sr), YESNO(il), tnf);
20 uint8_t type_length = data[index++];
21 uint32_t payload_length = 0;
23 payload_length = data[index++];
25 payload_length = (
static_cast<uint32_t
>(data[index]) << 24) | (
static_cast<uint32_t
>(data[index + 1]) << 16) |
26 (
static_cast<uint32_t
>(data[index + 2]) << 8) |
static_cast<uint32_t
>(data[index + 3]);
30 uint8_t id_length = 0;
32 id_length = data[index++];
35 ESP_LOGVV(TAG,
"Lengths: type=%d, payload=%d, id=%d", type_length, payload_length, id_length);
37 std::string type_str(data.begin() + index, data.begin() + index + type_length);
41 std::string id_str =
"";
43 id_str = std::string(data.begin() + index, data.begin() + index + id_length);
47 std::vector<uint8_t> payload_data(data.begin() + index, data.begin() + index + payload_length);
49 std::unique_ptr<NdefRecord> record;
53 if (tnf == TNF_WELL_KNOWN && type_str ==
"U") {
54 record = make_unique<NdefRecordUri>(payload_data);
55 }
else if (tnf == TNF_WELL_KNOWN && type_str ==
"T") {
56 record = make_unique<NdefRecordText>(payload_data);
59 record = make_unique<NdefRecord>(payload_data);
61 record->set_type(type_str);
64 record->set_id(id_str);
66 index += payload_length;
68 ESP_LOGV(TAG,
"Adding record type %s = %s", record->get_type().c_str(), record->get_payload().c_str());
77 if (this->
records_.size() >= MAX_NDEF_RECORDS) {
78 ESP_LOGE(TAG,
"Too many records. Max: %d", MAX_NDEF_RECORDS);
81 this->
records_.emplace_back(std::move(record));
88 return this->
add_record(make_unique<NdefRecordText>(encoding, text));
94 std::vector<uint8_t> data;
96 for (
size_t i = 0; i < this->
records_.size(); i++) {
97 auto encoded_record = this->
records_[i]->encode(i == 0, (i + 1) == this->
records_.size());
98 data.insert(data.end(), encoded_record.begin(), encoded_record.end());
bool add_text_record(const std::string &text)
bool add_record(std::unique_ptr< NdefRecord > record)
std::vector< std::shared_ptr< NdefRecord > > records_
std::vector< uint8_t > encode()
bool add_uri_record(const std::string &uri)