├── .devcontainer └── devcontainer.json ├── .gitignore ├── .gitmodules ├── CMakeLists.txt ├── Dockerfile ├── README.md ├── components ├── msg-core-wrapper │ └── CMakeLists.txt └── phev-core-wrapper │ └── CMakeLists.txt ├── main ├── CMakeLists.txt ├── Kconfig.projbuild ├── component.mk ├── main.c ├── mqtt.c ├── mqtt.h ├── ota.c ├── ota.h ├── ppp.c ├── ppp.h ├── ttgo.c └── ttgo.h ├── pem └── fullchain.pem └── sdkconfig.defaults /.devcontainer/devcontainer.json: -------------------------------------------------------------------------------- 1 | // For format details, see https://aka.ms/vscode-remote/devcontainer.json or this file's README at: 2 | // https://github.com/microsoft/vscode-dev-containers/tree/v0.44.0/containers/docker-existing-dockerfile 3 | { 4 | "name": "Existing Dockerfile", 5 | 6 | // Sets the run context to one level up instead of the .devcontainer folder. 7 | "context": "..", 8 | 9 | // Update the 'dockerFile' property if you aren't using the standard 'Dockerfile' filename. 10 | "dockerFile": "..\\Dockerfile", 11 | 12 | // Uncomment the next line to have VS Code connect as an existing non-root user in the container. 13 | // On Linux, by default, the container user's UID/GID will be updated to match your local user. See 14 | // https://aka.ms/vscode-remote/containers/non-root for details on adding a non-root user if none exist. 15 | // "remoteUser": "vscode", 16 | 17 | // Uncomment the next line if you will use a ptrace-based debugger like C++, Go, and Rust 18 | // "runArgs": [ "--cap-add=SYS_PTRACE", "--security-opt", "seccomp=unconfined" ], 19 | 20 | // Uncomment the next line to use Docker from inside the container. See https://aka.ms/vscode-remote/samples/docker-in-docker for details. 21 | // "mounts": [ "source=/var/run/docker.sock,target=/var/run/docker.sock,type=bind" ], 22 | 23 | // Use 'settings' to set *default* container specific settings.json values on container create. 24 | // You can edit these settings after create using File > Preferences > Settings > Remote. 25 | "settings": { 26 | // This will ignore your local shell user setting for Linux since shells like zsh are typically 27 | // not in base container images. You can also update this to an specific shell to ensure VS Code 28 | // uses the right one for terminals and tasks. For example, /bin/bash (or /bin/ash for Alpine). 29 | "terminal.integrated.shell.linux": null 30 | }, 31 | 32 | // Use 'appPort' to create a container with published ports. If the port isn't working, be sure 33 | // your server accepts connections from all interfaces (0.0.0.0 or '*'), not just localhost. 34 | // "appPort": [], 35 | 36 | // Uncomment the next line to run commands after the container is created - for example installing git. 37 | // "postCreateCommand": "apt-get update && apt-get install -y git", 38 | 39 | // Add the IDs of extensions you want installed when the container is created in the array below. 40 | "extensions": [] 41 | } 42 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .vscode/ 2 | build/ 3 | *.key 4 | sdkconfig 5 | sdkconfig.old 6 | .devcontainer 7 | sdkconfig.mosquitto 8 | .envrc 9 | 10 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "components/phev-core-wrapper/phevcore"] 2 | path = components/phev-core-wrapper/phevcore 3 | url = https://github.com/phev-remote/phevcore.git 4 | [submodule "components/msg-core-wrapper/msg-core"] 5 | path = components/msg-core-wrapper/msg-core 6 | url = https://github.com/papawattu/msg-core.git 7 | -------------------------------------------------------------------------------- /CMakeLists.txt: -------------------------------------------------------------------------------- 1 | # The following lines of boilerplate have to be in your project's 2 | # CMakeLists in this exact order for cmake to work correctly 3 | cmake_minimum_required(VERSION 3.5) 4 | 5 | set(SUPPORTED_TARGETS esp32) 6 | 7 | include($ENV{IDF_PATH}/tools/cmake/project.cmake) 8 | project(phev-ttgo) 9 | 10 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM papawattu/build-firmware 2 | ENV IDF_PATH /esp/esp-idf 3 | ENV BASH_ENV "/root/.bashrc" 4 | RUN echo "export IDF_PATH=/esp/esp-idf" >> /root/.bashrc 5 | RUN echo "source /esp/esp-idf/export.sh" >> /root/.bashrc 6 | ENTRYPOINT ["/bin/bash","-c"] 7 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Mitsubishi Outlander PHEV remote app ESP32 TTGO firmware 2 | 3 | https://banggood.app.link/AtArm9Qal1 4 | 5 | Uses SIM800 GPRS on the board to send car information to an MQTT broker 6 | 7 | Download the ESP IDF framework and toolchain 8 | 9 | https://github.com/espressif/esp-idf 10 | 11 | Follow the hello world example to ensure everthing is up and running. 12 | 13 | To checkout the firmware 14 | ``` 15 | git clone --recursive https://github.com/phev-remote/phev-ttgo 16 | 17 | cd phev-ttgo 18 | 19 | idf.py menuconfig 20 | ``` 21 | Configure the PPP config and WiFi connection for your car. Also you can use a different MQTT broker if you don't want to use a public one. 22 | ``` 23 | idf.py -p flash monitor 24 | ``` 25 | An ID is created based on the ESP MAC address which is logged at start up. 26 | 27 | The device will try and register itself, so put the car into registration mode and make sure the device is in WiFi range (you should see in the logs if it connects ok). 28 | 29 | Once registered it will start to broadcast to the MQTT topic 30 | ``` 31 | /ttgo/devices//events 32 | ``` 33 | You can then send updates to 34 | ``` 35 | /ttgo/devices//commands 36 | ``` 37 | topic in the following JSON format. 38 | 39 | ``` 40 | { 41 | "requests" : [ 42 | { 43 | "updateRegister" : { 44 | "register" : 2, 45 | "value" : [0,0,255,255,255,255,1,255,255,255,255,255,255,255,255] 46 | } 47 | }, 48 | { 49 | "operation" : { 50 | "airCon" : "on" 51 | } 52 | } 53 | ] 54 | } 55 | ``` 56 | The command above sets the aircon to ten minute cool. 57 | 58 | Happy PHEV Hacking! 59 | 60 | 61 | # Docker build instructions 62 | ``` 63 | docker build /phev-ttgo . 64 | 65 | docker run -v ~/phev-ttgo:/workspace phev-ttgo "idf.py menuconfig" 66 | 67 | docker run -v ~/phev-ttgo:/workspace phev-ttgo "idf.py build" 68 | ``` 69 | -------------------------------------------------------------------------------- /components/msg-core-wrapper/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | set(COMPONENT_SRCDIRS "./msg-core/src") 2 | set(COMPONENT_ADD_INCLUDEDIRS "msg-core/include") 3 | register_component() -------------------------------------------------------------------------------- /components/phev-core-wrapper/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | set(COMPONENT_SRCDIRS "./phevcore/src/") 2 | set(COMPONENT_ADD_INCLUDEDIRS "./phevcore/include") 3 | set(COMPONENT_REQUIRES "msg-core-wrapper" "json") 4 | register_component() -------------------------------------------------------------------------------- /main/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | set(COMPONENT_SRCS "ppp.c" "ttgo.c" "main.c" "mqtt.c" "ota.c") 2 | set(COMPONENT_ADD_INCLUDEDIRS ".") 3 | set(COMPONENT_EMBED_TXTFILES "../pem/fullchain.pem") 4 | 5 | register_component() -------------------------------------------------------------------------------- /main/Kconfig.projbuild: -------------------------------------------------------------------------------- 1 | menu "PHEV TTGO Config" 2 | config MQTT_BROKER_URI 3 | string "MQTT Broker URI" 4 | default "mqtt://test.mosquitto.org" 5 | help 6 | MQTT Broker URI 7 | config MQTT_TOPIC_PREFIX 8 | string "MQTT Topic prefix" 9 | default "/ttgo/devices" 10 | help 11 | You can specify a prefix for the default topic names 12 | config MQTT_COMMANDS_TOPIC 13 | string "MQTT Topic for commands" 14 | default "commands" 15 | help 16 | You can specify a command topic name 17 | config MQTT_EVENTS_TOPIC 18 | string "MQTT Topic for events" 19 | default "events" 20 | help 21 | You can specify a event topic name 22 | config MQTT_STATUS_TOPIC 23 | string "MQTT Topic for status" 24 | default "status" 25 | help 26 | You can specify a status topic name 27 | config CAR_WIFI_SSID 28 | string "Car WiFi SSID" 29 | default "REMOTExxxxx" 30 | help 31 | Car WiFi SSID, can be found in the manual 32 | config CAR_WIFI_PASSWORD 33 | string "Car WiFi Password" 34 | default "xxxxx" 35 | help 36 | Car WiFi password, can be found in the manual 37 | config PPP_APN 38 | string "PPP Access Point name" 39 | default "everywhere" 40 | help 41 | PPP Access Point name 42 | config PPP_USER 43 | string "PPP User" 44 | default "eesecure" 45 | help 46 | PPP User 47 | config PPP_PASS 48 | string "PPP Password" 49 | default "secure" 50 | help 51 | PPP Password 52 | config CAR_HOST_IP 53 | string "Car host IP" 54 | default "192.168.8.46" 55 | help 56 | Car host IP, you should not need to change this 57 | config CAR_HOST_PORT 58 | int "Car host port" 59 | default 8080 60 | help 61 | Car host port, you should not need to change this from 8080 62 | config FIRMWARE_OTA 63 | bool "Enable automatic OTA at start up" 64 | default y 65 | config FIRMWARE_VERSION_URL 66 | string "Firmware version URL" 67 | default "https://runesdata.se/firmware/images//VERSION.txt" 68 | depends on FIRMWARE_OTA 69 | config FIRMWARE_FALLBACK_VERSION_URL 70 | string "Fallback version URL" 71 | default "https://runesdata.se/firmware/VERSION.txt" 72 | depends on FIRMWARE_OTA 73 | config FIRMWARE_UPGRADE_URL 74 | string "Firmware upgrade url endpoint" 75 | default "https://runesdata.se/firmware/images//phev-ttgo.bin" 76 | help 77 | URL of server which hosts the firmware image. 78 | config FIRMWARE_FALLBACK_URL 79 | string "Firmware upgrade fallback url endpoint" 80 | default "https://runesdata.se/firmware/phev-ttgo.bin" 81 | help 82 | URL of server which hosts the fallback firmware image. 83 | config CUSTOM_DEVICE_ID 84 | string "Custom device ID" 85 | help 86 | Set a customer device ID rather than using the MAC address 87 | config CUSTOM_MAC 88 | bool "Custom MAC" 89 | default n 90 | config CUSTOM_MAC_ADDR 91 | hex "MAC address" 92 | depends on CUSTOM_MAC 93 | help 94 | Custom MAC address 95 | config MY18 96 | bool "MY18 Support" 97 | default n 98 | config PING_TIMEOUT 99 | int "Ping timeout" 100 | default 20 101 | config REBOOT_AFTER_ACK 102 | bool "Reboot after successful command" 103 | default n 104 | config REBOOT_DELAY 105 | int "Time to delay rebot after an ACK" 106 | default 10 107 | depends on REBOOT_AFTER_ACK 108 | config SHOW_DEBUG_INFO 109 | bool "Show heap and timeouts" 110 | default n 111 | endmenu -------------------------------------------------------------------------------- /main/component.mk: -------------------------------------------------------------------------------- 1 | # 2 | # "main" pseudo-component makefile. 3 | # 4 | # (Uses default behaviour of compiling all source files in directory, adding 'include' to include path.) 5 | 6 | -------------------------------------------------------------------------------- /main/main.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include "freertos/FreeRTOS.h" 5 | #include "freertos/task.h" 6 | #include "freertos/event_groups.h" 7 | #include "esp_netif.h" 8 | #include "esp_system.h" 9 | #include "esp_spi_flash.h" 10 | #include "esp_wifi.h" 11 | #include "esp_log.h" 12 | #include "esp_ota_ops.h" 13 | #include "nvs.h" 14 | #include "nvs_flash.h" 15 | #include "lwip/apps/sntp.h" 16 | #include "pthread.h" 17 | #include "esp_pthread.h" 18 | #include "time.h" 19 | #include "lwip/netif.h" 20 | #include "esp_event.h" 21 | #include "esp_event_loop.h" 22 | #include "mqtt.h" 23 | #include "msg_tcpip.h" 24 | #include "msg_utils.h" 25 | #include "logger.h" 26 | 27 | #include "ttgo.h" 28 | #include "ppp.h" 29 | #include "phev.h" 30 | #include "ota.h" 31 | 32 | #include "lwip/opt.h" 33 | #include "lwip/sockets.h" 34 | #include "lwip/sys.h" 35 | #include "lwip/netdb.h" 36 | #include "lwip/dns.h" 37 | #include "lwip/netif.h" 38 | 39 | #ifndef CONFIG_MQTT_BROKER_URI 40 | #define CONFIG_MQTT_BROKER_URI "mqtt://test.mosquitto.org" 41 | #endif 42 | #ifndef CONFIG_MQTT_TOPIC_PREFIX 43 | #define CONFIG_MQTT_TOPIC_PREFIX "" 44 | #endif 45 | #ifndef CONFIG_MQTT_COMMANDS_TOPIC 46 | #define CONFIG_MQTT_COMMANDS_TOPIC "commands" 47 | #endif 48 | #ifndef CONFIG_MQTT_EVENTS_TOPIC 49 | #define CONFIG_MQTT_EVENTS_TOPIC "events" 50 | #endif 51 | #ifndef CONFIG_CAR_WIFI_SSID 52 | #define CONFIG_CAR_WIFI_SSID "SSID" 53 | #endif 54 | #ifndef CONFIG_CAR_WIFI_PASSWORD 55 | #define CONFIG_CAR_WIFI_PASSWORD "PASSWORD" 56 | #endif 57 | #ifndef CONFIG_CAR_HOST_IP 58 | #define CONFIG_CAR_HOST_IP "192.168.8.46" 59 | #endif 60 | #ifndef CONFIG_CAR_HOST_PORT 61 | #define CONFIG_CAR_HOST_PORT 8080 62 | #endif 63 | #ifndef CONFIG_MQTT_STATUS_TOPIC 64 | #define CONFIG_MQTT_STATUS_TOPIC "status" 65 | #endif 66 | 67 | #ifdef CONFIG_MY18 68 | #define MY18 69 | #endif 70 | #define MAX_WIFI_CLIENT_SSID_LEN 32 71 | #define MAX_WIFI_CLIENT_PASSWORD_LEN 64 72 | 73 | 74 | const static char * TAG = "MAIN"; 75 | uint8_t DEFAULT_MAC[] = {0,0,0,0,0,0}; 76 | const static int CONNECTED_BIT = BIT0; 77 | 78 | static EventGroupHandle_t wifi_event_group; 79 | 80 | enum commands { CMD_UNSET, CMD_STATUS, CMD_REGISTER, CMD_HEADLIGHTS, CMD_BATTERY, CMD_AIRCON, CMD_GET_REG_VAL, CMD_DISPLAY_REG }; 81 | 82 | static int global_sock = 0; 83 | static void * nvsHandle = NULL; 84 | 85 | static int main_eventHandler(phevEvent_t * event); 86 | 87 | static int s_retry_num = 0; 88 | 89 | static char * g_version = NULL; 90 | 91 | static int64_t lastResponseTime = 0; 92 | 93 | static void wifi_client_event_handler(void *ctx, esp_event_base_t event_base, 94 | int32_t event_id, void* event_data) 95 | { 96 | if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_START) { 97 | esp_wifi_connect(); 98 | } else if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_DISCONNECTED) { 99 | if (s_retry_num < 10) { 100 | esp_wifi_connect(); 101 | s_retry_num++; 102 | ESP_LOGI(TAG, "retry to connect to the AP"); 103 | } 104 | ESP_LOGI(TAG,"connect to the AP fail"); 105 | } else if (event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP) { 106 | ip_event_got_ip_t* event = (ip_event_got_ip_t*) event_data; 107 | ESP_LOGI(TAG, "got ip:" IPSTR, IP2STR(&event->ip_info.ip)); 108 | s_retry_num = 0; 109 | xEventGroupSetBits(wifi_event_group, CONNECTED_BIT); 110 | } 111 | } 112 | 113 | void wifi_client_setup(void) 114 | { 115 | //uint8_t new_mac[8] = {0x24, 0x0d, 0xc2, 0xc2, 0x91, 0x85}; 116 | //esp_base_mac_addr_set(new_mac); 117 | //vTaskDelay(100 / portTICK_PERIOD_MS); 118 | wifi_event_group = xEventGroupCreate(); 119 | xEventGroupClearBits(wifi_event_group, CONNECTED_BIT); 120 | ESP_ERROR_CHECK(esp_event_loop_init(wifi_client_event_handler, NULL)); 121 | wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT(); 122 | ESP_ERROR_CHECK(esp_wifi_init(&cfg)); 123 | ESP_ERROR_CHECK(esp_wifi_set_storage(WIFI_STORAGE_RAM)); 124 | } 125 | void wifi_conn_init() 126 | { 127 | //esp_wifi_stop(); 128 | ESP_ERROR_CHECK(esp_netif_init()); 129 | 130 | wifi_event_group = xEventGroupCreate(); 131 | 132 | xEventGroupClearBits(wifi_event_group, CONNECTED_BIT); 133 | 134 | ESP_ERROR_CHECK(esp_event_loop_create_default()); 135 | 136 | esp_netif_create_default_wifi_sta(); 137 | 138 | wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT(); 139 | ESP_ERROR_CHECK(esp_wifi_init(&cfg)); 140 | 141 | esp_event_handler_instance_t instance_any_id; 142 | esp_event_handler_instance_t instance_got_ip; 143 | ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT, 144 | ESP_EVENT_ANY_ID, 145 | &wifi_client_event_handler, 146 | NULL, 147 | &instance_any_id)); 148 | ESP_ERROR_CHECK(esp_event_handler_instance_register(IP_EVENT, 149 | IP_EVENT_STA_GOT_IP, 150 | &wifi_client_event_handler, 151 | NULL, 152 | &instance_got_ip)); 153 | wifi_config_t wifi_config = { 154 | .sta = { 155 | .ssid = CONFIG_CAR_WIFI_SSID, 156 | .password = CONFIG_CAR_WIFI_PASSWORD, 157 | .pmf_cfg = { 158 | .capable = true, 159 | .required = false 160 | }, 161 | }, 162 | }; 163 | 164 | ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA) ); 165 | ESP_ERROR_CHECK(esp_wifi_set_config(ESP_IF_WIFI_STA, &wifi_config) ); 166 | ESP_ERROR_CHECK(esp_wifi_start() ); 167 | 168 | //LOG_I(TAG, "start the WIFI SSID:[%s] password:[%s]", wifi_config.sta.ssid, wifi_config.sta.password); 169 | LOG_I(TAG,"Waiting for WiFi..."); 170 | 171 | 172 | 173 | 174 | xEventGroupWaitBits(wifi_event_group, CONNECTED_BIT, 175 | false, true, portMAX_DELAY); 176 | 177 | for (struct netif *pri = netif_list; pri != NULL; pri=pri->next) 178 | { 179 | //LOG_I(TAG, "Interface priority is %c%c%d (" IPSTR "/" IPSTR " gateway " IPSTR ")", 180 | //pri->name[0], pri->name[1], pri->num, 181 | //IP2STR(&pri->ip_addr.u_addr.ip4), IP2STR(&pri->netmask.u_addr.ip4), IP2STR(&pri->gw.u_addr.ip4)); 182 | if(pri->name[0] == 'p') 183 | { 184 | LOG_I(TAG,"Set PPP priority interface"); 185 | netif_set_default(pri); 186 | } 187 | } 188 | 189 | for (struct netif *pri = netif_list; pri != NULL; pri=pri->next) 190 | { 191 | LOG_I(TAG, "Interface priority is %c%c%d (" IPSTR "/" IPSTR " gateway " IPSTR ")", 192 | pri->name[0], pri->name[1], pri->num, 193 | IP2STR(&pri->ip_addr.u_addr.ip4), IP2STR(&pri->netmask.u_addr.ip4), IP2STR(&pri->gw.u_addr.ip4)); 194 | 195 | 196 | } 197 | 198 | LOG_I(TAG,"WiFi Connected..."); 199 | 200 | } 201 | void init_nvs() 202 | { 203 | esp_err_t err = nvs_flash_init(); 204 | if (err == ESP_ERR_NVS_NO_FREE_PAGES || err == ESP_ERR_NVS_NEW_VERSION_FOUND) { 205 | // 1.OTA app partition table has a smaller NVS partition size than the non-OTA 206 | // partition table. This size mismatch may cause NVS initialization to fail. 207 | // 2.NVS partition contains data in new format and cannot be recognized by this version of code. 208 | // If this happens, we erase NVS partition and initialize NVS again. 209 | ESP_ERROR_CHECK(nvs_flash_erase()); 210 | err = nvs_flash_init(); 211 | } 212 | ESP_ERROR_CHECK(err); 213 | } 214 | 215 | static void initialize_sntp(void) 216 | { 217 | LOG_I(TAG, "Initializing SNTP"); 218 | sntp_setoperatingmode(SNTP_OPMODE_POLL); 219 | sntp_setservername(0, "uk.pool.ntp.org"); 220 | sntp_init(); 221 | } 222 | 223 | static void obtain_time(void) 224 | { 225 | initialize_sntp(); 226 | 227 | vTaskDelay(2000 / portTICK_PERIOD_MS); 228 | // wait for time to be set 229 | time_t now = 0; 230 | struct tm timeinfo = {0}; 231 | while (timeinfo.tm_year < (2019 - 1900)) { 232 | LOG_I(TAG, "Waiting for system time to be set..."); 233 | vTaskDelay(2000 / portTICK_PERIOD_MS); 234 | time(&now); 235 | localtime_r(&now, &timeinfo); 236 | } 237 | LOG_I(TAG,"Current local time and date: %s", asctime(&timeinfo) ); 238 | } 239 | 240 | static int main_eventHandler(phevEvent_t * event) 241 | { 242 | if(!event) 243 | { 244 | return 0; 245 | } 246 | 247 | lastResponseTime = esp_timer_get_time(); 248 | 249 | switch (event->type) 250 | { 251 | case PHEV_REGISTER_UPDATE: 252 | { 253 | LOG_I(TAG,"Register : %d",event->reg); 254 | 255 | LOG_BUFFER_HEXDUMP(TAG,event->data,event->length,LOG_INFO); 256 | 257 | return 0; 258 | } 259 | case PHEV_REGISTER_UPDATE_ACK: 260 | { 261 | LOG_I(TAG,"Register %d acknowledged", event->reg); 262 | #ifdef CONFIG_REBOOT_AFTER_ACK 263 | vTaskDelay((CONFIG_REBOOT_DELAY * 1000) / portTICK_PERIOD_MS); 264 | esp_restart(); 265 | #endif 266 | break; 267 | } 268 | case PHEV_REGISTRATION_COMPLETE: 269 | { 270 | LOG_I(TAG,"Registration Complete\n"); 271 | nvs_set_u8(nvsHandle,"registered",true); 272 | LOG_I(TAG,"Rebooting..."); 273 | esp_restart(); 274 | 275 | return 0; 276 | } 277 | case PHEV_CONNECTED: 278 | { 279 | LOG_I(TAG,"Connected\n"); 280 | 281 | return 0; 282 | } 283 | case PHEV_STARTED: 284 | { 285 | LOG_I(TAG,"Started\n"); 286 | return 0; 287 | } 288 | case PHEV_VIN: 289 | { 290 | LOG_I(TAG,"VIN number : %s\n",event->data); 291 | message_t * version = msg_utils_createMsgTopic("version",(uint8_t *) g_version,strlen(g_version)); 292 | event->ctx->serviceCtx->pipe->pipe->in->publish(event->ctx->serviceCtx->pipe->pipe->in,version); 293 | return 0; 294 | } 295 | case PHEV_ECU_VERSION: 296 | { 297 | LOG_I(TAG,"ECU Version : %s\n",event->data); 298 | return 0; 299 | } 300 | case PHEV_DATE_SYNC: 301 | { 302 | LOG_I(TAG,"Date sync : 20%d-%d-%d %d:%d:%d",event->data[0],event->data[1],event->data[2],event->data[3],event->data[4],event->data[5]); 303 | char * str = phev_statusAsJson(event->ctx); 304 | message_t * status = msg_utils_createMsgTopic("status",(uint8_t *) str,strlen(str)); 305 | event->ctx->serviceCtx->pipe->pipe->in->publish(event->ctx->serviceCtx->pipe->pipe->in,status); 306 | free(str); 307 | return 0; 308 | } 309 | case PHEV_PING_RESPONSE: 310 | { 311 | LOG_D(TAG,"Ping Event"); 312 | return 0; 313 | } 314 | case PHEV_FILTERED_MESSAGE: 315 | { 316 | LOG_D(TAG,"Filtered message"); 317 | return 0; 318 | } 319 | default: { 320 | LOG_W(TAG,"Unhandled command %d\n",event->type); 321 | return 0; 322 | } 323 | 324 | } 325 | return 0; 326 | } 327 | void main_thread(void * ctx) 328 | { 329 | phev_start((phevCtx_t *) ctx); 330 | } 331 | 332 | static int times = 0; 333 | static bool waiting = false; 334 | 335 | void refreshCallback(phev_pipe_ctx_t *ctx, uint8_t reg, void *customCtx) 336 | { 337 | waiting = false; 338 | 339 | LOG_I(TAG,"******REFRESH ACK************** REG %02X %d",reg,times++); 340 | } 341 | void main_phev_start(bool init, uint64_t * mac,char * deviceId) 342 | { 343 | phevCtx_t * ctx; 344 | const char * host = CONFIG_CAR_HOST_IP; 345 | const uint16_t port = CONFIG_CAR_HOST_PORT; 346 | 347 | mqttSettings_t mqtt_settings = { 348 | .url = CONFIG_MQTT_BROKER_URI, 349 | .topic_prefix = CONFIG_MQTT_TOPIC_PREFIX, 350 | .device_id = deviceId, 351 | .incoming_topic = CONFIG_MQTT_COMMANDS_TOPIC, 352 | .outgoing_topic = CONFIG_MQTT_EVENTS_TOPIC, 353 | .status_topic = CONFIG_MQTT_STATUS_TOPIC, 354 | .ctx = nvsHandle, 355 | }; 356 | 357 | 358 | messagingClient_t * in_client = msg_mqtt_createMqttClient(mqtt_settings); 359 | 360 | phevSettings_t settings = { 361 | .host = host, 362 | .mac = mac, 363 | .port = port, 364 | .registerDevice = init, 365 | .handler = main_eventHandler, 366 | .in = in_client, 367 | 368 | #ifdef MY18 369 | .my18 = true, 370 | #endif 371 | }; 372 | 373 | if(init) 374 | { 375 | LOG_I(TAG,"Registering"); 376 | ctx = phev_registerDevice(settings); 377 | } else { 378 | LOG_I(TAG,"Already Registered"); 379 | ctx = phev_init(settings); 380 | } 381 | 382 | LOG_I(TAG,"Starting thread"); 383 | xTaskCreate( main_thread, "Main thread task", 8192 , (void *) ctx, tskIDLE_PRIORITY, NULL ); 384 | 385 | uint8_t lastPing = 0; 386 | uint8_t timeout = 0; 387 | int last = -1; 388 | while(true) 389 | { 390 | 391 | #ifdef CONFIG_SHOW_DEBUG_INFO 392 | LOG_I(TAG,"*********** Free heap %ul",xPortGetFreeHeapSize()); 393 | LOG_I(TAG,">>>>>>>>> Ping %02X", ctx->serviceCtx->pipe->pingResponse); 394 | LOG_I(TAG,"*********** Last command time %lld - Current time %lld", lastResponseTime,esp_timer_get_time()); 395 | #endif 396 | vTaskDelay(1000 / portTICK_PERIOD_MS); 397 | 398 | if(esp_timer_get_time() > (lastResponseTime + 1000000)) 399 | { 400 | if(timeout == CONFIG_PING_TIMEOUT) 401 | { 402 | LOG_E(TAG,"Ping timeout rebooting"); 403 | vTaskDelay(1000 / portTICK_PERIOD_MS); 404 | esp_restart(); 405 | } 406 | else 407 | { 408 | timeout ++; 409 | } 410 | } 411 | else 412 | { 413 | timeout = 0; 414 | } 415 | } 416 | 417 | } 418 | 419 | 420 | void app_main() 421 | { 422 | esp_app_desc_t * app = esp_ota_get_app_description(); 423 | 424 | g_version = app->version; 425 | LOG_I(TAG,"PHEV TTGO Version %s",app->version); 426 | char * deviceId = NULL; 427 | 428 | uint8_t mac[6]; 429 | 430 | uint8_t registered = false; 431 | 432 | uint8_t forceota = false; 433 | 434 | #ifdef CONFIG_CUSTOM_MAC 435 | uint8_t custom_mac[6]; 436 | 437 | custom_mac[0] = ((uint8_t) (CONFIG_CUSTOM_MAC_ADDR >> 40) & 0xff); 438 | custom_mac[1] = ((uint8_t) (CONFIG_CUSTOM_MAC_ADDR >> 32) & 0xff); 439 | custom_mac[2] = ((uint8_t) (CONFIG_CUSTOM_MAC_ADDR >> 24) & 0xff); 440 | custom_mac[3] = ((uint8_t) (CONFIG_CUSTOM_MAC_ADDR >> 16) & 0xff); 441 | custom_mac[4] = ((uint8_t) (CONFIG_CUSTOM_MAC_ADDR >> 8) & 0xff); 442 | custom_mac[5] = (uint8_t) CONFIG_CUSTOM_MAC_ADDR & 0xff; 443 | LOG_I(TAG,"Custom MAC %02x%02x%02x%02x%02x%02x", 444 | (uint8_t) custom_mac[0], 445 | (uint8_t) custom_mac[1], 446 | (uint8_t) custom_mac[2], 447 | (uint8_t) custom_mac[3], 448 | (uint8_t) custom_mac[4], 449 | (uint8_t) custom_mac[5]); 450 | 451 | esp_base_mac_addr_set(custom_mac); 452 | #else 453 | esp_efuse_mac_get_default(&mac); 454 | #endif 455 | init_nvs(); 456 | 457 | esp_err_t err = nvs_open("phev_store", NVS_READWRITE, &nvsHandle); 458 | 459 | err = nvs_get_u8(nvsHandle,"registered", ®istered); 460 | 461 | if(err == ESP_ERR_NVS_NOT_FOUND) 462 | { 463 | LOG_I(TAG,"Car not registered with this device"); 464 | err = nvs_set_u8(nvsHandle,"registered",registered); 465 | } 466 | 467 | err = nvs_get_u8(nvsHandle,"forceota", &forceota); 468 | 469 | if(err != ESP_ERR_NVS_NOT_FOUND) 470 | { 471 | if(forceota) 472 | { 473 | LOG_I(TAG,"OTA has been forced"); 474 | 475 | nvs_set_u8(nvsHandle,"forceota",false); 476 | 477 | ota_do_firmware_upgrade(CONFIG_FIRMWARE_UPGRADE_URL,CONFIG_FIRMWARE_FALLBACK_URL); 478 | } 479 | } 480 | 481 | #ifdef CONFIG_CUSTOM_DEVICE_ID 482 | deviceId = strdup(CONFIG_CUSTOM_DEVICE_ID); 483 | #else 484 | asprintf(&deviceId, "%02x%02x%02x%02x%02x%02x",(unsigned char) mac[0], (unsigned char) mac[1],(unsigned char) mac[2], (unsigned char) mac[3], (unsigned char) mac[4], (unsigned char) mac[5]); 485 | #endif 486 | LOG_I(TAG,"Device ID %s",deviceId); 487 | #ifdef MY18 488 | LOG_I(TAG,"MY18"); 489 | #endif 490 | 491 | initTTGoSIM(); 492 | 493 | //esp_netif_init(); 494 | 495 | wifi_conn_init(); 496 | 497 | ppp_start_app(); 498 | 499 | obtain_time(); 500 | 501 | #ifdef CONFIG_FIRMWARE_OTA 502 | 503 | LOG_I(TAG,"OTA Switched on in config, checking for latest version"); 504 | char * versionString = ota_get_latest_version(CONFIG_FIRMWARE_VERSION_URL,CONFIG_FIRMWARE_FALLBACK_VERSION_URL); 505 | 506 | if(versionString == NULL) 507 | { 508 | LOG_W(TAG,"Could not get latest version from %s or %s",CONFIG_FIRMWARE_VERSION_URL,CONFIG_FIRMWARE_FALLBACK_VERSION_URL); 509 | } 510 | else 511 | { 512 | if(strncmp(versionString,app->version,strlen(app->version)) != 0) 513 | { 514 | LOG_I(TAG,"Found another version of firmware, upgrading from %s to %s",app->version,versionString); 515 | ota_do_firmware_upgrade(CONFIG_FIRMWARE_UPGRADE_URL,CONFIG_FIRMWARE_FALLBACK_URL); 516 | } 517 | else 518 | { 519 | LOG_I(TAG,"Firmware at latest version"); 520 | } 521 | } 522 | #else 523 | LOG_I(TAG,"OTA Switched off in config"); 524 | #endif 525 | 526 | main_phev_start(!registered,mac,deviceId); 527 | 528 | } 529 | -------------------------------------------------------------------------------- /main/mqtt.c: -------------------------------------------------------------------------------- 1 | #include "esp_system.h" 2 | #include "mqtt_client.h" 3 | #include "esp_log.h" 4 | #include "msg_core.h" 5 | #include "msg_utils.h" 6 | #include "mqtt.h" 7 | #include "lwip/netif.h" 8 | #include "freertos/event_groups.h" 9 | #include "ota.h" 10 | #include "sdkconfig.h" 11 | #include "nvs.h" 12 | #include "nvs_flash.h" 13 | 14 | 15 | extern const uint8_t mqtt_phev_remote_com_pem_start[] asm("_binary_phevremote_pem_start"); 16 | extern const uint8_t mqtt_phev_remote_com_pem_end[] asm("_binary_phevremote_pem_end"); 17 | 18 | const static char *APP_TAG = "MQTT"; 19 | 20 | const static int CONNECTED_BIT = BIT0; 21 | 22 | static char * CONTROL_TOPIC; 23 | 24 | static char * STATUS_TOPIC; 25 | 26 | static char * TOPIC_PREFIX; 27 | 28 | static EventGroupHandle_t mqtt_event_group; 29 | 30 | message_t * msg_mqtt_incomingHandler(messagingClient_t *client) 31 | { 32 | return NULL; 33 | } 34 | 35 | void msg_mqtt_asyncIncomingHandler(messagingClient_t *client, message_t *message) 36 | { 37 | msg_core_call_subs(client, message); 38 | } 39 | static esp_err_t mqtt_event_handler(esp_mqtt_event_handle_t event) 40 | { 41 | esp_mqtt_client_handle_t client = event->client; 42 | int msg_id; 43 | mqtt_ctx_t * ctx = (mqtt_ctx_t *) event->user_context; 44 | switch (event->event_id) { 45 | case MQTT_EVENT_CONNECTED: 46 | ESP_LOGI(APP_TAG, "MQTT_EVENT_CONNECTED"); 47 | 48 | msg_id = esp_mqtt_client_subscribe(client, ctx->incoming_topic, 0); 49 | ESP_LOGI(APP_TAG, "sent subscribe successful to %s msg_id=%d", ctx->incoming_topic,msg_id); 50 | ctx->messagingClient->connected = 1; 51 | xEventGroupSetBits(mqtt_event_group, CONNECTED_BIT); 52 | msg_id = esp_mqtt_client_subscribe(client, CONTROL_TOPIC, 0); 53 | ESP_LOGI(APP_TAG, "sent subscribe successful to %s msg_id=%d", CONTROL_TOPIC,msg_id); 54 | 55 | break; 56 | case MQTT_EVENT_DISCONNECTED: 57 | ESP_LOGI(APP_TAG, "MQTT_EVENT_DISCONNECTED"); 58 | //esp_mqtt_client_reconnect(client); 59 | ctx->messagingClient->connected = 0; 60 | 61 | esp_mqtt_client_start(client); 62 | break; 63 | 64 | case MQTT_EVENT_SUBSCRIBED: 65 | break; 66 | case MQTT_EVENT_UNSUBSCRIBED: 67 | ESP_LOGI(APP_TAG, "MQTT_EVENT_UNSUBSCRIBED, msg_id=%d", event->msg_id); 68 | break; 69 | case MQTT_EVENT_PUBLISHED: 70 | ESP_LOGI(APP_TAG, "MQTT_EVENT_PUBLISHED, msg_id=%d", event->msg_id); 71 | break; 72 | case MQTT_EVENT_DATA: 73 | ESP_LOGI(APP_TAG, "MQTT_EVENT_DATA"); 74 | if(strncmp(event->topic,CONTROL_TOPIC,strlen(CONTROL_TOPIC)) == 0) 75 | { 76 | 77 | if(event->data_len == 0) 78 | { 79 | LOG_I(APP_TAG,"Control topic - restarting"); 80 | vTaskDelay(2000 / portTICK_PERIOD_MS); 81 | esp_restart(); 82 | } 83 | if(strncmp(event->data,OTA_FORCE,strlen(OTA_FORCE)) == 0) 84 | { 85 | LOG_I(APP_TAG,"Forced OTA"); 86 | nvs_set_u8(ctx->ctx,"forceota",true); 87 | vTaskDelay(2000 / portTICK_PERIOD_MS); 88 | esp_restart(); 89 | } 90 | 91 | } else { 92 | message_t * msg = msg_utils_createMsgTopic(event->topic,(uint8_t *) event->data,event->data_len); 93 | msg_mqtt_asyncIncomingHandler(ctx->messagingClient,msg); 94 | 95 | } 96 | 97 | break; 98 | case MQTT_EVENT_ERROR: 99 | ESP_LOGI(APP_TAG, "MQTT_EVENT_ERROR"); 100 | break; 101 | default: 102 | ESP_LOGI(APP_TAG, "Other event id:%d", event->event_id); 103 | break; 104 | } 105 | return ESP_OK; 106 | } 107 | int msg_mqtt_start(messagingClient_t *client) 108 | { 109 | return 0; 110 | } 111 | int msg_mqtt_stop(messagingClient_t *client) 112 | { 113 | return 0; 114 | } 115 | int msg_mqtt_connect(messagingClient_t *client) 116 | { 117 | mqtt_ctx_t * ctx = (mqtt_ctx_t *) client->ctx; 118 | 119 | LOG_I(APP_TAG,"MQTT connecting to %s",ctx->url); 120 | 121 | esp_mqtt_client_config_t mqtt_cfg = { 122 | .uri = ctx->url, 123 | .event_handle = mqtt_event_handler, 124 | .user_context = (void *) ctx, 125 | }; 126 | 127 | esp_mqtt_client_handle_t mqtt = esp_mqtt_client_init(&mqtt_cfg); 128 | ctx->mqtt = mqtt; 129 | 130 | mqtt_event_group = xEventGroupCreate(); 131 | xEventGroupClearBits(mqtt_event_group, CONNECTED_BIT); 132 | int ret = esp_mqtt_client_start(mqtt); 133 | 134 | xEventGroupWaitBits(mqtt_event_group, CONNECTED_BIT, 135 | false, true, portMAX_DELAY); 136 | LOG_I(APP_TAG,"MQTT connected"); 137 | 138 | return 0; 139 | } 140 | 141 | void msg_mqtt_outgoingHandler(messagingClient_t *client, message_t *message) 142 | { 143 | LOG_V(APP_TAG,"START - outgoingHandler"); 144 | mqtt_ctx_t * ctx = (mqtt_ctx_t *) client->ctx; 145 | 146 | if(client->connected && message->length > 0 && message->data) 147 | { 148 | if(message->topic == NULL) 149 | { 150 | LOG_I(APP_TAG,"mqtt topic %s",ctx->outgoing_topic); 151 | esp_mqtt_client_publish(ctx->mqtt, ctx->outgoing_topic, (char *) message->data, message->length, 1, 0); 152 | } else { 153 | char * topic; 154 | asprintf(&topic,"%s/%s",TOPIC_PREFIX,message->topic); 155 | LOG_I(APP_TAG,"mqtt topic %s",topic); 156 | esp_mqtt_client_publish(ctx->mqtt, topic, (char *) message->data, message->length, 1, 0); 157 | } 158 | 159 | } 160 | LOG_V(APP_TAG,"END - outgoingHandler"); 161 | //return ret; 162 | } 163 | messagingClient_t * msg_mqtt_createMqttClient(mqttSettings_t settings) 164 | { 165 | LOG_V(APP_TAG,"START - createMqttClient"); 166 | 167 | messagingSettings_t clientSettings; 168 | 169 | mqtt_ctx_t * ctx = malloc(sizeof(mqtt_ctx_t)); 170 | //msg_mqtt_t * mqtt_ctx = malloc(sizeof(msg_mqtt_t)); 171 | 172 | ctx->url = strdup(settings.url); 173 | 174 | asprintf(&ctx->incoming_topic,"%s/%s/%s",settings.topic_prefix,settings.device_id,settings.incoming_topic); 175 | asprintf(&ctx->outgoing_topic,"%s/%s/%s",settings.topic_prefix,settings.device_id,settings.outgoing_topic); 176 | asprintf(&CONTROL_TOPIC,"%s/%s/control",settings.topic_prefix,settings.device_id); 177 | asprintf(&STATUS_TOPIC,"%s/%s/%s",settings.topic_prefix,settings.device_id,settings.status_topic); 178 | asprintf(&TOPIC_PREFIX,"%s/%s",settings.topic_prefix,settings.device_id); 179 | 180 | LOG_I(APP_TAG,"Incoming Topic %s : Outgoing Topic %s : Control Topic %s : Status topic %s",ctx->incoming_topic,ctx->outgoing_topic,CONTROL_TOPIC, STATUS_TOPIC); 181 | 182 | // ctx->incoming_topic = strdup(settings.incoming_topic); 183 | // ctx->outgoing_topic = strdup(settings.outgoing_topic); 184 | 185 | LOG_D(APP_TAG,"Addr of incoming handler %p", msg_mqtt_incomingHandler); 186 | 187 | clientSettings.incomingHandler = msg_mqtt_incomingHandler; 188 | clientSettings.outgoingHandler = msg_mqtt_outgoingHandler; 189 | 190 | clientSettings.start = NULL; 191 | clientSettings.stop = NULL; 192 | clientSettings.connect = msg_mqtt_connect; 193 | 194 | clientSettings.ctx = (void *) ctx; 195 | ctx->ctx = settings.ctx; 196 | 197 | messagingClient_t * client = msg_core_createMessagingClient(clientSettings); 198 | 199 | ctx->messagingClient = client; 200 | 201 | LOG_V(APP_TAG,"END - createMqttClient"); 202 | 203 | return client; 204 | 205 | } -------------------------------------------------------------------------------- /main/mqtt.h: -------------------------------------------------------------------------------- 1 | #ifndef _MQTT_H_ 2 | #define _MQTT_H_ 3 | 4 | #include "mqtt_client.h" 5 | #include "msg_core.h" 6 | 7 | typedef struct mqttSettings_t 8 | { 9 | char * url; 10 | char * incoming_topic; 11 | char * outgoing_topic; 12 | char * status_topic; 13 | char * topic_prefix; 14 | char * device_id; 15 | void * ctx; 16 | } mqttSettings_t; 17 | 18 | typedef struct mqtt_ctx_t 19 | { 20 | char * url; 21 | char * incoming_topic; 22 | char * outgoing_topic; 23 | messagingClient_t * messagingClient; 24 | esp_mqtt_client_handle_t mqtt; 25 | void * ctx; 26 | 27 | 28 | } mqtt_ctx_t; 29 | 30 | messagingClient_t * msg_mqtt_createMqttClient(mqttSettings_t settings); 31 | message_t * msg_mqtt_incomingHandler(messagingClient_t *client); 32 | void msg_mqtt_outgoingHandler(messagingClient_t *client, message_t *message); 33 | 34 | #endif -------------------------------------------------------------------------------- /main/ota.c: -------------------------------------------------------------------------------- 1 | #include "esp_system.h" 2 | #include "esp_wifi.h" 3 | //#include "esp_event_loop.h" 4 | //#include "freertos/event_groups.h" 5 | #include "esp_event.h" 6 | #include "esp_log.h" 7 | #include "esp_ota_ops.h" 8 | #include "esp_http_client.h" 9 | #include "esp_https_ota.h" 10 | #include "ota.h" 11 | #include "logger.h" 12 | #include "string.h" 13 | 14 | const static char * APP_TAG = "OTA"; 15 | 16 | extern const uint8_t server_cert_pem_start[] asm("_binary_fullchain_pem_start"); 17 | extern const uint8_t server_cert_pem_end[] asm("_binary_fullchain_pem_end"); 18 | 19 | esp_err_t ota_http_event_handle(esp_http_client_event_t *evt) 20 | { 21 | switch(evt->event_id) { 22 | case HTTP_EVENT_ERROR: 23 | LOG_D(APP_TAG, "HTTP_EVENT_ERROR"); 24 | break; 25 | case HTTP_EVENT_ON_CONNECTED: 26 | LOG_D(APP_TAG, "HTTP_EVENT_ON_CONNECTED"); 27 | break; 28 | case HTTP_EVENT_HEADER_SENT: 29 | LOG_D(APP_TAG, "HTTP_EVENT_HEADER_SENT"); 30 | break; 31 | case HTTP_EVENT_ON_HEADER: 32 | LOG_D(APP_TAG, "HTTP_EVENT_ON_HEADER"); 33 | printf("%.*s", evt->data_len, (char*)evt->data); 34 | break; 35 | case HTTP_EVENT_ON_DATA: 36 | LOG_D(APP_TAG, "HTTP_EVENT_ON_DATA, len=%d", evt->data_len); 37 | if (!esp_http_client_is_chunked_response(evt->client)) { 38 | if(evt->data_len > 31) 39 | { 40 | LOG_E(APP_TAG,"Version data lenth too long"); 41 | } 42 | else 43 | { 44 | memset(evt->data + evt->data_len,0,32 - evt->data_len); 45 | LOG_D(APP_TAG,"Version %s",(char *) evt->data); 46 | strncpy(evt->user_data,(char *) evt->data, evt->data_len); 47 | LOG_D(APP_TAG,"Returning version %s",(char *) evt->user_data); 48 | } 49 | 50 | } 51 | 52 | break; 53 | case HTTP_EVENT_ON_FINISH: 54 | LOG_I(APP_TAG, "HTTP_EVENT_ON_FINISH"); 55 | break; 56 | case HTTP_EVENT_DISCONNECTED: 57 | LOG_I(APP_TAG, "HTTP_EVENT_DISCONNECTED"); 58 | break; 59 | } 60 | return ESP_OK; 61 | } 62 | 63 | 64 | esp_http_client_handle_t ota_get_config(const char * url, char * data) 65 | { 66 | esp_http_client_config_t config = { 67 | .url = url, 68 | .event_handler = ota_http_event_handle, 69 | .user_data = data, 70 | .cert_pem = (char *)server_cert_pem_start, 71 | }; 72 | esp_http_client_handle_t client = esp_http_client_init(&config); 73 | return client; 74 | 75 | } 76 | char * ota_get_latest_version(const char * url, const char * fallbackUrl) 77 | { 78 | char version[32]; 79 | 80 | memset(version,0,sizeof(version)); 81 | 82 | esp_http_client_handle_t client = ota_get_config(url,version); 83 | 84 | esp_err_t err = esp_http_client_perform(client); 85 | 86 | if (err == ESP_OK) 87 | { 88 | int status = esp_http_client_get_status_code(client); 89 | 90 | LOG_I(APP_TAG, "Status = %d, content_length = %d", 91 | status, 92 | esp_http_client_get_content_length(client)); 93 | if(status == 200) 94 | { 95 | LOG_I(APP_TAG,"Latest version %s",version); 96 | 97 | esp_http_client_cleanup(client); 98 | return strdup(version); 99 | } 100 | else 101 | { 102 | if(status == 404) 103 | { 104 | LOG_W(APP_TAG,"Cannot find specific car version txt : %s",url); 105 | 106 | esp_http_client_handle_t client = ota_get_config(fallbackUrl,version); 107 | 108 | esp_err_t err = esp_http_client_perform(client); 109 | 110 | if (err == ESP_OK) 111 | { 112 | status = esp_http_client_get_status_code(client); 113 | if(status == 200) 114 | { 115 | LOG_I(APP_TAG,"Default version %s",version); 116 | esp_http_client_cleanup(client); 117 | return strdup(version); 118 | } 119 | LOG_E(APP_TAG,"Cannot get default version"); 120 | } 121 | } 122 | else 123 | { 124 | LOG_E(APP_TAG,"OTA http failure %d",status); 125 | } 126 | } 127 | } 128 | return NULL; 129 | } 130 | esp_err_t ota_do_firmware_upgrade(const char * url, const char * fallbackUrl) 131 | { 132 | LOG_V(APP_TAG,"START - Performing firmware upgrade"); 133 | esp_http_client_config_t config = { 134 | .url = url, 135 | .cert_pem = (char *)server_cert_pem_start, 136 | }; 137 | esp_err_t ret = esp_https_ota(&config); 138 | if (ret == ESP_OK) { 139 | LOG_I(APP_TAG,"Firmware upgraded - restarting"); 140 | 141 | esp_restart(); 142 | } else { 143 | esp_http_client_config_t config = { 144 | .url = fallbackUrl, 145 | .cert_pem = (char *)server_cert_pem_start, 146 | }; 147 | esp_err_t ret = esp_https_ota(&config); 148 | if (ret == ESP_OK) { 149 | LOG_I(APP_TAG,"Firmware upgraded to default firmware- restarting"); 150 | 151 | esp_restart(); 152 | } 153 | LOG_E(APP_TAG,"Cannot upgrade firmware"); 154 | 155 | } 156 | 157 | LOG_V(APP_TAG,"END - Performing firmware upgrade"); 158 | 159 | return ESP_OK; 160 | } -------------------------------------------------------------------------------- /main/ota.h: -------------------------------------------------------------------------------- 1 | 2 | #ifndef OTA_FORCE 3 | #define OTA_FORCE "otaforce" 4 | #endif 5 | 6 | esp_err_t ota_do_firmware_upgrade(const char * url,const char * fallbackUrl); 7 | char * ota_get_latest_version(const char * url, const char * fallbackUrl); -------------------------------------------------------------------------------- /main/ppp.c: -------------------------------------------------------------------------------- 1 | /* PPPoS Client Example with GSM (tested with Telit GL865-DUAL-V3) 2 | 3 | This example code is in the Public Domain (or CC0 licensed, at your option.) 4 | 5 | Unless required by applicable law or agreed to in writing, this 6 | software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR 7 | CONDITIONS OF ANY KIND, either express or implied. 8 | */ 9 | #include 10 | #include "freertos/FreeRTOS.h" 11 | #include "freertos/task.h" 12 | #include "freertos/event_groups.h" 13 | #include "esp_system.h" 14 | #include "esp_wifi.h" 15 | #include "esp_event_loop.h" 16 | #include "esp_log.h" 17 | #include "nvs_flash.h" 18 | 19 | #include "driver/uart.h" 20 | 21 | #include "netif/ppp/pppos.h" 22 | #include "netif/ppp/pppapi.h" 23 | #include "lwip/err.h" 24 | #include "lwip/sockets.h" 25 | #include "lwip/sys.h" 26 | #include "lwip/netdb.h" 27 | #include "lwip/dns.h" 28 | #include "driver/gpio.h" 29 | #include "logger.h" 30 | #include "ppp.h" 31 | 32 | 33 | 34 | /* The examples use simple GSM configuration that you can set via 35 | 'make menuconfig'. 36 | */ 37 | #define BUF_SIZE (1024) 38 | #define GSM_TIMEOUT (5000) 39 | 40 | /* Pins used for serial communication with GSM module */ 41 | #define UART1_TX_PIN (GPIO_NUM_27) 42 | #define UART1_RX_PIN (GPIO_NUM_26) 43 | #define UART1_RTS_PIN 0 44 | #define UART1_CTS_PIN 0 45 | 46 | #define PPP_APN CONFIG_PPP_APN 47 | #define PPP_USER CONFIG_PPP_USER 48 | #define PPP_PASS CONFIG_PPP_PASS 49 | 50 | /* UART */ 51 | int uart_num = UART_NUM_1; 52 | 53 | const static int CONNECTED_BIT = BIT0; 54 | static EventGroupHandle_t ppp_event_group; 55 | 56 | /* The PPP control block */ 57 | ppp_pcb *ppp; 58 | 59 | /* The PPP IP interface */ 60 | struct netif ppp_netif; 61 | 62 | static const char *TAG = "PPP"; 63 | 64 | typedef struct { 65 | const char *cmd; 66 | uint16_t cmdSize; 67 | const char *cmdResponseOnOk; 68 | uint32_t timeoutMs; 69 | } GSM_Cmd; 70 | 71 | #define GSM_OK_Str "OK" 72 | 73 | #define CONN_STR "AT+CGDCONT=1,\"IP\",\"" PPP_APN "\"\r" 74 | 75 | GSM_Cmd GSM_MGR_InitCmds[] = { 76 | { 77 | .cmd = "AT\r", 78 | .cmdSize = sizeof("AT\r") - 1, 79 | .cmdResponseOnOk = GSM_OK_Str, 80 | .timeoutMs = GSM_TIMEOUT, 81 | }, 82 | { 83 | .cmd = "ATE0\r", 84 | .cmdSize = sizeof("ATE0\r") - 1, 85 | .cmdResponseOnOk = GSM_OK_Str, 86 | .timeoutMs = GSM_TIMEOUT, 87 | }, 88 | { 89 | .cmd = "AT+CPIN?\r", 90 | .cmdSize = sizeof("AT+CPIN?\r") - 1, 91 | .cmdResponseOnOk = "CPIN: READY", 92 | .timeoutMs = GSM_TIMEOUT, 93 | }, 94 | { 95 | //AT+CGDCONT=1,"IP","apn" 96 | .cmd = CONN_STR, 97 | .cmdSize = sizeof(CONN_STR) - 1, 98 | .cmdResponseOnOk = GSM_OK_Str, 99 | .timeoutMs = GSM_TIMEOUT, 100 | }, 101 | { 102 | .cmd = "ATDT*99***1#\r", 103 | .cmdSize = sizeof("ATDT*99***1#\r") - 1, 104 | .cmdResponseOnOk = "CONNECT", 105 | .timeoutMs = GSM_TIMEOUT, 106 | } 107 | }; 108 | 109 | #define GSM_MGR_InitCmdsSize (sizeof(GSM_MGR_InitCmds)/sizeof(GSM_Cmd)) 110 | 111 | /* PPP status callback example */ 112 | static void ppp_status_cb(ppp_pcb *pcb, int err_code, void *ctx) 113 | { 114 | struct netif *pppif = ppp_netif(pcb); 115 | LWIP_UNUSED_ARG(ctx); 116 | 117 | switch (err_code) { 118 | case PPPERR_NONE: { 119 | 120 | LOG_D(TAG, "status_cb: Connected\n"); 121 | #if PPP_IPV4_SUPPORT 122 | LOG_D(TAG, " our_ipaddr = %s\n", ipaddr_ntoa(&pppif->ip_addr)); 123 | LOG_D(TAG, " his_ipaddr = %s\n", ipaddr_ntoa(&pppif->gw)); 124 | LOG_D(TAG, " netmask = %s\n", ipaddr_ntoa(&pppif->netmask)); 125 | #endif /* PPP_IPV4_SUPPORT */ 126 | #if PPP_IPV6_SUPPORT 127 | LOG_D(TAG, " our6_ipaddr = %s\n", ip6addr_ntoa(netif_ip6_addr(pppif, 0))); 128 | #endif /* PPP_IPV6_SUPPORT */ 129 | 130 | ip_addr_t dnsserver; 131 | IP_ADDR4( &dnsserver,8,8,8,8); 132 | dns_setserver(0, &dnsserver); 133 | xEventGroupSetBits(ppp_event_group, CONNECTED_BIT); 134 | break; 135 | } 136 | case PPPERR_PARAM: { 137 | LOG_E(TAG, "status_cb: Invalid parameter\n"); 138 | break; 139 | } 140 | case PPPERR_OPEN: { 141 | LOG_E(TAG, "status_cb: Unable to open PPP session\n"); 142 | break; 143 | } 144 | case PPPERR_DEVICE: { 145 | LOG_E(TAG, "status_cb: Invalid I/O device for PPP\n"); 146 | break; 147 | } 148 | case PPPERR_ALLOC: { 149 | LOG_E(TAG, "status_cb: Unable to allocate resources\n"); 150 | break; 151 | } 152 | case PPPERR_USER: { 153 | LOG_E(TAG, "status_cb: User interrupt\n"); 154 | break; 155 | } 156 | case PPPERR_CONNECT: { 157 | LOG_E(TAG, "status_cb: Connection lost\n"); 158 | esp_restart(); 159 | break; 160 | } 161 | case PPPERR_AUTHFAIL: { 162 | LOG_E(TAG, "status_cb: Failed authentication challenge\n"); 163 | break; 164 | } 165 | case PPPERR_PROTOCOL: { 166 | LOG_E(TAG, "status_cb: Failed to meet protocol\n"); 167 | break; 168 | } 169 | case PPPERR_PEERDEAD: { 170 | LOG_E(TAG, "status_cb: Connection timeout\n"); 171 | break; 172 | } 173 | case PPPERR_IDLETIMEOUT: { 174 | LOG_E(TAG, "status_cb: Idle Timeout\n"); 175 | break; 176 | } 177 | case PPPERR_CONNECTTIME: { 178 | LOG_E(TAG, "status_cb: Max connect time reached\n"); 179 | break; 180 | } 181 | case PPPERR_LOOPBACK: { 182 | LOG_E(TAG, "status_cb: Loopback detected\n"); 183 | break; 184 | } 185 | default: { 186 | LOG_E(TAG, "status_cb: Unknown error code %d\n", err_code); 187 | break; 188 | } 189 | } 190 | 191 | /* 192 | * This should be in the switch case, this is put outside of the switch 193 | * case for example readability. 194 | */ 195 | 196 | if (err_code == PPPERR_NONE) { 197 | return; 198 | } 199 | 200 | /* ppp_close() was previously called, don't reconnect */ 201 | if (err_code == PPPERR_USER) { 202 | /* ppp_free(); -- can be called here */ 203 | return; 204 | } 205 | 206 | 207 | /* 208 | * Try to reconnect in 30 seconds, if you need a modem chatscript you have 209 | * to do a much better signaling here ;-) 210 | */ 211 | //ppp_connect(pcb, 30); 212 | /* OR ppp_listen(pcb); */ 213 | } 214 | 215 | static u32_t ppp_output_callback(ppp_pcb *pcb, u8_t *data, u32_t len, void *ctx) 216 | { 217 | LOG_D(TAG, "PPP tx len %d", len); 218 | return uart_write_bytes(uart_num, (const char *)data, len); 219 | } 220 | 221 | static void pppos_client_task() 222 | { 223 | 224 | //vTaskDelay(10000 / portTICK_PERIOD_MS); 225 | char *data = (char *) malloc(BUF_SIZE); 226 | uart_config_t uart_config = { 227 | .baud_rate = 115200, 228 | .data_bits = UART_DATA_8_BITS, 229 | .parity = UART_PARITY_DISABLE, 230 | .stop_bits = UART_STOP_BITS_1, 231 | .flow_ctrl = UART_HW_FLOWCTRL_DISABLE, 232 | }; 233 | //Configure UART1 parameters 234 | uart_param_config(uart_num, &uart_config); 235 | 236 | // Configure UART1 pins (as set in example's menuconfig) 237 | LOG_D(TAG, "Configuring UART1 GPIOs: TX:%d RX:%d RTS:%d CTS: %d", 238 | UART1_TX_PIN, UART1_RX_PIN, UART1_RTS_PIN, UART1_CTS_PIN); 239 | uart_set_pin(uart_num, UART1_TX_PIN, UART1_RX_PIN, UART1_RTS_PIN, UART1_CTS_PIN); 240 | uart_driver_install(uart_num, BUF_SIZE * 2, BUF_SIZE * 2, 0, NULL, 0); 241 | 242 | while (1) { 243 | //init gsm 244 | int gsmCmdIter = 0; 245 | while (1) { 246 | LOG_D(TAG, "%s", GSM_MGR_InitCmds[gsmCmdIter].cmd); 247 | uart_write_bytes(uart_num, (const char *)GSM_MGR_InitCmds[gsmCmdIter].cmd, 248 | GSM_MGR_InitCmds[gsmCmdIter].cmdSize); 249 | 250 | int timeoutCnt = 0; 251 | while (1) { 252 | memset(data, 0, BUF_SIZE); 253 | int len = uart_read_bytes(uart_num, (uint8_t *)data, BUF_SIZE, 500 / portTICK_RATE_MS); 254 | if (len > 0) { 255 | LOG_D(TAG, "%s", data); 256 | } 257 | 258 | timeoutCnt += 500; 259 | if (strstr(data, GSM_MGR_InitCmds[gsmCmdIter].cmdResponseOnOk) != NULL) { 260 | break; 261 | } 262 | 263 | if (timeoutCnt > GSM_MGR_InitCmds[gsmCmdIter].timeoutMs) { 264 | LOG_E(TAG, "Gsm Init Error"); 265 | return; 266 | } 267 | } 268 | gsmCmdIter++; 269 | 270 | if (gsmCmdIter >= GSM_MGR_InitCmdsSize) { 271 | break; 272 | } 273 | } 274 | 275 | LOG_I(TAG, "Gsm init end"); 276 | 277 | ppp = pppapi_pppos_create(&ppp_netif, 278 | ppp_output_callback, ppp_status_cb, NULL); 279 | 280 | LOG_I(TAG, "After pppapi_pppos_create"); 281 | 282 | if (ppp == NULL) { 283 | LOG_E(TAG, "Error init pppos"); 284 | return; 285 | } 286 | 287 | pppapi_set_default(ppp); 288 | 289 | LOG_D(TAG, "After pppapi_set_default"); 290 | 291 | pppapi_set_auth(ppp, PPPAUTHTYPE_PAP, PPP_USER, PPP_PASS); 292 | 293 | LOG_D(TAG, "After pppapi_set_auth"); 294 | 295 | pppapi_connect(ppp, 0); 296 | 297 | LOG_D(TAG, "After pppapi_connect"); 298 | 299 | while (1) { 300 | memset(data, 0, BUF_SIZE); 301 | int len = uart_read_bytes(uart_num, (uint8_t *)data, BUF_SIZE, 10 / portTICK_RATE_MS); 302 | if (len > 0) { 303 | LOG_D(TAG, "PPP rx len %d", len); 304 | pppos_input_tcpip(ppp, (u8_t *)data, len); 305 | } 306 | } 307 | 308 | } 309 | } 310 | 311 | void ppp_start_app(void) 312 | { 313 | ppp_event_group = xEventGroupCreate(); 314 | xEventGroupClearBits(ppp_event_group, CONNECTED_BIT); 315 | xTaskCreate(&pppos_client_task, "pppos_client_task", 2048, NULL, 5, NULL); 316 | xEventGroupWaitBits(ppp_event_group, CONNECTED_BIT, 317 | false, true, portMAX_DELAY); 318 | } 319 | -------------------------------------------------------------------------------- /main/ppp.h: -------------------------------------------------------------------------------- 1 | #ifndef _PPP_H_ 2 | #define _PPP_H_ 3 | 4 | void ppp_start_app(void); 5 | 6 | #endif -------------------------------------------------------------------------------- /main/ttgo.c: -------------------------------------------------------------------------------- 1 | #include "ttgo.h" 2 | 3 | void initTTGoSIM(void) 4 | { 5 | gpio_config_t io_conf; 6 | io_conf.mode = GPIO_MODE_OUTPUT; 7 | io_conf.pin_bit_mask = (1ULL<< SIMCARD_RST) | (1ULL<< SIMCARD_PWKEY) | (1ULL << SIM800_POWER_ON); 8 | io_conf.intr_type = GPIO_PIN_INTR_DISABLE; 9 | 10 | gpio_config(&io_conf); 11 | 12 | gpio_set_level(SIMCARD_PWKEY,0); 13 | gpio_set_level(SIMCARD_RST,1); 14 | gpio_set_level(SIM800_POWER_ON,1); 15 | 16 | 17 | } -------------------------------------------------------------------------------- /main/ttgo.h: -------------------------------------------------------------------------------- 1 | #ifndef _TTGO_H_ 2 | #define _TTGO_H_ 3 | 4 | #include "driver/gpio.h" 5 | 6 | #define SIMCARD_RST (GPIO_NUM_5) 7 | #define SIMCARD_PWKEY (GPIO_NUM_4) 8 | #define SIM800_POWER_ON (GPIO_NUM_23) 9 | 10 | void initTTGoSIM(void); 11 | 12 | #endif -------------------------------------------------------------------------------- /pem/fullchain.pem: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE----- 2 | MIIFXDCCBESgAwIBAgISBGAArILa8+X4w64mz9VedKAmMA0GCSqGSIb3DQEBCwUA 3 | MEoxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MSMwIQYDVQQD 4 | ExpMZXQncyBFbmNyeXB0IEF1dGhvcml0eSBYMzAeFw0yMDA1MTcyMzAwMTNaFw0y 5 | MDA4MTUyMzAwMTNaMB4xHDAaBgNVBAMTE2hhc3Npby5ydW5lc2RhdGEuc2UwggEi 6 | MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDdwWbMdKo4UC/2z7+aDQtdiMhd 7 | zKxGfjB0bxBlQ7i81Yt2ONHOfwyu0vRgj+0z/wsvgYCznLKy/FxNQ4s7lc+VU5y+ 8 | /Ix2q5b+2cO+1tB12MPPM1Gk/jq0pKYSKjQeBvpUggqLv8Q7qUBRrdt1hpFSczci 9 | Nk8+qEbpGHvbGkRLJrhsM0KFPVOM6zYHGomT9ePOoNWCC4YrqKy+O4YUwFICFvE1 10 | RWRhkgEOESepWEyxGDge3WfYqtJ25mDwActEIjXBEU4HEUcY3zQgXKYiFTyEuFzk 11 | 4kJQyCRZiqlEx5SAaaoFNV25fqKCQKwwPksx3yduamlkJzEBAQztf7UeefRdAgMB 12 | AAGjggJmMIICYjAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEG 13 | CCsGAQUFBwMCMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFDgBs+U57cqEZak27Osk 14 | qOu/bCw1MB8GA1UdIwQYMBaAFKhKamMEfd265tE5t6ZFZe/zqOyhMG8GCCsGAQUF 15 | BwEBBGMwYTAuBggrBgEFBQcwAYYiaHR0cDovL29jc3AuaW50LXgzLmxldHNlbmNy 16 | eXB0Lm9yZzAvBggrBgEFBQcwAoYjaHR0cDovL2NlcnQuaW50LXgzLmxldHNlbmNy 17 | eXB0Lm9yZy8wHgYDVR0RBBcwFYITaGFzc2lvLnJ1bmVzZGF0YS5zZTBMBgNVHSAE 18 | RTBDMAgGBmeBDAECATA3BgsrBgEEAYLfEwEBATAoMCYGCCsGAQUFBwIBFhpodHRw 19 | Oi8vY3BzLmxldHNlbmNyeXB0Lm9yZzCCAQIGCisGAQQB1nkCBAIEgfMEgfAA7gB0 20 | AF6nc/nfVsDntTZIfdBJ4DJ6kZoMhKESEoQYdZaBcUVYAAABciUUtjAAAAQDAEUw 21 | QwIfZNV49cGhJHiKjffjfBFfVxweAh6gU7rZRn9zGyJTzQIgJogYLwmaELZA/4gd 22 | uZrLHO3sZ8THeMalw40eRGpy4f0AdgAHt1wb5X1o//Gwxh0jFce65ld8V5S3au68 23 | YToaadOiHAAAAXIlFLZWAAAEAwBHMEUCIFuO0NTvBoPWRmZuSxcwasfowH72LzS8 24 | UFqF1UOoDffXAiEA4ChkYzh8lH2rnlEFI8E68sTKZVExEKgEsx0nFZ+F35owDQYJ 25 | KoZIhvcNAQELBQADggEBAJD1omJ2E2abPWa5xVznhRH2bkllSZYCqNJqktHJNPR2 26 | FThU7Pg+Cx6MQefA9jbsCqlaWYY1b7tg7v3wX/flBB5WTA/D0R5JJ4kDfXDg3axU 27 | Yhe7TDvOBIXwZTM+s/htgDao9yRYCiplzZf9yiTlOo/xLqkrkA7zs+T4b/0WIPoM 28 | uHZZ69xYxb2p1debTwOBPOGOzXhKz7XPodInpyHevm3sd3dogKODuTplGnFX5I+g 29 | 911mbUgVhIboKSncUBLtoOXmwJh1nlte9YBarUea3ZkYl+Ac7aJjSVclzPuzY/X+ 30 | Nrig3Vu9NumlLfSh59PvUJLZIUbdI3zmkuunm8xoqP4= 31 | -----END CERTIFICATE----- 32 | -----BEGIN CERTIFICATE----- 33 | MIIEkjCCA3qgAwIBAgIQCgFBQgAAAVOFc2oLheynCDANBgkqhkiG9w0BAQsFADA/ 34 | MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT 35 | DkRTVCBSb290IENBIFgzMB4XDTE2MDMxNzE2NDA0NloXDTIxMDMxNzE2NDA0Nlow 36 | SjELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUxldCdzIEVuY3J5cHQxIzAhBgNVBAMT 37 | GkxldCdzIEVuY3J5cHQgQXV0aG9yaXR5IFgzMIIBIjANBgkqhkiG9w0BAQEFAAOC 38 | AQ8AMIIBCgKCAQEAnNMM8FrlLke3cl03g7NoYzDq1zUmGSXhvb418XCSL7e4S0EF 39 | q6meNQhY7LEqxGiHC6PjdeTm86dicbp5gWAf15Gan/PQeGdxyGkOlZHP/uaZ6WA8 40 | SMx+yk13EiSdRxta67nsHjcAHJyse6cF6s5K671B5TaYucv9bTyWaN8jKkKQDIZ0 41 | Z8h/pZq4UmEUEz9l6YKHy9v6Dlb2honzhT+Xhq+w3Brvaw2VFn3EK6BlspkENnWA 42 | a6xK8xuQSXgvopZPKiAlKQTGdMDQMc2PMTiVFrqoM7hD8bEfwzB/onkxEz0tNvjj 43 | /PIzark5McWvxI0NHWQWM6r6hCm21AvA2H3DkwIDAQABo4IBfTCCAXkwEgYDVR0T 44 | AQH/BAgwBgEB/wIBADAOBgNVHQ8BAf8EBAMCAYYwfwYIKwYBBQUHAQEEczBxMDIG 45 | CCsGAQUFBzABhiZodHRwOi8vaXNyZy50cnVzdGlkLm9jc3AuaWRlbnRydXN0LmNv 46 | bTA7BggrBgEFBQcwAoYvaHR0cDovL2FwcHMuaWRlbnRydXN0LmNvbS9yb290cy9k 47 | c3Ryb290Y2F4My5wN2MwHwYDVR0jBBgwFoAUxKexpHsscfrb4UuQdf/EFWCFiRAw 48 | VAYDVR0gBE0wSzAIBgZngQwBAgEwPwYLKwYBBAGC3xMBAQEwMDAuBggrBgEFBQcC 49 | ARYiaHR0cDovL2Nwcy5yb290LXgxLmxldHNlbmNyeXB0Lm9yZzA8BgNVHR8ENTAz 50 | MDGgL6AthitodHRwOi8vY3JsLmlkZW50cnVzdC5jb20vRFNUUk9PVENBWDNDUkwu 51 | Y3JsMB0GA1UdDgQWBBSoSmpjBH3duubRObemRWXv86jsoTANBgkqhkiG9w0BAQsF 52 | AAOCAQEA3TPXEfNjWDjdGBX7CVW+dla5cEilaUcne8IkCJLxWh9KEik3JHRRHGJo 53 | uM2VcGfl96S8TihRzZvoroed6ti6WqEBmtzw3Wodatg+VyOeph4EYpr/1wXKtx8/ 54 | wApIvJSwtmVi4MFU5aMqrSDE6ea73Mj2tcMyo5jMd6jmeWUHK8so/joWUoHOUgwu 55 | X4Po1QYz+3dszkDqMp4fklxBwXRsW10KXzPMTZ+sOPAveyxindmjkW8lGy+QsRlG 56 | PfZ+G6Z6h7mjem0Y+iWlkYcV4PIWL1iwBi8saCbGS5jN2p8M+X+Q7UNKEkROb3N6 57 | KOqkqm57TH2H3eDJAkSnh6/DNFu0Qg== 58 | -----END CERTIFICATE----- 59 | -------------------------------------------------------------------------------- /sdkconfig.defaults: -------------------------------------------------------------------------------- 1 | # 2 | # Automatically generated file; DO NOT EDIT. 3 | # Espressif IoT Development Framework Configuration 4 | # 5 | CONFIG_IDF_TARGET="esp32" 6 | 7 | # 8 | # SDK tool configuration 9 | # 10 | CONFIG_TOOLPREFIX="xtensa-esp32-elf-" 11 | CONFIG_MAKE_WARN_UNDEFINED_VARIABLES=y 12 | 13 | # 14 | # Application manager 15 | # 16 | CONFIG_APP_COMPILE_TIME_DATE=y 17 | CONFIG_APP_EXCLUDE_PROJECT_VER_VAR= 18 | CONFIG_APP_EXCLUDE_PROJECT_NAME_VAR= 19 | 20 | # 21 | # Bootloader config 22 | # 23 | CONFIG_LOG_BOOTLOADER_LEVEL_NONE= 24 | CONFIG_LOG_BOOTLOADER_LEVEL_ERROR= 25 | CONFIG_LOG_BOOTLOADER_LEVEL_WARN= 26 | CONFIG_LOG_BOOTLOADER_LEVEL_INFO=y 27 | CONFIG_LOG_BOOTLOADER_LEVEL_DEBUG= 28 | CONFIG_LOG_BOOTLOADER_LEVEL_VERBOSE= 29 | CONFIG_LOG_BOOTLOADER_LEVEL=3 30 | CONFIG_BOOTLOADER_VDDSDIO_BOOST_1_8V= 31 | CONFIG_BOOTLOADER_VDDSDIO_BOOST_1_9V=y 32 | CONFIG_BOOTLOADER_FACTORY_RESET= 33 | CONFIG_BOOTLOADER_APP_TEST= 34 | CONFIG_BOOTLOADER_WDT_ENABLE=y 35 | CONFIG_BOOTLOADER_WDT_DISABLE_IN_USER_CODE= 36 | CONFIG_BOOTLOADER_WDT_TIME_MS=9000 37 | CONFIG_APP_ROLLBACK_ENABLE= 38 | 39 | # 40 | # Security features 41 | # 42 | CONFIG_SECURE_SIGNED_APPS_NO_SECURE_BOOT= 43 | CONFIG_SECURE_BOOT_ENABLED= 44 | CONFIG_FLASH_ENCRYPTION_ENABLED= 45 | 46 | # 47 | # Serial flasher config 48 | # 49 | CONFIG_ESPTOOLPY_BAUD_OTHER_VAL=115200 50 | CONFIG_FLASHMODE_QIO= 51 | CONFIG_FLASHMODE_QOUT= 52 | CONFIG_FLASHMODE_DIO=y 53 | CONFIG_FLASHMODE_DOUT= 54 | CONFIG_ESPTOOLPY_FLASHMODE="dio" 55 | CONFIG_ESPTOOLPY_FLASHFREQ_80M= 56 | CONFIG_ESPTOOLPY_FLASHFREQ_40M=y 57 | CONFIG_ESPTOOLPY_FLASHFREQ_26M= 58 | CONFIG_ESPTOOLPY_FLASHFREQ_20M= 59 | CONFIG_ESPTOOLPY_FLASHFREQ="40m" 60 | CONFIG_ESPTOOLPY_FLASHSIZE_1MB= 61 | CONFIG_ESPTOOLPY_FLASHSIZE_2MB= 62 | CONFIG_ESPTOOLPY_FLASHSIZE_4MB=y 63 | CONFIG_ESPTOOLPY_FLASHSIZE_8MB= 64 | CONFIG_ESPTOOLPY_FLASHSIZE_16MB= 65 | CONFIG_ESPTOOLPY_FLASHSIZE="2MB" 66 | CONFIG_ESPTOOLPY_FLASHSIZE_DETECT=y 67 | CONFIG_ESPTOOLPY_BEFORE_RESET=y 68 | CONFIG_ESPTOOLPY_BEFORE_NORESET= 69 | CONFIG_ESPTOOLPY_BEFORE="default_reset" 70 | CONFIG_ESPTOOLPY_AFTER_RESET=y 71 | CONFIG_ESPTOOLPY_AFTER_NORESET= 72 | CONFIG_ESPTOOLPY_AFTER="hard_reset" 73 | CONFIG_MONITOR_BAUD_9600B= 74 | CONFIG_MONITOR_BAUD_57600B= 75 | CONFIG_MONITOR_BAUD_115200B=y 76 | CONFIG_MONITOR_BAUD_230400B= 77 | CONFIG_MONITOR_BAUD_921600B= 78 | CONFIG_MONITOR_BAUD_2MB= 79 | CONFIG_MONITOR_BAUD_OTHER= 80 | CONFIG_MONITOR_BAUD_OTHER_VAL=115200 81 | CONFIG_MONITOR_BAUD=115200 82 | 83 | # 84 | # PHEV TTGO Config 85 | # 86 | CONFIG_MQTT_BROKER_URI="mqtt://test.mosquitto.org" 87 | 88 | # 89 | # Partition Table 90 | # 91 | CONFIG_PARTITION_TABLE_SINGLE_APP= 92 | CONFIG_PARTITION_TABLE_TWO_OTA=y 93 | CONFIG_PARTITION_TABLE_CUSTOM= 94 | CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partitions.csv" 95 | CONFIG_PARTITION_TABLE_FILENAME="partitions_singleapp.csv" 96 | CONFIG_PARTITION_TABLE_OFFSET=0x8000 97 | CONFIG_PARTITION_TABLE_MD5=y 98 | 99 | # 100 | # Compiler options 101 | # 102 | CONFIG_OPTIMIZATION_LEVEL_DEBUG=y 103 | CONFIG_OPTIMIZATION_LEVEL_RELEASE= 104 | CONFIG_OPTIMIZATION_ASSERTIONS_ENABLED=y 105 | CONFIG_OPTIMIZATION_ASSERTIONS_SILENT= 106 | CONFIG_OPTIMIZATION_ASSERTIONS_DISABLED= 107 | CONFIG_CXX_EXCEPTIONS= 108 | CONFIG_STACK_CHECK_NONE=y 109 | CONFIG_STACK_CHECK_NORM= 110 | CONFIG_STACK_CHECK_STRONG= 111 | CONFIG_STACK_CHECK_ALL= 112 | CONFIG_STACK_CHECK= 113 | CONFIG_WARN_WRITE_STRINGS= 114 | CONFIG_DISABLE_GCC8_WARNINGS= 115 | 116 | # 117 | # Component config 118 | # 119 | 120 | # 121 | # Application Level Tracing 122 | # 123 | CONFIG_ESP32_APPTRACE_DEST_TRAX= 124 | CONFIG_ESP32_APPTRACE_DEST_NONE=y 125 | CONFIG_ESP32_APPTRACE_ENABLE= 126 | CONFIG_ESP32_APPTRACE_LOCK_ENABLE=y 127 | CONFIG_AWS_IOT_SDK= 128 | 129 | # 130 | # Bluetooth 131 | # 132 | CONFIG_BT_ENABLED= 133 | CONFIG_BTDM_CONTROLLER_BLE_MAX_CONN_EFF=0 134 | CONFIG_BTDM_CONTROLLER_BR_EDR_MAX_ACL_CONN_EFF=0 135 | CONFIG_BTDM_CONTROLLER_BR_EDR_MAX_SYNC_CONN_EFF=0 136 | CONFIG_BTDM_CONTROLLER_PINNED_TO_CORE=0 137 | CONFIG_BT_RESERVE_DRAM=0 138 | 139 | # 140 | # Driver configurations 141 | # 142 | 143 | # 144 | # ADC configuration 145 | # 146 | CONFIG_ADC_FORCE_XPD_FSM= 147 | CONFIG_ADC2_DISABLE_DAC=y 148 | 149 | # 150 | # SPI configuration 151 | # 152 | CONFIG_SPI_MASTER_IN_IRAM= 153 | CONFIG_SPI_MASTER_ISR_IN_IRAM=y 154 | CONFIG_SPI_SLAVE_IN_IRAM= 155 | CONFIG_SPI_SLAVE_ISR_IN_IRAM=y 156 | 157 | # 158 | # eFuse Bit Manager 159 | # 160 | CONFIG_EFUSE_CUSTOM_TABLE= 161 | CONFIG_EFUSE_VIRTUAL= 162 | CONFIG_EFUSE_CODE_SCHEME_COMPAT_NONE= 163 | CONFIG_EFUSE_CODE_SCHEME_COMPAT_3_4=y 164 | CONFIG_EFUSE_CODE_SCHEME_COMPAT_REPEAT= 165 | CONFIG_EFUSE_MAX_BLK_LEN=192 166 | 167 | # 168 | # ESP32-specific 169 | # 170 | CONFIG_IDF_TARGET_ESP32=y 171 | CONFIG_ESP32_REV_MIN_0=y 172 | CONFIG_ESP32_REV_MIN_1= 173 | CONFIG_ESP32_REV_MIN_2= 174 | CONFIG_ESP32_REV_MIN_3= 175 | CONFIG_ESP32_REV_MIN=0 176 | CONFIG_ESP32_DPORT_WORKAROUND=y 177 | CONFIG_ESP32_DEFAULT_CPU_FREQ_80= 178 | CONFIG_ESP32_DEFAULT_CPU_FREQ_160=y 179 | CONFIG_ESP32_DEFAULT_CPU_FREQ_240= 180 | CONFIG_ESP32_DEFAULT_CPU_FREQ_MHZ=160 181 | CONFIG_SPIRAM_SUPPORT= 182 | CONFIG_MEMMAP_TRACEMEM= 183 | CONFIG_MEMMAP_TRACEMEM_TWOBANKS= 184 | CONFIG_ESP32_TRAX= 185 | CONFIG_TRACEMEM_RESERVE_DRAM=0x0 186 | CONFIG_TWO_UNIVERSAL_MAC_ADDRESS= 187 | CONFIG_FOUR_UNIVERSAL_MAC_ADDRESS=y 188 | CONFIG_NUMBER_OF_UNIVERSAL_MAC_ADDRESS=4 189 | CONFIG_SYSTEM_EVENT_QUEUE_SIZE=32 190 | CONFIG_SYSTEM_EVENT_TASK_STACK_SIZE=2304 191 | CONFIG_MAIN_TASK_STACK_SIZE=3584 192 | CONFIG_IPC_TASK_STACK_SIZE=1024 193 | CONFIG_TIMER_TASK_STACK_SIZE=3584 194 | CONFIG_NEWLIB_STDOUT_LINE_ENDING_CRLF=y 195 | CONFIG_NEWLIB_STDOUT_LINE_ENDING_LF= 196 | CONFIG_NEWLIB_STDOUT_LINE_ENDING_CR= 197 | CONFIG_NEWLIB_STDIN_LINE_ENDING_CRLF= 198 | CONFIG_NEWLIB_STDIN_LINE_ENDING_LF= 199 | CONFIG_NEWLIB_STDIN_LINE_ENDING_CR=y 200 | CONFIG_NEWLIB_NANO_FORMAT= 201 | CONFIG_CONSOLE_UART_DEFAULT=y 202 | CONFIG_CONSOLE_UART_CUSTOM= 203 | CONFIG_CONSOLE_UART_NONE= 204 | CONFIG_CONSOLE_UART_NUM=0 205 | CONFIG_CONSOLE_UART_BAUDRATE=115200 206 | CONFIG_ULP_COPROC_ENABLED= 207 | CONFIG_ULP_COPROC_RESERVE_MEM=0 208 | CONFIG_ESP32_PANIC_PRINT_HALT= 209 | CONFIG_ESP32_PANIC_PRINT_REBOOT=y 210 | CONFIG_ESP32_PANIC_SILENT_REBOOT= 211 | CONFIG_ESP32_PANIC_GDBSTUB= 212 | CONFIG_ESP32_DEBUG_OCDAWARE=y 213 | CONFIG_ESP32_DEBUG_STUBS_ENABLE=y 214 | CONFIG_INT_WDT=y 215 | CONFIG_INT_WDT_TIMEOUT_MS=300 216 | CONFIG_INT_WDT_CHECK_CPU1=y 217 | CONFIG_TASK_WDT=y 218 | CONFIG_TASK_WDT_PANIC= 219 | CONFIG_TASK_WDT_TIMEOUT_S=5 220 | CONFIG_TASK_WDT_CHECK_IDLE_TASK_CPU0=y 221 | CONFIG_TASK_WDT_CHECK_IDLE_TASK_CPU1=y 222 | CONFIG_BROWNOUT_DET=y 223 | CONFIG_BROWNOUT_DET_LVL_SEL_0=y 224 | CONFIG_BROWNOUT_DET_LVL_SEL_1= 225 | CONFIG_BROWNOUT_DET_LVL_SEL_2= 226 | CONFIG_BROWNOUT_DET_LVL_SEL_3= 227 | CONFIG_BROWNOUT_DET_LVL_SEL_4= 228 | CONFIG_BROWNOUT_DET_LVL_SEL_5= 229 | CONFIG_BROWNOUT_DET_LVL_SEL_6= 230 | CONFIG_BROWNOUT_DET_LVL_SEL_7= 231 | CONFIG_BROWNOUT_DET_LVL=0 232 | CONFIG_REDUCE_PHY_TX_POWER=y 233 | CONFIG_ESP32_TIME_SYSCALL_USE_RTC_FRC1=y 234 | CONFIG_ESP32_TIME_SYSCALL_USE_RTC= 235 | CONFIG_ESP32_TIME_SYSCALL_USE_FRC1= 236 | CONFIG_ESP32_TIME_SYSCALL_USE_NONE= 237 | CONFIG_ESP32_RTC_CLOCK_SOURCE_INTERNAL_RC=y 238 | CONFIG_ESP32_RTC_CLOCK_SOURCE_EXTERNAL_CRYSTAL= 239 | CONFIG_ESP32_RTC_CLOCK_SOURCE_EXTERNAL_OSC= 240 | CONFIG_ESP32_RTC_CLOCK_SOURCE_INTERNAL_8MD256= 241 | CONFIG_ESP32_RTC_CLK_CAL_CYCLES=1024 242 | CONFIG_ESP32_DEEP_SLEEP_WAKEUP_DELAY=2000 243 | CONFIG_ESP32_XTAL_FREQ_40=y 244 | CONFIG_ESP32_XTAL_FREQ_26= 245 | CONFIG_ESP32_XTAL_FREQ_AUTO= 246 | CONFIG_ESP32_XTAL_FREQ=40 247 | CONFIG_DISABLE_BASIC_ROM_CONSOLE= 248 | CONFIG_NO_BLOBS= 249 | CONFIG_ESP_TIMER_PROFILING= 250 | CONFIG_COMPATIBLE_PRE_V2_1_BOOTLOADERS= 251 | CONFIG_ESP_ERR_TO_NAME_LOOKUP=y 252 | 253 | # 254 | # Wi-Fi 255 | # 256 | CONFIG_ESP32_WIFI_STATIC_RX_BUFFER_NUM=10 257 | CONFIG_ESP32_WIFI_DYNAMIC_RX_BUFFER_NUM=32 258 | CONFIG_ESP32_WIFI_STATIC_TX_BUFFER= 259 | CONFIG_ESP32_WIFI_DYNAMIC_TX_BUFFER=y 260 | CONFIG_ESP32_WIFI_TX_BUFFER_TYPE=1 261 | CONFIG_ESP32_WIFI_DYNAMIC_TX_BUFFER_NUM=32 262 | CONFIG_ESP32_WIFI_CSI_ENABLED= 263 | CONFIG_ESP32_WIFI_AMPDU_TX_ENABLED=y 264 | CONFIG_ESP32_WIFI_TX_BA_WIN=6 265 | CONFIG_ESP32_WIFI_AMPDU_RX_ENABLED=y 266 | CONFIG_ESP32_WIFI_RX_BA_WIN=6 267 | CONFIG_ESP32_WIFI_NVS_ENABLED=y 268 | CONFIG_ESP32_WIFI_TASK_PINNED_TO_CORE_0=y 269 | CONFIG_ESP32_WIFI_TASK_PINNED_TO_CORE_1= 270 | CONFIG_ESP32_WIFI_SOFTAP_BEACON_MAX_LEN=752 271 | CONFIG_ESP32_WIFI_MGMT_SBUF_NUM=32 272 | CONFIG_ESP32_WIFI_DEBUG_LOG_ENABLE= 273 | CONFIG_ESP32_WIFI_IRAM_OPT=y 274 | 275 | # 276 | # PHY 277 | # 278 | CONFIG_ESP32_PHY_CALIBRATION_AND_DATA_STORAGE=y 279 | CONFIG_ESP32_PHY_INIT_DATA_IN_PARTITION= 280 | CONFIG_ESP32_PHY_MAX_WIFI_TX_POWER=20 281 | CONFIG_ESP32_PHY_MAX_TX_POWER=20 282 | 283 | # 284 | # Power Management 285 | # 286 | CONFIG_PM_ENABLE= 287 | 288 | # 289 | # ADC-Calibration 290 | # 291 | CONFIG_ADC_CAL_EFUSE_TP_ENABLE=y 292 | CONFIG_ADC_CAL_EFUSE_VREF_ENABLE=y 293 | CONFIG_ADC_CAL_LUT_ENABLE=y 294 | 295 | # 296 | # Event Loop Library 297 | # 298 | CONFIG_EVENT_LOOP_PROFILING= 299 | 300 | # 301 | # ESP HTTP client 302 | # 303 | CONFIG_ESP_HTTP_CLIENT_ENABLE_HTTPS=y 304 | 305 | # 306 | # HTTP Server 307 | # 308 | CONFIG_HTTPD_MAX_REQ_HDR_LEN=512 309 | CONFIG_HTTPD_MAX_URI_LEN=512 310 | CONFIG_HTTPD_ERR_RESP_NO_DELAY=y 311 | CONFIG_HTTPD_PURGE_BUF_LEN=32 312 | CONFIG_HTTPD_LOG_PURGE_DATA= 313 | 314 | # 315 | # ESP HTTPS OTA 316 | # 317 | CONFIG_OTA_ALLOW_HTTP=y 318 | 319 | # 320 | # Core dump 321 | # 322 | CONFIG_ESP32_ENABLE_COREDUMP_TO_FLASH= 323 | CONFIG_ESP32_ENABLE_COREDUMP_TO_UART= 324 | CONFIG_ESP32_ENABLE_COREDUMP_TO_NONE=y 325 | CONFIG_ESP32_ENABLE_COREDUMP= 326 | 327 | # 328 | # Ethernet 329 | # 330 | CONFIG_DMA_RX_BUF_NUM=10 331 | CONFIG_DMA_TX_BUF_NUM=10 332 | CONFIG_EMAC_L2_TO_L3_RX_BUF_MODE=y 333 | CONFIG_EMAC_CHECK_LINK_PERIOD_MS=2000 334 | CONFIG_EMAC_TASK_PRIORITY=20 335 | CONFIG_EMAC_TASK_STACK_SIZE=3072 336 | 337 | # 338 | # FAT Filesystem support 339 | # 340 | CONFIG_FATFS_CODEPAGE_DYNAMIC= 341 | CONFIG_FATFS_CODEPAGE_437=y 342 | CONFIG_FATFS_CODEPAGE_720= 343 | CONFIG_FATFS_CODEPAGE_737= 344 | CONFIG_FATFS_CODEPAGE_771= 345 | CONFIG_FATFS_CODEPAGE_775= 346 | CONFIG_FATFS_CODEPAGE_850= 347 | CONFIG_FATFS_CODEPAGE_852= 348 | CONFIG_FATFS_CODEPAGE_855= 349 | CONFIG_FATFS_CODEPAGE_857= 350 | CONFIG_FATFS_CODEPAGE_860= 351 | CONFIG_FATFS_CODEPAGE_861= 352 | CONFIG_FATFS_CODEPAGE_862= 353 | CONFIG_FATFS_CODEPAGE_863= 354 | CONFIG_FATFS_CODEPAGE_864= 355 | CONFIG_FATFS_CODEPAGE_865= 356 | CONFIG_FATFS_CODEPAGE_866= 357 | CONFIG_FATFS_CODEPAGE_869= 358 | CONFIG_FATFS_CODEPAGE_932= 359 | CONFIG_FATFS_CODEPAGE_936= 360 | CONFIG_FATFS_CODEPAGE_949= 361 | CONFIG_FATFS_CODEPAGE_950= 362 | CONFIG_FATFS_CODEPAGE=437 363 | CONFIG_FATFS_LFN_NONE=y 364 | CONFIG_FATFS_LFN_HEAP= 365 | CONFIG_FATFS_LFN_STACK= 366 | CONFIG_FATFS_FS_LOCK=0 367 | CONFIG_FATFS_TIMEOUT_MS=10000 368 | CONFIG_FATFS_PER_FILE_CACHE=y 369 | 370 | # 371 | # Modbus configuration 372 | # 373 | CONFIG_MB_QUEUE_LENGTH=20 374 | CONFIG_MB_SERIAL_TASK_STACK_SIZE=2048 375 | CONFIG_MB_SERIAL_BUF_SIZE=256 376 | CONFIG_MB_SERIAL_TASK_PRIO=10 377 | CONFIG_MB_CONTROLLER_SLAVE_ID_SUPPORT= 378 | CONFIG_MB_CONTROLLER_NOTIFY_TIMEOUT=20 379 | CONFIG_MB_CONTROLLER_NOTIFY_QUEUE_SIZE=20 380 | CONFIG_MB_CONTROLLER_STACK_SIZE=4096 381 | CONFIG_MB_EVENT_QUEUE_TIMEOUT=20 382 | CONFIG_MB_TIMER_PORT_ENABLED=y 383 | CONFIG_MB_TIMER_GROUP=0 384 | CONFIG_MB_TIMER_INDEX=0 385 | 386 | # 387 | # FreeRTOS 388 | # 389 | CONFIG_FREERTOS_UNICORE= 390 | CONFIG_FREERTOS_NO_AFFINITY=0x7FFFFFFF 391 | CONFIG_FREERTOS_CORETIMER_0=y 392 | CONFIG_FREERTOS_CORETIMER_1= 393 | CONFIG_FREERTOS_HZ=100 394 | CONFIG_FREERTOS_ASSERT_ON_UNTESTED_FUNCTION=y 395 | CONFIG_FREERTOS_CHECK_STACKOVERFLOW_NONE= 396 | CONFIG_FREERTOS_CHECK_STACKOVERFLOW_PTRVAL= 397 | CONFIG_FREERTOS_CHECK_STACKOVERFLOW_CANARY=y 398 | CONFIG_FREERTOS_WATCHPOINT_END_OF_STACK= 399 | CONFIG_FREERTOS_INTERRUPT_BACKTRACE=y 400 | CONFIG_FREERTOS_THREAD_LOCAL_STORAGE_POINTERS=1 401 | CONFIG_FREERTOS_ASSERT_FAIL_ABORT=y 402 | CONFIG_FREERTOS_ASSERT_FAIL_PRINT_CONTINUE= 403 | CONFIG_FREERTOS_ASSERT_DISABLE= 404 | CONFIG_FREERTOS_IDLE_TASK_STACKSIZE=1536 405 | CONFIG_FREERTOS_ISR_STACKSIZE=1536 406 | CONFIG_FREERTOS_LEGACY_HOOKS= 407 | CONFIG_FREERTOS_MAX_TASK_NAME_LEN=16 408 | CONFIG_SUPPORT_STATIC_ALLOCATION= 409 | CONFIG_TIMER_TASK_PRIORITY=1 410 | CONFIG_TIMER_TASK_STACK_DEPTH=2048 411 | CONFIG_TIMER_QUEUE_LENGTH=10 412 | CONFIG_FREERTOS_QUEUE_REGISTRY_SIZE=0 413 | CONFIG_FREERTOS_USE_TRACE_FACILITY= 414 | CONFIG_FREERTOS_GENERATE_RUN_TIME_STATS= 415 | CONFIG_FREERTOS_DEBUG_INTERNALS= 416 | CONFIG_FREERTOS_TASK_FUNCTION_WRAPPER=y 417 | CONFIG_FREERTOS_CHECK_MUTEX_GIVEN_BY_OWNER=y 418 | CONFIG_FREERTOS_CHECK_PORT_CRITICAL_COMPLIANCE= 419 | 420 | # 421 | # Heap memory debugging 422 | # 423 | CONFIG_HEAP_POISONING_DISABLED=y 424 | CONFIG_HEAP_POISONING_LIGHT= 425 | CONFIG_HEAP_POISONING_COMPREHENSIVE= 426 | CONFIG_HEAP_TRACING= 427 | 428 | # 429 | # libsodium 430 | # 431 | CONFIG_LIBSODIUM_USE_MBEDTLS_SHA=y 432 | 433 | # 434 | # Log output 435 | # 436 | CONFIG_LOG_DEFAULT_LEVEL_NONE= 437 | CONFIG_LOG_DEFAULT_LEVEL_ERROR= 438 | CONFIG_LOG_DEFAULT_LEVEL_WARN= 439 | CONFIG_LOG_DEFAULT_LEVEL_INFO=y 440 | CONFIG_LOG_DEFAULT_LEVEL_DEBUG= 441 | CONFIG_LOG_DEFAULT_LEVEL_VERBOSE= 442 | CONFIG_LOG_DEFAULT_LEVEL=3 443 | CONFIG_LOG_COLORS=y 444 | 445 | # 446 | # LWIP 447 | # 448 | CONFIG_L2_TO_L3_COPY= 449 | CONFIG_LWIP_IRAM_OPTIMIZATION= 450 | CONFIG_LWIP_MAX_SOCKETS=10 451 | CONFIG_USE_ONLY_LWIP_SELECT= 452 | CONFIG_LWIP_SO_REUSE=y 453 | CONFIG_LWIP_SO_REUSE_RXTOALL=y 454 | CONFIG_LWIP_SO_RCVBUF= 455 | CONFIG_LWIP_DHCP_MAX_NTP_SERVERS=1 456 | CONFIG_LWIP_IP_FRAG= 457 | CONFIG_LWIP_IP_REASSEMBLY= 458 | CONFIG_LWIP_STATS= 459 | CONFIG_LWIP_ETHARP_TRUST_IP_MAC= 460 | CONFIG_ESP_GRATUITOUS_ARP=y 461 | CONFIG_GARP_TMR_INTERVAL=60 462 | CONFIG_TCPIP_RECVMBOX_SIZE=32 463 | CONFIG_LWIP_DHCP_DOES_ARP_CHECK=y 464 | CONFIG_LWIP_DHCP_RESTORE_LAST_IP= 465 | 466 | # 467 | # DHCP server 468 | # 469 | CONFIG_LWIP_DHCPS_LEASE_UNIT=60 470 | CONFIG_LWIP_DHCPS_MAX_STATION_NUM=8 471 | CONFIG_LWIP_AUTOIP= 472 | CONFIG_LWIP_NETIF_LOOPBACK=y 473 | CONFIG_LWIP_LOOPBACK_MAX_PBUFS=8 474 | 475 | # 476 | # TCP 477 | # 478 | CONFIG_LWIP_MAX_ACTIVE_TCP=16 479 | CONFIG_LWIP_MAX_LISTENING_TCP=16 480 | CONFIG_TCP_MAXRTX=12 481 | CONFIG_TCP_SYNMAXRTX=6 482 | CONFIG_TCP_MSS=1436 483 | CONFIG_TCP_MSL=60000 484 | CONFIG_TCP_SND_BUF_DEFAULT=5744 485 | CONFIG_TCP_WND_DEFAULT=5744 486 | CONFIG_TCP_RECVMBOX_SIZE=6 487 | CONFIG_TCP_QUEUE_OOSEQ=y 488 | CONFIG_ESP_TCP_KEEP_CONNECTION_WHEN_IP_CHANGES= 489 | CONFIG_TCP_OVERSIZE_MSS=y 490 | CONFIG_TCP_OVERSIZE_QUARTER_MSS= 491 | CONFIG_TCP_OVERSIZE_DISABLE= 492 | 493 | # 494 | # UDP 495 | # 496 | CONFIG_LWIP_MAX_UDP_PCBS=16 497 | CONFIG_UDP_RECVMBOX_SIZE=6 498 | CONFIG_TCPIP_TASK_STACK_SIZE=3072 499 | CONFIG_TCPIP_TASK_AFFINITY_NO_AFFINITY=y 500 | CONFIG_TCPIP_TASK_AFFINITY_CPU0= 501 | CONFIG_TCPIP_TASK_AFFINITY_CPU1= 502 | CONFIG_TCPIP_TASK_AFFINITY=0x7FFFFFFF 503 | CONFIG_PPP_SUPPORT=y 504 | CONFIG_PPP_NOTIFY_PHASE_SUPPORT= 505 | CONFIG_PPP_PAP_SUPPORT=y 506 | CONFIG_PPP_CHAP_SUPPORT= 507 | CONFIG_PPP_MSCHAP_SUPPORT= 508 | CONFIG_PPP_MPPE_SUPPORT= 509 | CONFIG_PPP_DEBUG_ON= 510 | 511 | # 512 | # ICMP 513 | # 514 | CONFIG_LWIP_MULTICAST_PING= 515 | CONFIG_LWIP_BROADCAST_PING= 516 | 517 | # 518 | # LWIP RAW API 519 | # 520 | CONFIG_LWIP_MAX_RAW_PCBS=16 521 | 522 | # 523 | # mbedTLS 524 | # 525 | CONFIG_MBEDTLS_INTERNAL_MEM_ALLOC=y 526 | CONFIG_MBEDTLS_DEFAULT_MEM_ALLOC= 527 | CONFIG_MBEDTLS_CUSTOM_MEM_ALLOC= 528 | CONFIG_MBEDTLS_SSL_MAX_CONTENT_LEN=16384 529 | CONFIG_MBEDTLS_ASYMMETRIC_CONTENT_LEN= 530 | CONFIG_MBEDTLS_DEBUG= 531 | CONFIG_MBEDTLS_HARDWARE_AES=y 532 | CONFIG_MBEDTLS_HARDWARE_MPI= 533 | CONFIG_MBEDTLS_HARDWARE_SHA= 534 | CONFIG_MBEDTLS_HAVE_TIME=y 535 | CONFIG_MBEDTLS_HAVE_TIME_DATE= 536 | CONFIG_MBEDTLS_TLS_SERVER_AND_CLIENT=y 537 | CONFIG_MBEDTLS_TLS_SERVER_ONLY= 538 | CONFIG_MBEDTLS_TLS_CLIENT_ONLY= 539 | CONFIG_MBEDTLS_TLS_DISABLED= 540 | CONFIG_MBEDTLS_TLS_SERVER=y 541 | CONFIG_MBEDTLS_TLS_CLIENT=y 542 | CONFIG_MBEDTLS_TLS_ENABLED=y 543 | 544 | # 545 | # TLS Key Exchange Methods 546 | # 547 | CONFIG_MBEDTLS_PSK_MODES= 548 | CONFIG_MBEDTLS_KEY_EXCHANGE_RSA=y 549 | CONFIG_MBEDTLS_KEY_EXCHANGE_DHE_RSA=y 550 | CONFIG_MBEDTLS_KEY_EXCHANGE_ELLIPTIC_CURVE=y 551 | CONFIG_MBEDTLS_KEY_EXCHANGE_ECDHE_RSA=y 552 | CONFIG_MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA=y 553 | CONFIG_MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA=y 554 | CONFIG_MBEDTLS_KEY_EXCHANGE_ECDH_RSA=y 555 | CONFIG_MBEDTLS_SSL_RENEGOTIATION=y 556 | CONFIG_MBEDTLS_SSL_PROTO_SSL3= 557 | CONFIG_MBEDTLS_SSL_PROTO_TLS1=y 558 | CONFIG_MBEDTLS_SSL_PROTO_TLS1_1=y 559 | CONFIG_MBEDTLS_SSL_PROTO_TLS1_2=y 560 | CONFIG_MBEDTLS_SSL_PROTO_DTLS= 561 | CONFIG_MBEDTLS_SSL_ALPN=y 562 | CONFIG_MBEDTLS_SSL_SESSION_TICKETS=y 563 | 564 | # 565 | # Symmetric Ciphers 566 | # 567 | CONFIG_MBEDTLS_AES_C=y 568 | CONFIG_MBEDTLS_CAMELLIA_C= 569 | CONFIG_MBEDTLS_DES_C= 570 | CONFIG_MBEDTLS_RC4_DISABLED=y 571 | CONFIG_MBEDTLS_RC4_ENABLED_NO_DEFAULT= 572 | CONFIG_MBEDTLS_RC4_ENABLED= 573 | CONFIG_MBEDTLS_BLOWFISH_C= 574 | CONFIG_MBEDTLS_XTEA_C= 575 | CONFIG_MBEDTLS_CCM_C=y 576 | CONFIG_MBEDTLS_GCM_C=y 577 | CONFIG_MBEDTLS_RIPEMD160_C= 578 | 579 | # 580 | # Certificates 581 | # 582 | CONFIG_MBEDTLS_PEM_PARSE_C=y 583 | CONFIG_MBEDTLS_PEM_WRITE_C=y 584 | CONFIG_MBEDTLS_X509_CRL_PARSE_C=y 585 | CONFIG_MBEDTLS_X509_CSR_PARSE_C=y 586 | CONFIG_MBEDTLS_ECP_C=y 587 | CONFIG_MBEDTLS_ECDH_C=y 588 | CONFIG_MBEDTLS_ECDSA_C=y 589 | CONFIG_MBEDTLS_ECP_DP_SECP192R1_ENABLED=y 590 | CONFIG_MBEDTLS_ECP_DP_SECP224R1_ENABLED=y 591 | CONFIG_MBEDTLS_ECP_DP_SECP256R1_ENABLED=y 592 | CONFIG_MBEDTLS_ECP_DP_SECP384R1_ENABLED=y 593 | CONFIG_MBEDTLS_ECP_DP_SECP521R1_ENABLED=y 594 | CONFIG_MBEDTLS_ECP_DP_SECP192K1_ENABLED=y 595 | CONFIG_MBEDTLS_ECP_DP_SECP224K1_ENABLED=y 596 | CONFIG_MBEDTLS_ECP_DP_SECP256K1_ENABLED=y 597 | CONFIG_MBEDTLS_ECP_DP_BP256R1_ENABLED=y 598 | CONFIG_MBEDTLS_ECP_DP_BP384R1_ENABLED=y 599 | CONFIG_MBEDTLS_ECP_DP_BP512R1_ENABLED=y 600 | CONFIG_MBEDTLS_ECP_DP_CURVE25519_ENABLED=y 601 | CONFIG_MBEDTLS_ECP_NIST_OPTIM=y 602 | 603 | # 604 | # mDNS 605 | # 606 | CONFIG_MDNS_MAX_SERVICES=10 607 | 608 | # 609 | # ESP-MQTT Configurations 610 | # 611 | CONFIG_MQTT_PROTOCOL_311=y 612 | CONFIG_MQTT_TRANSPORT_SSL=y 613 | CONFIG_MQTT_TRANSPORT_WEBSOCKET=y 614 | CONFIG_MQTT_TRANSPORT_WEBSOCKET_SECURE=y 615 | CONFIG_MQTT_USE_CUSTOM_CONFIG= 616 | CONFIG_MQTT_TASK_CORE_SELECTION_ENABLED= 617 | CONFIG_MQTT_CUSTOM_OUTBOX= 618 | 619 | # 620 | # NVS 621 | # 622 | 623 | # 624 | # OpenSSL 625 | # 626 | CONFIG_OPENSSL_DEBUG= 627 | CONFIG_OPENSSL_ASSERT_DO_NOTHING=y 628 | CONFIG_OPENSSL_ASSERT_EXIT= 629 | 630 | # 631 | # PThreads 632 | # 633 | CONFIG_ESP32_PTHREAD_TASK_PRIO_DEFAULT=5 634 | CONFIG_ESP32_PTHREAD_TASK_STACK_SIZE_DEFAULT=3072 635 | CONFIG_PTHREAD_STACK_MIN=768 636 | CONFIG_ESP32_DEFAULT_PTHREAD_CORE_NO_AFFINITY=y 637 | CONFIG_ESP32_DEFAULT_PTHREAD_CORE_0= 638 | CONFIG_ESP32_DEFAULT_PTHREAD_CORE_1= 639 | CONFIG_ESP32_PTHREAD_TASK_CORE_DEFAULT=-1 640 | CONFIG_ESP32_PTHREAD_TASK_NAME_DEFAULT="pthread" 641 | 642 | # 643 | # SPI Flash driver 644 | # 645 | CONFIG_SPI_FLASH_VERIFY_WRITE= 646 | CONFIG_SPI_FLASH_ENABLE_COUNTERS= 647 | CONFIG_SPI_FLASH_ROM_DRIVER_PATCH=y 648 | CONFIG_SPI_FLASH_WRITING_DANGEROUS_REGIONS_ABORTS=y 649 | CONFIG_SPI_FLASH_WRITING_DANGEROUS_REGIONS_FAILS= 650 | CONFIG_SPI_FLASH_WRITING_DANGEROUS_REGIONS_ALLOWED= 651 | CONFIG_SPI_FLASH_YIELD_DURING_ERASE=y 652 | CONFIG_SPI_FLASH_ERASE_YIELD_DURATION_MS=20 653 | CONFIG_SPI_FLASH_ERASE_YIELD_TICKS=1 654 | 655 | # 656 | # SPIFFS Configuration 657 | # 658 | CONFIG_SPIFFS_MAX_PARTITIONS=3 659 | 660 | # 661 | # SPIFFS Cache Configuration 662 | # 663 | CONFIG_SPIFFS_CACHE=y 664 | CONFIG_SPIFFS_CACHE_WR=y 665 | CONFIG_SPIFFS_CACHE_STATS= 666 | CONFIG_SPIFFS_PAGE_CHECK=y 667 | CONFIG_SPIFFS_GC_MAX_RUNS=10 668 | CONFIG_SPIFFS_GC_STATS= 669 | CONFIG_SPIFFS_PAGE_SIZE=256 670 | CONFIG_SPIFFS_OBJ_NAME_LEN=32 671 | CONFIG_SPIFFS_USE_MAGIC=y 672 | CONFIG_SPIFFS_USE_MAGIC_LENGTH=y 673 | CONFIG_SPIFFS_META_LENGTH=4 674 | CONFIG_SPIFFS_USE_MTIME=y 675 | 676 | # 677 | # Debug Configuration 678 | # 679 | CONFIG_SPIFFS_DBG= 680 | CONFIG_SPIFFS_API_DBG= 681 | CONFIG_SPIFFS_GC_DBG= 682 | CONFIG_SPIFFS_CACHE_DBG= 683 | CONFIG_SPIFFS_CHECK_DBG= 684 | CONFIG_SPIFFS_TEST_VISUALISATION= 685 | 686 | # 687 | # TCP/IP Adapter 688 | # 689 | CONFIG_IP_LOST_TIMER_INTERVAL=120 690 | CONFIG_TCPIP_LWIP=y 691 | 692 | # 693 | # Unity unit testing library 694 | # 695 | CONFIG_UNITY_ENABLE_FLOAT=y 696 | CONFIG_UNITY_ENABLE_DOUBLE=y 697 | CONFIG_UNITY_ENABLE_COLOR= 698 | CONFIG_UNITY_ENABLE_IDF_TEST_RUNNER=y 699 | CONFIG_UNITY_ENABLE_FIXTURE= 700 | 701 | # 702 | # Virtual file system 703 | # 704 | CONFIG_SUPPRESS_SELECT_DEBUG_OUTPUT=y 705 | CONFIG_SUPPORT_TERMIOS=y 706 | 707 | # 708 | # Wear Levelling 709 | # 710 | CONFIG_WL_SECTOR_SIZE_512= 711 | CONFIG_WL_SECTOR_SIZE_4096=y 712 | CONFIG_WL_SECTOR_SIZE=4096 713 | 714 | # 715 | # Wi-Fi Provisioning Manager 716 | # 717 | CONFIG_WIFI_PROV_SCAN_MAX_ENTRIES=16 718 | --------------------------------------------------------------------------------