SPSP
Simple publish-subscribe protocol. Connects low power IoT clients to MQTT.
All Classes Files Functions Variables Typedefs Enumerations
linux/spsp/espnow_adapter.hpp
Go to the documentation of this file.
1 
10 #pragma once
11 
12 #include <functional>
13 #include <string>
14 #include <thread>
15 
16 #include "spsp/espnow_adapter_if.hpp"
18 #include "spsp/espnow_types.hpp"
19 
20 namespace SPSP::LocalLayers::ESPNOW
21 {
29  class Adapter : public IAdapter
30  {
31  protected:
37  struct RawSocket
38  {
39  int fd;
40  RawSocket();
41  ~RawSocket();
42  };
43 
49  struct EventFD
50  {
51  int fd;
52  EventFD();
53  ~EventFD();
54  };
55 
58  int m_epollFd;
60  AdapterRecvCb m_recvCb = nullptr;
61  AdapterSendCb m_sendCb = nullptr;
62  std::thread m_thread;
63 
64  public:
74  Adapter(const std::string& ifname);
75 
80  ~Adapter();
81 
89  void setRecvCb(AdapterRecvCb cb) noexcept { m_recvCb = cb; }
90 
96  AdapterRecvCb getRecvCb() const noexcept { return m_recvCb; }
97 
103  void setSendCb(AdapterSendCb cb) noexcept { m_sendCb = cb; }
104 
110  AdapterSendCb getSendCb() const noexcept { return m_sendCb; }
111 
122  void send(const LocalAddrT& dst, const std::string& data);
123 
131  void addPeer(const LocalAddrT& peer) {}
132 
140  void removePeer(const LocalAddrT& peer) {}
141 
142  protected:
147  void handlerThread();
148 
154  void attachSocketFilter();
155 
162  void processIEEE80211RawPacket(const uint8_t* data, size_t len);
163 
173  bool parseRadiotap(const uint8_t* data, size_t len,
175 
183  void processIEEE80211RawAction(const uint8_t* data, size_t len, int rssi);
184 
192  void processIEEE80211RawAck(const uint8_t* data, size_t len, int rssi);
193  };
194 } // namespace SPSP::LocalLayers::ESPNOW
SPSP::LocalLayers::ESPNOW::Adapter::attachSocketFilter
void attachSocketFilter()
Attaches BPF filter to the socket.
SPSP::LocalLayers::ESPNOW::Adapter::addPeer
void addPeer(const LocalAddrT &peer)
Adds peer to peer list.
Definition: linux/spsp/espnow_adapter.hpp:131
SPSP::LocalLayers::ESPNOW::Adapter::setRecvCb
void setRecvCb(AdapterRecvCb cb) noexcept
Sets receive callback.
Definition: linux/spsp/espnow_adapter.hpp:89
SPSP::LocalLayers::ESPNOW::Adapter::processIEEE80211RawAction
void processIEEE80211RawAction(const uint8_t *data, size_t len, int rssi)
Processes incoming raw IEEE 802.11 action frame.
SPSP::LocalLayers::ESPNOW::Adapter::handlerThread
void handlerThread()
Function of thread handling incoming packets.
SPSP::LocalLayers::ESPNOW::Adapter::processIEEE80211RawAck
void processIEEE80211RawAck(const uint8_t *data, size_t len, int rssi)
Processes incoming raw IEEE 802.11 acknowledgement.
espnow_packet_ieee80211.hpp
ESP-NOW IEEE802.11 structures including radiotap.
SPSP::LocalLayers::ESPNOW::Adapter::getSendCb
AdapterSendCb getSendCb() const noexcept
Gets send callback.
Definition: linux/spsp/espnow_adapter.hpp:110
SPSP::LocalLayers::ESPNOW::Adapter::send
void send(const LocalAddrT &dst, const std::string &data)
Sends local message.
SPSP::LocalLayers::ESPNOW::Adapter::m_localAddr
LocalAddrT m_localAddr
Cached local MAC address.
Definition: linux/spsp/espnow_adapter.hpp:59
SPSP::LocalLayers::ESPNOW::Adapter::~Adapter
~Adapter()
Destroys the adapter.
SPSP::LocalLayers::ESPNOW::Adapter::m_eventFd
EventFD m_eventFd
Epoll event file descriptor.
Definition: linux/spsp/espnow_adapter.hpp:57
SPSP::LocalLayers::ESPNOW::Adapter::setSendCb
void setSendCb(AdapterSendCb cb) noexcept
Sets send callback.
Definition: linux/spsp/espnow_adapter.hpp:103
SPSP::LocalLayers::ESPNOW::Adapter::EventFD
Wrapper of event file descriptor.
Definition: linux/spsp/espnow_adapter.hpp:49
SPSP::LocalLayers::ESPNOW::IEEE80211::RadiotapParsedFields
Parsed fields from radiotap header.
Definition: espnow_packet_ieee80211.hpp:49
SPSP::LocalLayers::ESPNOW::Adapter::getRecvCb
AdapterRecvCb getRecvCb() const noexcept
Gets receive callback.
Definition: linux/spsp/espnow_adapter.hpp:96
SPSP::LocalLayers::ESPNOW::Adapter::removePeer
void removePeer(const LocalAddrT &peer)
Removes peer from peer list.
Definition: linux/spsp/espnow_adapter.hpp:140
SPSP::LocalLayers::ESPNOW::Adapter::m_thread
std::thread m_thread
Handler thread.
Definition: linux/spsp/espnow_adapter.hpp:62
SPSP::LocalLayers::ESPNOW::Adapter::m_sock
RawSocket m_sock
Socket.
Definition: linux/spsp/espnow_adapter.hpp:56
espnow_types.hpp
Types for ESPNOW classes.
SPSP::LocalAddrMAC
Local layer address container for MAC address.
Definition: local_addr_mac.hpp:24
SPSP::LocalLayers::ESPNOW::Adapter::RawSocket
Wrapper of raw socket.
Definition: linux/spsp/espnow_adapter.hpp:37
SPSP::LocalLayers::ESPNOW::Adapter::m_epollFd
int m_epollFd
Epoll file descriptor.
Definition: linux/spsp/espnow_adapter.hpp:58
SPSP::LocalLayers::ESPNOW::Adapter::Adapter
Adapter()
Constructs a new ESP-NOW adapter.
SPSP::LocalLayers::ESPNOW::Adapter::parseRadiotap
bool parseRadiotap(const uint8_t *data, size_t len, IEEE80211::RadiotapParsedFields &rpf)
Parses radiotap header of IEEE 802.11 frame.
SPSP::LocalLayers::ESPNOW::Adapter::processIEEE80211RawPacket
void processIEEE80211RawPacket(const uint8_t *data, size_t len)
Processes incoming raw IEEE 802.11 packet.