esp_netif_lora_example/main/main.c

94 lines
2.5 KiB
C

#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);
}
}