#include "esp_random.h" #include "esp_log.h" #include "esp_mac.h" #include "socket.h" #include "esp_netif_lora.h" #define TAG "netif" void app_main() { static esp_netif_lora_config_t config; config.netif = NULL; config.lora = NULL; ESP_LOGI(TAG, "config.lora: %p", (void*)config.lora); esp_efuse_mac_get_default((uint8_t*)&config.mac); esp_netif_set_ip4_addr(&config.ip_info.ip, 10, 10 , 0, config.mac[5]); esp_netif_set_ip4_addr(&config.ip_info.gw, 10, 10 , 0, 1); esp_netif_set_ip4_addr(&config.ip_info.netmask, 255, 255 , 255, 0); //esp_log_level_set("spi_master", ESP_LOG_DEBUG); //esp_log_level_set("LoRa32", ESP_LOG_DEBUG); esp_netif_lora_init(&config); int sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); struct sockaddr_in local_addr; local_addr.sin_family = AF_INET; //local_addr.sin_addr.s_addr = config.ip_info.ip.addr; local_addr.sin_addr.s_addr = INADDR_ANY; local_addr.sin_port = htons(666); //ESP_ERROR_CHECK(ret); struct timeval timeout; timeout.tv_sec = esp_random() % 4 + 1; timeout.tv_usec = 0; setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(timeout)); setsockopt(sock, SOL_SOCKET, SO_BROADCAST, NULL, 0); ip_mreq mreq; mreq.imr_multiaddr.s_addr = inet_addr("224.0.1.187"); mreq.imr_interface.s_addr = config.ip_info.ip.addr; setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *)&mreq, sizeof(mreq)); // TODO double check this is actually part of accepting multicast // or if it was just binding to INADDR_ANY setsockopt(sock, SOL_SOCKET, SO_BROADCAST, (void*)1, 1); int ret = bind(sock, (struct sockaddr *)&local_addr, sizeof(local_addr)); ESP_LOGI(TAG, "looping"); uint8_t buf[200]; uint8_t client_addr_len; ssize_t recieved; ssize_t sent; buf[0] = 0x06; buf[1] = 0x06; buf[2] = 0x06; struct sockaddr_in broadcast; broadcast.sin_family = AF_INET; broadcast.sin_addr.s_addr = inet_addr("224.0.1.187"); broadcast.sin_port = htons(666); while(1) { recieved = recvfrom(sock, &buf, 255, 0, (struct sockaddr *)&local_addr, (socklen_t *)&client_addr_len); if((int)recieved == -1) { sent = sendto(sock, &buf, sizeof(buf), 0, (struct sockaddr *)&broadcast, sizeof(broadcast)); if(sent == -1) { ESP_LOGI(TAG, "sendto errno: %d", errno); } } else { ESP_LOGI(TAG, "buf[0] = %d", buf[0]); buf[0]++; sent = sendto(sock, &buf, sizeof(buf), 0, (struct sockaddr *)&broadcast, sizeof(broadcast)); } vTaskDelay(10 / portTICK_PERIOD_MS); } }