2 Commits

Author SHA1 Message Date
c17756160f updated tests, changed file names, new mesh packet type 2021-01-11 22:56:39 +01:00
d4182eddb2 format log output 2021-01-11 18:59:19 +01:00
12 changed files with 133 additions and 104 deletions

View File

@ -1,4 +1,4 @@
idf_component_register(SRCS "mesh_network_handler.c" "mesh_network.c" "mesh_ota.c" idf_component_register(SRCS "Mesh_network_handler.c" "Mesh_network.c" "Mesh_OTA.c"
INCLUDE_DIRS "include" INCLUDE_DIRS "include"
REQUIRES nvs_flash REQUIRES nvs_flash
esp_http_client esp_http_client

View File

@ -1,4 +1,4 @@
#include "mesh_ota.h" #include "Mesh_OTA.h"
/* /*
* 999.999.999 * 999.999.999

View File

@ -1,11 +1,14 @@
#include "mesh_ota.h" #include "Mesh_OTA.h"
static const char *LOG_TAG = "mesh_network"; static const char *LOG_TAG = "mesh_network";
static const uint8_t MESH_ID[6] = { 0x77, 0x77, 0x77, 0x77, 0x77, 0x77}; static uint8_t tx_buf[CONFIG_MESH_MESSAGE_SIZE] = { 0, };
static uint8_t tx_buf[TX_SIZE] = { 0, }; static uint8_t rx_buf[CONFIG_MESH_MESSAGE_SIZE] = { 0, };
static uint8_t rx_buf[RX_SIZE] = { 0, };
static uint8_t u8NodeMAC[6]; 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() esp_err_t errMeshNetworkInitialize()
{ {
@ -57,7 +60,7 @@ esp_err_t errMeshNetworkInitialize()
mesh_cfg_t cfg = MESH_INIT_CONFIG_DEFAULT(); mesh_cfg_t cfg = MESH_INIT_CONFIG_DEFAULT();
/* mesh ID */ /* mesh ID */
memcpy((uint8_t *) &cfg.mesh_id, MESH_ID, 6); memcpy((uint8_t *) &cfg.mesh_id, CONFIG_MESH_ID, 6);
ERROR_CHECK(errMeshNetworkInitializeRouter(&cfg)); ERROR_CHECK(errMeshNetworkInitializeRouter(&cfg));
@ -150,8 +153,7 @@ esp_err_t errGetChildren(mesh_addr_t* pChildren, uint16_t* pu16ChildrenSize)
return err; return err;
} }
/* esp_err_t errSendMeshPacket(mesh_addr_t* pAddrDest, MESH_PACKET_t* pPacket)
esp_err_t errSendPacket(mesh_addr_t* dest, struct ota_mesh_packet* packet)
{ {
esp_err_t err; esp_err_t err;
mesh_data_t data; mesh_data_t data;
@ -159,28 +161,23 @@ esp_err_t errSendPacket(mesh_addr_t* dest, struct ota_mesh_packet* packet)
data.size = sizeof(tx_buf); data.size = sizeof(tx_buf);
data.proto = MESH_PROTO_BIN; data.proto = MESH_PROTO_BIN;
data.tos = MESH_TOS_P2P; data.tos = MESH_TOS_P2P;
memcpy(tx_buf, (uint8_t *)packet, sizeof(struct ota_mesh_packet)); memcpy(tx_buf, (uint8_t *)pPacket, sizeof(MESH_PACKET_t));
err = esp_mesh_send(dest, &data, MESH_DATA_P2P, NULL, 0); err = esp_mesh_send(pAddrDest, &data, MESH_DATA_P2P, NULL, 0);
return err; return err;
} }
*/
esp_err_t errStartReceiveTask() esp_err_t errStartReceiveTask()
{ {
esp_err_t err = ESP_OK; esp_err_t err = ESP_OK;
BaseType_t xReturned; BaseType_t xReturned;
//static bool is_comm_p2p_started = false; xReturned = xTaskCreate(vTaskReceiveMeshData, "ReceiveMeshData", 7000, NULL, 5, NULL);
// if (!is_comm_p2p_started)
// {
//is_comm_p2p_started = true;
xReturned = xTaskCreate(vTaskReceiveMeshData, "ReceiveMeshData", 7000, NULL, 5, NULL);
if(xReturned != pdPASS) if(xReturned != pdPASS)
{ {
err = ESP_FAIL; err = ESP_FAIL;
} }
//}
return err; return err;
} }
@ -191,11 +188,11 @@ void vTaskReceiveMeshData(void *arg)
mesh_data_t data; mesh_data_t data;
int flag = 0; int flag = 0;
data.data = rx_buf; data.data = rx_buf;
data.size = RX_SIZE; data.size = CONFIG_MESH_MESSAGE_SIZE;
while (true) while (true)
{ {
data.size = RX_SIZE; data.size = CONFIG_MESH_MESSAGE_SIZE;
err = esp_mesh_recv(&from, &data, portMAX_DELAY, &flag, NULL, 0); err = esp_mesh_recv(&from, &data, portMAX_DELAY, &flag, NULL, 0);
if (err != ESP_OK || !data.size) if (err != ESP_OK || !data.size)
{ {
@ -204,7 +201,7 @@ void vTaskReceiveMeshData(void *arg)
} }
/*
struct ota_mesh_packet packet; struct ota_mesh_packet packet;
memcpy(&packet, (uint8_t *)rx_buf, sizeof(struct ota_mesh_packet)); memcpy(&packet, (uint8_t *)rx_buf, sizeof(struct ota_mesh_packet));
@ -239,8 +236,9 @@ void vTaskReceiveMeshData(void *arg)
break; break;
}//end switch }//end switch
*/
} //end while } //end while
vTaskDelete(NULL);
} }

View File

@ -1,5 +1,5 @@
#include "mesh_ota.h" #include "Mesh_OTA.h"
static const char *LOG_TAG = "mesh_network_handler"; static const char *LOG_TAG = "mesh_network_handler";
@ -77,21 +77,15 @@ void vMeshEventHandler(void *arg, esp_event_base_t event_base, int32_t i32EventI
esp_mesh_get_id(&id); esp_mesh_get_id(&id);
i32MeshLayer = connected->self_layer; i32MeshLayer = connected->self_layer;
memcpy(&mesh_parent_addr.addr, connected->connected.bssid, 6); memcpy(&mesh_parent_addr.addr, connected->connected.bssid, 6);
//WTF
ESP_LOGI(LOG_TAG, "<MESH_EVENT_PARENT_CONNECTED>layer:%d-->%d, parent:"MACSTR"%s, ID:"MACSTR", duty:%d", ESP_LOGI(LOG_TAG, "<MESH_EVENT_PARENT_CONNECTED>layer:%d-->%d, parent:"MACSTR"%s, ID:"MACSTR", duty:%d",
last_layer, i32MeshLayer, MAC2STR(mesh_parent_addr.addr), last_layer, i32MeshLayer, MAC2STR(mesh_parent_addr.addr),
esp_mesh_is_root() ? "<ROOT>" : esp_mesh_is_root() ? "<ROOT>" : (i32MeshLayer == 2) ? "<layer2>" : "", //print own node title
(i32MeshLayer == 2) ? "<layer2>" : "", MAC2STR(id.addr), connected->duty); MAC2STR(id.addr), connected->duty);
last_layer = i32MeshLayer; last_layer = i32MeshLayer;
//mesh_connected_indicator(i32MeshLayer);
bIsMeshConnected = true; bIsMeshConnected = true;
if (esp_mesh_is_root()) if (esp_mesh_is_root())
{ {
esp_netif_dhcpc_start(netif_sta); //get a IP from router ESP_ERROR_CHECK(esp_netif_dhcpc_start(netif_sta)); //get a IP from router
} }
errStartReceiveTask();//start receiving errStartReceiveTask();//start receiving
} }
@ -101,7 +95,6 @@ void vMeshEventHandler(void *arg, esp_event_base_t event_base, int32_t i32EventI
mesh_event_disconnected_t *disconnected = (mesh_event_disconnected_t *)vpEventData; mesh_event_disconnected_t *disconnected = (mesh_event_disconnected_t *)vpEventData;
ESP_LOGI(LOG_TAG, "<MESH_EVENT_PARENT_DISCONNECTED>reason:%d", disconnected->reason); ESP_LOGI(LOG_TAG, "<MESH_EVENT_PARENT_DISCONNECTED>reason:%d", disconnected->reason);
bIsMeshConnected = false; bIsMeshConnected = false;
// mesh_disconnected_indicator();
i32MeshLayer = esp_mesh_get_layer(); i32MeshLayer = esp_mesh_get_layer();
} }
break; break;
@ -109,16 +102,10 @@ void vMeshEventHandler(void *arg, esp_event_base_t event_base, int32_t i32EventI
{ {
mesh_event_layer_change_t *layer_change = (mesh_event_layer_change_t *)vpEventData; mesh_event_layer_change_t *layer_change = (mesh_event_layer_change_t *)vpEventData;
i32MeshLayer = layer_change->new_layer; i32MeshLayer = layer_change->new_layer;
//WTF
ESP_LOGI(LOG_TAG, "<MESH_EVENT_LAYER_CHANGE>layer:%d-->%d%s", ESP_LOGI(LOG_TAG, "<MESH_EVENT_LAYER_CHANGE>layer:%d-->%d%s",
last_layer, i32MeshLayer, last_layer, i32MeshLayer,
esp_mesh_is_root() ? "<ROOT>" : esp_mesh_is_root() ? "<ROOT>" : (i32MeshLayer == 2) ? "<layer2>" : "");
(i32MeshLayer == 2) ? "<layer2>" : "");
last_layer = i32MeshLayer; last_layer = i32MeshLayer;
//mesh_connected_indicator(i32MeshLayer);
} }
break; break;
case MESH_EVENT_ROOT_ADDRESS: case MESH_EVENT_ROOT_ADDRESS:
@ -174,9 +161,7 @@ void vMeshEventHandler(void *arg, esp_event_base_t event_base, int32_t i32EventI
{ {
mesh_event_root_conflict_t *root_conflict = (mesh_event_root_conflict_t *)vpEventData; mesh_event_root_conflict_t *root_conflict = (mesh_event_root_conflict_t *)vpEventData;
ESP_LOGI(LOG_TAG, "<MESH_EVENT_ROOT_ASKED_YIELD>"MACSTR", rssi:%d, capacity:%d", ESP_LOGI(LOG_TAG, "<MESH_EVENT_ROOT_ASKED_YIELD>"MACSTR", rssi:%d, capacity:%d",
MAC2STR(root_conflict->addr), MAC2STR(root_conflict->addr), root_conflict->rssi, root_conflict->capacity);
root_conflict->rssi,
root_conflict->capacity);
} }
break; break;
case MESH_EVENT_CHANNEL_SWITCH: case MESH_EVENT_CHANNEL_SWITCH:

View File

@ -13,23 +13,20 @@
#include "esp_ota_ops.h" #include "esp_ota_ops.h"
#include "esp_partition.h" #include "esp_partition.h"
#include "mesh_network.h" #include "Mesh_network.h"
#define ERASE_NVS //erase non volatile storage if full #define ERASE_NVS //erase non volatile storage if full
struct ota_mesh_packet /*
{ enum ota_packet_type
enum ota_mesh_packet_type
{ {
APP_Version_Request, APP_Version_Request,
APP_Version_Response, APP_Version_Response,
OTA_Data, OTA_Data,
OTA_ACK, OTA_ACK,
OTA_Complete OTA_Complete
} type; };
*/
uint8_t au8Payload[1024];
};
#define ERROR_CHECK(x) if (err == ESP_OK) \ #define ERROR_CHECK(x) if (err == ESP_OK) \
{ \ { \
@ -45,6 +42,4 @@ bool bNewerVersion(const char* pu8Local, const char* pu8Remote);
esp_err_t errExtractVersionNumber(const char* pu8Data, uint32_t* pu32DataLenght, char* pc8RemoteVersionNumber); 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); esp_err_t errFindImageStart(const char* pu8Data, uint32_t* pu32DataLenght, uint32_t* pu32StartOffset);
#endif /* H_MESH_OTA */ #endif /* H_MESH_OTA */

View File

@ -0,0 +1,78 @@
#ifndef H_MESH_NETWORK
#define H_MESH_NETWORK
#include <string.h>
#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
{
//todo type
//todo lenght
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 */

View File

@ -1,35 +0,0 @@
#ifndef H_MESH_NETWORK
#define H_MESH_NETWORK
#include <string.h>
#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"
#define RX_SIZE (1234)
#define TX_SIZE (1234)
static bool bIsMeshConnected;
static int32_t i32MeshLayer;
static mesh_addr_t mesh_parent_addr;
static 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);
esp_err_t errSendPacket(mesh_addr_t* dest, struct ota_mesh_packet* packet);
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);
#endif /* H_MESH_NETWORK */

View File

@ -1,7 +1,7 @@
#include <limits.h> #include <limits.h>
#include "unity.h" #include "unity.h"
#include "mesh_ota.h" #include "Mesh_OTA.h"
#include "test_image_hex.h" #include "test_image_hex.h"
// ### ### ### distinguish newer image version ### ### ### // ### ### ### distinguish newer image version ### ### ###

View File

@ -1,2 +1,2 @@
idf_component_register(SRCS "main.c" idf_component_register(SRCS "Main.c"
INCLUDE_DIRS ".") INCLUDE_DIRS ".")

View File

@ -106,6 +106,12 @@ menu "Mesh OTA Configuration"
help help
mesh network channel. 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 config MESH_ROUTER_SSID
string "Router SSID" string "Router SSID"
default "ROUTER_SSID" default "ROUTER_SSID"
@ -158,6 +164,13 @@ menu "Mesh OTA Configuration"
help help
The number of devices over the network(max: 300). 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 config OTA_HTTPS_SERVER_COMMON_NAME
string "Common name OTA server" string "Common name OTA server"
default "exmaple.com" default "exmaple.com"

View File

@ -11,13 +11,10 @@
#include "esp_ota_ops.h" #include "esp_ota_ops.h"
#include "esp_partition.h" #include "esp_partition.h"
#include "mesh_ota.h" #include "Mesh_OTA.h"
static const char *LOG_TAG = "esp_main"; static const char *LOG_TAG = "esp_main";
void app_main(void) void app_main(void)
{ {
esp_err_t err = ESP_OK; esp_err_t err = ESP_OK;
@ -29,10 +26,6 @@ void app_main(void)
//start app //start app
} }

View File

@ -150,6 +150,7 @@ CONFIG_MESH_PS_NETWORK_DUTY_APPLIED_ENTIRE=y
CONFIG_MESH_PS_NWK_DUTY_RULE=0 CONFIG_MESH_PS_NWK_DUTY_RULE=0
CONFIG_MESH_MAX_LAYER=6 CONFIG_MESH_MAX_LAYER=6
CONFIG_MESH_CHANNEL=13 CONFIG_MESH_CHANNEL=13
CONFIG_MESH_ID="00, 00, 00, 00, 00, 00"
CONFIG_MESH_ROUTER_SSID="labNet" CONFIG_MESH_ROUTER_SSID="labNet"
CONFIG_MESH_ROUTER_PASSWD="12345678" CONFIG_MESH_ROUTER_PASSWD="12345678"
CONFIG_WIFI_AUTH_WPA2_PSK=y CONFIG_WIFI_AUTH_WPA2_PSK=y
@ -158,6 +159,7 @@ CONFIG_MESH_AP_AUTHMODE=3
CONFIG_MESH_AP_PASSWD="qaws1234" CONFIG_MESH_AP_PASSWD="qaws1234"
CONFIG_MESH_AP_CONNECTIONS=6 CONFIG_MESH_AP_CONNECTIONS=6
CONFIG_MESH_ROUTE_TABLE_SIZE=50 CONFIG_MESH_ROUTE_TABLE_SIZE=50
CONFIG_MESH_MESSAGE_SIZE=1500
CONFIG_OTA_HTTPS_SERVER_COMMON_NAME="ota.hendrikschutter.com" CONFIG_OTA_HTTPS_SERVER_COMMON_NAME="ota.hendrikschutter.com"
CONFIG_OTA_HTTPS_SERVER_PORT="443" CONFIG_OTA_HTTPS_SERVER_PORT="443"
CONFIG_OTA_HTTPS_URL="https://ota.hendrikschutter.com/mesh_ota.bin" CONFIG_OTA_HTTPS_URL="https://ota.hendrikschutter.com/mesh_ota.bin"