|
@@ -28,32 +28,49 @@
|
|
|
|
|
|
#ifdef WIFI_ENABLED
|
|
|
|
|
|
-#define HOST_IP_ADDR CONFIG_BACK_END_SERVER_IP_ADDRESS
|
|
|
-#define PORT CONFIG_UDP_PORT_NO
|
|
|
-
|
|
|
static QueueHandle_t udpTxQueue = NULL; // Queue for transmitting UDP-Data to back-end server
|
|
|
|
|
|
-static void setupConnection(int *socket_fd, struct sockaddr_in *backEndAddress) {
|
|
|
+static QueueHandle_t udpForwardQueue = NULL; // Queue for forwarding NEXA-UDP-Data to next transceiver
|
|
|
+
|
|
|
+static int socket_fd;
|
|
|
+static struct sockaddr_in backEndAddress; // Address to back-end server
|
|
|
+static struct sockaddr_in backEndAddressSensorData; // Address to back-end server (sensor)
|
|
|
+static struct sockaddr_in forwardAddress; // Address to next transceiver for NEXA-code-forwarding
|
|
|
+
|
|
|
+static void setupConnection() {
|
|
|
|
|
|
struct sockaddr_in recvFromAddress;
|
|
|
|
|
|
- closesocket(*socket_fd);
|
|
|
+ closesocket(socket_fd);
|
|
|
+
|
|
|
+ // This Address is used for sending to the back-end server
|
|
|
+ backEndAddress.sin_addr.s_addr = inet_addr(CONFIG_BACK_END_SERVER_IP_ADDRESS);
|
|
|
+ backEndAddress.sin_family = AF_INET;
|
|
|
+ backEndAddress.sin_port = htons(CONFIG_UDP_PORT_NO);
|
|
|
|
|
|
- backEndAddress->sin_addr.s_addr = inet_addr(HOST_IP_ADDR);
|
|
|
- backEndAddress->sin_family = AF_INET;
|
|
|
- backEndAddress->sin_port = htons(PORT);
|
|
|
+ // This Address is used for sending to the back-end server for sensor-data (different port)
|
|
|
+ backEndAddressSensorData.sin_addr.s_addr = inet_addr(CONFIG_BACK_END_SERVER_IP_ADDRESS);
|
|
|
+ backEndAddressSensorData.sin_family = AF_INET;
|
|
|
+ backEndAddressSensorData.sin_port = htons(CONFIG_UDP_PORT_NO_FOR_SENSOR_DATA);
|
|
|
+
|
|
|
+ // This Address is used for forwaring NEXA codes to next transceiver
|
|
|
+ forwardAddress.sin_addr.s_addr = inet_addr(CONFIG_NEXT_FORWARD_IP_ADDRESS);
|
|
|
+ forwardAddress.sin_family = AF_INET;
|
|
|
+ forwardAddress.sin_port = htons(CONFIG_UDP_PORT_NO);
|
|
|
|
|
|
// Wait for WiFi to be connected first
|
|
|
while( commIsUpAndRunning == 0 ) vTaskDelay(500 / portTICK_PERIOD_MS);
|
|
|
|
|
|
- *socket_fd = socket(AF_INET, SOCK_DGRAM, 0);
|
|
|
- if (*socket_fd < 0) ESP_LOGE("UDP","Socket error");
|
|
|
+ socket_fd = socket(AF_INET, SOCK_DGRAM, 0);
|
|
|
+ if (socket_fd < 0) ESP_LOGE("UDP","Socket error");
|
|
|
|
|
|
// Bind our server socket to a port.
|
|
|
- recvFromAddress.sin_family = AF_INET;
|
|
|
+ // We listen on this port from ANY other host. It could be the
|
|
|
+ // back-end server, or it could be another Transceiver that forwards
|
|
|
recvFromAddress.sin_addr.s_addr = htonl(INADDR_ANY);
|
|
|
- recvFromAddress.sin_port = htons(PORT);
|
|
|
- if( (bind(*socket_fd, (const struct sockaddr *)&recvFromAddress, sizeof(struct sockaddr_in))) == -1 )
|
|
|
+ recvFromAddress.sin_family = AF_INET;
|
|
|
+ recvFromAddress.sin_port = htons(CONFIG_UDP_PORT_NO);
|
|
|
+ if( (bind(socket_fd, (const struct sockaddr *)&recvFromAddress, sizeof(struct sockaddr_in))) == -1 )
|
|
|
ESP_LOGE("UDP","Bind error");
|
|
|
else
|
|
|
ESP_LOGI("UDP","UDP Rx Bind.");
|
|
@@ -62,12 +79,10 @@ static void setupConnection(int *socket_fd, struct sockaddr_in *backEndAddress)
|
|
|
|
|
|
void udp_client_task(void *pvParameter)
|
|
|
{
|
|
|
- struct sockaddr_in backEndAddress;
|
|
|
int recv_len;
|
|
|
char dataBuff[UDP_QUEUE_OBJ_LENGTH];
|
|
|
- int socket_fd;
|
|
|
|
|
|
- setupConnection(&socket_fd, &backEndAddress);
|
|
|
+ setupConnection();
|
|
|
|
|
|
while(1)
|
|
|
{
|
|
@@ -87,8 +102,27 @@ void udp_client_task(void *pvParameter)
|
|
|
// Transmit
|
|
|
while( xQueueReceive( udpTxQueue, &dataBuff, 0 ) == pdTRUE ) {
|
|
|
|
|
|
- //ESP_LOGI("UDP","Send data:%s",dataBuff);
|
|
|
- sendto(socket_fd, dataBuff, strlen(dataBuff), 0, (struct sockaddr *)&backEndAddress, sizeof(backEndAddress));
|
|
|
+ // Last byte contains type of data
|
|
|
+ const uint8_t dataType = dataBuff[UDP_QUEUE_OBJ_LENGTH-1];
|
|
|
+
|
|
|
+ ESP_LOGI("UDP","Send data:%s Type:%u",dataBuff,dataType);
|
|
|
+
|
|
|
+ if( dataType == 0 ) {
|
|
|
+ sendto(socket_fd, dataBuff, strlen(dataBuff), 0, (struct sockaddr *)&backEndAddress, sizeof(backEndAddress));
|
|
|
+ }
|
|
|
+ else if( dataType == 1 ) {
|
|
|
+ sendto(socket_fd, dataBuff, strlen(dataBuff), 0, (struct sockaddr *)&backEndAddressSensorData, sizeof(backEndAddressSensorData));
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ ESP_LOGE("UDP","Wrong dataType:%u",dataType);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // Forward NEXT Codes to next transceiver
|
|
|
+ while( xQueueReceive( udpForwardQueue, &dataBuff, 0 ) == pdTRUE ) {
|
|
|
+
|
|
|
+ ESP_LOGI("UDP","Forward NEXA-data:%s",dataBuff);
|
|
|
+ sendto(socket_fd, dataBuff, strlen(dataBuff), 0, (struct sockaddr *)&forwardAddress, sizeof(forwardAddress));
|
|
|
}
|
|
|
|
|
|
vTaskDelay(50 / portTICK_RATE_MS);
|
|
@@ -99,11 +133,39 @@ void udp_client_task(void *pvParameter)
|
|
|
|
|
|
// Public interface for sending a UDP Message to the back-end server.
|
|
|
// Argument #1 must be UDP_QUEUE_OBJ_LENGTH chars in length.
|
|
|
-void sendUDPMessage(char *p) {
|
|
|
+// In the last data byte transfered, the type of data is specified
|
|
|
+void sendUDPMessage(char *p, bool sensorData) {
|
|
|
+
|
|
|
+ char data[UDP_QUEUE_OBJ_LENGTH];
|
|
|
+
|
|
|
|
|
|
- if( udpTxQueue != NULL ) xQueueSend( udpTxQueue, p, 0 );
|
|
|
+ data[0] = '<';
|
|
|
+ data[1] = CONFIG_UNIT_ID + 'A'; // Source
|
|
|
+ data[2] = 'A'; // Destination
|
|
|
+
|
|
|
+ if( p[0] == '<') {
|
|
|
+
|
|
|
+ strncpy(data+3, p+1, UDP_QUEUE_OBJ_LENGTH-4);
|
|
|
+
|
|
|
+ if( strchr(data,'>') != NULL ) {
|
|
|
+
|
|
|
+ if( sensorData == true )
|
|
|
+ data[UDP_QUEUE_OBJ_LENGTH-1] = 1; // Sensor data
|
|
|
+ else
|
|
|
+ data[UDP_QUEUE_OBJ_LENGTH-1] = 0; // NEXA
|
|
|
+
|
|
|
+ if( udpTxQueue != NULL ) xQueueSend( udpTxQueue, data, 0 );
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+// Public interface for forwaring a NEXA code to the next transceiver.
|
|
|
+void forwardNEXAMessage(char *p) {
|
|
|
+
|
|
|
+ //if( udpForwardQueue != NULL ) xQueueSend( udpForwardQueue, p, 0 );
|
|
|
}
|
|
|
|
|
|
+
|
|
|
void udpClientInit()
|
|
|
{
|
|
|
ESP_ERROR_CHECK(esp_netif_init());
|
|
@@ -111,6 +173,8 @@ void udpClientInit()
|
|
|
|
|
|
udpTxQueue = xQueueCreate( 5, UDP_QUEUE_OBJ_LENGTH );
|
|
|
|
|
|
+ udpForwardQueue = xQueueCreate( 5, UDP_QUEUE_OBJ_LENGTH );
|
|
|
+
|
|
|
xTaskCreate(udp_client_task, "udp_client", 4096, NULL, 5, NULL);
|
|
|
}
|
|
|
|