SPSP
Simple publish-subscribe protocol. Connects low power IoT clients to MQTT.
All Classes Files Functions Variables Typedefs Enumerations
espnow_packet_ieee80211.hpp
Go to the documentation of this file.
1 
10 #pragma once
11 
12 #include <cstdint>
13 
14 #include "spsp/espnow.hpp"
15 #include "spsp/espnow_packet.hpp"
16 
17 namespace SPSP::LocalLayers::ESPNOW::IEEE80211
18 {
19  static constexpr uint8_t FRAME_TYPE_ACTION = 0xD0;
20 
22  using RadiotapTSFT = uint64_t;
23  using RadiotapFlags = uint8_t;
24  using RadiotapRate = uint8_t;
25  struct RadiotapChannel { uint16_t freq; uint16_t flags; };
26  using RadiotapFHSS = uint16_t;
27  using RadiotapAntSignal = int8_t;
28  using RadiotapExtention = uint32_t;
29 
35  enum RadiotapPresentFlags : uint32_t
36  {
37  RADIOTAP_PRESENT_TSFT = (uint32_t) 1 << 0,
38  RADIOTAP_PRESENT_FLAGS = (uint32_t) 1 << 1,
39  RADIOTAP_PRESENT_RATE = (uint32_t) 1 << 2,
40  RADIOTAP_PRESENT_CHANNEL = (uint32_t) 1 << 3,
41  RADIOTAP_PRESENT_FHSS = (uint32_t) 1 << 4,
42  RADIOTAP_PRESENT_ANT_SIGNAL = (uint32_t) 1 << 5,
43  RADIOTAP_PRESENT_EXT = (uint32_t) 1 << 31,
44  };
45 
50  {
51  uint16_t len = 0;
52  uint16_t freq = 0;
53  int rssi = SIGNAL_MIN;
54  };
55 
56  #pragma pack(push, 1)
57 
62  {
63  uint8_t elementID = 221;
64  uint8_t len;
65  uint8_t oui[3] = {0x18, 0xFE, 0x34};
66  uint8_t type = 0x04;
67  uint8_t version = 0x01;
68  uint8_t payload[];
69 
75  void setPayloadLen(uint8_t payloadLen) { len = payloadLen + 5; }
76 
82  uint8_t getPayloadLen() const { return len - 5; }
83  };
84 
89  struct ActionFrame
90  {
91  uint8_t type = FRAME_TYPE_ACTION;
92  uint8_t flags = 0x00;
93  uint16_t dur = 0x0000;
94  uint8_t dst[6];
95  uint8_t src[6];
96  uint8_t bssid[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
97  uint16_t seq = 0x0000; // Recalculated in hardware
98  uint8_t cat = 0x7F;
99  uint8_t oui[3] = {0x18, 0xFE, 0x34};
100  uint8_t random[4];
101  VendorSpecificContent content;
102  };
103 
109  {
110  uint8_t type;
111  uint8_t flags;
112  uint16_t dur;
113  uint8_t addr1[6];
114  };
115 
120  struct Radiotap
121  {
122  uint8_t version = 0x00;
123  uint8_t pad = 0x00;
124  uint16_t len = sizeof(Radiotap);
125  uint32_t present = 0x00000000;
126  };
127 
133  struct TXRadiotap
134  {
135  Radiotap base = {
136  .len = sizeof(TXRadiotap),
137  .present = 0x00000004,
138  };
139  uint8_t datarate = 0x02; // TODO: make configurable
140  };
141 
147  {
148  TXRadiotap radiotap;
149  ActionFrame action;
150  };
151  #pragma pack(pop)
152 
155  static constexpr size_t MAX_PACKET_SIZE = 512;
156 } // namespace SPSP::LocalLayers::ESPNOW::IEEE80211
SPSP::LocalLayers::ESPNOW::IEEE80211::RadiotapTSFT
uint64_t RadiotapTSFT
Length of radiotap fields.
Definition: espnow_packet_ieee80211.hpp:22
espnow_packet.hpp
ESP-NOW packet structures.
SPSP::LocalLayers::ESPNOW::IEEE80211::RadiotapChannel
Definition: espnow_packet_ieee80211.hpp:25
SPSP::LocalLayers::ESPNOW::IEEE80211::ActionFrameWithRadiotap
Whole packet structure of ESP-NOW over radiotap.
Definition: espnow_packet_ieee80211.hpp:146
SPSP::LocalLayers::ESPNOW::IEEE80211::VendorSpecificContent::getPayloadLen
uint8_t getPayloadLen() const
Calculates actual payload length.
Definition: espnow_packet_ieee80211.hpp:82
SPSP::LocalLayers::ESPNOW::IEEE80211::Radiotap
Radiotap header.
Definition: espnow_packet_ieee80211.hpp:120
SPSP::LocalLayers::ESPNOW::IEEE80211::VendorSpecificContent::setPayloadLen
void setPayloadLen(uint8_t payloadLen)
Calculates correct len based on actual payload length.
Definition: espnow_packet_ieee80211.hpp:75
SPSP::LocalLayers::ESPNOW::IEEE80211::VendorSpecificContent
Vendor specific content of ESP-NOW.
Definition: espnow_packet_ieee80211.hpp:61
espnow.hpp
ESP-NOW local layer for SPSP.
SPSP::LocalLayers::ESPNOW::IEEE80211::ActionFrame
Action frame with vendor specific content.
Definition: espnow_packet_ieee80211.hpp:89
SPSP::LocalLayers::ESPNOW::IEEE80211::TXRadiotap
Transmit radiotap header.
Definition: espnow_packet_ieee80211.hpp:133
SPSP::LocalLayers::ESPNOW::IEEE80211::RadiotapParsedFields
Parsed fields from radiotap header.
Definition: espnow_packet_ieee80211.hpp:49
SPSP::LocalLayers::ESPNOW::IEEE80211::GenericFrame
Generic frame.
Definition: espnow_packet_ieee80211.hpp:108
SPSP::LocalLayers::ESPNOW::IEEE80211::RadiotapPresentFlags
RadiotapPresentFlags
Enumeration of parsed present field flags.
Definition: espnow_packet_ieee80211.hpp:35