2021-01-11 15:22:45 +01:00
2021-01-11 22:56:39 +01:00
# include "Mesh_OTA.h"
2021-01-11 15:22:45 +01:00
static const char * LOG_TAG = " mesh_network " ;
2021-01-11 22:56:39 +01:00
static uint8_t tx_buf [ CONFIG_MESH_MESSAGE_SIZE ] = { 0 , } ;
static uint8_t rx_buf [ CONFIG_MESH_MESSAGE_SIZE ] = { 0 , } ;
2021-01-11 18:31:37 +01:00
static uint8_t u8NodeMAC [ 6 ] ;
2021-01-11 22:56:39 +01:00
esp_netif_t * netif_sta ;
bool bIsMeshConnected ;
int32_t i32MeshLayer ;
mesh_addr_t mesh_parent_addr ;
2021-01-11 15:22:45 +01:00
esp_err_t errMeshNetworkInitialize ( )
{
2021-01-11 18:31:37 +01:00
//init module variables
2021-01-11 15:22:45 +01:00
esp_err_t err ;
2021-01-11 18:31:37 +01:00
bIsMeshConnected = false ;
i32MeshLayer = - 1 ;
2021-01-11 22:56:39 +01:00
netif_sta = NULL ;
2021-01-11 15:22:45 +01:00
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 */
2021-01-11 22:56:39 +01:00
memcpy ( ( uint8_t * ) & cfg . mesh_id , CONFIG_MESH_ID , 6 ) ;
2021-01-11 15:22:45 +01:00
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 ( ) ) ;
2021-01-11 18:31:37 +01:00
ERROR_CHECK ( esp_base_mac_addr_get ( u8NodeMAC ) )
2021-01-11 15:22:45 +01:00
//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 ( ) ) ;
2021-01-11 18:31:37 +01:00
ESP_LOGI ( LOG_TAG , " Node MAC: \" %x:%x:%x:%x:%x:%x \" " , u8NodeMAC [ 0 ] , u8NodeMAC [ 1 ] , u8NodeMAC [ 2 ] , u8NodeMAC [ 3 ] , u8NodeMAC [ 4 ] , u8NodeMAC [ 5 ] ) ;
2021-01-11 15:22:45 +01:00
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 ;
}
2021-01-11 18:31:37 +01:00
esp_err_t errGetChildren ( mesh_addr_t * pChildren , uint16_t * pu16ChildrenSize )
2021-01-11 15:22:45 +01:00
{
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 + + )
{
2021-01-11 18:31:37 +01:00
if ( ! ( bCheckMACEquality ( u8NodeMAC , route_table [ index ] . addr ) ) )
2021-01-11 15:22:45 +01:00
{
//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]);
2021-01-11 18:31:37 +01:00
pChildren [ * pu16ChildrenSize ] = route_table [ index ] ;
2021-01-11 15:22:45 +01:00
* pu16ChildrenSize = ( * pu16ChildrenSize ) + 1 ;
}
}
}
return err ;
}
2021-01-11 22:56:39 +01:00
esp_err_t errSendMeshPacket ( mesh_addr_t * pAddrDest , MESH_PACKET_t * pPacket )
2021-01-11 15:22:45 +01:00
{
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 ;
2021-01-11 22:56:39 +01:00
memcpy ( tx_buf , ( uint8_t * ) pPacket , sizeof ( MESH_PACKET_t ) ) ;
err = esp_mesh_send ( pAddrDest , & data , MESH_DATA_P2P , NULL , 0 ) ;
2021-01-11 15:22:45 +01:00
return err ;
}
2021-01-11 22:56:39 +01:00
2021-01-11 15:22:45 +01:00
2021-01-11 18:31:37 +01:00
esp_err_t errStartReceiveTask ( )
{
esp_err_t err = ESP_OK ;
BaseType_t xReturned ;
2021-01-11 22:56:39 +01:00
xReturned = xTaskCreate ( vTaskReceiveMeshData , " ReceiveMeshData " , 7000 , NULL , 5 , NULL ) ;
if ( xReturned ! = pdPASS )
{
err = ESP_FAIL ;
}
2021-01-11 18:31:37 +01:00
return err ;
}
void vTaskReceiveMeshData ( void * arg )
2021-01-11 15:22:45 +01:00
{
esp_err_t err ;
mesh_addr_t from ;
mesh_data_t data ;
int flag = 0 ;
data . data = rx_buf ;
2021-01-11 22:56:39 +01:00
data . size = CONFIG_MESH_MESSAGE_SIZE ;
2021-01-11 15:22:45 +01:00
while ( true )
{
2021-01-11 22:56:39 +01:00
data . size = CONFIG_MESH_MESSAGE_SIZE ;
2021-01-11 15:22:45 +01:00
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 ;
}
2021-01-11 18:31:37 +01:00
2021-01-11 22:56:39 +01:00
/*
2021-01-11 15:22:45 +01:00
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 ;
2021-01-11 18:31:37 +01:00
} //end switch
2021-01-11 15:22:45 +01:00
2021-01-11 22:56:39 +01:00
*/
2021-01-11 15:22:45 +01:00
} //end while
}