Skip to content
Snippets Groups Projects
Commit e23d3e31 authored by fxk8y's avatar fxk8y :spider:
Browse files

using magic strings instead of magic numbers

parent 6230730b
Branches feature/bme280
No related tags found
No related merge requests found
...@@ -13,32 +13,20 @@ static const char *TAG = "udp-server"; ...@@ -13,32 +13,20 @@ static const char *TAG = "udp-server";
static const in_port_t PORT = 4213; static const in_port_t PORT = 4213;
static std::map<uint32_t, qthing::udpPacketCallback> packetCallbackMap; static std::map<std::string, qthing::udpPacketCallback> packetCallbackMap;
void qthing::addUDPPacketCallback(uint32_t magicNumber, qthing::udpPacketCallback callback) { void qthing::addUDPPacketCallback(std::string magicString, qthing::udpPacketCallback callback) {
if (packetCallbackMap.count(magicNumber) > 0) { if (packetCallbackMap.count(magicString) > 0) {
qthing::udpPacketCallback old_callback = packetCallbackMap.at(magicNumber); qthing::udpPacketCallback old_callback = packetCallbackMap.at(magicString);
packetCallbackMap[magicNumber] = [old_callback, callback](udpPacket packet) { packetCallbackMap[magicString] = [old_callback, callback](udpPacket packet) {
old_callback(packet); old_callback(packet);
callback(packet); callback(packet);
}; };
} else { } else {
packetCallbackMap[magicNumber] = callback; packetCallbackMap[magicString] = callback;
} }
ESP_LOGI(TAG, "Registered callback for packets with magic number 0x%08X", magicNumber); ESP_LOGI(TAG, "Registered callback for packets with magic string %s", magicString.c_str());
}
std::string to_string(struct sockaddr_in6 sourceAddr) {
char addr_str[128];
if (sourceAddr.sin6_family == PF_INET) {
inet_ntoa_r(((struct sockaddr_in *)&sourceAddr)->sin_addr.s_addr, addr_str, sizeof(addr_str) - 1);
} else if (sourceAddr.sin6_family == PF_INET6) {
inet6_ntoa_r(sourceAddr.sin6_addr, addr_str, sizeof(addr_str) - 1);
}
return(std::string(addr_str));
} }
static char rx_buffer[2048]; // TODO: get MTU static char rx_buffer[2048]; // TODO: get MTU
...@@ -76,6 +64,7 @@ static void udp_server_task(void *pvParameters) ...@@ -76,6 +64,7 @@ static void udp_server_task(void *pvParameters)
struct sockaddr_in6 sourceAddr; // Large enough for both IPv4 or IPv6 struct sockaddr_in6 sourceAddr; // Large enough for both IPv4 or IPv6
socklen_t socklen = sizeof(sourceAddr); socklen_t socklen = sizeof(sourceAddr);
memset(rx_buffer, 0, sizeof(rx_buffer));
int len = recvfrom(sock, rx_buffer, sizeof(rx_buffer) - 1, 0, (struct sockaddr *)&sourceAddr, &socklen); int len = recvfrom(sock, rx_buffer, sizeof(rx_buffer) - 1, 0, (struct sockaddr *)&sourceAddr, &socklen);
// Error occured during receiving // Error occured during receiving
...@@ -85,30 +74,28 @@ static void udp_server_task(void *pvParameters) ...@@ -85,30 +74,28 @@ static void udp_server_task(void *pvParameters)
} }
// Data received // Data received
else { else {
ESP_LOGI(TAG, "Received %d bytes from %s:", len, to_string(sourceAddr).c_str()); ESP_LOGI(TAG, "Received %d bytes from %s", len, to_string(sourceAddr).c_str());
if (len >= sizeof(uint32_t)) { std::string payload_str(rx_buffer);
int16_t lenBestMatch = -1;
qthing::udpPacketCallback callback = NULL;
for(auto it = packetCallbackMap.begin(); it != packetCallbackMap.end(); ++it) {
if (len >= it->first.length() && payload_str.find(it->first) == 0) {
lenBestMatch = len;
callback = it->second;
}
}
uint32_t magicNumber = rx_buffer[0] << 24 | if (lenBestMatch > -1) {
rx_buffer[1] << 16 |
rx_buffer[2] << 8 |
rx_buffer[3];
qthing::udpPacket packet = { qthing::udpPacket packet = {
.sourceAddr = sourceAddr, .sourceAddr = sourceAddr,
.payload = rx_buffer + 4, .payload = rx_buffer,
.length = (uint16_t)(len - 4) .length = (uint16_t)len
}; };
auto iterator = packetCallbackMap.find(magicNumber); callback(packet);
if (iterator != packetCallbackMap.end()) {
auto callback = iterator->second;
callback(packet);
} else {
ESP_LOGW(TAG, "Packet has unknown magic number 0x%08X", magicNumber);
}
} else { } else {
ESP_LOGW(TAG, "Packet is too small, cannot determine magic number"); ESP_LOGW(TAG, "Packet has unknown magic string");
} }
} }
} }
......
...@@ -130,7 +130,7 @@ namespace qthing { ...@@ -130,7 +130,7 @@ namespace qthing {
} udpPacket; } udpPacket;
typedef std::function<void(udpPacket)> udpPacketCallback; typedef std::function<void(udpPacket)> udpPacketCallback;
void addUDPPacketCallback(uint32_t magicNumber, udpPacketCallback callback); void addUDPPacketCallback(std::string magicString, udpPacketCallback callback);
void start_udp_server(); void start_udp_server();
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment