#include "../include/nx/software/SystemSettingsApi.h" #include #include #include #include "KeyValueParser.h" #include #include "../include/nx/software/SystemSettings.h" #define IPV4_ADDR_SIZE 4 /* curl example: curl -v -X POST http://192.168.4.1/sys -d \ ssid=myssid&wpass=mypassword&wpwsave=1&wstatic=1&ip=3232237657&gw=3232237569&mask=4294967040 */ #define API_KEY_SSID "ssid" #define API_KEY_WPASS "wpass" #define API_KEY_WPWSAVE "wpwsave" #define API_KEY_USE_STATIC "wstatic" #define API_KEY_IPV4ADDR "ip" #define API_KEY_IPV4GW "gw" #define API_KEY_IPV4MASK "mask" #define API_KEY_DNS_ADDR "dns" #define API_KEY_SNTP_ADDR "sntp" #define API_KEY_TZ_ENV "tz" #define API_KEY_RS_SCHEDULE "rsch" #define API_KEY_DEVNAME "dn" #define API_KEY_RESTORE "restore_default" #define UNUSED(x) (void)(x) #define RESP_BUF_SIZE 1024 char responseBuffer[RESP_BUF_SIZE]; void int2ip(uint8_t array[4], uint32_t addr) { array[0] = (addr & 0xFF000000) >> 24; array[1] = (addr & 0x00FF0000) >> 16; array[2] = (addr & 0x0000FF00) >> 8; array[3] = (addr & 0x000000FF); } void handleKvPair(const char* key, const char* value, const void* userData, bool* done) { printf("System settings update; Key: %s, Value: %s\n", key, value); SystemSettings* settings = nxGetSystemSettings(); if (strcmp(key, API_KEY_RESTORE) == 0) { nxRestoreSystemDefaultSettings(); } else if (strcmp(key, API_KEY_SSID) == 0) { strcpy(settings->wifiSsid, value); } else if (strcmp(key, API_KEY_WPASS) == 0) { strcpy(settings->wifiPassword, value); } else if (strcmp(key, API_KEY_WPWSAVE) == 0) { settings->wifiPowerSave = atoi(value); } else if (strcmp(key, API_KEY_USE_STATIC) == 0) { settings->useStaticAddr = atoi(value); } else if (strcmp(key, API_KEY_IPV4ADDR) == 0) { uint32_t addr = strtoul(value, NULL, 10); int2ip(settings->ip4addr, addr); } else if (strcmp(key, API_KEY_IPV4GW) == 0) { uint32_t addr = strtoul(value, NULL, 10); int2ip(settings->ip4gw, addr); } else if (strcmp(key, API_KEY_IPV4MASK) == 0) { uint32_t addr = strtoul(value, NULL, 10); int2ip(settings->ip4mask, addr); } else if (strcmp(key, API_KEY_DNS_ADDR) == 0) { uint32_t addr = strtoul(value, NULL, 10); int2ip(settings->dnsAddr, addr); } else if (strcmp(key, API_KEY_SNTP_ADDR) == 0) { strcpy(settings->sntpAddr, value); } else if (strcmp(key, API_KEY_TZ_ENV) == 0) { strcpy(settings->tzEnv, value); } else if (strcmp(key, API_KEY_RS_SCHEDULE) == 0) { strcpy(settings->rsSchedule, value); } else { fprintf(stderr, "Unknown key: %s\n", key); } } // --------- Public API --------- // void nxApiGetSystemSettings(const uint8_t* msg, size_t msgLen, const char** response, size_t* respLen) { UNUSED(msg); UNUSED(msgLen); memset(responseBuffer, 0, RESP_BUF_SIZE); SystemSettings* settings = nxGetSystemSettings(); sprintf(responseBuffer, "{" "\"%s\":\"%s\", " // ssid "\"%s\":%i, " // power save "\"%s\":%i, " // use static ip "\"%s\":\"%i.%i.%i.%i\", " // ip "\"%s\":\"%i.%i.%i.%i\", " // gw "\"%s\":\"%i.%i.%i.%i\"," // mask "\"%s\":\"%i.%i.%i.%i\"," // dns "\"%s\":\"%s\"," // sntp "\"%s\":\"%s\"," // tz "\"%s\":\"%s\"," // rsch "\"%s\":\"%s\"" // dn "}", API_KEY_SSID, settings->wifiSsid, API_KEY_WPWSAVE, settings->wifiPowerSave, API_KEY_USE_STATIC, settings->useStaticAddr, API_KEY_IPV4ADDR, settings->ip4addr[0], settings->ip4addr[1], settings->ip4addr[2], settings->ip4addr[3], API_KEY_IPV4GW, settings->ip4gw[0], settings->ip4gw[1], settings->ip4gw[2], settings->ip4gw[3], API_KEY_IPV4MASK, settings->ip4mask[0], settings->ip4mask[1], settings->ip4mask[2], settings->ip4mask[3], API_KEY_DNS_ADDR, settings->dnsAddr[0], settings->dnsAddr[1], settings->dnsAddr[2], settings->dnsAddr[3], API_KEY_SNTP_ADDR, settings->sntpAddr, API_KEY_TZ_ENV, settings->tzEnv, API_KEY_RS_SCHEDULE, settings->rsSchedule, API_KEY_DEVNAME, settings->deviceName ); *response = responseBuffer; *respLen = strlen(responseBuffer); } void nxApiUpdateSystemSettings(const uint8_t* msg, size_t msgLen, const char** response, size_t* respLen) { nxParseKeyValueString((const char*)msg, handleKvPair, NULL); nxWriteSystemSettings(); }