22 #include "spsp/logger.hpp"
26 #define SPSP_LOG_TAG "SPSP/Node"
31 static const std::string NODE_REPORTING_TOPIC =
"_report";
32 static const std::string NODE_REPORTING_RSSI_SUBTOPIC =
"rssi";
33 static const std::string NODE_REPORTING_PROBE_PAYLOAD_SUBTOPIC =
"probe_payload";
35 static const int NODE_RSSI_UNKNOWN = INT_MIN;
41 using SubscribeCb = std::function<void(
const std::string& topic,
42 const std::string& payload)>;
71 virtual bool publish(
const std::string& topic,
72 const std::string& payload) = 0;
95 virtual bool unsubscribe(
const std::string& topic) = 0;
109 template <
typename TLocalLayer>
110 class ILocalNode :
virtual public INode
112 using LocalAddrT =
typename TLocalLayer::LocalAddrT;
113 using LocalMessageT =
typename TLocalLayer::LocalMessageT;
114 using LocalRecvSendCb = std::function<void(
const LocalMessageT&)>;
117 LocalRecvSendCb m_localRecvSendCb =
nullptr;
137 void receiveLocal(
const LocalMessageT& msg,
int rssi = NODE_RSSI_UNKNOWN)
139 if (rssi != NODE_RSSI_UNKNOWN) {
140 SPSP_LOGI(
"Received local msg: %s (%d dBm)",
141 msg.toString().c_str(), rssi);
143 SPSP_LOGI(
"Received local msg: %s", msg.toString().c_str());
147 if (m_localRecvSendCb !=
nullptr) {
148 SPSP_LOGD(
"Calling receive/send callback");
149 m_localRecvSendCb(msg);
152 bool processed =
false;
153 auto processingTimeBegin = std::chrono::steady_clock::now();
157 case LocalMessageType::PROBE_REQ: processed =
processProbeReq(msg, rssi);
break;
158 case LocalMessageType::PROBE_RES: processed =
processProbeRes(msg, rssi);
break;
159 case LocalMessageType::PUB: processed =
processPub(msg, rssi);
break;
160 case LocalMessageType::SUB_REQ: processed =
processSubReq(msg, rssi);
break;
161 case LocalMessageType::SUB_DATA: processed =
processSubData(msg, rssi);
break;
162 case LocalMessageType::UNSUB: processed =
processUnsub(msg, rssi);
break;
163 case LocalMessageType::TIME_REQ: processed =
processTimeReq(msg, rssi);
break;
164 case LocalMessageType::TIME_RES: processed =
processTimeRes(msg, rssi);
break;
166 SPSP_LOGW(
"Unprocessable message type %s (%d)",
168 static_cast<uint8_t
>(msg.type));
172 auto processingTimeEnd = std::chrono::steady_clock::now();
173 auto processingDuration = std::chrono::duration_cast
174 <std::chrono::milliseconds>(processingTimeEnd
175 - processingTimeBegin);
178 SPSP_LOGD(
"Message processed (%" PRId64
" ms): %s",
179 processingDuration.count(), msg.toString().c_str());
181 SPSP_LOGW(
"Message not processed (%" PRId64
" ms): %s",
182 processingDuration.count(), msg.toString().c_str());
199 m_localRecvSendCb = cb;
222 SPSP_LOGI(
"Sending local msg: %s", msg.toString().c_str());
225 bool delivered = m_ll->send(msg);
228 SPSP_LOGD(
"Message delivered: %s", msg.toString().c_str());
230 SPSP_LOGW(
"Message not delivered: %s", msg.toString().c_str());
234 if (m_localRecvSendCb !=
nullptr) {
235 SPSP_LOGD(
"Calling receive/send callback");
236 m_localRecvSendCb(msg);
252 if (rssi == NODE_RSSI_UNKNOWN)
return;
255 std::thread t([
this, addr, rssi] {
256 std::string topic = NODE_REPORTING_TOPIC +
"/"
257 + NODE_REPORTING_RSSI_SUBTOPIC +
"/"
260 this->publish(topic, std::to_string(rssi));
274 int rssi = NODE_RSSI_UNKNOWN) = 0;
285 int rssi = NODE_RSSI_UNKNOWN) = 0;
295 virtual bool processPub(
const LocalMessageT& req,
296 int rssi = NODE_RSSI_UNKNOWN) = 0;
307 int rssi = NODE_RSSI_UNKNOWN) = 0;
318 int rssi = NODE_RSSI_UNKNOWN) = 0;
329 int rssi = NODE_RSSI_UNKNOWN) = 0;
340 int rssi = NODE_RSSI_UNKNOWN) = 0;
351 int rssi = NODE_RSSI_UNKNOWN) = 0;
361 template <
typename TFarLayer>
362 class IFarNode :
virtual public INode
386 virtual bool receiveFar(
const std::string& topic,
387 const std::string& payload) = 0;
407 template<
typename TLocalLayer,
typename TFarLayer>