diff --git a/.gitignore b/.gitignore index cd531cf..37d7f21 100644 --- a/.gitignore +++ b/.gitignore @@ -52,3 +52,8 @@ Module.symvers Mkfile.old dkms.conf +build/ + +test/build/ + +*.old diff --git a/CMakeLists.txt b/CMakeLists.txt index 21386ed..4026deb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,4 +3,4 @@ cmake_minimum_required(VERSION 3.5) include($ENV{IDF_PATH}/tools/cmake/project.cmake) -project(internal_communication) +project(mesh_ota) diff --git a/Makefile b/Makefile index 83a296c..7a9b567 100644 --- a/Makefile +++ b/Makefile @@ -3,6 +3,6 @@ # project subdirectory. # -PROJECT_NAME := internal_communication +PROJECT_NAME := mesh_ota include $(IDF_PATH)/make/project.mk diff --git a/components/mesh_ota/CMakeLists.txt b/components/mesh_ota/CMakeLists.txt new file mode 100644 index 0000000..c524a09 --- /dev/null +++ b/components/mesh_ota/CMakeLists.txt @@ -0,0 +1,7 @@ +idf_component_register(SRCS "Mesh_network_handler.c" "Mesh_network.c" "Mesh_OTA.c" + INCLUDE_DIRS "include" + REQUIRES nvs_flash + esp_http_client + bootloader_support + app_update + log) diff --git a/components/mesh_ota/Mesh_OTA.c b/components/mesh_ota/Mesh_OTA.c new file mode 100644 index 0000000..4f7b221 --- /dev/null +++ b/components/mesh_ota/Mesh_OTA.c @@ -0,0 +1,237 @@ +#include "Mesh_OTA.h" + +/* + * 999.999.999 + * Return true if remote version is newer (higher) than local version +*/ +bool bNewerVersion(const char* pu8Local, const char* pu8Remote) +{ + char u8LocalTmp[12]; //local version + char u8RemoteTmp[12]; //remote version + char* pu8saveptrLocal; //context for strok_r + char* pu8saveptrRemote; //context for strok_r + bool bReturn = false; //flag to stop loop + uint8_t u8Index = 0; //numbers counter in version string + + strcpy(u8LocalTmp, pu8Local); //copy in tmp + strcpy(u8RemoteTmp, pu8Remote); //copy in tmp + + char* pu8TokenLocal = strtok_r(u8LocalTmp, ".", &pu8saveptrLocal); //split tokens + char* pu8TokenRemote = strtok_r(u8RemoteTmp, ".", &pu8saveptrRemote); //split tokens + + while( (u8Index <= 2) && (bReturn == false)) //loop through tokens + { + u8Index++; + if(atoi(pu8TokenLocal) < atoi(pu8TokenRemote)) + { + bReturn = true; //version number difference --> stop loop + } + pu8TokenLocal = strtok_r(NULL, ".", &pu8saveptrLocal); //split tokens + pu8TokenRemote = strtok_r(NULL, ".", &pu8saveptrRemote); //split tokens + } + return bReturn; +} + +esp_err_t errFindImageStart(const char* pu8Data, uint32_t* pu32DataLenght, uint32_t* pu32StartOffset) +{ + /* + Offset value + 0 = 0xE9 (first byte in image --> magic byte) + 48 = first digit of version number + */ + + esp_err_t errReturn = ESP_OK; + bool bImageStartOffsetFound = false; + uint32_t u32DataIndex = 0; + uint32_t u32FirstDotOffset = 0; + uint32_t u32SecondDotOffset = 0; + uint8_t u8FirstDotIndex = 0; + uint8_t u8SecondDotIndex = 0; + + *pu32StartOffset = 0U; //reset offset to zero + + while((u32DataIndex < *pu32DataLenght) && (bImageStartOffsetFound == false)) + { + //search for magic byte + if(pu8Data[u32DataIndex] == 0xe9) + { + //magic byte found + while ((u8FirstDotIndex < 3) && (u32FirstDotOffset == 0)) + { + //search first dot in version number + if((u32DataIndex+49+u8FirstDotIndex) < *pu32DataLenght) + { + if((pu8Data[(u32DataIndex+49+u8FirstDotIndex)] == 0x2e)) + { + //first dot found + u32FirstDotOffset = (u32DataIndex+49+u8FirstDotIndex); + } + } + u8FirstDotIndex++; + } + + while ((u8SecondDotIndex < 3) && (u32SecondDotOffset == 0) && (u32FirstDotOffset != 0)) + { + //search first dot in version number + if((u32FirstDotOffset+(u8SecondDotIndex+2)) < *pu32DataLenght) + { + if((pu8Data[(u32FirstDotOffset+(u8SecondDotIndex+2))] == 0x2e)) + { + //second dot found + u32SecondDotOffset = (u32FirstDotOffset+(u8SecondDotIndex+2)); + } + } + u8SecondDotIndex++; + } + + if((u32FirstDotOffset != 0) && (u32SecondDotOffset != 0)) + { + //image start found based on magic byte and version number systax + *pu32StartOffset = u32DataIndex; //store image start offset + bImageStartOffsetFound = true; + } + else + { + // this is propably not the magic byte --> reset + u32FirstDotOffset = 0; + u32SecondDotOffset = 0; + u8FirstDotIndex = 0; + u8SecondDotIndex = 0; + } + } + u32DataIndex++; + } + + if(bImageStartOffsetFound == false) + { + errReturn = ESP_ERR_NOT_FOUND; + } + + return errReturn; +} + +esp_err_t errExtractVersionNumber(const char* pu8Data, uint32_t* pu32DataLenght, char* pc8RemoteVersionNumber) +{ + uint32_t u32StartOffset; + esp_err_t err = ESP_OK; + + strcpy(pc8RemoteVersionNumber, "999.999.999"); //init value + err = errFindImageStart(pu8Data, pu32DataLenght, &u32StartOffset); //get image start offset + + if(err == ESP_OK) + { + //image found + strncpy(pc8RemoteVersionNumber, pu8Data+(u32StartOffset+48), 11); //copy version number + pc8RemoteVersionNumber[12] = '\0'; + } + return err; +} + +/* + + +esp_err_t esp_mesh_ota_send(mesh_addr_t* dest) +{ + esp_err_t err = ESP_OK; + + static uint32_t u32index; + + const esp_partition_t * currentPartition = esp_ota_get_boot_partition(); + + if((*currentPartition).subtype == 0) + { + + int data_read = 0; + + struct ota_mesh_packet packet; + packet.type=OTA_Data; + + if(u32index == 1024) + { + //all data read + data_read = 0; + u32index = 0; + } + else + { + ESP_LOGI(MESH_TAG, "OTA-Data read: %i", u32index); + err = esp_partition_read(currentPartition, (1024*u32index), packet.au8Payload, 1024 ); + ESP_ERROR_CHECK(err); + data_read = 1024; + u32index++; + } + + if (data_read > 0) + { + //send ota fragemnt to node + esp_mesh_send_packet(dest, &packet); + } + + ESP_ERROR_CHECK(err); + } + else + { + ESP_LOGI(MESH_TAG, "Subtype: %d", (*currentPartition).subtype); + } + return err; +} + +esp_err_t esp_mesh_ota_receive(mesh_addr_t* dest, struct ota_mesh_packet* packet) +{ + esp_err_t err = ESP_OK; + static esp_ota_handle_t otaHandle; + static uint32_t u32index; + + const esp_partition_t * currentPartition = esp_ota_get_boot_partition(); + const esp_partition_t * otaPartition = esp_ota_get_next_update_partition(currentPartition); + + if(u32index == 0) + { + //first run + + err = esp_ota_begin(otaPartition, OTA_SIZE_UNKNOWN, &otaHandle); + ESP_ERROR_CHECK(err); + } + + ESP_LOGI(MESH_TAG, "OTA-Data write: %i", u32index); + err = esp_ota_write(otaHandle, packet->au8Payload, 1024); + + if(err != ESP_OK) + { + ESP_LOGE(MESH_TAG, "OTA-Data write error: %i at %i", err, u32index); + } + + ESP_ERROR_CHECK(err); + + + + if(u32index >= 1023) + { + //ota update complete + + ESP_LOGI(MESH_TAG, "OTA-Data complete arrived: %i", u32index); + err = esp_ota_end(otaHandle); + ESP_ERROR_CHECK(err); + esp_app_desc_t otaPartitionDesc; + err = esp_ota_get_partition_description(otaPartition, &otaPartitionDesc); + ESP_ERROR_CHECK(err); + ESP_LOGI(MESH_TAG, "otaPartition project_name: %s", (otaPartitionDesc).project_name); + + err = esp_ota_set_boot_partition(otaPartition); + ESP_ERROR_CHECK(err); + + struct ota_mesh_packet retPacket; + retPacket.type=OTA_Complete; + ESP_ERROR_CHECK (esp_mesh_send_packet(dest, &retPacket)); //send back to parent + + //check if this node has children --> Update them + + esp_restart(); + } + + u32index++; + + + return err; +} +*/ \ No newline at end of file diff --git a/components/mesh_ota/Mesh_network.c b/components/mesh_ota/Mesh_network.c new file mode 100644 index 0000000..96f22ef --- /dev/null +++ b/components/mesh_ota/Mesh_network.c @@ -0,0 +1,247 @@ + +#include "Mesh_OTA.h" + +static const char *LOG_TAG = "mesh_network"; +static uint8_t tx_buf[CONFIG_MESH_MESSAGE_SIZE] = { 0, }; +static uint8_t rx_buf[CONFIG_MESH_MESSAGE_SIZE] = { 0, }; +static uint8_t u8NodeMAC[6]; +esp_netif_t* netif_sta; +bool bIsMeshConnected; +int32_t i32MeshLayer; +mesh_addr_t mesh_parent_addr; + +esp_err_t errMeshNetworkInitialize() +{ + //init module variables + esp_err_t err; + bIsMeshConnected = false; + i32MeshLayer = -1; + netif_sta = NULL; + + err = nvs_flash_init(); //init non-volatile storage + +#ifdef ERASE_NVS + if(err == ESP_ERR_NVS_NO_FREE_PAGES) //check if storage is full + { + ERROR_CHECK(nvs_flash_erase()); + } +#endif + + // tcpip initialization + ERROR_CHECK(esp_netif_init()); + + //event initialization + ERROR_CHECK(esp_event_loop_create_default()); + + //create network interfaces for mesh (only station instance saved for further manipulation, soft AP instance ignored + ERROR_CHECK(esp_netif_create_default_wifi_mesh_netifs(&netif_sta, NULL)); + + //wifi initialization + ERROR_CHECK(errMeshNetworkInitializeWiFi()); + + //mesh initialization + ERROR_CHECK(esp_mesh_init()); + + //mesh initialization + ERROR_CHECK(esp_event_handler_register(MESH_EVENT, ESP_EVENT_ANY_ID, &vMeshEventHandler, NULL)); + + //set mesh topology + ERROR_CHECK(esp_mesh_set_topology(CONFIG_MESH_TOPOLOGY)); + + //set mesh max layer according to the topology + ERROR_CHECK(esp_mesh_set_max_layer(CONFIG_MESH_MAX_LAYER)); + ERROR_CHECK(esp_mesh_set_vote_percentage(1)); + ERROR_CHECK(esp_mesh_set_xon_qsize(128)); + + //Disable mesh PS function + ERROR_CHECK(esp_mesh_disable_ps()); + ERROR_CHECK(esp_mesh_set_ap_assoc_expire(10)); + + mesh_cfg_t cfg = MESH_INIT_CONFIG_DEFAULT(); + + /* mesh ID */ + memcpy((uint8_t *) &cfg.mesh_id, CONFIG_MESH_ID, 6); + + ERROR_CHECK(errMeshNetworkInitializeRouter(&cfg)); + + /* mesh softAP */ + ERROR_CHECK(esp_mesh_set_ap_authmode(CONFIG_MESH_AP_AUTHMODE)); + cfg.mesh_ap.max_connection = CONFIG_MESH_AP_CONNECTIONS; + memcpy((uint8_t *) &cfg.mesh_ap.password, CONFIG_MESH_AP_PASSWD, + strlen(CONFIG_MESH_AP_PASSWD)); + ERROR_CHECK(esp_mesh_set_config(&cfg)); + + /* mesh start */ + ERROR_CHECK(esp_mesh_start()); + + ERROR_CHECK(esp_base_mac_addr_get(u8NodeMAC)) + + //debug info + ESP_LOGD(LOG_TAG, "mesh starts successfully, heap:%d, %s<%d>%s, ps:%d\n", esp_get_minimum_free_heap_size(), + esp_mesh_is_root_fixed() ? "root fixed" : "root not fixed", + esp_mesh_get_topology(), esp_mesh_get_topology() ? "(chain)":"(tree)", esp_mesh_is_ps_enabled()); + + + ESP_LOGI(LOG_TAG, "Node MAC: \"%x:%x:%x:%x:%x:%x\" ", u8NodeMAC[0], u8NodeMAC[1], u8NodeMAC[2], u8NodeMAC[3], u8NodeMAC[4], u8NodeMAC[5]); + + return ESP_OK; +} + +esp_err_t errMeshNetworkInitializeWiFi() +{ +//wifi initialization + esp_err_t err = ESP_OK; + wifi_init_config_t config = WIFI_INIT_CONFIG_DEFAULT(); + ERROR_CHECK(esp_wifi_init(&config)); + ERROR_CHECK(esp_event_handler_register(IP_EVENT, IP_EVENT_STA_GOT_IP, &vIPEventHandler, NULL)); + ERROR_CHECK(esp_wifi_set_storage(WIFI_STORAGE_FLASH)); + ERROR_CHECK(esp_wifi_start()); + return err; + +} + +esp_err_t errMeshNetworkInitializeRouter(mesh_cfg_t* cfg) +{ +//router initialization + esp_err_t err = ESP_OK; + (*cfg).channel = CONFIG_MESH_CHANNEL; + (*cfg).router.ssid_len = strlen(CONFIG_MESH_ROUTER_SSID); + memcpy((uint8_t *) &(*cfg).router.ssid, CONFIG_MESH_ROUTER_SSID, (*cfg).router.ssid_len); + memcpy((uint8_t *) &(*cfg).router.password, CONFIG_MESH_ROUTER_PASSWD, + strlen(CONFIG_MESH_ROUTER_PASSWD)); + return err; +} + +//returns true if MAC address is equal +bool bCheckMACEquality(uint8_t* pu8aMAC, uint8_t* pu8bMAC) +{ + bool bRet = true; + uint8_t index = 0; + + while ((index < 6) && (bRet == true)) + { + if(pu8aMAC[index] != pu8bMAC[index]) + { + bRet = false; + } + index++; + } + return bRet; +} + +esp_err_t errGetChildren(mesh_addr_t* pChildren, uint16_t* pu16ChildrenSize) +{ + esp_err_t err = ESP_OK; + int route_table_size = 0; + *pu16ChildrenSize = 0; + mesh_addr_t route_table[CONFIG_MESH_ROUTE_TABLE_SIZE]; + ERROR_CHECK(esp_mesh_get_routing_table((mesh_addr_t *) &route_table, (CONFIG_MESH_ROUTE_TABLE_SIZE * 6), &route_table_size)); + + if (err == ESP_OK) + { + for(uint16_t index = 0; index < esp_mesh_get_routing_table_size(); index++) + { + if(! (bCheckMACEquality(u8NodeMAC, route_table[index].addr)) ) + { + //child node + //ESP_LOGI(MESH_TAG, "adding Node: \"0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x\" ", route_table[index].addr[0], route_table[index].addr[1], route_table[index].addr[2], route_table[index].addr[3], route_table[index].addr[4], route_table[index].addr[5]); + pChildren[*pu16ChildrenSize] = route_table[index]; + *pu16ChildrenSize = (*pu16ChildrenSize)+1; + } + } + } + return err; +} + +esp_err_t errSendMeshPacket(mesh_addr_t* pAddrDest, MESH_PACKET_t* pPacket) +{ + esp_err_t err; + mesh_data_t data; + data.data = tx_buf; + data.size = sizeof(tx_buf); + data.proto = MESH_PROTO_BIN; + data.tos = MESH_TOS_P2P; + memcpy(tx_buf, (uint8_t *)pPacket, sizeof(MESH_PACKET_t)); + err = esp_mesh_send(pAddrDest, &data, MESH_DATA_P2P, NULL, 0); + return err; +} + + +esp_err_t errStartReceiveTask() +{ + esp_err_t err = ESP_OK; + BaseType_t xReturned; + + xReturned = xTaskCreate(vTaskReceiveMeshData, "ReceiveMeshData", 7000, NULL, 5, NULL); + + if(xReturned != pdPASS) + { + err = ESP_FAIL; + } + return err; +} + +void vTaskReceiveMeshData(void *arg) +{ + esp_err_t err; + mesh_addr_t from; + mesh_data_t data; + int flag = 0; + data.data = rx_buf; + data.size = CONFIG_MESH_MESSAGE_SIZE; + + while (true) + { + data.size = CONFIG_MESH_MESSAGE_SIZE; + err = esp_mesh_recv(&from, &data, portMAX_DELAY, &flag, NULL, 0); + if (err != ESP_OK || !data.size) + { + ESP_LOGE(LOG_TAG, "err:0x%x, size:%d", err, data.size); + continue; + } + + +/* + struct ota_mesh_packet packet; + memcpy(&packet, (uint8_t *)rx_buf, sizeof(struct ota_mesh_packet)); + + switch (packet.type) + { + case APP_Version_Request: + ESP_LOGI(LOG_TAG, "recv: APP_Version_Request"); + packet.type=APP_Version_Response; + packet.au8Payload[0] = 42; //TODO get current running version + // ESP_ERROR_CHECK (esp_mesh_send_packet(&from, &packet)); //send back to parent + break; + case APP_Version_Response: + ESP_LOGI(LOG_TAG, "recv: APP_Version_Response - App Version %i: ", packet.au8Payload[0]); + //check if node is out-dated + // esp_mesh_ota_send(&from); + break; + case OTA_Data: + ESP_LOGI(LOG_TAG, "recv: OTA_Data"); + //esp_mesh_ota_receive(&from, &packet); + packet.type=OTA_ACK; + //ESP_ERROR_CHECK (esp_mesh_send_packet(&from, &packet)); //send back to parent + break; + case OTA_ACK: + ESP_LOGI(LOG_TAG, "recv: OTA_ACK"); + //esp_mesh_ota_send(&from); + break; + case OTA_Complete: + ESP_LOGI(LOG_TAG, "recv: OTA_Complete"); + break; + default: + ESP_LOGE(LOG_TAG, "recv: something"); + break; + }//end switch + + */ + + } //end while +} + + + + + diff --git a/components/mesh_ota/Mesh_network_handler.c b/components/mesh_ota/Mesh_network_handler.c new file mode 100644 index 0000000..22e198a --- /dev/null +++ b/components/mesh_ota/Mesh_network_handler.c @@ -0,0 +1,221 @@ + +#include "Mesh_OTA.h" + +static const char *LOG_TAG = "mesh_network_handler"; + +void vIPEventHandler(void *arg, esp_event_base_t event_base, int32_t i32EventID, void *vpEventData) +{ + ip_event_got_ip_t *event = (ip_event_got_ip_t *) vpEventData; + ESP_LOGI(LOG_TAG, "IP:" IPSTR, IP2STR(&event->ip_info.ip)); +} + +void vMeshEventHandler(void *arg, esp_event_base_t event_base, int32_t i32EventID, void* vpEventData) +{ + mesh_addr_t id = {0,}; + static uint16_t last_layer = 0; + + switch (i32EventID) + { + case MESH_EVENT_STARTED: + { + esp_mesh_get_id(&id); + ESP_LOGI(LOG_TAG, "ID:"MACSTR"", MAC2STR(id.addr)); + bIsMeshConnected = false; + i32MeshLayer = esp_mesh_get_layer(); + } + break; + case MESH_EVENT_STOPPED: + { + ESP_LOGI(LOG_TAG, ""); + bIsMeshConnected = false; + i32MeshLayer = esp_mesh_get_layer(); + } + break; + case MESH_EVENT_CHILD_CONNECTED: + { + mesh_event_child_connected_t *child_connected = (mesh_event_child_connected_t *)vpEventData; + ESP_LOGI(LOG_TAG, "aid:%d, "MACSTR"", + child_connected->aid, + MAC2STR(child_connected->mac)); + } + break; + case MESH_EVENT_CHILD_DISCONNECTED: + { + mesh_event_child_disconnected_t *child_disconnected = (mesh_event_child_disconnected_t *)vpEventData; + ESP_LOGI(LOG_TAG, "aid:%d, "MACSTR"", + child_disconnected->aid, + MAC2STR(child_disconnected->mac)); + } + break; + case MESH_EVENT_ROUTING_TABLE_ADD: + { + mesh_event_routing_table_change_t *routing_table = (mesh_event_routing_table_change_t *)vpEventData; + ESP_LOGW(LOG_TAG, "add %d, new:%d, layer:%d", + routing_table->rt_size_change, + routing_table->rt_size_new, i32MeshLayer); + } + break; + case MESH_EVENT_ROUTING_TABLE_REMOVE: + { + mesh_event_routing_table_change_t *routing_table = (mesh_event_routing_table_change_t *)vpEventData; + ESP_LOGW(LOG_TAG, "remove %d, new:%d, layer:%d", + routing_table->rt_size_change, + routing_table->rt_size_new, i32MeshLayer); + } + break; + case MESH_EVENT_NO_PARENT_FOUND: + { + mesh_event_no_parent_found_t *no_parent = (mesh_event_no_parent_found_t *)vpEventData; + ESP_LOGI(LOG_TAG, "scan times:%d", + no_parent->scan_times); + /* TODO handler for the failure, maybe nominate themselves */ + } + break; + case MESH_EVENT_PARENT_CONNECTED: + { + mesh_event_connected_t *connected = (mesh_event_connected_t *)vpEventData; + esp_mesh_get_id(&id); + i32MeshLayer = connected->self_layer; + memcpy(&mesh_parent_addr.addr, connected->connected.bssid, 6); + ESP_LOGI(LOG_TAG, "layer:%d-->%d, parent:"MACSTR"%s, ID:"MACSTR", duty:%d", + last_layer, i32MeshLayer, MAC2STR(mesh_parent_addr.addr), + esp_mesh_is_root() ? "" : (i32MeshLayer == 2) ? "" : "", //print own node title + MAC2STR(id.addr), connected->duty); + last_layer = i32MeshLayer; + bIsMeshConnected = true; + if (esp_mesh_is_root()) + { + ESP_ERROR_CHECK(esp_netif_dhcpc_start(netif_sta)); //get a IP from router + } + errStartReceiveTask();//start receiving + } + break; + case MESH_EVENT_PARENT_DISCONNECTED: + { + mesh_event_disconnected_t *disconnected = (mesh_event_disconnected_t *)vpEventData; + ESP_LOGI(LOG_TAG, "reason:%d", disconnected->reason); + bIsMeshConnected = false; + i32MeshLayer = esp_mesh_get_layer(); + } + break; + case MESH_EVENT_LAYER_CHANGE: + { + mesh_event_layer_change_t *layer_change = (mesh_event_layer_change_t *)vpEventData; + i32MeshLayer = layer_change->new_layer; + ESP_LOGI(LOG_TAG, "layer:%d-->%d%s", + last_layer, i32MeshLayer, + esp_mesh_is_root() ? "" : (i32MeshLayer == 2) ? "" : ""); + last_layer = i32MeshLayer; + } + break; + case MESH_EVENT_ROOT_ADDRESS: + { + mesh_event_root_address_t *root_addr = (mesh_event_root_address_t *)vpEventData; + ESP_LOGI(LOG_TAG, "root address:"MACSTR"", + MAC2STR(root_addr->addr)); + } + break; + case MESH_EVENT_VOTE_STARTED: + { + mesh_event_vote_started_t *vote_started = (mesh_event_vote_started_t *)vpEventData; + ESP_LOGI(LOG_TAG, "attempts:%d, reason:%d, rc_addr:"MACSTR"", + vote_started->attempts, + vote_started->reason, + MAC2STR(vote_started->rc_addr.addr)); + } + break; + case MESH_EVENT_VOTE_STOPPED: + { + ESP_LOGI(LOG_TAG, ""); + } + break; + case MESH_EVENT_ROOT_SWITCH_REQ: + { + mesh_event_root_switch_req_t *switch_req = (mesh_event_root_switch_req_t *)vpEventData; + ESP_LOGI(LOG_TAG, "reason:%d, rc_addr:"MACSTR"", switch_req->reason, + MAC2STR( switch_req->rc_addr.addr)); + } + break; + case MESH_EVENT_ROOT_SWITCH_ACK: + { + //new root + i32MeshLayer = esp_mesh_get_layer(); + esp_mesh_get_parent_bssid(&mesh_parent_addr); + ESP_LOGI(LOG_TAG, "layer:%d, parent:"MACSTR"", i32MeshLayer, MAC2STR(mesh_parent_addr.addr)); + } + break; + case MESH_EVENT_TODS_STATE: + { + mesh_event_toDS_state_t *toDs_state = (mesh_event_toDS_state_t *)vpEventData; + ESP_LOGI(LOG_TAG, "state:%d", *toDs_state); + } + break; + case MESH_EVENT_ROOT_FIXED: + { + mesh_event_root_fixed_t *root_fixed = (mesh_event_root_fixed_t *)vpEventData; + ESP_LOGI(LOG_TAG, "%s", + root_fixed->is_fixed ? "fixed" : "not fixed"); + } + break; + case MESH_EVENT_ROOT_ASKED_YIELD: + { + mesh_event_root_conflict_t *root_conflict = (mesh_event_root_conflict_t *)vpEventData; + ESP_LOGI(LOG_TAG, ""MACSTR", rssi:%d, capacity:%d", + MAC2STR(root_conflict->addr), root_conflict->rssi, root_conflict->capacity); + } + break; + case MESH_EVENT_CHANNEL_SWITCH: + { + mesh_event_channel_switch_t *channel_switch = (mesh_event_channel_switch_t *)vpEventData; + ESP_LOGI(LOG_TAG, "new channel:%d", channel_switch->channel); + } + break; + case MESH_EVENT_SCAN_DONE: + { + mesh_event_scan_done_t *scan_done = (mesh_event_scan_done_t *)vpEventData; + ESP_LOGI(LOG_TAG, "number:%d", scan_done->number); + } + break; + case MESH_EVENT_NETWORK_STATE: + { + mesh_event_network_state_t *network_state = (mesh_event_network_state_t *)vpEventData; + ESP_LOGI(LOG_TAG, "is_rootless:%d", network_state->is_rootless); + } + break; + case MESH_EVENT_STOP_RECONNECTION: + { + ESP_LOGI(LOG_TAG, ""); + } + break; + case MESH_EVENT_FIND_NETWORK: + { + mesh_event_find_network_t *find_network = (mesh_event_find_network_t *)vpEventData; + ESP_LOGI(LOG_TAG, "new channel:%d, router BSSID:"MACSTR"", + find_network->channel, MAC2STR(find_network->router_bssid)); + } + break; + case MESH_EVENT_ROUTER_SWITCH: + { + mesh_event_router_switch_t *router_switch = (mesh_event_router_switch_t *)vpEventData; + ESP_LOGI(LOG_TAG, "new router:%s, channel:%d, "MACSTR"", + router_switch->ssid, router_switch->channel, MAC2STR(router_switch->bssid)); + } + break; + case MESH_EVENT_PS_PARENT_DUTY: + { + mesh_event_ps_duty_t *ps_duty = (mesh_event_ps_duty_t *)vpEventData; + ESP_LOGI(LOG_TAG, "duty:%d", ps_duty->duty); + } + break; + case MESH_EVENT_PS_CHILD_DUTY: + { + mesh_event_ps_duty_t *ps_duty = (mesh_event_ps_duty_t *)vpEventData; + ESP_LOGI(LOG_TAG, "cidx:%d, "MACSTR", duty:%d", ps_duty->child_connected.aid-1, + MAC2STR(ps_duty->child_connected.mac), ps_duty->duty); + } + break; + default: + ESP_LOGI(LOG_TAG, "unknown id:%d", i32EventID); + break; + } +} diff --git a/components/mesh_ota/component.mk b/components/mesh_ota/component.mk new file mode 100644 index 0000000..e69de29 diff --git a/components/mesh_ota/include/Mesh_OTA.h b/components/mesh_ota/include/Mesh_OTA.h new file mode 100644 index 0000000..608aa79 --- /dev/null +++ b/components/mesh_ota/include/Mesh_OTA.h @@ -0,0 +1,45 @@ +#ifndef H_MESH_OTA +#define H_MESH_OTA + +#include +#include "esp_wifi.h" +#include "esp_system.h" +#include "esp_event.h" +#include "esp_log.h" +#include "esp_mesh.h" +#include "esp_mesh_internal.h" +#include "nvs_flash.h" +#include "driver/gpio.h" +#include "esp_ota_ops.h" +#include "esp_partition.h" + +#include "Mesh_network.h" + +#define ERASE_NVS //erase non volatile storage if full + +/* +enum ota_packet_type + { + APP_Version_Request, + APP_Version_Response, + OTA_Data, + OTA_ACK, + OTA_Complete + }; +*/ + +#define ERROR_CHECK(x) if (err == ESP_OK) \ + { \ + err = (x); \ + if (err != ESP_OK) \ + { \ + ESP_LOGE(LOG_TAG, "%s failed with error: %d -> %s", #x, err, esp_err_to_name(err)); \ + } \ + } \ + + +bool bNewerVersion(const char* pu8Local, const char* pu8Remote); +esp_err_t errExtractVersionNumber(const char* pu8Data, uint32_t* pu32DataLenght, char* pc8RemoteVersionNumber); +esp_err_t errFindImageStart(const char* pu8Data, uint32_t* pu32DataLenght, uint32_t* pu32StartOffset); + +#endif /* H_MESH_OTA */ diff --git a/components/mesh_ota/include/Mesh_network.h b/components/mesh_ota/include/Mesh_network.h new file mode 100644 index 0000000..bb303c0 --- /dev/null +++ b/components/mesh_ota/include/Mesh_network.h @@ -0,0 +1,83 @@ +#ifndef H_MESH_NETWORK +#define H_MESH_NETWORK + +#include +#include "esp_wifi.h" +#include "esp_system.h" +#include "esp_event.h" +#include "esp_log.h" +#include "esp_mesh.h" +#include "esp_mesh_internal.h" + +#ifndef CONFIG_MESH_MESSAGE_SIZE +#define CONFIG_MESH_MESSAGE_SIZE 1500 +#endif +#ifndef CONFIG_MESH_TOPOLOGY +#define CONFIG_MESH_TOPOLOGY MESH_TOPO_TREE +#endif +#ifndef CONFIG_MESH_MAX_LAYER +#define CONFIG_MESH_MAX_LAYER 6 +#endif +#ifndef CONFIG_MESH_ID +#define CONFIG_MESH_ID "00, 00, 00, 00, 00, 00" +#endif +#ifndef CONFIG_MESH_AP_AUTHMODE +#define CONFIG_MESH_AP_AUTHMODE WIFI_AUTH_WPA2_PSK +#endif +#ifndef CONFIG_MESH_AP_CONNECTIONS +#define CONFIG_MESH_AP_CONNECTIONS 6 +#endif +#ifndef CONFIG_MESH_AP_PASSWD +#define CONFIG_MESH_AP_PASSWD "MAP_PASSWD" +#endif +#ifndef CONFIG_MESH_CHANNEL +#define CONFIG_MESH_CHANNEL 0 +#endif + +#ifndef CONFIG_MESH_ROUTER_SSID +#define CONFIG_MESH_ROUTER_SSID "ROUTER_SSID" +#endif + +#ifndef CONFIG_MESH_ROUTER_PASSWD +#define CONFIG_MESH_ROUTER_PASSWD "ROUTER_PASSWD" +#endif + +#ifndef CONFIG_MESH_ROUTE_TABLE_SIZE +#define CONFIG_MESH_ROUTE_TABLE_SIZE 50 +#endif + + +struct mesh_packet +{ + enum ota_mesh_packet_type { + APP_Data, //data for application + OTA_Version_Request, //send own version in payload + OTA_Version_Respone, //send own version in payload + OTA_Data, //send image segment + OTA_ACK, //ack image segment + OTA_Complete //signal end of image + } type; + uint8_t au8Payload[1024]; +}; + +typedef struct mesh_packet MESH_PACKET_t; + +extern bool bIsMeshConnected; +extern int32_t i32MeshLayer; +extern mesh_addr_t mesh_parent_addr; +extern esp_netif_t* netif_sta; + +esp_err_t errMeshNetworkInitialize(); +esp_err_t errMeshNetworkInitializeWiFi(); +esp_err_t errMeshNetworkInitializeRouter(mesh_cfg_t* cfg); + +bool bCheckMACEquality(uint8_t* pu8aMAC, uint8_t* pu8bMAC); +esp_err_t errGetChildren(mesh_addr_t* pChildren, uint16_t* pu16ChildrenSize); +void vMeshEventHandler(void *arg, esp_event_base_t event_base, int32_t i32EventID, void* vpEventData); +void vIPEventHandler(void *arg, esp_event_base_t event_base, int32_t i32EventID, void *event_data); +esp_err_t errStartReceiveTask(); +void vTaskReceiveMeshData(void *arg); +esp_err_t errSendMeshPacket(mesh_addr_t* pAddrDest, MESH_PACKET_t* pPacket); + +#endif /* H_MESH_NETWORK */ + diff --git a/components/mesh_ota/test/CMakeLists.txt b/components/mesh_ota/test/CMakeLists.txt new file mode 100644 index 0000000..dfb3c14 --- /dev/null +++ b/components/mesh_ota/test/CMakeLists.txt @@ -0,0 +1,3 @@ +idf_component_register(SRC_DIRS "." + INCLUDE_DIRS "." + REQUIRES cmock mesh_ota) diff --git a/components/mesh_ota/test/component.mk b/components/mesh_ota/test/component.mk new file mode 100644 index 0000000..e8e167c --- /dev/null +++ b/components/mesh_ota/test/component.mk @@ -0,0 +1,7 @@ +# This is the minimal test component makefile. +# +# The following line is needed to force the linker to include all the object +# files into the application, even if the functions in these object files +# are not referenced from outside (which is usually the case for unit tests). +# +COMPONENT_ADD_LDFLAGS = -Wl,--whole-archive -l$(COMPONENT_NAME) -Wl,--no-whole-archive diff --git a/components/mesh_ota/test/test_image_hex.h b/components/mesh_ota/test/test_image_hex.h new file mode 100644 index 0000000..7f216bd --- /dev/null +++ b/components/mesh_ota/test/test_image_hex.h @@ -0,0 +1,171 @@ +#ifndef H_TEST_IMAGE_HEX +#define H_TEST_IMAGE_HEX + +//with http response + 0.0.1 +char dataWithHttpRespone0_0_1[] = +{ +0x48, 0x54, 0x54, 0x50, 0x2f, 0x31, 0x2e, 0x31, 0x20, 0x32, 0x30, 0x30, 0x20, 0x4f, 0x4b, 0xd, 0xa, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x3a, 0x20, 0x6e, 0x67, 0x69, 0x6e, 0x78, 0x2f, 0x31, 0x2e, 0x31, 0x34, 0x2e, 0x32, 0xd, 0xa, 0x44, +0x61, 0x74, 0x65, 0x3a, 0x20, 0x54, 0x68, 0x75, 0x2c, 0x20, 0x30, 0x37, 0x20, 0x4a, 0x61, 0x6e, 0x20, 0x32, 0x30, 0x32, 0x31, 0x20, 0x31, 0x33, 0x3a, 0x34, 0x38, 0x3a, 0x32, 0x36, 0x20, 0x47, 0x4d, 0x54, 0xd, 0xa, 0x43, 0x6f, 0x6e, 0x74, +0x65, 0x6e, 0x74, 0x2d, 0x54, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6f, 0x63, 0x74, 0x65, 0x74, 0x2d, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0xd, 0xa, 0x43, 0x6f, 0x6e, 0x74, +0x65, 0x6e, 0x74, 0x2d, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3a, 0x20, 0x31, 0x31, 0x31, 0x34, 0x31, 0x30, 0x30, 0xd, 0xa, 0x4c, 0x61, 0x73, 0x74, 0x2d, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x3a, 0x20, 0x53, 0x61, 0x74, 0x2c, +0x20, 0x30, 0x32, 0x20, 0x4a, 0x61, 0x6e, 0x20, 0x32, 0x30, 0x32, 0x31, 0x20, 0x32, 0x30, 0x3a, 0x34, 0x31, 0x3a, 0x31, 0x31, 0x20, 0x47, 0x4d, 0x54, 0xd, 0xa, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x6b, +0x65, 0x65, 0x70, 0x2d, 0x61, 0x6c, 0x69, 0x76, 0x65, 0xd, 0xa, 0x45, 0x54, 0x61, 0x67, 0x3a, 0x20, 0x22, 0x35, 0x66, 0x66, 0x30, 0x64, 0x61, 0x36, 0x37, 0x2d, 0x31, 0x30, 0x66, 0x66, 0x66, 0x34, 0x22, 0xd, 0xa, 0x53, 0x74, 0x72, 0x69, +0x63, 0x74, 0x2d, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2d, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x3a, 0x20, 0x6d, 0x61, 0x78, 0x2d, 0x61, 0x67, 0x65, 0x3d, 0x33, 0x31, 0x35, 0x33, 0x36, 0x30, 0x30, 0x30, 0xd, +0xa, 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x2d, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x3a, 0x20, 0x62, 0x79, 0x74, 0x65, 0x73, 0xd, 0xa, 0xd, 0xa, 0xe9, 0x7, 0x2, 0x20, 0x5c, 0x12, 0x8, 0x40, 0xee, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x20, 0x0, 0x40, 0x3f, 0xe4, 0x55, 0x3, 0x0, 0x32, 0x54, 0xcd, 0xab, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x30, 0x2e, 0x30, 0x2e, 0x31, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x6f, 0x74, 0x61, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x31, 0x30, 0x3a, 0x32, 0x37, 0x3a, 0x32, 0x31, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4a, 0x61, 0x6e, 0x20, 0x20, 0x32, 0x20, 0x32, 0x30, 0x32, 0x31, 0x0, 0x0, 0x0, 0x0, 0x0, 0x76, 0x34, 0x2e, 0x33, 0x2d, 0x64, +0x65, 0x76, 0x2d, 0x31, 0x39, 0x30, 0x31, 0x2d, 0x67, 0x31, 0x37, 0x38, 0x62, 0x31, 0x32, 0x32, 0x63, 0x31, 0x2d, 0x64, 0x69, 0x72, 0x74, 0x79, 0x0, 0x0, 0xaa, 0xfc, 0x75, 0xd4, 0x9e, 0xd8, 0x9, 0xc1, 0x11, 0x49, 0x59, 0xa4, 0xbb, 0x16, +0xb8, 0x74, 0x14, 0xee, 0x2, 0xe7, 0x82, 0xe6, 0x2b, 0x96, 0x19, 0xb7, 0xe8, 0x2f, 0x41, 0x9e, 0x7e, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x70, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x0, 0x1b, 0x5b, 0x30, 0x3b, 0x33, 0x31, 0x6d, 0x45, 0x20, 0x28, 0x25, 0x64, 0x29, 0x20, 0x25, 0x73, 0x3a, 0x20, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, +0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x20, 0x74, 0x61, 0x73, 0x6b, 0x20, 0x61, 0x72, 0x67, 0x73, 0x21, 0x1b, 0x5b, 0x30, 0x6d, 0xa, 0x0, 0x0, 0x0, 0x0, 0x1b, 0x5b, 0x30, 0x3b, 0x33, 0x31, 0x6d, 0x45, 0x20, 0x28, 0x25, 0x64, 0x29, +0x20, 0x25, 0x73, 0x3a, 0x20, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x20, 0x70, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x20, 0x64, 0x61, 0x74, 0x61, 0x21, 0x1b, 0x5b, 0x30, +0x6d, 0xa, 0x0, 0x1b, 0x5b, 0x30, 0x3b, 0x33, 0x31, 0x6d, 0x45, 0x20, 0x28, 0x25, 0x64, 0x29, 0x20, 0x25, 0x73, 0x3a, 0x20, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x20, 0x74, 0x61, +0x73, 0x6b, 0x21, 0x1b, 0x5b, 0x30, 0x6d, 0xa, 0x0, 0x0, 0x0, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x20, 0x26, 0x26, 0x20, 0x22, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x74, 0x68, 0x72, 0x65, 0x61, +0x64, 0x73, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x21, 0x22, 0x0, 0x2f, 0x68, 0x6f, 0x6d, 0x65, 0x2f, 0x68, 0x65, 0x6e, 0x64, 0x72, 0x69, 0x6b, 0x2f, 0x65, 0x73, 0x70, 0x2f, 0x65, 0x73, 0x70, 0x2d, 0x69, 0x64, 0x66, 0x2f, 0x63, 0x6f, 0x6d, 0x70, +0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x70, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x2f, 0x70, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x2e, 0x63, 0x0, 0x0, 0x1b, 0x5b, 0x30, 0x3b, 0x33, 0x31, 0x6d, 0x45, 0x20, 0x28, 0x25, 0x64, 0x29, 0x20, +0x25, 0x73, 0x3a, 0x20, 0x25, 0x73, 0x3a, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x21, 0x1b, 0x5b, 0x30, 0x6d, 0xa, 0x0, 0x0, 0x0, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x20, 0x26, 0x26, 0x20, 0x22, 0x46, +0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x75, 0x6e, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x6d, 0x75, 0x74, 0x65, 0x78, 0x21, 0x22, 0x0, 0x0, 0x70, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6d, 0x75, 0x74, 0x65, 0x78, 0x5f, 0x75, +0x6e, 0x6c, 0x6f, 0x63, 0x6b, 0x0, 0x0, 0x0, 0x0, 0x70, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x63, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x0, 0x0, 0x74, 0x6c, 0x73, 0x20, 0x21, 0x3d, 0x20, 0x4e, 0x55, 0x4c, 0x4c, 0x0, 0x2f, 0x68, 0x6f, 0x6d, +0x65, 0x2f, 0x68, 0x65, 0x6e, 0x64, 0x72, 0x69, 0x6b, 0x2f, 0x65, 0x73, 0x70, 0x2f, 0x65, 0x73, 0x70, 0x2d, 0x69, 0x64, 0x66, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74 +}; + +//without http response + 0.0.1 +char dataWithoutHttpRespone0_0_1[] = +{ +0xe9, 0x7, 0x2, 0x20, 0x5c, 0x12, 0x8, 0x40, 0xee, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x20, 0x0, 0x40, 0x3f, 0xe4, 0x55, 0x3, 0x0, 0x32, 0x54, 0xcd, 0xab, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x30, 0x2e, 0x30, 0x2e, 0x31, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x6f, 0x74, 0x61, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x31, 0x30, 0x3a, 0x32, 0x37, 0x3a, 0x32, 0x31, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4a, 0x61, 0x6e, 0x20, 0x20, 0x32, 0x20, 0x32, 0x30, 0x32, 0x31, 0x0, 0x0, 0x0, 0x0, 0x0, 0x76, 0x34, 0x2e, 0x33, 0x2d, 0x64, +0x65, 0x76, 0x2d, 0x31, 0x39, 0x30, 0x31, 0x2d, 0x67, 0x31, 0x37, 0x38, 0x62, 0x31, 0x32, 0x32, 0x63, 0x31, 0x2d, 0x64, 0x69, 0x72, 0x74, 0x79, 0x0, 0x0, 0xaa, 0xfc, 0x75, 0xd4, 0x9e, 0xd8, 0x9, 0xc1, 0x11, 0x49, 0x59, 0xa4, 0xbb, 0x16, +0xb8, 0x74, 0x14, 0xee, 0x2, 0xe7, 0x82, 0xe6, 0x2b, 0x96, 0x19, 0xb7, 0xe8, 0x2f, 0x41, 0x9e, 0x7e, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x70, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x0, 0x1b, 0x5b, 0x30, 0x3b, 0x33, 0x31, 0x6d, 0x45, 0x20, 0x28, 0x25, 0x64, 0x29, 0x20, 0x25, 0x73, 0x3a, 0x20, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, +0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x20, 0x74, 0x61, 0x73, 0x6b, 0x20, 0x61, 0x72, 0x67, 0x73, 0x21, 0x1b, 0x5b, 0x30, 0x6d, 0xa, 0x0, 0x0, 0x0, 0x0, 0x1b, 0x5b, 0x30, 0x3b, 0x33, 0x31, 0x6d, 0x45, 0x20, 0x28, 0x25, 0x64, 0x29, +0x20, 0x25, 0x73, 0x3a, 0x20, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x20, 0x70, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x20, 0x64, 0x61, 0x74, 0x61, 0x21, 0x1b, 0x5b, 0x30, +0x6d, 0xa, 0x0, 0x1b, 0x5b, 0x30, 0x3b, 0x33, 0x31, 0x6d, 0x45, 0x20, 0x28, 0x25, 0x64, 0x29, 0x20, 0x25, 0x73, 0x3a, 0x20, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x20, 0x74, 0x61, +0x73, 0x6b, 0x21, 0x1b, 0x5b, 0x30, 0x6d, 0xa, 0x0, 0x0, 0x0, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x20, 0x26, 0x26, 0x20, 0x22, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x74, 0x68, 0x72, 0x65, 0x61, +0x64, 0x73, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x21, 0x22, 0x0, 0x2f, 0x68, 0x6f, 0x6d, 0x65, 0x2f, 0x68, 0x65, 0x6e, 0x64, 0x72, 0x69, 0x6b, 0x2f, 0x65, 0x73, 0x70, 0x2f, 0x65, 0x73, 0x70, 0x2d, 0x69, 0x64, 0x66, 0x2f, 0x63, 0x6f, 0x6d, 0x70, +0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x70, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x2f, 0x70, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x2e, 0x63, 0x0, 0x0, 0x1b, 0x5b, 0x30, 0x3b, 0x33, 0x31, 0x6d, 0x45, 0x20, 0x28, 0x25, 0x64, 0x29, 0x20, +0x25, 0x73, 0x3a, 0x20, 0x25, 0x73, 0x3a, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x21, 0x1b, 0x5b, 0x30, 0x6d, 0xa, 0x0, 0x0, 0x0, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x20, 0x26, 0x26, 0x20, 0x22, 0x46, +0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x75, 0x6e, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x6d, 0x75, 0x74, 0x65, 0x78, 0x21, 0x22, 0x0, 0x0, 0x70, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6d, 0x75, 0x74, 0x65, 0x78, 0x5f, 0x75, +0x6e, 0x6c, 0x6f, 0x63, 0x6b, 0x0, 0x0, 0x0, 0x0, 0x70, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x63, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x0, 0x0, 0x74, 0x6c, 0x73, 0x20, 0x21, 0x3d, 0x20, 0x4e, 0x55, 0x4c, 0x4c, 0x0, 0x2f, 0x68, 0x6f, 0x6d, +0x65, 0x2f, 0x68, 0x65, 0x6e, 0x64, 0x72, 0x69, 0x6b, 0x2f, 0x65, 0x73, 0x70, 0x2f, 0x65, 0x73, 0x70, 0x2d, 0x69, 0x64, 0x66, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74 +}; + +//without http response + 9999.999.999 +char dataWithoutHttpRespone999_999_999[] = +{ +0xe9, 0x7, 0x2, 0x20, 0x5c, 0x12, 0x8, 0x40, 0xee, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x20, 0x0, 0x40, 0x3f, 0xec, 0x44, 0x3, 0x0, 0x32, 0x54, 0xcd, 0xab, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x39, 0x39, 0x39, 0x2e, 0x39, 0x39, 0x39, 0x2e, 0x39, 0x39, 0x39, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x6f, 0x74, 0x61, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x31, 0x34, 0x3a, 0x35, 0x39, 0x3a, 0x33, 0x38, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4a, 0x61, 0x6e, 0x20, 0x20, 0x36, 0x20, 0x32, 0x30, 0x32, 0x31, 0x0, 0x0, 0x0, 0x0, 0x0, 0x76, 0x34, 0x2e, 0x33, 0x2d, 0x64, +0x65, 0x76, 0x2d, 0x31, 0x39, 0x30, 0x31, 0x2d, 0x67, 0x31, 0x37, 0x38, 0x62, 0x31, 0x32, 0x32, 0x63, 0x31, 0x2d, 0x64, 0x69, 0x72, 0x74, 0x79, 0x0, 0x0, 0x75, 0xf1, 0xa7, 0x5d, 0x78, 0xac, 0xe3, 0x63, 0x3f, 0x1a, 0x81, 0x90, 0x34, 0x2c, +0xf7, 0xb3, 0x33, 0x63, 0xa4, 0x7c, 0x1e, 0x98, 0xf6, 0x74, 0xd0, 0xcf, 0xdc, 0x51, 0x68, 0x15, 0xcd, 0x61, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x70, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x0, 0x1b, 0x5b, 0x30, 0x3b, 0x33, 0x31, 0x6d, 0x45, 0x20, 0x28, 0x25, 0x64, 0x29, 0x20, 0x25, 0x73, 0x3a, 0x20, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x74, 0x6f, +0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x20, 0x74, 0x61, 0x73, 0x6b, 0x20, 0x61, 0x72, 0x67, 0x73, 0x21, 0x1b, 0x5b, 0x30, 0x6d, 0xa, 0x0, 0x0, 0x0, 0x0, 0x1b, 0x5b, 0x30, 0x3b, 0x33, 0x31, 0x6d, 0x45, 0x20, 0x28, 0x25, 0x64, +0x29, 0x20, 0x25, 0x73, 0x3a, 0x20, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x20, 0x70, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x20, 0x64, 0x61, 0x74, 0x61, 0x21, 0x1b, 0x5b, +0x30, 0x6d, 0xa, 0x0, 0x1b, 0x5b, 0x30, 0x3b, 0x33, 0x31, 0x6d, 0x45, 0x20, 0x28, 0x25, 0x64, 0x29, 0x20, 0x25, 0x73, 0x3a, 0x20, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x20, 0x74, +0x61, 0x73, 0x6b, 0x21, 0x1b, 0x5b, 0x30, 0x6d, 0xa, 0x0, 0x0, 0x0, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x20, 0x26, 0x26, 0x20, 0x22, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x74, 0x68, 0x72, +0x65, 0x61, 0x64, 0x73, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x21, 0x22, 0x0, 0x2f, 0x68, 0x6f, 0x6d, 0x65, 0x2f, 0x68, 0x65, 0x6e, 0x64, 0x72, 0x69, 0x6b, 0x2f, 0x65, 0x73, 0x70, 0x2f, 0x65, 0x73, 0x70, 0x2d, 0x69, 0x64, 0x66, 0x2f, 0x63, 0x6f, +0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x70, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x2f, 0x70, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x2e, 0x63, 0x0, 0x0, 0x1b, 0x5b, 0x30, 0x3b, 0x33, 0x31, 0x6d, 0x45, 0x20, 0x28, 0x25, 0x64, +0x29, 0x20, 0x25, 0x73, 0x3a, 0x20, 0x25, 0x73, 0x3a, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x21, 0x1b, 0x5b, 0x30, 0x6d, 0xa, 0x0, 0x0, 0x0, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x20, 0x26, 0x26, +0x20, 0x22, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x75, 0x6e, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x6d, 0x75, 0x74, 0x65, 0x78, 0x21, 0x22, 0x0, 0x0, 0x70, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6d, 0x75, 0x74, 0x65, +0x78, 0x5f, 0x75, 0x6e, 0x6c, 0x6f, 0x63, 0x6b, 0x0, 0x0, 0x0, 0x0, 0x70, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x63, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x0, 0x0, 0x74, 0x6c, 0x73, 0x20, 0x21, 0x3d, 0x20, 0x4e, 0x55, 0x4c, 0x4c, 0x0, 0x2f, +0x68, 0x6f, 0x6d, 0x65, 0x2f, 0x68, 0x65, 0x6e, 0x64, 0x72, 0x69, 0x6b, 0x2f, 0x65, 0x73, 0x70, 0x2f, 0x65, 0x73, 0x70, 0x2d, 0x69, 0x64, 0x66, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, + +}; + +//with http response + 999.999.999 +char dataWithHttpRespone999_999_999[] = +{ +0x48, 0x54, 0x54, 0x50, 0x2f, 0x31, 0x2e, 0x31, 0x20, 0x32, 0x30, 0x30, 0x20, 0x4f, 0x4b, 0xd, 0xa, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x3a, 0x20, 0x6e, 0x67, 0x69, 0x6e, 0x78, 0x2f, 0x31, 0x2e, 0x31, 0x34, 0x2e, 0x32, 0xd, 0xa, 0x44, +0x61, 0x74, 0x65, 0x3a, 0x20, 0x54, 0x68, 0x75, 0x2c, 0x20, 0x30, 0x37, 0x20, 0x4a, 0x61, 0x6e, 0x20, 0x32, 0x30, 0x32, 0x31, 0x20, 0x31, 0x35, 0x3a, 0x31, 0x33, 0x3a, 0x32, 0x39, 0x20, 0x47, 0x4d, 0x54, 0xd, 0xa, 0x43, 0x6f, 0x6e, 0x74, +0x65, 0x6e, 0x74, 0x2d, 0x54, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6f, 0x63, 0x74, 0x65, 0x74, 0x2d, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0xd, 0xa, 0x43, 0x6f, 0x6e, 0x74, +0x65, 0x6e, 0x74, 0x2d, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3a, 0x20, 0x31, 0x31, 0x31, 0x34, 0x31, 0x30, 0x30, 0xd, 0xa, 0x4c, 0x61, 0x73, 0x74, 0x2d, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x3a, 0x20, 0x57, 0x65, 0x64, 0x2c, +0x20, 0x30, 0x36, 0x20, 0x4a, 0x61, 0x6e, 0x20, 0x32, 0x30, 0x32, 0x31, 0x20, 0x31, 0x33, 0x3a, 0x35, 0x39, 0x3a, 0x35, 0x33, 0x20, 0x47, 0x4d, 0x54, 0xd, 0xa, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x6b, +0x65, 0x65, 0x70, 0x2d, 0x61, 0x6c, 0x69, 0x76, 0x65, 0xd, 0xa, 0x45, 0x54, 0x61, 0x67, 0x3a, 0x20, 0x22, 0x35, 0x66, 0x66, 0x35, 0x63, 0x32, 0x35, 0x39, 0x2d, 0x31, 0x30, 0x66, 0x66, 0x66, 0x34, 0x22, 0xd, 0xa, 0x53, 0x74, 0x72, 0x69, +0x63, 0x74, 0x2d, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2d, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x3a, 0x20, 0x6d, 0x61, 0x78, 0x2d, 0x61, 0x67, 0x65, 0x3d, 0x33, 0x31, 0x35, 0x33, 0x36, 0x30, 0x30, 0x30, 0xd, +0xa, 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x2d, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x3a, 0x20, 0x62, 0x79, 0x74, 0x65, 0x73, 0xd, 0xa, 0xd, 0xa, 0xe9, 0x7, 0x2, 0x20, 0x5c, 0x12, 0x8, 0x40, 0xee, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x20, 0x0, 0x40, 0x3f, 0xec, 0x44, 0x3, 0x0, 0x32, 0x54, 0xcd, 0xab, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x39, 0x39, 0x39, 0x2e, 0x39, 0x39, 0x39, 0x2e, 0x39, 0x39, 0x39, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x6f, 0x74, 0x61, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x31, 0x34, 0x3a, 0x35, 0x39, 0x3a, 0x33, 0x38, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4a, 0x61, 0x6e, 0x20, 0x20, 0x36, 0x20, 0x32, 0x30, 0x32, 0x31, 0x0, 0x0, 0x0, 0x0, 0x0, 0x76, 0x34, 0x2e, 0x33, 0x2d, 0x64, +0x65, 0x76, 0x2d, 0x31, 0x39, 0x30, 0x31, 0x2d, 0x67, 0x31, 0x37, 0x38, 0x62, 0x31, 0x32, 0x32, 0x63, 0x31, 0x2d, 0x64, 0x69, 0x72, 0x74, 0x79, 0x0, 0x0, 0x75, 0xf1, 0xa7, 0x5d, 0x78, 0xac, 0xe3, 0x63, 0x3f, 0x1a, 0x81, 0x90, 0x34, 0x2c, +0xf7, 0xb3, 0x33, 0x63, 0xa4, 0x7c, 0x1e, 0x98, 0xf6, 0x74, 0xd0, 0xcf, 0xdc, 0x51, 0x68, 0x15, 0xcd, 0x61, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x70, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x0, 0x1b, 0x5b, 0x30, 0x3b, 0x33, 0x31, 0x6d, 0x45, 0x20, 0x28, 0x25, 0x64, 0x29, 0x20, 0x25, 0x73, 0x3a, 0x20, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x74, 0x6f, +0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x20, 0x74, 0x61, 0x73, 0x6b, 0x20, 0x61, 0x72, 0x67, 0x73, 0x21, 0x1b, 0x5b, 0x30, 0x6d, 0xa, 0x0, 0x0, 0x0, 0x0, 0x1b, 0x5b, 0x30, 0x3b, 0x33, 0x31, 0x6d, 0x45, 0x20, 0x28, 0x25, 0x64, +0x29, 0x20, 0x25, 0x73, 0x3a, 0x20, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x20, 0x70, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x20, 0x64, 0x61, 0x74, 0x61, 0x21, 0x1b, 0x5b, +0x30, 0x6d, 0xa, 0x0, 0x1b, 0x5b, 0x30, 0x3b, 0x33, 0x31, 0x6d, 0x45, 0x20, 0x28, 0x25, 0x64, 0x29, 0x20, 0x25, 0x73, 0x3a, 0x20, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x20, 0x74, +0x61, 0x73, 0x6b, 0x21, 0x1b, 0x5b, 0x30, 0x6d, 0xa, 0x0, 0x0, 0x0, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x20, 0x26, 0x26, 0x20, 0x22, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x74, 0x68, 0x72, +0x65, 0x61, 0x64, 0x73, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x21, 0x22, 0x0, 0x2f, 0x68, 0x6f, 0x6d, 0x65, 0x2f, 0x68, 0x65, 0x6e, 0x64, 0x72, 0x69, 0x6b, 0x2f, 0x65, 0x73, 0x70, 0x2f, 0x65, 0x73, 0x70, 0x2d, 0x69, 0x64, 0x66, 0x2f, 0x63, 0x6f, +0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x70, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x2f, 0x70, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x2e, 0x63, 0x0, 0x0, 0x1b, 0x5b, 0x30, 0x3b, 0x33, 0x31, 0x6d, 0x45, 0x20, 0x28, 0x25, 0x64, +0x29, 0x20, 0x25, 0x73, 0x3a, 0x20, 0x25, 0x73, 0x3a, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x21, 0x1b, 0x5b, 0x30, 0x6d, 0xa, 0x0, 0x0, 0x0, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x20, 0x26, 0x26, +0x20, 0x22, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x75, 0x6e, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x6d, 0x75, 0x74, 0x65, 0x78, 0x21, 0x22, 0x0, 0x0, 0x70, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6d, 0x75, 0x74, 0x65, +0x78, 0x5f, 0x75, 0x6e, 0x6c, 0x6f, 0x63, 0x6b, 0x0, 0x0, 0x0, 0x0, 0x70, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x63, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x0, 0x0, 0x74, 0x6c, 0x73, 0x20, 0x21, 0x3d, 0x20, 0x4e, 0x55, 0x4c, 0x4c, 0x0, 0x2f, +0x68, 0x6f, 0x6d, 0x65, 0x2f, 0x68, 0x65, 0x6e, 0x64, 0x72, 0x69, 0x6b, 0x2f, 0x65, 0x73, 0x70, 0x2f, 0x65, 0x73, 0x70, 0x2d, 0x69, 0x64, 0x66, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, +}; + +//with http response + 999.9.999 +char dataWithHttpRespone999_9_999[] = +{ +0x48, 0x54, 0x54, 0x50, 0x2f, 0x31, 0x2e, 0x31, 0x20, 0x32, 0x30, 0x30, 0x20, 0x4f, 0x4b, 0xd, 0xa, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x3a, 0x20, 0x6e, 0x67, 0x69, 0x6e, 0x78, 0x2f, 0x31, 0x2e, 0x31, 0x34, 0x2e, 0x32, 0xd, 0xa, 0x44, +0x61, 0x74, 0x65, 0x3a, 0x20, 0x54, 0x68, 0x75, 0x2c, 0x20, 0x30, 0x37, 0x20, 0x4a, 0x61, 0x6e, 0x20, 0x32, 0x30, 0x32, 0x31, 0x20, 0x31, 0x35, 0x3a, 0x31, 0x33, 0x3a, 0x32, 0x39, 0x20, 0x47, 0x4d, 0x54, 0xd, 0xa, 0x43, 0x6f, 0x6e, 0x74, +0x65, 0x6e, 0x74, 0x2d, 0x54, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6f, 0x63, 0x74, 0x65, 0x74, 0x2d, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0xd, 0xa, 0x43, 0x6f, 0x6e, 0x74, +0x65, 0x6e, 0x74, 0x2d, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3a, 0x20, 0x34, 0x31, 0x30, 0x30, 0xd, 0xa, 0x4c, 0x61, 0x73, 0x74, 0x2d, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x3a, 0x20, 0x57, 0x65, 0x64, 0x2c, +0x20, 0x30, 0x36, 0x20, 0x4a, 0x61, 0x6e, 0x20, 0x32, 0x30, 0x32, 0x31, 0x20, 0x31, 0x33, 0x3a, 0x35, 0x39, 0x3a, 0x35, 0x33, 0x20, 0x47, 0x4d, 0x54, 0xd, 0xa, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x6b, +0x65, 0x65, 0x70, 0x2d, 0x61, 0x6c, 0x69, 0x76, 0x65, 0xd, 0xa, 0x45, 0x54, 0x61, 0x67, 0x3a, 0x20, 0x22, 0x35, 0x66, 0x66, 0x35, 0x63, 0x32, 0x35, 0x39, 0x2d, 0x31, 0x30, 0x66, 0x66, 0x66, 0x34, 0x22, 0xd, 0xa, 0x53, 0x74, 0x72, 0x69, +0x63, 0x74, 0x2d, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2d, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x3a, 0x20, 0x6d, 0x61, 0x78, 0x2d, 0x61, 0x67, 0x65, 0x3d, 0x33, 0x31, 0x35, 0x33, 0x36, 0x30, 0x30, 0x30, 0xd, +0xa, 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x2d, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x3a, 0x20, 0x62, 0x79, 0x74, 0x65, 0x73, 0xd, 0xa, 0xd, 0xa, 0xe9, 0x7, 0x2, 0x20, 0x5c, 0x12, 0x8, 0x40, 0xee, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x20, 0x0, 0x40, 0x3f, 0xec, 0x44, 0x3, 0x0, 0x32, 0x54, 0xcd, 0xab, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x39, 0x39, 0x39, 0x2e, 0x39, 0x2e, 0x39, 0x39, 0x39, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x6f, 0x74, 0x61, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x31, 0x34, 0x3a, 0x35, 0x39, 0x3a, 0x33, 0x38, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4a, 0x61, 0x6e, 0x20, 0x20, 0x36, 0x20, 0x32, 0x30, 0x32, 0x31, 0x0, 0x0, 0x0, 0x0, 0x0, 0x76, 0x34, 0x2e, 0x33, 0x2d, 0x64, +0x65, 0x76, 0x2d, 0x31, 0x39, 0x30, 0x31, 0x2d, 0x67, 0x31, 0x37, 0x38, 0x62, 0x31, 0x32, 0x32, 0x63, 0x31, 0x2d, 0x64, 0x69, 0x72, 0x74, 0x79, 0x0, 0x0, 0x75, 0xf1, 0xa7, 0x5d, 0x78, 0xac, 0xe3, 0x63, 0x3f, 0x1a, 0x81, 0x90, 0x34, 0x2c, +0xf7, 0xb3, 0x33, 0x63, 0xa4, 0x7c, 0x1e, 0x98, 0xf6, 0x74, 0xd0, 0xcf, 0xdc, 0x51, 0x68, 0x15, 0xcd, 0x61, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x70, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x0, 0x1b, 0x5b, 0x30, 0x3b, 0x33, 0x31, 0x6d, 0x45, 0x20, 0x28, 0x25, 0x64, 0x29, 0x20, 0x25, 0x73, 0x3a, 0x20, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x74, 0x6f, +0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x20, 0x74, 0x61, 0x73, 0x6b, 0x20, 0x61, 0x72, 0x67, 0x73, 0x21, 0x1b, 0x5b, 0x30, 0x6d, 0xa, 0x0, 0x0, 0x0, 0x0, 0x1b, 0x5b, 0x30, 0x3b, 0x33, 0x31, 0x6d, 0x45, 0x20, 0x28, 0x25, 0x64, +0x29, 0x20, 0x25, 0x73, 0x3a, 0x20, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x20, 0x70, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x20, 0x64, 0x61, 0x74, 0x61, 0x21, 0x1b, 0x5b, +0x30, 0x6d, 0xa, 0x0, 0x1b, 0x5b, 0x30, 0x3b, 0x33, 0x31, 0x6d, 0x45, 0x20, 0x28, 0x25, 0x64, 0x29, 0x20, 0x25, 0x73, 0x3a, 0x20, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x20, 0x74, +0x61, 0x73, 0x6b, 0x21, 0x1b, 0x5b, 0x30, 0x6d, 0xa, 0x0, 0x0, 0x0, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x20, 0x26, 0x26, 0x20, 0x22, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x74, 0x68, 0x72, +0x65, 0x61, 0x64, 0x73, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x21, 0x22, 0x0, 0x2f, 0x68, 0x6f, 0x6d, 0x65, 0x2f, 0x68, 0x65, 0x6e, 0x64, 0x72, 0x69, 0x6b, 0x2f, 0x65, 0x73, 0x70, 0x2f, 0x65, 0x73, 0x70, 0x2d, 0x69, 0x64, 0x66, 0x2f, 0x63, 0x6f, +0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x70, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x2f, 0x70, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x2e, 0x63, 0x0, 0x0, 0x1b, 0x5b, 0x30, 0x3b, 0x33, 0x31, 0x6d, 0x45, 0x20, 0x28, 0x25, 0x64, +0x29, 0x20, 0x25, 0x73, 0x3a, 0x20, 0x25, 0x73, 0x3a, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x21, 0x1b, 0x5b, 0x30, 0x6d, 0xa, 0x0, 0x0, 0x0, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x20, 0x26, 0x26, +0x20, 0x22, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x75, 0x6e, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x6d, 0x75, 0x74, 0x65, 0x78, 0x21, 0x22, 0x0, 0x0, 0x70, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6d, 0x75, 0x74, 0x65, +0x78, 0x5f, 0x75, 0x6e, 0x6c, 0x6f, 0x63, 0x6b, 0x0, 0x0, 0x0, 0x0, 0x70, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x63, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x0, 0x0, 0x74, 0x6c, 0x73, 0x20, 0x21, 0x3d, 0x20, 0x4e, 0x55, 0x4c, 0x4c, 0x0, 0x2f, +0x68, 0x6f, 0x6d, 0x65, 0x2f, 0x68, 0x65, 0x6e, 0x64, 0x72, 0x69, 0x6b, 0x2f, 0x65, 0x73, 0x70, 0x2f, 0x65, 0x73, 0x70, 0x2d, 0x69, 0x64, 0x66, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, +}; + +//with http response + 999.99.999 +char dataWithHttpRespone999_99_999[] = +{ +0x48, 0x54, 0x54, 0x50, 0x2f, 0x31, 0x2e, 0x31, 0x20, 0x32, 0x30, 0x30, 0x20, 0x4f, 0x4b, 0xd, 0xa, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x3a, 0x20, 0x6e, 0x67, 0x69, 0x6e, 0x78, 0x2f, 0x31, 0x2e, 0x31, 0x34, 0x2e, 0x32, 0xd, 0xa, 0x44, +0x61, 0x74, 0x65, 0x3a, 0x20, 0x54, 0x68, 0x75, 0x2c, 0x20, 0x30, 0x37, 0x20, 0x4a, 0x61, 0x6e, 0x20, 0x32, 0x30, 0x32, 0x31, 0x20, 0x31, 0x35, 0x3a, 0x31, 0x33, 0x3a, 0x32, 0x39, 0x20, 0x47, 0x4d, 0x54, 0xd, 0xa, 0x43, 0x6f, 0x6e, 0x74, +0x65, 0x6e, 0x74, 0x2d, 0x54, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6f, 0x63, 0x74, 0x65, 0x74, 0x2d, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0xd, 0xa, 0x43, 0x6f, 0x6e, 0x74, +0x65, 0x6e, 0x74, 0x2d, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3a, 0x20, 0x31, 0x31, 0x31, 0x34, 0x31, 0x30, 0x30, 0xd, 0xa, 0x4c, 0x61, 0x73, 0x74, 0x2d, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x3a, 0x20, 0x57, 0x65, 0x64, 0x2c, +0x20, 0x30, 0x36, 0x20, 0x4a, 0x61, 0x6e, 0x20, 0x32, 0x30, 0x32, 0x31, 0x20, 0x31, 0x33, 0x3a, 0x35, 0x39, 0x3a, 0x35, 0x33, 0x20, 0x47, 0x4d, 0x54, 0xd, 0xa, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x6b, +0x65, 0x65, 0x70, 0x2d, 0x61, 0x6c, 0x69, 0x76, 0x65, 0xd, 0xa, 0x45, 0x54, 0x61, 0x67, 0x3a, 0x20, 0x22, 0x35, 0x66, 0x66, 0x35, 0x63, 0x32, 0x35, 0x39, 0x2d, 0x31, 0x30, 0x66, 0x66, 0x66, 0x34, 0x22, 0xd, 0xa, 0x53, 0x74, 0x72, 0x69, +0x63, 0x74, 0x2d, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2d, 0x53, 0x65, 0x63, 0x75, 0x72, 0x61, 0x78, 0x2d, 0x61, 0x67, 0x65, 0x3d, 0x33, 0x31, 0x35, 0x33, 0x36, 0x30, 0x30, 0x30, 0xd, +0xa, 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x2d, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x3a, 0x20, 0x62, 0x79, 0x74, 0x65, 0x73, 0xd, 0xa, 0xd, 0xa, 0xe9, 0x7, 0x2, 0x20, 0x5c, 0x12, 0x8, 0x40, 0xee, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x20, 0x0, 0x40, 0x3f, 0xec, 0x44, 0x3, 0x0, 0x32, 0x54, 0xcd, 0xab, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x39, 0x39, 0x39, 0x2e, 0x39, 0x39, 0x2e, 0x39, 0x39, 0x39, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x6f, 0x74, 0x61, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x31, 0x34, 0x3a, 0x35, 0x39, 0x3a, 0x33, 0x38, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4a, 0x61, 0x6e, 0x20, 0x20, 0x36, 0x20, 0x32, 0x30, 0x32, 0x31, 0x0, 0x0, 0x0, 0x0, 0x0, 0x76, 0x34, 0x2e, 0x33, 0x2d, 0x64, +0x65, 0x76, 0x2d, 0x31, 0x39, 0x30, 0x31, 0x2d, 0x67, 0x31, 0x37, 0x38, 0x62, 0x31, 0x32, 0x32, 0x63, 0x31, 0x2d, 0x64, 0x69, 0x72, 0x74, 0x79, 0x0, 0x0, 0x75, 0xf1, 0xa7, 0x5d, 0x78, 0xac, 0xe3, 0x63, 0x3f, 0x1a, 0x81, 0x90, 0x34, 0x2c, +0xf7, 0xb3, 0x33, 0x63, 0xa4, 0x7c, 0x1e, 0x98, 0xf6, 0x74, 0xd0, 0xcf, 0xdc, 0x51, 0x68, 0x15, 0xcd, 0x61, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x70, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x0, 0x1b, 0x5b, 0x30, 0x3b, 0x33, 0x31, 0x6d, 0x45, 0x20, 0x28, 0x25, 0x64, 0x29, 0x20, 0x25, 0x73, 0x3a, 0x20, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x74, 0x6f, +0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x20, 0x74, 0x61, 0x73, 0x6b, 0x20, 0x61, 0x72, 0x67, 0x73, 0x21, 0x1b, 0x5b, 0x30, 0x6d, 0xa, 0x0, 0x0, 0x0, 0x0, 0x1b, 0x5b, 0x30, 0x3b, 0x33, 0x31, 0x6d, 0x45, 0x20, 0x28, 0x25, 0x64, +0x29, 0x20, 0x25, 0x73, 0x3a, 0x20, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x20, 0x70, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x20, 0x64, 0x61, 0x74, 0x61, 0x21, 0x1b, 0x5b, +0x30, 0x6d, 0xa, 0x0, 0x1b, 0x5b, 0x30, 0x3b, 0x33, 0x31, 0x6d, 0x45, 0x20, 0x28, 0x25, 0x64, 0x29, 0x20, 0x25, 0x73, 0x3a, 0x20, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x20, 0x74, +0x61, 0x73, 0x6b, 0x21, 0x1b, 0x5b, 0x30, 0x6d, 0xa, 0x0, 0x0, 0x0, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x20, 0x26, 0x26, 0x20, 0x22, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x74, 0x68, 0x72, +0x65, 0x61, 0x64, 0x73, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x21, 0x22, 0x0, 0x2f, 0x68, 0x6f, 0x6d, 0x65, 0x2f, 0x68, 0x65, 0x6e, 0x64, 0x72, 0x69, 0x6b, 0x2f, 0x65, 0x73, 0x70, 0x2f, 0x65, 0x73, 0x70, 0x2d, 0x69, 0x64, 0x66, 0x2f, 0x63, 0x6f, +0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x70, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x2f, 0x70, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x2e, 0x63, 0x0, 0x0, 0x1b, 0x5b, 0x30, 0x3b, 0x33, 0x31, 0x6d, 0x45, 0x20, 0x28, 0x25, 0x64, +0x29, 0x20, 0x25, 0x73, 0x3a, 0x20, 0x25, 0x73, 0x3a, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x21, 0x1b, 0x5b, 0x30, 0x6d, 0xa, 0x0, 0x0, 0x0, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x20, 0x26, 0x26, +0x20, 0x22, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x75, 0x6e, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x6d, 0x75, 0x74, 0x65, 0x78, 0x21, 0x22, 0x0, 0x0, 0x70, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6d, 0x75, 0x74, 0x65, +0x78, 0x5f, 0x75, 0x6e, 0x6c, 0x6f, 0x63, 0x6b, 0x0, 0x0, 0x0, 0x0, 0x70, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x63, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x0, 0x0, 0x74, 0x6c, 0x73, 0x20, 0x21, 0x3d, 0x20, 0x4e, 0x55, 0x4c, 0x4c, 0x0, 0x2f, +0x68, 0x6f, 0x6d, 0x65, 0x2f, 0x68, 0x65, 0x6e, 0x64, 0x72, 0x69, 0x6b, 0x2f, 0x65, 0x73, 0x70, 0x2f, 0x65, 0x73, 0x70, 0x2d, 0x69, 0x64, 0x66, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, +}; + +#endif /* H_TEST_IMAGE_HEX */ diff --git a/components/mesh_ota/test/test_mesh_ota.c b/components/mesh_ota/test/test_mesh_ota.c new file mode 100644 index 0000000..f801293 --- /dev/null +++ b/components/mesh_ota/test/test_mesh_ota.c @@ -0,0 +1,223 @@ +#include +#include "unity.h" + +#include "Mesh_OTA.h" +#include "test_image_hex.h" + +// ### ### ### distinguish newer image version ### ### ### + +TEST_CASE("Remote got patch", "[distinguish newer image version]") +{ + char versionLocal[] = "1.2.3"; //current running image + char versionRemote[] = "1.2.4"; //image from server + TEST_ASSERT_TRUE( bNewerVersion(versionLocal, versionRemote) ); +} + +TEST_CASE("Remote got minor", "[distinguish newer image version]") +{ + char versionLocal[] = "1.2.3"; //current running image + char versionRemote[] = "1.3.3"; //image from server + TEST_ASSERT_TRUE( bNewerVersion(versionLocal, versionRemote) ); +} + +TEST_CASE("Remote got major", "[distinguish newer image version]") +{ + char versionLocal[] = "1.2.3"; //current running image + char versionRemote[] = "2.2.3"; //image from server + TEST_ASSERT_TRUE( bNewerVersion(versionLocal, versionRemote) ); +} + +TEST_CASE("Local got patch", "[distinguish newer image version]") +{ + char versionLocal[] = "1.2.4"; //current running image + char versionRemote[] = "1.2.3"; //image from server + TEST_ASSERT_FALSE( bNewerVersion(versionLocal, versionRemote) ); +} + +TEST_CASE("Local got minor", "[distinguish newer image version]") +{ + char versionLocal[] = "1.3.3"; //current running image + char versionRemote[] = "1.2.3"; //image from server + TEST_ASSERT_FALSE( bNewerVersion(versionLocal, versionRemote) ); +} + +TEST_CASE("Local got major", "[distinguish newer image version]") +{ + char versionLocal[] = "2.2.3"; //current running image + char versionRemote[] = "1.2.3"; //image from server + TEST_ASSERT_FALSE( bNewerVersion(versionLocal, versionRemote) ); +} + +TEST_CASE("Remote got alpha and patch", "[distinguish newer image version]") +{ + char versionLocal[] = "2.2.3"; //current running image + char versionRemote[] = "a2.2.4"; //image from server + TEST_ASSERT_TRUE( bNewerVersion(versionLocal, versionRemote) ); +} + +TEST_CASE("Remote got max", "[distinguish newer image version]") +{ + char versionLocal[] = "2.2.3"; //current running image + char versionRemote[] = "999.999.999"; //image from server + TEST_ASSERT_TRUE( bNewerVersion(versionLocal, versionRemote) ); +} + +// ### ### ### find start offset in firmware image ### ### ### + +TEST_CASE("with http response + 0.0.1", "[find start offset in firmware image]") +{ + uint32_t u32StartOffset; + uint32_t u32DataLenght = sizeof(dataWithHttpRespone0_0_1)/sizeof(dataWithHttpRespone0_0_1[0]); + esp_err_t err = errFindImageStart(dataWithHttpRespone0_0_1, &u32DataLenght, &u32StartOffset); + if(err == ESP_OK) + { + TEST_ASSERT_EQUAL_INT(305, u32StartOffset); + } + else + { + TEST_ASSERT_EQUAL_INT(ESP_OK, err); + } +} + +TEST_CASE("without http response + 0.0.1", "[find start offset in firmware image]") +{ + uint32_t u32StartOffset; + uint32_t u32DataLenght = sizeof(dataWithoutHttpRespone0_0_1)/sizeof(dataWithoutHttpRespone0_0_1[0]); + esp_err_t err = errFindImageStart(dataWithoutHttpRespone0_0_1, &u32DataLenght, &u32StartOffset); + if(err == ESP_OK) + { + TEST_ASSERT_EQUAL_INT(0, u32StartOffset); + } + else + { + TEST_ASSERT_EQUAL_INT(ESP_OK, err); + } +} + + +TEST_CASE("with http response + 999.999.999", "[find start offset in firmware image]") +{ + uint32_t u32StartOffset; + uint32_t u32DataLenght = sizeof(dataWithHttpRespone999_999_999)/sizeof(dataWithHttpRespone999_999_999[0]); + esp_err_t err = errFindImageStart(dataWithHttpRespone999_999_999, &u32DataLenght, &u32StartOffset); + if(err == ESP_OK) + { + TEST_ASSERT_EQUAL_INT(305, u32StartOffset); + } + else + { + TEST_ASSERT_EQUAL_INT(ESP_OK, err); + } +} + +TEST_CASE("without http response + 999.999.999", "[find start offset in firmware image]") +{ + uint32_t u32StartOffset; + uint32_t u32DataLenght = sizeof(dataWithoutHttpRespone999_999_999)/sizeof(dataWithoutHttpRespone999_999_999[0]); + esp_err_t err = errFindImageStart(dataWithoutHttpRespone999_999_999, &u32DataLenght, &u32StartOffset); + if(err == ESP_OK) + { + TEST_ASSERT_EQUAL_INT(0, u32StartOffset); + } + else + { + TEST_ASSERT_EQUAL_INT(ESP_OK, err); + } +} + +TEST_CASE("with http response + 999.9.999", "[find start offset in firmware image]") +{ + uint32_t u32StartOffset; + uint32_t u32DataLenght = sizeof(dataWithHttpRespone999_9_999)/sizeof(dataWithHttpRespone999_9_999[0]); + esp_err_t err = errFindImageStart(dataWithHttpRespone999_9_999, &u32DataLenght, &u32StartOffset); + if(err == ESP_OK) + { + TEST_ASSERT_EQUAL_INT(302, u32StartOffset); + } + else + { + TEST_ASSERT_EQUAL_INT(ESP_OK, err); + } +} + +TEST_CASE("with http response + 999.99.999", "[find start offset in firmware image]") +{ + uint32_t u32StartOffset; + uint32_t u32DataLenght = sizeof(dataWithHttpRespone999_99_999)/sizeof(dataWithHttpRespone999_99_999[0]); + esp_err_t err = errFindImageStart(dataWithHttpRespone999_99_999, &u32DataLenght, &u32StartOffset); + if(err == ESP_OK) + { + TEST_ASSERT_EQUAL_INT(299, u32StartOffset); + } + else + { + TEST_ASSERT_EQUAL_INT(ESP_OK, err); + } +} + +// ### ### ### distinguish newer image version ### ### ### + +TEST_CASE("extract version 0.0.1", "[extract image version number]") +{ + char versionLocal[] = "0.0.0"; //current running image + char versionRemote[12];//image from server + uint32_t u32DataLenght = sizeof(dataWithHttpRespone0_0_1)/sizeof(dataWithHttpRespone0_0_1[0]); + esp_err_t err = errExtractVersionNumber(dataWithHttpRespone0_0_1, &u32DataLenght, versionRemote); + if(err == ESP_OK) + { + TEST_ASSERT_TRUE( bNewerVersion(versionLocal, versionRemote) ); + } + else + { + TEST_ASSERT_EQUAL_INT(ESP_OK, err); + } +} + +TEST_CASE("extract version 999.999.999", "[extract image version number]") +{ + char versionLocal[] = "0.0.0"; //current running image + char versionRemote[12];//image from server + uint32_t u32DataLenght = sizeof(dataWithHttpRespone999_999_999)/sizeof(dataWithHttpRespone999_999_999[0]); + esp_err_t err = errExtractVersionNumber(dataWithHttpRespone999_999_999, &u32DataLenght, versionRemote); + if(err == ESP_OK) + { + TEST_ASSERT_TRUE( bNewerVersion(versionLocal, versionRemote) ); + } + else + { + TEST_ASSERT_EQUAL_INT(ESP_OK, err); + } +} + +TEST_CASE("extract version 999.99.999", "[extract image version number]") +{ + char versionLocal[] = "999.100.999"; //current running image + char versionRemote[12];//image from server + uint32_t u32DataLenght = sizeof(dataWithHttpRespone999_99_999)/sizeof(dataWithHttpRespone999_99_999[0]); + esp_err_t err = errExtractVersionNumber(dataWithHttpRespone999_99_999, &u32DataLenght, versionRemote); + if(err == ESP_OK) + { + TEST_ASSERT_FALSE( bNewerVersion(versionLocal, versionRemote) ); + } + else + { + TEST_ASSERT_EQUAL_INT(ESP_OK, err); + } +} + + + + + + + + + + + + + + + + + diff --git a/main/CMakeLists.txt b/main/CMakeLists.txt index 497c231..5f0acda 100644 --- a/main/CMakeLists.txt +++ b/main/CMakeLists.txt @@ -1,2 +1,2 @@ -idf_component_register(SRCS "mesh_main.c" +idf_component_register(SRCS "Main.c" INCLUDE_DIRS ".") diff --git a/main/Kconfig.projbuild b/main/Kconfig.projbuild index 6dfb1da..795146a 100644 --- a/main/Kconfig.projbuild +++ b/main/Kconfig.projbuild @@ -1,4 +1,4 @@ -menu "Example Configuration" +menu "Mesh OTA Configuration" choice bool "Mesh Topology" @@ -105,6 +105,12 @@ menu "Example Configuration" default 0 help mesh network channel. + + config MESH_ID + string "ID for mesh network" + default "00, 00, 00, 00, 00, 00" + help + Mesh network id like MAC addr. config MESH_ROUTER_SSID string "Router SSID" @@ -124,22 +130,17 @@ menu "Example Configuration" help Authentication mode. - config WIFI_AUTH_OPEN - bool "WIFI_AUTH_OPEN" - config WIFI_AUTH_WPA_PSK - bool "WIFI_AUTH_WPA_PSK" config WIFI_AUTH_WPA2_PSK bool "WIFI_AUTH_WPA2_PSK" - config WIFI_AUTH_WPA_WPA2_PSK - bool "WIFI_AUTH_WPA_WPA2_PSK" + config WIFI_AUTH_WPA2_ENTERPRISE + bool "WIFI_AUTH_WPA2_ENTERPRISE" endchoice config MESH_AP_AUTHMODE int - default 0 if WIFI_AUTH_OPEN - default 2 if WIFI_AUTH_WPA_PSK + default 3 if WIFI_AUTH_WPA2_PSK - default 4 if WIFI_AUTH_WPA_WPA2_PSK + default 5 if WIFI_AUTH_WPA2_ENTERPRISE help Mesh AP authentication mode. @@ -162,4 +163,36 @@ menu "Example Configuration" default 50 help The number of devices over the network(max: 300). + + config MESH_MESSAGE_SIZE + int "Mesh network messages size" + range 1 65536 + default 1500 + help + Length of messages deliveres by the mesh network. + + config OTA_HTTPS_SERVER_COMMON_NAME + string "Common name OTA server" + default "exmaple.com" + help + Fully Qualified Domain Name used in the certificate. + + config OTA_HTTPS_SERVER_PORT + string "Server port" + default "443" + help + HTTPS webserver port + + config OTA_HTTPS_URL + string "URL to ota image" + default "https://exmaple.com/theImage.bin" + help + Uniform Resource Locator to the image file + + config OTA_HTTPS_AUTH + string "HTTPS authentication" + default "base64(user:password)" + help + HTTPS basic auth using base64 decoded "user:password" + endmenu diff --git a/main/Main.c b/main/Main.c new file mode 100644 index 0000000..5a57337 --- /dev/null +++ b/main/Main.c @@ -0,0 +1,31 @@ + +#include +#include "esp_wifi.h" +#include "esp_system.h" +#include "esp_event.h" +#include "esp_log.h" +#include "esp_mesh.h" +#include "esp_mesh_internal.h" +#include "nvs_flash.h" +#include "driver/gpio.h" +#include "esp_ota_ops.h" +#include "esp_partition.h" + +#include "Mesh_OTA.h" + +static const char *LOG_TAG = "esp_main"; + +void app_main(void) +{ + esp_err_t err = ESP_OK; + ESP_LOGI(LOG_TAG, "hardcoded: 0.0.1"); + err = errMeshNetworkInitialize(); + ESP_ERROR_CHECK(err); + + //start ota + + //start app + +} + + diff --git a/main/mesh_main.c b/main/mesh_main.c deleted file mode 100644 index b6abe62..0000000 --- a/main/mesh_main.c +++ /dev/null @@ -1,606 +0,0 @@ - -#include -#include "esp_wifi.h" -#include "esp_system.h" -#include "esp_event.h" -#include "esp_log.h" -#include "esp_mesh.h" -#include "esp_mesh_internal.h" -#include "nvs_flash.h" -#include "driver/gpio.h" -#include "esp_ota_ops.h" -#include "esp_partition.h" - - - -#define RX_SIZE (1234) -#define TX_SIZE (1234) - - - -static const char *MESH_TAG = "mesh_main"; -static const uint8_t MESH_ID[6] = { 0x77, 0x77, 0x77, 0x77, 0x77, 0x77}; -static uint8_t tx_buf[TX_SIZE] = { 0, }; -static uint8_t rx_buf[RX_SIZE] = { 0, }; -static bool is_mesh_connected = false; -static mesh_addr_t mesh_parent_addr; -static uint8_t ownMAC[6]; -static int mesh_layer = -1; -static esp_netif_t *netif_sta = NULL; - -struct ota_mesh_packet { - enum ota_mesh_packet_type { - APP_Version_Request, - APP_Version_Response, - OTA_Data, - OTA_ACK, - OTA_Complete - } type; - - uint8_t au8Payload[1024]; -}; - - - -/******************************************************* - * Function Declarations - *******************************************************/ - -esp_err_t esp_mesh_send_packet(mesh_addr_t* dest, struct ota_mesh_packet* packet); - -/******************************************************* - * Function Definitions - *******************************************************/ - - -esp_err_t esp_mesh_ota_send(mesh_addr_t* dest) -{ - esp_err_t err = ESP_OK; - - static uint32_t u32index; - - const esp_partition_t * currentPartition = esp_ota_get_boot_partition(); - - if((*currentPartition).subtype == 0) { - - int data_read = 0; - - struct ota_mesh_packet packet; - packet.type=OTA_Data; - - if(u32index == 1024) - { - //all data read - data_read = 0; - u32index = 0; - } - else - { - ESP_LOGI(MESH_TAG, "OTA-Data read: %i", u32index); - err = esp_partition_read(currentPartition, (1024*u32index), packet.au8Payload, 1024 ); - ESP_ERROR_CHECK(err); - data_read = 1024; - u32index++; - } - - if (data_read > 0) - { - //send ota fragemnt to node - esp_mesh_send_packet(dest, &packet); - } - - ESP_ERROR_CHECK(err); - } - else - { - ESP_LOGI(MESH_TAG, "Subtype: %d", (*currentPartition).subtype); - } - return err; -} - -esp_err_t esp_mesh_ota_receive(mesh_addr_t* dest, struct ota_mesh_packet* packet) -{ - esp_err_t err = ESP_OK; - static esp_ota_handle_t otaHandle; - static uint32_t u32index; - - const esp_partition_t * currentPartition = esp_ota_get_boot_partition(); - const esp_partition_t * otaPartition = esp_ota_get_next_update_partition(currentPartition); - - if(u32index == 0) - { - //first run - - err = esp_ota_begin(otaPartition, OTA_SIZE_UNKNOWN, &otaHandle); - ESP_ERROR_CHECK(err); - } - - ESP_LOGI(MESH_TAG, "OTA-Data write: %i", u32index); - err = esp_ota_write(otaHandle, packet->au8Payload, 1024); - - if(err != ESP_OK) - { - ESP_LOGE(MESH_TAG, "OTA-Data write error: %i at %i", err, u32index); - } - - ESP_ERROR_CHECK(err); - - - - if(u32index >= 1023) - { - //ota update complete - - ESP_LOGI(MESH_TAG, "OTA-Data complete arrived: %i", u32index); - err = esp_ota_end(otaHandle); - ESP_ERROR_CHECK(err); - esp_app_desc_t otaPartitionDesc; - err = esp_ota_get_partition_description(otaPartition, &otaPartitionDesc); - ESP_ERROR_CHECK(err); - ESP_LOGI(MESH_TAG, "otaPartition project_name: %s", (otaPartitionDesc).project_name); - - err = esp_ota_set_boot_partition(otaPartition); - ESP_ERROR_CHECK(err); - - struct ota_mesh_packet retPacket; - retPacket.type=OTA_Complete; - ESP_ERROR_CHECK (esp_mesh_send_packet(dest, &retPacket)); //send back to parent - - //check if this node has children --> Update them - - esp_restart(); - } - - u32index++; - - - return err; -} - - - -//returns true if MAC address is equal -bool esp_mesh_check_MAC_Equality(uint8_t* aMAC, uint8_t* bMAC) -{ - for (uint8_t index = 0; index < 6; index++) - { - if(aMAC[index] != bMAC[index]) { - return false; - } - } - return true; -} - -esp_err_t esp_mesh_get_Children(mesh_addr_t children[], uint16_t* pu16ChildrenSize) -{ - *pu16ChildrenSize = 0; - mesh_addr_t route_table[CONFIG_MESH_ROUTE_TABLE_SIZE]; - int route_table_size = 0; - esp_mesh_get_routing_table((mesh_addr_t *) &route_table, CONFIG_MESH_ROUTE_TABLE_SIZE * 6, &route_table_size); - for(uint16_t index = 0; index < esp_mesh_get_routing_table_size(); index++) - { - if(! (esp_mesh_check_MAC_Equality(ownMAC, route_table[index].addr)) ) - { - //child node - // ESP_LOGI(MESH_TAG, "adding Node: \"0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x\" ", route_table[index].addr[0], route_table[index].addr[1], route_table[index].addr[2], route_table[index].addr[3], route_table[index].addr[4], route_table[index].addr[5]); - children[*pu16ChildrenSize] = route_table[index]; - *pu16ChildrenSize = (*pu16ChildrenSize)+1; - } - } - return ESP_OK; -} - - -esp_err_t esp_mesh_send_packet(mesh_addr_t* dest, struct ota_mesh_packet* packet) -{ - esp_err_t err; - mesh_data_t data; - data.data = tx_buf; - data.size = sizeof(tx_buf); - data.proto = MESH_PROTO_BIN; - data.tos = MESH_TOS_P2P; - - memcpy(tx_buf, (uint8_t *)packet, sizeof(struct ota_mesh_packet)); - - err = esp_mesh_send(dest, &data, MESH_DATA_P2P, NULL, 0); - - return err; -} - -void esp_mesh_p2p_rx_main(void *arg) -{ - esp_err_t err; - mesh_addr_t from; - mesh_data_t data; - int flag = 0; - data.data = rx_buf; - data.size = RX_SIZE; - - while (true) { - data.size = RX_SIZE; - err = esp_mesh_recv(&from, &data, portMAX_DELAY, &flag, NULL, 0); - if (err != ESP_OK || !data.size) { - ESP_LOGE(MESH_TAG, "err:0x%x, size:%d", err, data.size); - continue; - } - - struct ota_mesh_packet packet; - memcpy(&packet, (uint8_t *)rx_buf, sizeof(struct ota_mesh_packet)); - - switch (packet.type) - { - case APP_Version_Request: - ESP_LOGI(MESH_TAG, "recv: APP_Version_Request"); - packet.type=APP_Version_Response; - packet.au8Payload[0] = 42; //TODO get current running version - ESP_ERROR_CHECK (esp_mesh_send_packet(&from, &packet)); //send back to parent - break; - case APP_Version_Response: - ESP_LOGI(MESH_TAG, "recv: APP_Version_Response - App Version %i: ", packet.au8Payload[0]); - //check if node is out-dated - esp_mesh_ota_send(&from); - break; - case OTA_Data: - ESP_LOGI(MESH_TAG, "recv: OTA_Data"); - esp_mesh_ota_receive(&from, &packet); - packet.type=OTA_ACK; - ESP_ERROR_CHECK (esp_mesh_send_packet(&from, &packet)); //send back to parent - break; - case OTA_ACK: - ESP_LOGI(MESH_TAG, "recv: OTA_ACK"); - esp_mesh_ota_send(&from); - break; - case OTA_Complete: - ESP_LOGI(MESH_TAG, "recv: OTA_Complete"); - break; - default: - ESP_LOGE(MESH_TAG, "recv: something"); - break; - } - - } //end while - vTaskDelete(NULL); -} - - -esp_err_t esp_mesh_comm_p2p_start(void) -{ - static bool is_comm_p2p_started = false; - if (!is_comm_p2p_started) { - is_comm_p2p_started = true; - xTaskCreate(esp_mesh_p2p_rx_main, "MPRX", 7000, NULL, 5, NULL); - } - return ESP_OK; -} - -void mesh_event_handler(void *arg, esp_event_base_t event_base, - int32_t event_id, void *event_data) -{ - mesh_addr_t id = {0,}; - static uint16_t last_layer = 0; - - switch (event_id) { - case MESH_EVENT_STARTED: { - esp_mesh_get_id(&id); - ESP_LOGI(MESH_TAG, "ID:"MACSTR"", MAC2STR(id.addr)); -is_mesh_connected = false; -mesh_layer = esp_mesh_get_layer(); -} -break; - case MESH_EVENT_STOPPED: { -ESP_LOGI(MESH_TAG, ""); -is_mesh_connected = false; -mesh_layer = esp_mesh_get_layer(); -} -break; - case MESH_EVENT_CHILD_CONNECTED: { -mesh_event_child_connected_t *child_connected = (mesh_event_child_connected_t *)event_data; -ESP_LOGI(MESH_TAG, "aid:%d, "MACSTR"", - child_connected->aid, - MAC2STR(child_connected->mac)); -} -break; - case MESH_EVENT_CHILD_DISCONNECTED: { -mesh_event_child_disconnected_t *child_disconnected = (mesh_event_child_disconnected_t *)event_data; -ESP_LOGI(MESH_TAG, "aid:%d, "MACSTR"", - child_disconnected->aid, - MAC2STR(child_disconnected->mac)); -} -break; - case MESH_EVENT_ROUTING_TABLE_ADD: { -mesh_event_routing_table_change_t *routing_table = (mesh_event_routing_table_change_t *)event_data; -ESP_LOGW(MESH_TAG, "add %d, new:%d, layer:%d", - routing_table->rt_size_change, - routing_table->rt_size_new, mesh_layer); -} -break; - case MESH_EVENT_ROUTING_TABLE_REMOVE: { -mesh_event_routing_table_change_t *routing_table = (mesh_event_routing_table_change_t *)event_data; -ESP_LOGW(MESH_TAG, "remove %d, new:%d, layer:%d", - routing_table->rt_size_change, - routing_table->rt_size_new, mesh_layer); -} -break; - case MESH_EVENT_NO_PARENT_FOUND: { -mesh_event_no_parent_found_t *no_parent = (mesh_event_no_parent_found_t *)event_data; -ESP_LOGI(MESH_TAG, "scan times:%d", - no_parent->scan_times); -} - /* TODO handler for the failure */ -break; - case MESH_EVENT_PARENT_CONNECTED: { -mesh_event_connected_t *connected = (mesh_event_connected_t *)event_data; -esp_mesh_get_id(&id); -mesh_layer = connected->self_layer; -memcpy(&mesh_parent_addr.addr, connected->connected.bssid, 6); -ESP_LOGI(MESH_TAG, - "layer:%d-->%d, parent:"MACSTR"%s, ID:"MACSTR", duty:%d", - last_layer, mesh_layer, MAC2STR(mesh_parent_addr.addr), - esp_mesh_is_root() ? "" : - (mesh_layer == 2) ? "" : "", MAC2STR(id.addr), connected->duty); -last_layer = mesh_layer; - // mesh_connected_indicator(mesh_layer); -is_mesh_connected = true; -if (esp_mesh_is_root()) { -esp_netif_dhcpc_start(netif_sta); -} -esp_mesh_comm_p2p_start();//start receiving -} -break; - case MESH_EVENT_PARENT_DISCONNECTED: { -mesh_event_disconnected_t *disconnected = (mesh_event_disconnected_t *)event_data; -ESP_LOGI(MESH_TAG, - "reason:%d", - disconnected->reason); -is_mesh_connected = false; - // mesh_disconnected_indicator(); -mesh_layer = esp_mesh_get_layer(); -} -break; - case MESH_EVENT_LAYER_CHANGE: { -mesh_event_layer_change_t *layer_change = (mesh_event_layer_change_t *)event_data; -mesh_layer = layer_change->new_layer; -ESP_LOGI(MESH_TAG, "layer:%d-->%d%s", - last_layer, mesh_layer, - esp_mesh_is_root() ? "" : - (mesh_layer == 2) ? "" : ""); -last_layer = mesh_layer; - // mesh_connected_indicator(mesh_layer); -} -break; - case MESH_EVENT_ROOT_ADDRESS: { -mesh_event_root_address_t *root_addr = (mesh_event_root_address_t *)event_data; -ESP_LOGI(MESH_TAG, "root address:"MACSTR"", - MAC2STR(root_addr->addr)); -} -break; - case MESH_EVENT_VOTE_STARTED: { -mesh_event_vote_started_t *vote_started = (mesh_event_vote_started_t *)event_data; -ESP_LOGI(MESH_TAG, - "attempts:%d, reason:%d, rc_addr:"MACSTR"", - vote_started->attempts, - vote_started->reason, - MAC2STR(vote_started->rc_addr.addr)); -} -break; - case MESH_EVENT_VOTE_STOPPED: { -ESP_LOGI(MESH_TAG, ""); -break; -} - case MESH_EVENT_ROOT_SWITCH_REQ: { -mesh_event_root_switch_req_t *switch_req = (mesh_event_root_switch_req_t *)event_data; -ESP_LOGI(MESH_TAG, - "reason:%d, rc_addr:"MACSTR"", - switch_req->reason, - MAC2STR( switch_req->rc_addr.addr)); -} -break; - case MESH_EVENT_ROOT_SWITCH_ACK: { -/* new root */ -mesh_layer = esp_mesh_get_layer(); -esp_mesh_get_parent_bssid(&mesh_parent_addr); -ESP_LOGI(MESH_TAG, "layer:%d, parent:"MACSTR"", mesh_layer, MAC2STR(mesh_parent_addr.addr)); -} -break; - case MESH_EVENT_TODS_STATE: { -mesh_event_toDS_state_t *toDs_state = (mesh_event_toDS_state_t *)event_data; -ESP_LOGI(MESH_TAG, "state:%d", *toDs_state); -} -break; - case MESH_EVENT_ROOT_FIXED: { -mesh_event_root_fixed_t *root_fixed = (mesh_event_root_fixed_t *)event_data; -ESP_LOGI(MESH_TAG, "%s", - root_fixed->is_fixed ? "fixed" : "not fixed"); -} -break; - case MESH_EVENT_ROOT_ASKED_YIELD: { -mesh_event_root_conflict_t *root_conflict = (mesh_event_root_conflict_t *)event_data; -ESP_LOGI(MESH_TAG, - ""MACSTR", rssi:%d, capacity:%d", - MAC2STR(root_conflict->addr), - root_conflict->rssi, - root_conflict->capacity); -} -break; - case MESH_EVENT_CHANNEL_SWITCH: { -mesh_event_channel_switch_t *channel_switch = (mesh_event_channel_switch_t *)event_data; -ESP_LOGI(MESH_TAG, "new channel:%d", channel_switch->channel); -} -break; - case MESH_EVENT_SCAN_DONE: { -mesh_event_scan_done_t *scan_done = (mesh_event_scan_done_t *)event_data; -ESP_LOGI(MESH_TAG, "number:%d", - scan_done->number); -} -break; - case MESH_EVENT_NETWORK_STATE: { -mesh_event_network_state_t *network_state = (mesh_event_network_state_t *)event_data; -ESP_LOGI(MESH_TAG, "is_rootless:%d", - network_state->is_rootless); -} -break; - case MESH_EVENT_STOP_RECONNECTION: { -ESP_LOGI(MESH_TAG, ""); -} -break; - case MESH_EVENT_FIND_NETWORK: { -mesh_event_find_network_t *find_network = (mesh_event_find_network_t *)event_data; -ESP_LOGI(MESH_TAG, "new channel:%d, router BSSID:"MACSTR"", - find_network->channel, MAC2STR(find_network->router_bssid)); -} -break; - case MESH_EVENT_ROUTER_SWITCH: { -mesh_event_router_switch_t *router_switch = (mesh_event_router_switch_t *)event_data; -ESP_LOGI(MESH_TAG, "new router:%s, channel:%d, "MACSTR"", - router_switch->ssid, router_switch->channel, MAC2STR(router_switch->bssid)); -} -break; - case MESH_EVENT_PS_PARENT_DUTY: { -mesh_event_ps_duty_t *ps_duty = (mesh_event_ps_duty_t *)event_data; -ESP_LOGI(MESH_TAG, "duty:%d", ps_duty->duty); -} -break; - case MESH_EVENT_PS_CHILD_DUTY: { -mesh_event_ps_duty_t *ps_duty = (mesh_event_ps_duty_t *)event_data; -ESP_LOGI(MESH_TAG, "cidx:%d, "MACSTR", duty:%d", ps_duty->child_connected.aid-1, -MAC2STR(ps_duty->child_connected.mac), ps_duty->duty); -} -break; - default: - ESP_LOGI(MESH_TAG, "unknown id:%d", event_id); - break; - } -} - -void ip_event_handler(void *arg, esp_event_base_t event_base, - int32_t event_id, void *event_data) -{ - ip_event_got_ip_t *event = (ip_event_got_ip_t *) event_data; - ESP_LOGI(MESH_TAG, "IP:" IPSTR, IP2STR(&event->ip_info.ip)); - -} - -void app_main(void) -{ -/* - esp_err_t err; - - err = nvs_flash_erase(); - - if(err != ESP_OK){ - ESP_LOGI(MESH_TAG, "Error: %x", err); - while(1){ - - } - } - */ - - ESP_ERROR_CHECK(nvs_flash_init()); - - ESP_LOGI(MESH_TAG, "Hello World"); - const esp_partition_t * currentPartition = esp_ota_get_boot_partition(); - ESP_LOGI(MESH_TAG, "Type: %d", (*currentPartition).subtype); - ESP_LOGI(MESH_TAG, "Start address: %d", (*currentPartition).address); - ESP_LOGI(MESH_TAG, "Size: %d", (*currentPartition).size); //passt - ESP_LOGI(MESH_TAG, "Encrypted: %d", (*currentPartition).encrypted); - - /* tcpip initialization */ - ESP_ERROR_CHECK(esp_netif_init()); - - /* event initialization */ - ESP_ERROR_CHECK(esp_event_loop_create_default()); - - /* create network interfaces for mesh (only station instance saved for further manipulation, soft AP instance ignored */ - ESP_ERROR_CHECK(esp_netif_create_default_wifi_mesh_netifs(&netif_sta, NULL)); - - /* wifi initialization */ - wifi_init_config_t config = WIFI_INIT_CONFIG_DEFAULT(); - ESP_ERROR_CHECK(esp_wifi_init(&config)); - ESP_ERROR_CHECK(esp_event_handler_register(IP_EVENT, IP_EVENT_STA_GOT_IP, &ip_event_handler, NULL)); - ESP_ERROR_CHECK(esp_wifi_set_storage(WIFI_STORAGE_FLASH)); - ESP_ERROR_CHECK(esp_wifi_start()); - - /* mesh initialization */ - ESP_ERROR_CHECK(esp_mesh_init()); - ESP_ERROR_CHECK(esp_event_handler_register(MESH_EVENT, ESP_EVENT_ANY_ID, &mesh_event_handler, NULL)); - - /* set mesh topology */ - ESP_ERROR_CHECK(esp_mesh_set_topology(CONFIG_MESH_TOPOLOGY)); - - /* set mesh max layer according to the topology */ - ESP_ERROR_CHECK(esp_mesh_set_max_layer(CONFIG_MESH_MAX_LAYER)); - ESP_ERROR_CHECK(esp_mesh_set_vote_percentage(1)); - ESP_ERROR_CHECK(esp_mesh_set_xon_qsize(128)); - - /* Disable mesh PS function */ - ESP_ERROR_CHECK(esp_mesh_disable_ps()); - ESP_ERROR_CHECK(esp_mesh_set_ap_assoc_expire(10)); - - mesh_cfg_t cfg = MESH_INIT_CONFIG_DEFAULT(); - - /* mesh ID */ - memcpy((uint8_t *) &cfg.mesh_id, MESH_ID, 6); - - /* router */ - cfg.channel = CONFIG_MESH_CHANNEL; - cfg.router.ssid_len = strlen(CONFIG_MESH_ROUTER_SSID); - memcpy((uint8_t *) &cfg.router.ssid, CONFIG_MESH_ROUTER_SSID, cfg.router.ssid_len); - memcpy((uint8_t *) &cfg.router.password, CONFIG_MESH_ROUTER_PASSWD, - strlen(CONFIG_MESH_ROUTER_PASSWD)); - - /* mesh softAP */ - ESP_ERROR_CHECK(esp_mesh_set_ap_authmode(CONFIG_MESH_AP_AUTHMODE)); - cfg.mesh_ap.max_connection = CONFIG_MESH_AP_CONNECTIONS; - memcpy((uint8_t *) &cfg.mesh_ap.password, CONFIG_MESH_AP_PASSWD, - strlen(CONFIG_MESH_AP_PASSWD)); - ESP_ERROR_CHECK(esp_mesh_set_config(&cfg)); - - ESP_ERROR_CHECK(esp_base_mac_addr_get(ownMAC)); - - ESP_LOGI(MESH_TAG, "Own MAC: \"0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x\" ", ownMAC[0], ownMAC[1], ownMAC[2], ownMAC[3], ownMAC[4], ownMAC[5]); - - /* mesh start */ - ESP_ERROR_CHECK(esp_mesh_start()); - - ESP_LOGI(MESH_TAG, "mesh starts successfully, heap:%d, %s<%d>%s, ps:%d\n", esp_get_minimum_free_heap_size(), - esp_mesh_is_root_fixed() ? "root fixed" : "root not fixed", - esp_mesh_get_topology(), esp_mesh_get_topology() ? "(chain)":"(tree)", esp_mesh_is_ps_enabled()); - - -/* START OTA MESH */ - - //if (esp_mesh_is_root()) { - ESP_LOGI(MESH_TAG, "ROOT NODE"); - //https ota - - // while(1){ - for(;;) { - if(gpio_get_level(0) == 0){ - break; - } - vTaskDelay(1000 / portTICK_PERIOD_MS); - } - - mesh_addr_t children[CONFIG_MESH_ROUTE_TABLE_SIZE]; - uint16_t u16ChildrenSize; - esp_mesh_get_Children(children, &u16ChildrenSize); - - ESP_LOGI(MESH_TAG, "ChildrenSize: %i", u16ChildrenSize); - - - struct ota_mesh_packet packet; - - packet.type=APP_Version_Request; - //packet.au8Payload[0] = 42; - - for (uint16_t i = 0; i < u16ChildrenSize; i++) - { - ESP_ERROR_CHECK (esp_mesh_send_packet(&children[i], &packet)); - } - - - - // }//end while 1 - //} // end root node - -} diff --git a/partitions.csv b/partitions.csv index 35a548f..f8ed1c0 100644 --- a/partitions.csv +++ b/partitions.csv @@ -3,6 +3,5 @@ nvs, data, nvs, , 0x4000, otadata, data, ota, , 0x2000, phy_init, data, phy, , 0x1000, -factory, app, factory, , 1M, -ota_0, app, ota_0, , 1M, -ota_1, app, ota_1, , 1M, +ota_0, app, ota_0, , 1500K, +ota_1, app, ota_1, , 1500K, diff --git a/sdkconfig b/sdkconfig index 73e0cd4..8875051 100644 --- a/sdkconfig +++ b/sdkconfig @@ -31,7 +31,8 @@ CONFIG_APP_BUILD_USE_FLASH_SECTIONS=y CONFIG_APP_COMPILE_TIME_DATE=y # CONFIG_APP_EXCLUDE_PROJECT_VER_VAR is not set # CONFIG_APP_EXCLUDE_PROJECT_NAME_VAR is not set -# CONFIG_APP_PROJECT_VER_FROM_CONFIG is not set +CONFIG_APP_PROJECT_VER_FROM_CONFIG=y +CONFIG_APP_PROJECT_VER="0.0.1" CONFIG_APP_RETRIEVE_LEN_ELF_SHA=16 # end of Application manager @@ -66,8 +67,16 @@ CONFIG_BOOTLOADER_RESERVE_RTC_SIZE=0 # # Security features # -# CONFIG_SECURE_SIGNED_APPS_NO_SECURE_BOOT is not set +CONFIG_SECURE_SIGNED_ON_BOOT=y +CONFIG_SECURE_SIGNED_ON_UPDATE=y +CONFIG_SECURE_SIGNED_APPS=y +CONFIG_SECURE_SIGNED_APPS_NO_SECURE_BOOT=y +CONFIG_SECURE_SIGNED_APPS_ECDSA_SCHEME=y +CONFIG_SECURE_SIGNED_ON_BOOT_NO_SECURE_BOOT=y +CONFIG_SECURE_SIGNED_ON_UPDATE_NO_SECURE_BOOT=y # CONFIG_SECURE_BOOT is not set +CONFIG_SECURE_BOOT_BUILD_SIGNED_BINARIES=y +CONFIG_SECURE_BOOT_SIGNING_KEY="secure_boot_signing_key.pem" # CONFIG_SECURE_FLASH_ENC_ENABLED is not set # end of Security features @@ -119,12 +128,12 @@ CONFIG_ESPTOOLPY_MONITOR_BAUD=115200 CONFIG_PARTITION_TABLE_CUSTOM=y CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partitions.csv" CONFIG_PARTITION_TABLE_FILENAME="partitions.csv" -CONFIG_PARTITION_TABLE_OFFSET=0x8000 +CONFIG_PARTITION_TABLE_OFFSET=0x10000 CONFIG_PARTITION_TABLE_MD5=y # end of Partition Table # -# Example Configuration +# Mesh OTA Configuration # CONFIG_MESH_TOPO_TREE=y # CONFIG_MESH_TOPO_CHAIN is not set @@ -141,17 +150,21 @@ CONFIG_MESH_PS_NETWORK_DUTY_APPLIED_ENTIRE=y CONFIG_MESH_PS_NWK_DUTY_RULE=0 CONFIG_MESH_MAX_LAYER=6 CONFIG_MESH_CHANNEL=13 -CONFIG_MESH_ROUTER_SSID="nicht verbunden" -CONFIG_MESH_ROUTER_PASSWD="flamingo" -# CONFIG_WIFI_AUTH_OPEN is not set -# CONFIG_WIFI_AUTH_WPA_PSK is not set +CONFIG_MESH_ID="00, 00, 00, 00, 00, 00" +CONFIG_MESH_ROUTER_SSID="labNet" +CONFIG_MESH_ROUTER_PASSWD="12345678" CONFIG_WIFI_AUTH_WPA2_PSK=y -# CONFIG_WIFI_AUTH_WPA_WPA2_PSK is not set +# CONFIG_WIFI_AUTH_WPA2_ENTERPRISE is not set CONFIG_MESH_AP_AUTHMODE=3 -CONFIG_MESH_AP_PASSWD="MAP_PASSWD" +CONFIG_MESH_AP_PASSWD="qaws1234" CONFIG_MESH_AP_CONNECTIONS=6 CONFIG_MESH_ROUTE_TABLE_SIZE=50 -# end of Example Configuration +CONFIG_MESH_MESSAGE_SIZE=1500 +CONFIG_OTA_HTTPS_SERVER_COMMON_NAME="ota.hendrikschutter.com" +CONFIG_OTA_HTTPS_SERVER_PORT="443" +CONFIG_OTA_HTTPS_URL="https://ota.hendrikschutter.com/mesh_ota.bin" +CONFIG_OTA_HTTPS_AUTH="b3RhOnB3" +# end of Mesh OTA Configuration # # Compiler options @@ -351,6 +364,7 @@ CONFIG_ESP_CONSOLE_UART_DEFAULT=y # CONFIG_ESP_CONSOLE_UART_CUSTOM is not set # CONFIG_ESP_CONSOLE_NONE is not set CONFIG_ESP_CONSOLE_UART=y +CONFIG_ESP_CONSOLE_MULTIPLE_UART=y CONFIG_ESP_CONSOLE_UART_NUM=0 CONFIG_ESP_CONSOLE_UART_BAUDRATE=115200 CONFIG_ESP_INT_WDT=y @@ -594,7 +608,8 @@ CONFIG_FREERTOS_IDLE_TASK_STACKSIZE=2304 CONFIG_FREERTOS_ISR_STACKSIZE=1536 # CONFIG_FREERTOS_LEGACY_HOOKS is not set CONFIG_FREERTOS_MAX_TASK_NAME_LEN=16 -# CONFIG_FREERTOS_SUPPORT_STATIC_ALLOCATION is not set +CONFIG_FREERTOS_SUPPORT_STATIC_ALLOCATION=y +# CONFIG_FREERTOS_ENABLE_STATIC_TASK_CLEAN_UP is not set CONFIG_FREERTOS_TIMER_TASK_PRIORITY=1 CONFIG_FREERTOS_TIMER_TASK_STACK_DEPTH=2048 CONFIG_FREERTOS_TIMER_QUEUE_LENGTH=10 @@ -691,7 +706,6 @@ CONFIG_LWIP_LOOPBACK_MAX_PBUFS=8 # # TCP # -CONFIG_LWIP_TCP_ISN_HOOK=y CONFIG_LWIP_MAX_ACTIVE_TCP=16 CONFIG_LWIP_MAX_LISTENING_TCP=16 CONFIG_LWIP_TCP_HIGH_SPEED_RETRANSMISSION=y @@ -719,6 +733,14 @@ CONFIG_LWIP_MAX_UDP_PCBS=16 CONFIG_LWIP_UDP_RECVMBOX_SIZE=6 # end of UDP +# +# Checksums +# +# CONFIG_LWIP_CHECKSUM_CHECK_IP is not set +# CONFIG_LWIP_CHECKSUM_CHECK_UDP is not set +CONFIG_LWIP_CHECKSUM_CHECK_ICMP=y +# end of Checksums + CONFIG_LWIP_TCPIP_TASK_STACK_SIZE=3072 CONFIG_LWIP_TCPIP_TASK_AFFINITY_NO_AFFINITY=y # CONFIG_LWIP_TCPIP_TASK_AFFINITY_CPU0 is not set @@ -751,6 +773,20 @@ CONFIG_LWIP_SNTP_UPDATE_DELAY=3600000 CONFIG_LWIP_ESP_LWIP_ASSERT=y +# +# Hooks +# +# CONFIG_LWIP_HOOK_TCP_ISN_NONE is not set +CONFIG_LWIP_HOOK_TCP_ISN_DEFAULT=y +# CONFIG_LWIP_HOOK_TCP_ISN_CUSTOM is not set +CONFIG_LWIP_HOOK_IP6_ROUTE_NONE=y +# CONFIG_LWIP_HOOK_IP6_ROUTE_DEFAULT is not set +# CONFIG_LWIP_HOOK_IP6_ROUTE_CUSTOM is not set +CONFIG_LWIP_HOOK_NETCONN_EXT_RESOLVE_NONE=y +# CONFIG_LWIP_HOOK_NETCONN_EXT_RESOLVE_DEFAULT is not set +# CONFIG_LWIP_HOOK_NETCONN_EXT_RESOLVE_CUSTOM is not set +# end of Hooks + # # Debug # @@ -761,8 +797,10 @@ CONFIG_LWIP_ESP_LWIP_ASSERT=y # CONFIG_LWIP_SOCKETS_DEBUG is not set # CONFIG_LWIP_IP_DEBUG is not set # CONFIG_LWIP_ICMP_DEBUG is not set +# CONFIG_LWIP_DHCP_DEBUG is not set # CONFIG_LWIP_IP6_DEBUG is not set # CONFIG_LWIP_ICMP6_DEBUG is not set +# CONFIG_LWIP_TCP_DEBUG is not set # end of Debug # end of LWIP @@ -1026,7 +1064,7 @@ CONFIG_WS_BUFFER_SIZE=1024 # CONFIG_UNITY_ENABLE_FLOAT=y CONFIG_UNITY_ENABLE_DOUBLE=y -# CONFIG_UNITY_ENABLE_COLOR is not set +CONFIG_UNITY_ENABLE_COLOR=y CONFIG_UNITY_ENABLE_IDF_TEST_RUNNER=y # CONFIG_UNITY_ENABLE_FIXTURE is not set # CONFIG_UNITY_ENABLE_BACKTRACE_ON_FAIL is not set @@ -1071,6 +1109,7 @@ CONFIG_WPA_MBEDTLS_CRYPTO=y # CONFIG_WPA_DEBUG_PRINT is not set # CONFIG_WPA_TESTING_OPTIONS is not set # CONFIG_WPA_WPS_WARS is not set +# CONFIG_WPA_11KV_SUPPORT is not set # end of Supplicant # end of Component config @@ -1193,7 +1232,7 @@ CONFIG_MB_EVENT_QUEUE_TIMEOUT=20 CONFIG_MB_TIMER_PORT_ENABLED=y CONFIG_MB_TIMER_GROUP=0 CONFIG_MB_TIMER_INDEX=0 -# CONFIG_SUPPORT_STATIC_ALLOCATION is not set +# CONFIG_ENABLE_STATIC_TASK_CLEAN_UP_HOOK is not set CONFIG_TIMER_TASK_PRIORITY=1 CONFIG_TIMER_TASK_STACK_DEPTH=2048 CONFIG_TIMER_QUEUE_LENGTH=10 diff --git a/secure_boot_signing_key.pem b/secure_boot_signing_key.pem new file mode 100644 index 0000000..be8f795 --- /dev/null +++ b/secure_boot_signing_key.pem @@ -0,0 +1,5 @@ +-----BEGIN EC PRIVATE KEY----- +MHcCAQEEIPADEvh72EIFEGixpoyTcMq6k3TdS5vYytoCd/aFdcOUoAoGCCqGSM49 +AwEHoUQDQgAE3LyvSuovRT0+O9V8fcjvdHT1vaS2RRs6Zh7RKd3LemhOR+ZZ7KmE +7QZiCmbVxMsano1h8rJG0m4PSv/eQ03K8A== +-----END EC PRIVATE KEY----- diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt new file mode 100644 index 0000000..e47aa84 --- /dev/null +++ b/test/CMakeLists.txt @@ -0,0 +1,16 @@ +# This is the project CMakeLists.txt file for the test subproject +cmake_minimum_required(VERSION 3.5) + +# Include the components directory of the main application: +# +set(EXTRA_COMPONENT_DIRS "../components") + +# Set the components to include the tests for. +# This can be overriden from CMake cache: +# - when invoking CMake directly: cmake -D TEST_COMPONENTS="xxxxx" .. +# - when using idf.py: idf.py -T xxxxx build +# +set(TEST_COMPONENTS "mesh_ota" CACHE STRING "List of components to test") + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +project(unit_test_mesh_ota) diff --git a/test/Makefile b/test/Makefile new file mode 100644 index 0000000..5e6a595 --- /dev/null +++ b/test/Makefile @@ -0,0 +1,17 @@ +# +# This is a project Makefile for the test subproject. +# + +PROJECT_NAME := unit_test_mesh_ota + +# Include the components directory of the main application: +# +EXTRA_COMPONENT_DIRS := $(realpath ../components) + +# Set the components to include the tests for. +# This can be overriden from the command line +# (e.g. 'make TEST_COMPONENTS=xxxx flash monitor') +# +TEST_COMPONENTS ?= mesh_ota + +include $(IDF_PATH)/make/project.mk diff --git a/test/main/CMakeLists.txt b/test/main/CMakeLists.txt new file mode 100644 index 0000000..b9d8f20 --- /dev/null +++ b/test/main/CMakeLists.txt @@ -0,0 +1,2 @@ +idf_component_register(SRCS "unit_test_mesh_ota.c" + INCLUDE_DIRS ".") diff --git a/test/main/component.mk b/test/main/component.mk new file mode 100644 index 0000000..e69de29 diff --git a/test/main/unit_test_mesh_ota.c b/test/main/unit_test_mesh_ota.c new file mode 100644 index 0000000..1c7fe6f --- /dev/null +++ b/test/main/unit_test_mesh_ota.c @@ -0,0 +1,58 @@ +/* Example test application for testable component. + + This example code is in the Public Domain (or CC0 licensed, at your option.) + + Unless required by applicable law or agreed to in writing, this + software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR + CONDITIONS OF ANY KIND, either express or implied. +*/ + +#include +#include +#include "unity.h" + +static void print_banner(const char* text); + +void app_main(void) +{ + /* These are the different ways of running registered tests. + * In practice, only one of them is usually needed. + * + * UNITY_BEGIN() and UNITY_END() calls tell Unity to print a summary + * (number of tests executed/failed/ignored) of tests executed between these calls. + */ + + /* + print_banner("Executing one test by its name"); + UNITY_BEGIN(); + unity_run_test_by_name("Mean of an empty array is zero"); + UNITY_END(); + + print_banner("Running tests with [mean] tag"); + UNITY_BEGIN(); + unity_run_tests_by_tag("[mean]", false); + UNITY_END(); + + print_banner("Running tests without [fails] tag"); + UNITY_BEGIN(); + unity_run_tests_by_tag("[fails]", true); + UNITY_END(); +*/ + + + print_banner("Running all the registered tests"); + UNITY_BEGIN(); + unity_run_all_tests(); + UNITY_END(); + + print_banner("Starting interactive test menu"); + /* This function will not return, and will be busy waiting for UART input. + * Make sure that task watchdog is disabled if you use this function. + */ + unity_run_menu(); +} + +static void print_banner(const char* text) +{ + printf("\n#### %s #####\n\n", text); +} diff --git a/sdkconfig.old b/test/sdkconfig similarity index 80% rename from sdkconfig.old rename to test/sdkconfig index b4976b6..97d0400 100644 --- a/sdkconfig.old +++ b/test/sdkconfig @@ -2,6 +2,7 @@ # Automatically generated file. DO NOT EDIT. # Espressif IoT Development Framework (ESP-IDF) Project Configuration # +CONFIG_IDF_CMAKE=y CONFIG_IDF_TARGET_ARCH_XTENSA=y CONFIG_IDF_TARGET="esp32" CONFIG_IDF_TARGET_ESP32=y @@ -11,8 +12,6 @@ CONFIG_IDF_FIRMWARE_CHIP_ID=0x0000 # SDK tool configuration # CONFIG_SDK_TOOLPREFIX="xtensa-esp32-elf-" -CONFIG_SDK_PYTHON="python" -CONFIG_SDK_MAKE_WARN_UNDEFINED_VARIABLES=y # CONFIG_SDK_TOOLCHAIN_SUPPORTS_TIME_WIDE_64_BITS is not set # end of SDK tool configuration @@ -75,15 +74,7 @@ CONFIG_BOOTLOADER_RESERVE_RTC_SIZE=0 # # Serial flasher config # -CONFIG_ESPTOOLPY_PORT="/dev/ttyUSB0" -CONFIG_ESPTOOLPY_BAUD_115200B=y -# CONFIG_ESPTOOLPY_BAUD_230400B is not set -# CONFIG_ESPTOOLPY_BAUD_921600B is not set -# CONFIG_ESPTOOLPY_BAUD_2MB is not set -# CONFIG_ESPTOOLPY_BAUD_OTHER is not set CONFIG_ESPTOOLPY_BAUD_OTHER_VAL=115200 -CONFIG_ESPTOOLPY_BAUD=115200 -CONFIG_ESPTOOLPY_COMPRESSED=y # CONFIG_ESPTOOLPY_NO_STUB is not set # CONFIG_ESPTOOLPY_FLASHMODE_QIO is not set # CONFIG_ESPTOOLPY_FLASHMODE_QOUT is not set @@ -96,11 +87,11 @@ CONFIG_ESPTOOLPY_FLASHFREQ_40M=y # CONFIG_ESPTOOLPY_FLASHFREQ_20M is not set CONFIG_ESPTOOLPY_FLASHFREQ="40m" # CONFIG_ESPTOOLPY_FLASHSIZE_1MB is not set -# CONFIG_ESPTOOLPY_FLASHSIZE_2MB is not set -CONFIG_ESPTOOLPY_FLASHSIZE_4MB=y +CONFIG_ESPTOOLPY_FLASHSIZE_2MB=y +# CONFIG_ESPTOOLPY_FLASHSIZE_4MB is not set # CONFIG_ESPTOOLPY_FLASHSIZE_8MB is not set # CONFIG_ESPTOOLPY_FLASHSIZE_16MB is not set -CONFIG_ESPTOOLPY_FLASHSIZE="4MB" +CONFIG_ESPTOOLPY_FLASHSIZE="2MB" CONFIG_ESPTOOLPY_FLASHSIZE_DETECT=y CONFIG_ESPTOOLPY_BEFORE_RESET=y # CONFIG_ESPTOOLPY_BEFORE_NORESET is not set @@ -120,36 +111,6 @@ CONFIG_ESPTOOLPY_MONITOR_BAUD_OTHER_VAL=115200 CONFIG_ESPTOOLPY_MONITOR_BAUD=115200 # end of Serial flasher config -# -# Example Configuration -# -CONFIG_MESH_TOPO_TREE=y -# CONFIG_MESH_TOPO_CHAIN is not set -CONFIG_MESH_TOPOLOGY=0 -CONFIG_MESH_ENABLE_PS=y -CONFIG_MESH_PS_DEV_DUTY_TYPE_REQUEST=y -# CONFIG_MESH_PS_DEV_DUTY_TYPE_DEMAND is not set -CONFIG_MESH_PS_DEV_DUTY_TYPE=1 -CONFIG_MESH_PS_DEV_DUTY=12 -CONFIG_MESH_PS_NWK_DUTY=12 -CONFIG_MESH_PS_NWK_DUTY_DURATION=-1 -CONFIG_MESH_PS_NETWORK_DUTY_APPLIED_ENTIRE=y -# CONFIG_MESH_PS_NETWORK_DUTY_APPLIED_UPLINK is not set -CONFIG_MESH_PS_NWK_DUTY_RULE=0 -CONFIG_MESH_MAX_LAYER=6 -CONFIG_MESH_CHANNEL=13 -CONFIG_MESH_ROUTER_SSID="nicht verbunden" -CONFIG_MESH_ROUTER_PASSWD="flamingo" -# CONFIG_WIFI_AUTH_OPEN is not set -# CONFIG_WIFI_AUTH_WPA_PSK is not set -CONFIG_WIFI_AUTH_WPA2_PSK=y -# CONFIG_WIFI_AUTH_WPA_WPA2_PSK is not set -CONFIG_MESH_AP_AUTHMODE=3 -CONFIG_MESH_AP_PASSWD="MAP_PASSWD" -CONFIG_MESH_AP_CONNECTIONS=6 -CONFIG_MESH_ROUTE_TABLE_SIZE=50 -# end of Example Configuration - # # Partition Table # @@ -338,36 +299,6 @@ CONFIG_ESP32_XTAL_FREQ=40 CONFIG_ESP32_DPORT_DIS_INTERRUPT_LVL=5 # end of ESP32-specific -# -# Memory protection -# -CONFIG_ESP32S2_MEMPROT_FEATURE=y -CONFIG_ESP32S2_MEMPROT_FEATURE_LOCK=y -# end of Memory protection - -# -# Cache config -# -# end of Cache config - -CONFIG_ESP32S2_TRACEMEM_RESERVE_DRAM=0x0 -CONFIG_ESP32S2_ULP_COPROC_RESERVE_MEM=0 -CONFIG_ESP32S2_DEBUG_OCDAWARE=y -CONFIG_ESP32S2_BROWNOUT_DET=y -CONFIG_ESP32S2_ALLOW_RTC_FAST_MEM_AS_HEAP=y - -# -# Cache config -# -# end of Cache config - -CONFIG_ESP32S3_TRACEMEM_RESERVE_DRAM=0x0 -CONFIG_ESP_MAC_ADDR_UNIVERSE_BT_OFFSET=2 -CONFIG_ESP32S3_ULP_COPROC_RESERVE_MEM=0 -CONFIG_ESP32S3_DEBUG_OCDAWARE=y -CONFIG_ESP32S3_BROWNOUT_DET=y -CONFIG_ESP32S3_ALLOW_RTC_FAST_MEM_AS_HEAP=y - # # ADC-Calibration # @@ -390,20 +321,18 @@ CONFIG_ESP_CONSOLE_UART_DEFAULT=y # CONFIG_ESP_CONSOLE_UART_CUSTOM is not set # CONFIG_ESP_CONSOLE_NONE is not set CONFIG_ESP_CONSOLE_UART=y +CONFIG_ESP_CONSOLE_MULTIPLE_UART=y CONFIG_ESP_CONSOLE_UART_NUM=0 CONFIG_ESP_CONSOLE_UART_BAUDRATE=115200 CONFIG_ESP_INT_WDT=y CONFIG_ESP_INT_WDT_TIMEOUT_MS=300 CONFIG_ESP_INT_WDT_CHECK_CPU1=y -CONFIG_ESP_TASK_WDT=y -# CONFIG_ESP_TASK_WDT_PANIC is not set -CONFIG_ESP_TASK_WDT_TIMEOUT_S=5 -CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU0=y -CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU1=y +# CONFIG_ESP_TASK_WDT is not set # CONFIG_ESP_PANIC_HANDLER_IRAM is not set CONFIG_ESP_MAC_ADDR_UNIVERSE_WIFI_STA=y CONFIG_ESP_MAC_ADDR_UNIVERSE_WIFI_AP=y CONFIG_ESP_MAC_ADDR_UNIVERSE_BT=y +CONFIG_ESP_MAC_ADDR_UNIVERSE_BT_OFFSET=2 CONFIG_ESP_MAC_ADDR_UNIVERSE_ETH=y # end of Common ESP-related @@ -632,7 +561,8 @@ CONFIG_FREERTOS_IDLE_TASK_STACKSIZE=2304 CONFIG_FREERTOS_ISR_STACKSIZE=1536 # CONFIG_FREERTOS_LEGACY_HOOKS is not set CONFIG_FREERTOS_MAX_TASK_NAME_LEN=16 -# CONFIG_FREERTOS_SUPPORT_STATIC_ALLOCATION is not set +CONFIG_FREERTOS_SUPPORT_STATIC_ALLOCATION=y +# CONFIG_FREERTOS_ENABLE_STATIC_TASK_CLEAN_UP is not set CONFIG_FREERTOS_TIMER_TASK_PRIORITY=1 CONFIG_FREERTOS_TIMER_TASK_STACK_DEPTH=2048 CONFIG_FREERTOS_TIMER_QUEUE_LENGTH=10 @@ -729,7 +659,6 @@ CONFIG_LWIP_LOOPBACK_MAX_PBUFS=8 # # TCP # -CONFIG_LWIP_TCP_ISN_HOOK=y CONFIG_LWIP_MAX_ACTIVE_TCP=16 CONFIG_LWIP_MAX_LISTENING_TCP=16 CONFIG_LWIP_TCP_HIGH_SPEED_RETRANSMISSION=y @@ -757,6 +686,14 @@ CONFIG_LWIP_MAX_UDP_PCBS=16 CONFIG_LWIP_UDP_RECVMBOX_SIZE=6 # end of UDP +# +# Checksums +# +# CONFIG_LWIP_CHECKSUM_CHECK_IP is not set +# CONFIG_LWIP_CHECKSUM_CHECK_UDP is not set +CONFIG_LWIP_CHECKSUM_CHECK_ICMP=y +# end of Checksums + CONFIG_LWIP_TCPIP_TASK_STACK_SIZE=3072 CONFIG_LWIP_TCPIP_TASK_AFFINITY_NO_AFFINITY=y # CONFIG_LWIP_TCPIP_TASK_AFFINITY_CPU0 is not set @@ -789,6 +726,20 @@ CONFIG_LWIP_SNTP_UPDATE_DELAY=3600000 CONFIG_LWIP_ESP_LWIP_ASSERT=y +# +# Hooks +# +# CONFIG_LWIP_HOOK_TCP_ISN_NONE is not set +CONFIG_LWIP_HOOK_TCP_ISN_DEFAULT=y +# CONFIG_LWIP_HOOK_TCP_ISN_CUSTOM is not set +CONFIG_LWIP_HOOK_IP6_ROUTE_NONE=y +# CONFIG_LWIP_HOOK_IP6_ROUTE_DEFAULT is not set +# CONFIG_LWIP_HOOK_IP6_ROUTE_CUSTOM is not set +CONFIG_LWIP_HOOK_NETCONN_EXT_RESOLVE_NONE=y +# CONFIG_LWIP_HOOK_NETCONN_EXT_RESOLVE_DEFAULT is not set +# CONFIG_LWIP_HOOK_NETCONN_EXT_RESOLVE_CUSTOM is not set +# end of Hooks + # # Debug # @@ -799,8 +750,10 @@ CONFIG_LWIP_ESP_LWIP_ASSERT=y # CONFIG_LWIP_SOCKETS_DEBUG is not set # CONFIG_LWIP_IP_DEBUG is not set # CONFIG_LWIP_ICMP_DEBUG is not set +# CONFIG_LWIP_DHCP_DEBUG is not set # CONFIG_LWIP_IP6_DEBUG is not set # CONFIG_LWIP_ICMP6_DEBUG is not set +# CONFIG_LWIP_TCP_DEBUG is not set # end of Debug # end of LWIP @@ -1054,6 +1007,11 @@ CONFIG_SPIFFS_USE_MTIME=y CONFIG_WS_BUFFER_SIZE=1024 # end of TCP Transport +# +# TinyUSB +# +# end of TinyUSB + # # Unity unit testing library # @@ -1104,6 +1062,7 @@ CONFIG_WPA_MBEDTLS_CRYPTO=y # CONFIG_WPA_DEBUG_PRINT is not set # CONFIG_WPA_TESTING_OPTIONS is not set # CONFIG_WPA_WPS_WARS is not set +# CONFIG_WPA_11KV_SUPPORT is not set # end of Supplicant # end of Component config @@ -1112,3 +1071,157 @@ CONFIG_WPA_MBEDTLS_CRYPTO=y # # CONFIG_LEGACY_INCLUDE_COMMON_HEADERS is not set # end of Compatibility options + +# Deprecated options for backward compatibility +CONFIG_TOOLPREFIX="xtensa-esp32-elf-" +# CONFIG_LOG_BOOTLOADER_LEVEL_NONE is not set +# CONFIG_LOG_BOOTLOADER_LEVEL_ERROR is not set +# CONFIG_LOG_BOOTLOADER_LEVEL_WARN is not set +CONFIG_LOG_BOOTLOADER_LEVEL_INFO=y +# CONFIG_LOG_BOOTLOADER_LEVEL_DEBUG is not set +# CONFIG_LOG_BOOTLOADER_LEVEL_VERBOSE is not set +CONFIG_LOG_BOOTLOADER_LEVEL=3 +# CONFIG_APP_ROLLBACK_ENABLE is not set +# CONFIG_FLASH_ENCRYPTION_ENABLED is not set +# CONFIG_FLASHMODE_QIO is not set +# CONFIG_FLASHMODE_QOUT is not set +CONFIG_FLASHMODE_DIO=y +# CONFIG_FLASHMODE_DOUT is not set +# CONFIG_MONITOR_BAUD_9600B is not set +# CONFIG_MONITOR_BAUD_57600B is not set +CONFIG_MONITOR_BAUD_115200B=y +# CONFIG_MONITOR_BAUD_230400B is not set +# CONFIG_MONITOR_BAUD_921600B is not set +# CONFIG_MONITOR_BAUD_2MB is not set +# CONFIG_MONITOR_BAUD_OTHER is not set +CONFIG_MONITOR_BAUD_OTHER_VAL=115200 +CONFIG_MONITOR_BAUD=115200 +CONFIG_COMPILER_OPTIMIZATION_LEVEL_DEBUG=y +# CONFIG_COMPILER_OPTIMIZATION_LEVEL_RELEASE is not set +CONFIG_OPTIMIZATION_ASSERTIONS_ENABLED=y +# CONFIG_OPTIMIZATION_ASSERTIONS_SILENT is not set +# CONFIG_OPTIMIZATION_ASSERTIONS_DISABLED is not set +# CONFIG_CXX_EXCEPTIONS is not set +CONFIG_STACK_CHECK_NONE=y +# CONFIG_STACK_CHECK_NORM is not set +# CONFIG_STACK_CHECK_STRONG is not set +# CONFIG_STACK_CHECK_ALL is not set +# CONFIG_WARN_WRITE_STRINGS is not set +# CONFIG_DISABLE_GCC8_WARNINGS is not set +# CONFIG_ESP32_APPTRACE_DEST_TRAX is not set +CONFIG_ESP32_APPTRACE_DEST_NONE=y +CONFIG_ESP32_APPTRACE_LOCK_ENABLE=y +CONFIG_BTDM_CONTROLLER_BLE_MAX_CONN_EFF=0 +CONFIG_BTDM_CONTROLLER_BR_EDR_MAX_ACL_CONN_EFF=0 +CONFIG_BTDM_CONTROLLER_BR_EDR_MAX_SYNC_CONN_EFF=0 +CONFIG_BTDM_CONTROLLER_PINNED_TO_CORE=0 +CONFIG_ADC2_DISABLE_DAC=y +# CONFIG_SPIRAM_SUPPORT is not set +CONFIG_TRACEMEM_RESERVE_DRAM=0x0 +# CONFIG_TWO_UNIVERSAL_MAC_ADDRESS is not set +CONFIG_FOUR_UNIVERSAL_MAC_ADDRESS=y +CONFIG_NUMBER_OF_UNIVERSAL_MAC_ADDRESS=4 +# CONFIG_ULP_COPROC_ENABLED is not set +CONFIG_ULP_COPROC_RESERVE_MEM=0 +CONFIG_BROWNOUT_DET=y +CONFIG_BROWNOUT_DET_LVL_SEL_0=y +# CONFIG_BROWNOUT_DET_LVL_SEL_1 is not set +# CONFIG_BROWNOUT_DET_LVL_SEL_2 is not set +# CONFIG_BROWNOUT_DET_LVL_SEL_3 is not set +# CONFIG_BROWNOUT_DET_LVL_SEL_4 is not set +# CONFIG_BROWNOUT_DET_LVL_SEL_5 is not set +# CONFIG_BROWNOUT_DET_LVL_SEL_6 is not set +# CONFIG_BROWNOUT_DET_LVL_SEL_7 is not set +CONFIG_BROWNOUT_DET_LVL=0 +CONFIG_REDUCE_PHY_TX_POWER=y +CONFIG_ESP32_RTC_CLOCK_SOURCE_INTERNAL_RC=y +# CONFIG_ESP32_RTC_CLOCK_SOURCE_EXTERNAL_CRYSTAL is not set +# CONFIG_ESP32_RTC_CLOCK_SOURCE_EXTERNAL_OSC is not set +# CONFIG_ESP32_RTC_CLOCK_SOURCE_INTERNAL_8MD256 is not set +# CONFIG_DISABLE_BASIC_ROM_CONSOLE is not set +# CONFIG_NO_BLOBS is not set +# CONFIG_COMPATIBLE_PRE_V2_1_BOOTLOADERS is not set +CONFIG_SYSTEM_EVENT_QUEUE_SIZE=32 +CONFIG_SYSTEM_EVENT_TASK_STACK_SIZE=2304 +CONFIG_MAIN_TASK_STACK_SIZE=3584 +CONFIG_IPC_TASK_STACK_SIZE=1024 +CONFIG_CONSOLE_UART_DEFAULT=y +# CONFIG_CONSOLE_UART_CUSTOM is not set +# CONFIG_ESP_CONSOLE_UART_NONE is not set +CONFIG_CONSOLE_UART=y +CONFIG_CONSOLE_UART_NUM=0 +CONFIG_CONSOLE_UART_BAUDRATE=115200 +CONFIG_INT_WDT=y +CONFIG_INT_WDT_TIMEOUT_MS=300 +CONFIG_INT_WDT_CHECK_CPU1=y +# CONFIG_TASK_WDT is not set +# CONFIG_EVENT_LOOP_PROFILING is not set +CONFIG_POST_EVENTS_FROM_ISR=y +CONFIG_POST_EVENTS_FROM_IRAM_ISR=y +# CONFIG_ESP32S2_PANIC_PRINT_HALT is not set +CONFIG_ESP32S2_PANIC_PRINT_REBOOT=y +# CONFIG_ESP32S2_PANIC_SILENT_REBOOT is not set +# CONFIG_ESP32S2_PANIC_GDBSTUB is not set +CONFIG_TIMER_TASK_STACK_SIZE=3584 +# CONFIG_ESP32_ENABLE_COREDUMP_TO_FLASH is not set +# CONFIG_ESP32_ENABLE_COREDUMP_TO_UART is not set +CONFIG_ESP32_ENABLE_COREDUMP_TO_NONE=y +CONFIG_MB_MASTER_TIMEOUT_MS_RESPOND=150 +CONFIG_MB_MASTER_DELAY_MS_CONVERT=200 +CONFIG_MB_QUEUE_LENGTH=20 +CONFIG_MB_SERIAL_TASK_STACK_SIZE=4096 +CONFIG_MB_SERIAL_BUF_SIZE=256 +CONFIG_MB_SERIAL_TASK_PRIO=10 +CONFIG_MB_CONTROLLER_SLAVE_ID_SUPPORT=y +CONFIG_MB_CONTROLLER_SLAVE_ID=0x00112233 +CONFIG_MB_CONTROLLER_NOTIFY_TIMEOUT=20 +CONFIG_MB_CONTROLLER_NOTIFY_QUEUE_SIZE=20 +CONFIG_MB_CONTROLLER_STACK_SIZE=4096 +CONFIG_MB_EVENT_QUEUE_TIMEOUT=20 +CONFIG_MB_TIMER_PORT_ENABLED=y +CONFIG_MB_TIMER_GROUP=0 +CONFIG_MB_TIMER_INDEX=0 +# CONFIG_ENABLE_STATIC_TASK_CLEAN_UP_HOOK is not set +CONFIG_TIMER_TASK_PRIORITY=1 +CONFIG_TIMER_TASK_STACK_DEPTH=2048 +CONFIG_TIMER_QUEUE_LENGTH=10 +# CONFIG_L2_TO_L3_COPY is not set +# CONFIG_USE_ONLY_LWIP_SELECT is not set +CONFIG_ESP_GRATUITOUS_ARP=y +CONFIG_GARP_TMR_INTERVAL=60 +CONFIG_TCPIP_RECVMBOX_SIZE=32 +CONFIG_TCP_MAXRTX=12 +CONFIG_TCP_SYNMAXRTX=12 +CONFIG_TCP_MSS=1440 +CONFIG_TCP_MSL=60000 +CONFIG_TCP_SND_BUF_DEFAULT=5744 +CONFIG_TCP_WND_DEFAULT=5744 +CONFIG_TCP_RECVMBOX_SIZE=6 +CONFIG_TCP_QUEUE_OOSEQ=y +# CONFIG_ESP_TCP_KEEP_CONNECTION_WHEN_IP_CHANGES is not set +CONFIG_TCP_OVERSIZE_MSS=y +# CONFIG_TCP_OVERSIZE_QUARTER_MSS is not set +# CONFIG_TCP_OVERSIZE_DISABLE is not set +CONFIG_UDP_RECVMBOX_SIZE=6 +CONFIG_TCPIP_TASK_STACK_SIZE=3072 +CONFIG_TCPIP_TASK_AFFINITY_NO_AFFINITY=y +# CONFIG_TCPIP_TASK_AFFINITY_CPU0 is not set +# CONFIG_TCPIP_TASK_AFFINITY_CPU1 is not set +CONFIG_TCPIP_TASK_AFFINITY=0x7FFFFFFF +# CONFIG_PPP_SUPPORT is not set +CONFIG_ESP32_PTHREAD_TASK_PRIO_DEFAULT=5 +CONFIG_ESP32_PTHREAD_TASK_STACK_SIZE_DEFAULT=3072 +CONFIG_ESP32_PTHREAD_STACK_MIN=768 +CONFIG_ESP32_DEFAULT_PTHREAD_CORE_NO_AFFINITY=y +# CONFIG_ESP32_DEFAULT_PTHREAD_CORE_0 is not set +# CONFIG_ESP32_DEFAULT_PTHREAD_CORE_1 is not set +CONFIG_ESP32_PTHREAD_TASK_CORE_DEFAULT=-1 +CONFIG_ESP32_PTHREAD_TASK_NAME_DEFAULT="pthread" +CONFIG_SPI_FLASH_WRITING_DANGEROUS_REGIONS_ABORTS=y +# CONFIG_SPI_FLASH_WRITING_DANGEROUS_REGIONS_FAILS is not set +# CONFIG_SPI_FLASH_WRITING_DANGEROUS_REGIONS_ALLOWED is not set +CONFIG_SUPPRESS_SELECT_DEBUG_OUTPUT=y +CONFIG_SUPPORT_TERMIOS=y +CONFIG_SEMIHOSTFS_MAX_MOUNT_POINTS=1 +CONFIG_SEMIHOSTFS_HOST_PATH_MAX_LEN=128 +# End of deprecated options diff --git a/test/sdkconfig.defaults b/test/sdkconfig.defaults new file mode 100644 index 0000000..a1f2ef6 --- /dev/null +++ b/test/sdkconfig.defaults @@ -0,0 +1 @@ +CONFIG_ESP_TASK_WDT=n