/* * ESPRESSIF MIT License * * Copyright (c) 2015 * * Permission is hereby granted for use on ESPRESSIF SYSTEMS ESP8266 only, in which case, * it is free of charge, to any person obtaining a copy of this software and associated * documentation files (the "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished * to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or * substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "esp_common.h" #include "user_config.h" #include "apps/sntp.h" #include "uart.h" #include "cfg.h" #include "log.h" #include "soft_ap.h" #include "user_main.h" #include "cfg.h" static char g_DeviceId[33]; static char g_staMacAddr[16]; void set_platform_product_id(uint8 *param, uint8 len) { char g_ProductId[5]; if(param == NULL || len != 4){ LOG_EX(LOG_Info, "param error\r\n"); return ; } memset(g_ProductId, 0, sizeof(g_ProductId)); memcpy(g_ProductId, param, len); LOG_EX(LOG_Info, "enter_softap! g_ProductId=%s\r\n", g_ProductId); if(ne_cfg_save_product_id(g_ProductId, sizeof(g_ProductId)) != ERR_OK){ LOG_EX(LOG_Info, "savr product error\r\n"); } } const char* GetPlatformDevId(void) { return g_DeviceId; } const char* GetSTAMacAddr(void) { return g_staMacAddr; } /****************************************************************************** * FunctionName : user_rf_cal_sector_set * Description : SDK just reversed 4 sectors, used for rf init data and paramters. * We add this function to force users to set rf cal sector, since * we don't know which sector is free in user's application. * sector map for last several sectors : ABCCC * A : rf cal * B : rf init data * C : sdk parameters * Parameters : none * Returns : rf cal sector *******************************************************************************/ uint32 user_rf_cal_sector_set(void) { flash_size_map size_map = system_get_flash_size_map(); uint32 rf_cal_sec = 0; switch (size_map) { case FLASH_SIZE_4M_MAP_256_256: rf_cal_sec = 128 - 5; break; case FLASH_SIZE_8M_MAP_512_512: rf_cal_sec = 256 - 5; break; case FLASH_SIZE_16M_MAP_512_512: case FLASH_SIZE_16M_MAP_1024_1024: rf_cal_sec = 512 - 5; break; case FLASH_SIZE_32M_MAP_512_512: case FLASH_SIZE_32M_MAP_1024_1024: rf_cal_sec = 1024 - 5; break; case FLASH_SIZE_64M_MAP_1024_1024: rf_cal_sec = 2048 - 5; break; case FLASH_SIZE_128M_MAP_1024_1024: rf_cal_sec = 4096 - 5; break; default: rf_cal_sec = 0; break; } return rf_cal_sec; } static const char* _get_used_server(int svrType) { switch(svrType) { case ONLINE_PUBLISH: return "ONLINE_PUBLISH"; case TEST_LAN_PUBLISN: return "TEST_LAN_PUBLISN"; case TEST_WAN_PUBLISH: return "TEST_WAN_PUBLISH"; default: return "Error Server Configure"; } } static void init_sntp(void) { sntp_setoperatingmode(SNTP_OPMODE_POLL); // for set more sntp server, plz modify macro SNTP_MAX_SERVERS in sntp_opts.h file sntp_setservername(0, "202.112.29.82"); // set sntp server after got ip address, you had better to adjust the sntp server to your area // sntp_setservername(1, "time-a.nist.gov"); // sntp_setservername(2, "ntp.sjtu.edu.cn"); // sntp_setservername(3, "0.nettime.pool.ntp.org"); // sntp_setservername(4, "time-b.nist.gov"); // sntp_setservername(5, "time-a.timefreq.bldrdoc.gov"); // sntp_setservername(6, "time-b.timefreq.bldrdoc.gov"); // sntp_setservername(7, "time-c.timefreq.bldrdoc.gov"); // sntp_setservername(8, "utcnist.colorado.edu"); // sntp_setservername(9, "time.nist.gov"); sntp_init(); while (1) { u32_t ts = 0; ts = sntp_get_current_timestamp(); LOG_EX(LOG_Debug, "Current time: %s\n", sntp_get_real_time(ts)); if (ts == 0) { } else { break; } vTaskDelay(2000 / portTICK_RATE_MS); } } static void __dumpHeapSize(void* pvParams) { while (TRUE) { LOG_EX(LOG_Debug, "Free Heap Size: %u\n", system_get_free_heap_size()); vTaskDelay(1000 / portTICK_RATE_MS); } vTaskDelete(NULL); } static int32 g_SoftApSetupMode; int32 ne_get_softap_setup_mode(void) { return g_SoftApSetupMode; } /* * system device id init. */ static void ne_device_id_init(void) { u8_t devMd5[16]; uint32_t uDevId = system_get_chip_id(); u8_t mac[6]; wifi_get_macaddr(STATION_IF, mac); mbedtls_md5(mac, 6, devMd5); memset(g_DeviceId, 0, 33); SysBin2HexStr(g_DeviceId, devMd5, 16); LOG_EX(LOG_Info, "APP version:%s\n", CURRENT_VERSION); LOG_EX(LOG_Info, "SDK version:%s %d firmware version=%s\n", system_get_sdk_version(), system_get_free_heap_size(), FIRMWARE_VERSION); LOG_EX(LOG_Info, "Chip ID: %s(%u)\n", g_DeviceId, uDevId); #if !RELEASE_VERSION LOG_EX(LOG_Info, "Product Key: %s\n", USR_CFG_SERVER(ProductKey)); LOG_EX(LOG_Info, "Product Secert: %s\n", USR_CFG_SERVER(ProductSecury)); #endif LOG_EX(LOG_Info, "HTTPS Server: %s\n", USR_CFG_SERVER(HTTPSServer)); LOG_EX(LOG_Info, "MQTT Server: %s\n", USR_CFG_SERVER(MQTTServer)); LOG_EX(LOG_Info, "MQTT Port: %d\n", USR_CFG_SERVER(MQTTPort)); } /* * system get wifi mac address. */ static void ne_get_wifi_mac(void) { u8_t mac[6]; wifi_get_macaddr(STATION_IF, mac); memset(g_staMacAddr, 0, 16); SysBin2HexStr(g_staMacAddr, mac, 6); LOG_EX(LOG_Info, "STA MAC: %02X:%02X:%02X:%02X:%02X:%02X\n", MAC2STR(mac)); wifi_get_macaddr(SOFTAP_IF, mac); LOG_EX(LOG_Info, "AP MAC: %02X:%02X:%02X:%02X:%02X:%02X\n", MAC2STR(mac)); } /* * system product init. */ static int ne_product_init(void) { CfgInitEnv(); ne_device_init(); ne_device_id_init(); ne_get_wifi_mac(); g_SoftApSetupMode = ne_cfg_get_init_type(); ShowCfgConfigure(); } /* * system server init. */ static int ne_server_init(void) { // spi_flash_erase_sector(PARAM_SAVE_DEVICESECRET); ne_thread_monitor_init(); ne_thread_monitor_start(); ProtocolInitEnv(); user_conn_init(); } #if 0 static void test_aes(void) { int iCount = 0; mbedtls_aes_context aes_ctx; //密钥数值 unsigned char key[16] = {'0', '1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'}; unsigned char enAes[16] = {0xA5, 0xF4, 0xDD, 0xC8, 0xE5, 0xCF, 0x4B, 0xB5, 0x98, 0xB4, 0xCB, 0xE2, 0x85, 0x74, 0x71, 0xC6}; //明文空间 unsigned char plain[16] = "helloworld"; //解密后明文的空间 unsigned char dec_plain[16]={0}; //密文空间 unsigned char cipher[16]={0}; unsigned char dec[16]={0}; unsigned char basecode[128]; mbedtls_aes_init( &aes_ctx ); //设置加密密钥 mbedtls_aes_setkey_enc( &aes_ctx, key, 128); LOG_EX(LOG_Debug, "*********** Before encode: %s\n", plain); mbedtls_aes_crypt_ecb( &aes_ctx, MBEDTLS_AES_ENCRYPT, plain, cipher ); IHW_LOG_BUF(LOG_Debug, "AES_", cipher, 16); memset(basecode, 0, 128); mbedtls_base64_encode(basecode, 128, &iCount, cipher, 16); LOG_EX(LOG_Debug, "\n*********** Encrypt AES: %s\n", basecode); //设置解密密钥 mbedtls_aes_setkey_dec(&aes_ctx, key, 128); mbedtls_aes_crypt_ecb( &aes_ctx, MBEDTLS_AES_DECRYPT, enAes, dec_plain ); LOG_EX(LOG_Debug, "*********** Decode: %s\n", dec_plain); IHW_LOG_BUF(LOG_Debug, "CIP_", enAes, 16); IHW_LOG_BUF(LOG_Debug, "DES_", dec_plain, 16); mbedtls_aes_free( &aes_ctx ); } #endif static void __showTimes(void* pvParams) { uint32 cnt = 1; while (TRUE) { uint32 cal = system_rtc_clock_cali_proc(); uint32 rtc = system_get_rtc_time(); uint32 iVal = ((cal * 1000) >> 12) / 1000; uint32 dVal = ((cal * 1000) >> 12) % 1000; LOG_EX(LOG_Debug, "rtc = %u, cal(%u): %u.%u \n", rtc, cal, iVal, dVal); vTaskDelay(1000 / portTICK_RATE_MS); if(cnt++ > 25) { system_deep_sleep_instant(30000 * 1000); } } vTaskDelete(NULL); } /* * entry of user application, init user function here. */ void ICACHE_FLASH_ATTR user_init(void) { wifi_set_opmode(1); // set wifi start up only STA mode. ne_product_init(); ne_server_init(); #if NE_DEBUG_VERSION ne_timer_init(); ne_keypad_init(); #endif wifi_station_set_auto_connect(0); ne_network_init(); //wifi_set_sleep_type(MODEM_SLEEP_T); //test_aes(); //xTaskCreate(__showTimes, "__showTimes", 256, NULL, 1, NULL); }