This commit is contained in:
2021-03-10 12:56:06 +01:00
parent 9e84cb6a8c
commit bb905feb58

View File

@ -14,14 +14,29 @@
#include <freertos/FreeRTOS.h>
#include <freertos/task.h>
#include <freertos/queue.h>
#include <nvs.h>
static const char *TAG = "ss";
extern char VERSION[];
const char sinkServer[] = "sink.hottis.de";
const char deviceId[] = "MainsCnt0x";
const char sharedSecret[] = "1234567890123456789012345678901";
const uint16_t sinkPort = 20169;
const uint32_t CONFIG_MAGIC = 0xaffe0001;
static const char DEFAULT_SINKSERVER[] = "sink.hottis.de";
static const uint16_t DEFAULT_SINKPORT = 20169;
static const char DEFAULT_DEVICE_ID[] = "MainsCnt0x";
static const char DEFAULT_SHAREDSECRET[] = "1234567890123456789012345678901";
typedef struct __attribute__((__packed__)) {
uint32_t magic;
char sinkServer[48];
uint16 sinkPort;
char deviceId[16];
uint8_t sharedSecret[32];
} sinksenderConfig_t;
sinksenderConfig_t config;
extern xQueueHandle minuteBufferQueue;
@ -33,15 +48,15 @@ static void sinksenderSend(t_minuteBuffer *minuteBuffer) {
minuteBuffer->s.version = strtoll(VERSION, NULL, 16);
memset(minuteBuffer->s.deviceId, 0, sizeof(minuteBuffer->s.deviceId));
strcpy(minuteBuffer->s.deviceId, deviceId);
strcpy(minuteBuffer->s.deviceId, config.deviceId);
memcpy(minuteBuffer->s.hash, sharedSecret, SHA256_BLOCK_SIZE);
memcpy(minuteBuffer->s.hash, config.sharedSecret, SHA256_BLOCK_SIZE);
SHA256_CTX ctx;
sha256_init(&ctx);
sha256_update(&ctx, minuteBuffer->b, sizeof(minuteBuffer->b));
sha256_final(&ctx, minuteBuffer->s.hash);
struct hostent *hptr = gethostbyname(sinkServer);
struct hostent *hptr = gethostbyname(config.sinkServer);
if (hptr) {
if (hptr->h_addrtype == AF_INET) {
char *sinkAddr = hptr->h_addr_list[0];
@ -53,7 +68,7 @@ static void sinksenderSend(t_minuteBuffer *minuteBuffer) {
struct sockaddr_in servaddr;
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(sinkPort);
servaddr.sin_port = htons(config.sinkPort);
memcpy(&servaddr.sin_addr.s_addr, sinkAddr, 4);
ssize_t res = sendto(sockfd, minuteBuffer->b, sizeof(minuteBuffer->b),
@ -67,7 +82,7 @@ static void sinksenderSend(t_minuteBuffer *minuteBuffer) {
ESP_LOGE(TAG, "unknown address type: %d", hptr->h_addrtype);
}
} else {
ESP_LOGE(TAG, "sinkserver %s couldn't be resolved: %d", sinkServer, h_errno);
ESP_LOGE(TAG, "sinkserver %s couldn't be resolved: %d", config.sinkServer, h_errno);
}
}
@ -86,5 +101,34 @@ static void sinksenderExecTask(void *arg) {
void sinksenderInit() {
ESP_LOGI(TAG, "Initializing sink sender");
ESP_LOGI(TAG, "About to load sink sender configuration");
nvs_handle_t nvsHandle;
if (ESP_OK != nvs_open("config", NVS_READWRITE, &nvsHandle)) {
ESP_LOGE(TAG, "Unable to open nvs namespace config, use default values");
strcpy(config.sinkServer, DEFAULT_SINKSERVER);
config.sinkPort = DEFAULT_SINKPORT;
strcpy(config.deviceId, DEFAULT_DEVICE_ID);
strcpy(config.sharedSecret, DEFAULT_SHAREDSECRET);
} else {
esp_err_t err = nvs_get_blob(nvsHandle, "sinkSender", (void*)&config, sizeof(config));
if (err == ESP_OK) {
ESP_LOGI(TAG, "sinkSender configuration loaded");
} else {
ESP_LOGE(TAG, "Get result is %d", err);
}
if (config.magic != CONFIG_MAGIC) {
ESP_LOGW(TAG, "No configuration found, write it");
config.magic = CONFIG_MAGIC;
strcpy(config.sinkServer, DEFAULT_SINKSERVER);
config.sinkPort = DEFAULT_SINKPORT;
strcpy(config.deviceId, DEFAULT_DEVICE_ID);
strcpy(config.sharedSecret, DEFAULT_SHAREDSECRET);
err = nvs_set_blob(nvsHandle, "sinkSender", (void*)&config, sizeof(config));
ESP_LOGW(TAG, "Set result is %d", err);
err = nvs_commit(nvsHandle);
ESP_LOGW(TAG, "Commit result is %d", err);
}
}
xTaskCreate(sinksenderExecTask, "sinksender_exec_task", 4096, NULL, 5, NULL);
}