ESPHome  2024.3.2
nfc.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include "esphome/core/log.h"
4 #include "esphome/core/helpers.h"
5 #include "ndef_record.h"
6 #include "ndef_message.h"
7 #include "nfc_tag.h"
8 
9 #include <vector>
10 
11 namespace esphome {
12 namespace nfc {
13 
14 static const uint8_t MIFARE_CLASSIC_BLOCK_SIZE = 16;
15 static const uint8_t MIFARE_CLASSIC_LONG_TLV_SIZE = 4;
16 static const uint8_t MIFARE_CLASSIC_SHORT_TLV_SIZE = 2;
17 static const uint8_t MIFARE_CLASSIC_BLOCKS_PER_SECT_LOW = 4;
18 static const uint8_t MIFARE_CLASSIC_BLOCKS_PER_SECT_HIGH = 16;
19 static const uint8_t MIFARE_CLASSIC_16BLOCK_SECT_START = 32;
20 
21 static const uint8_t MIFARE_ULTRALIGHT_PAGE_SIZE = 4;
22 static const uint8_t MIFARE_ULTRALIGHT_READ_SIZE = 4;
23 static const uint8_t MIFARE_ULTRALIGHT_DATA_START_PAGE = 4;
24 static const uint8_t MIFARE_ULTRALIGHT_MAX_PAGE = 63;
25 
26 static const uint8_t TAG_TYPE_MIFARE_CLASSIC = 0;
27 static const uint8_t TAG_TYPE_1 = 1;
28 static const uint8_t TAG_TYPE_2 = 2;
29 static const uint8_t TAG_TYPE_3 = 3;
30 static const uint8_t TAG_TYPE_4 = 4;
31 static const uint8_t TAG_TYPE_UNKNOWN = 99;
32 
33 // Mifare Commands
34 static const uint8_t MIFARE_CMD_AUTH_A = 0x60;
35 static const uint8_t MIFARE_CMD_AUTH_B = 0x61;
36 static const uint8_t MIFARE_CMD_HALT = 0x50;
37 static const uint8_t MIFARE_CMD_READ = 0x30;
38 static const uint8_t MIFARE_CMD_WRITE = 0xA0;
39 static const uint8_t MIFARE_CMD_WRITE_ULTRALIGHT = 0xA2;
40 
41 // Mifare Ack/Nak
42 static const uint8_t MIFARE_CMD_ACK = 0x0A;
43 static const uint8_t MIFARE_CMD_NAK_INVALID_XFER_BUFF_VALID = 0x00;
44 static const uint8_t MIFARE_CMD_NAK_CRC_ERROR_XFER_BUFF_VALID = 0x01;
45 static const uint8_t MIFARE_CMD_NAK_INVALID_XFER_BUFF_INVALID = 0x04;
46 static const uint8_t MIFARE_CMD_NAK_CRC_ERROR_XFER_BUFF_INVALID = 0x05;
47 
48 static const char *const MIFARE_CLASSIC = "Mifare Classic";
49 static const char *const NFC_FORUM_TYPE_2 = "NFC Forum Type 2";
50 static const char *const ERROR = "Error";
51 
52 static const uint8_t DEFAULT_KEY[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
53 static const uint8_t NDEF_KEY[6] = {0xD3, 0xF7, 0xD3, 0xF7, 0xD3, 0xF7};
54 static const uint8_t MAD_KEY[6] = {0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5};
55 
56 std::string format_uid(std::vector<uint8_t> &uid);
57 std::string format_bytes(std::vector<uint8_t> &bytes);
58 
59 uint8_t guess_tag_type(uint8_t uid_length);
60 uint8_t get_mifare_classic_ndef_start_index(std::vector<uint8_t> &data);
61 bool decode_mifare_classic_tlv(std::vector<uint8_t> &data, uint32_t &message_length, uint8_t &message_start_index);
62 uint32_t get_mifare_classic_buffer_size(uint32_t message_length);
63 
64 bool mifare_classic_is_first_block(uint8_t block_num);
65 bool mifare_classic_is_trailer_block(uint8_t block_num);
66 
67 uint32_t get_mifare_ultralight_buffer_size(uint32_t message_length);
68 
70  public:
71  virtual void tag_off(NfcTag &tag) {}
72  virtual void tag_on(NfcTag &tag) {}
73 };
74 
75 class Nfcc {
76  public:
77  void register_listener(NfcTagListener *listener) { this->tag_listeners_.push_back(listener); }
78 
79  protected:
80  std::vector<NfcTagListener *> tag_listeners_;
81 };
82 
83 } // namespace nfc
84 } // namespace esphome
std::vector< NfcTagListener * > tag_listeners_
Definition: nfc.h:80
uint32_t get_mifare_classic_buffer_size(uint32_t message_length)
Definition: nfc.cpp:78
bool mifare_classic_is_trailer_block(uint8_t block_num)
Definition: nfc.cpp:99
bool decode_mifare_classic_tlv(std::vector< uint8_t > &data, uint32_t &message_length, uint8_t &message_start_index)
Definition: nfc.cpp:55
uint8_t get_mifare_classic_ndef_start_index(std::vector< uint8_t > &data)
Definition: nfc.cpp:42
std::string format_uid(std::vector< uint8_t > &uid)
Definition: nfc.cpp:10
void register_listener(NfcTagListener *listener)
Definition: nfc.h:77
virtual void tag_off(NfcTag &tag)
Definition: nfc.h:71
uint8_t guess_tag_type(uint8_t uid_length)
Definition: nfc.cpp:34
bool mifare_classic_is_first_block(uint8_t block_num)
Definition: nfc.cpp:91
This is a workaround until we can figure out a way to get the tflite-micro idf component code availab...
Definition: a01nyub.cpp:7
std::vector< uint8_t > bytes
Definition: sml_parser.h:12
virtual void tag_on(NfcTag &tag)
Definition: nfc.h:72
uint32_t get_mifare_ultralight_buffer_size(uint32_t message_length)
Definition: nfc.cpp:71
std::string format_bytes(std::vector< uint8_t > &bytes)
Definition: nfc.cpp:22