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 if ((data.begin() + index > data.end()) || (data.begin() + index + payload_length > data.end())) {
48 ESP_LOGE(TAG,
"Corrupt record encountered; NdefMessage constructor aborting");
52 std::vector<uint8_t> payload_data(data.begin() + index, data.begin() + index + payload_length);
54 std::unique_ptr<NdefRecord> record;
58 if (tnf == TNF_WELL_KNOWN && type_str ==
"U") {
59 record = make_unique<NdefRecordUri>(payload_data);
60 }
else if (tnf == TNF_WELL_KNOWN && type_str ==
"T") {
61 record = make_unique<NdefRecordText>(payload_data);
64 record = make_unique<NdefRecord>(payload_data);
66 record->set_type(type_str);
69 record->set_id(id_str);
71 index += payload_length;
73 ESP_LOGV(TAG,
"Adding record type %s = %s", record->get_type().c_str(), record->get_payload().c_str());
82 if (this->
records_.size() >= MAX_NDEF_RECORDS) {
83 ESP_LOGE(TAG,
"Too many records. Max: %d", MAX_NDEF_RECORDS);
86 this->
records_.emplace_back(std::move(record));
93 return this->
add_record(make_unique<NdefRecordText>(encoding, text));
99 std::vector<uint8_t> data;
101 for (
size_t i = 0; i < this->
records_.size(); i++) {
102 auto encoded_record = this->
records_[i]->encode(i == 0, (i + 1) == this->
records_.size());
103 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)