static int mcu_wifiinfo( lua_State* L ) { char wifi_ver[64] = {0}; IPStatusTypedef para; char mac[18]; MicoGetRfVer(wifi_ver, sizeof(wifi_ver)); micoWlanGetIPStatus(¶, Station); formatMACAddr(mac, (char *)¶.mac); lua_pushstring(L,MicoGetVer());//mxchipWNet library version lua_pushstring(L,mac);//mac //lua_pushstring(L,mico_get_bootloader_ver());//bootloader_ver lua_pushstring(L,wifi_ver);//Wi-Fi driver version return 3; }
OSStatus system_network_daemen_start( mico_Context_t * const inContext ) { IPStatusTypedef para; MicoInit(); MicoSysLed(true); system_log("Free memory %d bytes", MicoGetMemoryInfo()->free_memory); micoWlanGetIPStatus(¶, Station); formatMACAddr(inContext->micoStatus.mac, (char *)¶.mac); MicoGetRfVer(inContext->micoStatus.rf_version, sizeof(inContext->micoStatus.rf_version)); inContext->micoStatus.rf_version[49] = 0x0; system_log("MiCO library version: %s", MicoGetVer()); system_log("Wi-Fi driver version %s, mac %s", inContext->micoStatus.rf_version, inContext->micoStatus.mac); if(inContext->flashContentInRam.micoSystemConfig.rfPowerSaveEnable == true){ micoWlanEnablePowerSave(); } if(inContext->flashContentInRam.micoSystemConfig.mcuPowerSaveEnable == true){ MicoMcuPowerSaveConfig(true); } return kNoErr; }
json_object* ConfigCreateReportJsonMessage( mico_Context_t * const inContext ) { OSStatus err = kNoErr; config_delegate_log_trace(); char name[50], *tempString; OTA_Versions_t versions; char rfVersion[50]; json_object *sectors, *sector, *subMenuSectors, *subMenuSector, *mainObject = NULL; MicoGetRfVer( rfVersion, 50 ); if(inContext->flashContentInRam.micoSystemConfig.configured == wLanUnConfigured){ /*You can upload a specific menu*/ } mico_rtos_lock_mutex(&inContext->flashContentInRam_mutex); snprintf(name, 50, "%s(%c%c%c%c%c%c)",MODEL, inContext->micoStatus.mac[9], inContext->micoStatus.mac[10], inContext->micoStatus.mac[12], inContext->micoStatus.mac[13], inContext->micoStatus.mac[15], inContext->micoStatus.mac[16]); versions.fwVersion = FIRMWARE_REVISION; versions.hdVersion = HARDWARE_REVISION; versions.protocol = PROTOCOL; versions.rfVersion = NULL; sectors = json_object_new_array(); require( sectors, exit ); err = MICOAddTopMenu(&mainObject, name, sectors, versions); require_noerr(err, exit); /*Sector 1*/ sector = json_object_new_array(); require( sector, exit ); err = MICOAddSector(sectors, "MICO SYSTEM", sector); require_noerr(err, exit); /*name cell*/ err = MICOAddStringCellToSector(sector, "Device Name", inContext->flashContentInRam.micoSystemConfig.name, "RW", NULL); require_noerr(err, exit); //Bonjour switcher cell err = MICOAddSwitchCellToSector(sector, "Bonjour", inContext->flashContentInRam.micoSystemConfig.bonjourEnable, "RW"); require_noerr(err, exit); //RF power save switcher cell err = MICOAddSwitchCellToSector(sector, "RF power save", inContext->flashContentInRam.micoSystemConfig.rfPowerSaveEnable, "RW"); require_noerr(err, exit); //MCU power save switcher cell err = MICOAddSwitchCellToSector(sector, "MCU power save", inContext->flashContentInRam.micoSystemConfig.mcuPowerSaveEnable, "RW"); require_noerr(err, exit); /*sub menu*/ subMenuSectors = json_object_new_array(); require( subMenuSectors, exit ); err = MICOAddMenuCellToSector(sector, "Detail", subMenuSectors); require_noerr(err, exit); subMenuSector = json_object_new_array(); require( subMenuSector, exit ); err = MICOAddSector(subMenuSectors, "", subMenuSector); require_noerr(err, exit); err = MICOAddStringCellToSector(subMenuSector, "Firmware Rev.", FIRMWARE_REVISION, "RO", NULL); require_noerr(err, exit); err = MICOAddStringCellToSector(subMenuSector, "Hardware Rev.", HARDWARE_REVISION, "RO", NULL); require_noerr(err, exit); err = MICOAddStringCellToSector(subMenuSector, "MICO OS Rev.", MicoGetVer(), "RO", NULL); require_noerr(err, exit); err = MICOAddStringCellToSector(subMenuSector, "RF Driver Rev.", rfVersion, "RO", NULL); require_noerr(err, exit); err = MICOAddStringCellToSector(subMenuSector, "Model", MODEL, "RO", NULL); require_noerr(err, exit); err = MICOAddStringCellToSector(subMenuSector, "Manufacturer", MANUFACTURER, "RO", NULL); require_noerr(err, exit); err = MICOAddStringCellToSector(subMenuSector, "Protocol", PROTOCOL, "RO", NULL); require_noerr(err, exit); subMenuSector = json_object_new_array(); err = MICOAddSector(subMenuSectors, "WLAN", subMenuSector); require_noerr(err, exit); tempString = DataToHexStringWithColons( (uint8_t *)inContext->flashContentInRam.micoSystemConfig.bssid, 6 ); err = MICOAddStringCellToSector(subMenuSector, "BSSID", tempString, "RO", NULL); require_noerr(err, exit); free(tempString); err = MICOAddNumberCellToSector(subMenuSector, "Channel", inContext->flashContentInRam.micoSystemConfig.channel, "RO", NULL); require_noerr(err, exit); switch(inContext->flashContentInRam.micoSystemConfig.security){ case SECURITY_TYPE_NONE: err = MICOAddStringCellToSector(subMenuSector, "Security", "Open system", "RO", NULL); break; case SECURITY_TYPE_WEP: err = MICOAddStringCellToSector(subMenuSector, "Security", "WEP", "RO", NULL); break; case SECURITY_TYPE_WPA_TKIP: err = MICOAddStringCellToSector(subMenuSector, "Security", "WPA TKIP", "RO", NULL); break; case SECURITY_TYPE_WPA_AES: err = MICOAddStringCellToSector(subMenuSector, "Security", "WPA AES", "RO", NULL); break; case SECURITY_TYPE_WPA2_TKIP: err = MICOAddStringCellToSector(subMenuSector, "Security", "WPA2 TKIP", "RO", NULL); break; case SECURITY_TYPE_WPA2_AES: err = MICOAddStringCellToSector(subMenuSector, "Security", "WPA2 AES", "RO", NULL); break; case SECURITY_TYPE_WPA2_MIXED: err = MICOAddStringCellToSector(subMenuSector, "Security", "WPA2 MIXED", "RO", NULL); break; default: err = MICOAddStringCellToSector(subMenuSector, "Security", "Auto", "RO", NULL); break; } require_noerr(err, exit); if(inContext->flashContentInRam.micoSystemConfig.keyLength == maxKeyLen){ /*This is a PMK key, generated by user key in WPA security type*/ tempString = calloc(maxKeyLen+1, 1); require_action(tempString, exit, err=kNoMemoryErr); memcpy(tempString, inContext->flashContentInRam.micoSystemConfig.key, maxKeyLen); err = MICOAddStringCellToSector(subMenuSector, "PMK", tempString, "RO", NULL); require_noerr(err, exit); free(tempString); } else{ err = MICOAddStringCellToSector(subMenuSector, "KEY", inContext->flashContentInRam.micoSystemConfig.user_key, "RO", NULL); require_noerr(err, exit); } /*Sector 3*/ sector = json_object_new_array(); require( sector, exit ); err = MICOAddSector(sectors, "WLAN", sector); require_noerr(err, exit); /*SSID cell*/ err = MICOAddStringCellToSector(sector, "Wi-Fi", inContext->flashContentInRam.micoSystemConfig.ssid, "RW", NULL); require_noerr(err, exit); /*PASSWORD cell*/ err = MICOAddStringCellToSector(sector, "Password", inContext->flashContentInRam.micoSystemConfig.user_key, "RW", NULL); require_noerr(err, exit); /*DHCP cell*/ err = MICOAddSwitchCellToSector(sector, "DHCP", inContext->flashContentInRam.micoSystemConfig.dhcpEnable, "RW"); require_noerr(err, exit); /*Local cell*/ err = MICOAddStringCellToSector(sector, "IP address", inContext->micoStatus.localIp, "RW", NULL); require_noerr(err, exit); /*Netmask cell*/ err = MICOAddStringCellToSector(sector, "Net Mask", inContext->micoStatus.netMask, "RW", NULL); require_noerr(err, exit); /*Gateway cell*/ err = MICOAddStringCellToSector(sector, "Gateway", inContext->micoStatus.gateWay, "RW", NULL); require_noerr(err, exit); /*DNS server cell*/ err = MICOAddStringCellToSector(sector, "DNS Server", inContext->micoStatus.dnsServer, "RW", NULL); require_noerr(err, exit); mico_rtos_unlock_mutex(&inContext->flashContentInRam_mutex); exit: if(err != kNoErr && mainObject){ json_object_put(mainObject); mainObject = NULL; } return mainObject; }
OSStatus MICOStartBonjourService( WiFi_Interface interface, mico_Context_t * const inContext ) { char *temp_txt= NULL; char *temp_txt2; OSStatus err; net_para_st para; bonjour_init_t init; temp_txt = malloc(500); require_action(temp_txt, exit, err = kNoMemoryErr); memset(&init, 0x0, sizeof(bonjour_init_t)); micoWlanGetIPStatus(¶, Station); init.service_name = BONJOUR_SERVICE; /* name#xxxxxx.local. */ snprintf( temp_txt, 100, "%s#%c%c%c%c%c%c.local.", inContext->flashContentInRam.micoSystemConfig.name, inContext->micoStatus.mac[9], inContext->micoStatus.mac[10], \ inContext->micoStatus.mac[12], inContext->micoStatus.mac[13], \ inContext->micoStatus.mac[15], inContext->micoStatus.mac[16] ); init.host_name = (char*)__strdup(temp_txt); /* name#xxxxxx. */ snprintf( temp_txt, 100, "%s#%c%c%c%c%c%c", inContext->flashContentInRam.micoSystemConfig.name, inContext->micoStatus.mac[9], inContext->micoStatus.mac[10], \ inContext->micoStatus.mac[12], inContext->micoStatus.mac[13], \ inContext->micoStatus.mac[15], inContext->micoStatus.mac[16] ); init.instance_name = (char*)__strdup(temp_txt); init.service_port = inContext->flashContentInRam.appConfig.localServerPort; init.interface = interface; temp_txt2 = __strdup_trans_dot(inContext->micoStatus.mac); sprintf(temp_txt, "MAC=%s.", temp_txt2); free(temp_txt2); temp_txt2 = __strdup_trans_dot(FIRMWARE_REVISION); sprintf(temp_txt, "%sFirmware Rev=%s.", temp_txt, temp_txt2); free(temp_txt2); temp_txt2 = __strdup_trans_dot(HARDWARE_REVISION); sprintf(temp_txt, "%sHardware Rev=%s.", temp_txt, temp_txt2); free(temp_txt2); temp_txt2 = __strdup_trans_dot(MicoGetVer()); sprintf(temp_txt, "%sMICO OS Rev=%s.", temp_txt, temp_txt2); free(temp_txt2); temp_txt2 = __strdup_trans_dot(MODEL); sprintf(temp_txt, "%sModel=%s.", temp_txt, temp_txt2); free(temp_txt2); temp_txt2 = __strdup_trans_dot(PROTOCOL); sprintf(temp_txt, "%sProtocol=%s.", temp_txt, temp_txt2); free(temp_txt2); temp_txt2 = __strdup_trans_dot(MANUFACTURER); sprintf(temp_txt, "%sManufacturer=%s.", temp_txt, temp_txt2); free(temp_txt2); sprintf(temp_txt, "%sSeed=%u.", temp_txt, inContext->flashContentInRam.micoSystemConfig.seed); init.txt_record = (char*)__strdup(temp_txt); bonjour_service_init(init); free(init.host_name); free(init.instance_name); free(init.txt_record); err = MICOAddNotification( mico_notify_WIFI_STATUS_CHANGED, (void *)BonjourNotify_WifiStatusHandler ); require_noerr( err, exit ); err = MICOAddNotification( mico_notify_SYS_WILL_POWER_OFF, (void *)BonjourNotify_SYSWillPoerOffHandler ); require_noerr( err, exit ); start_bonjour_service(); _bonjourStarted = true; exit: if(temp_txt) free(temp_txt); return err; }
int application_start(void) { OSStatus err = kNoErr; IPStatusTypedef para; struct tm currentTime; mico_rtc_time_t time; char wifi_ver[64]; mico_log_trace(); #if 1 /*Read current configurations*/ context = ( mico_Context_t *)malloc(sizeof(mico_Context_t) ); require_action( context, exit, err = kNoMemoryErr ); memset(context, 0x0, sizeof(mico_Context_t)); mico_rtos_init_mutex(&context->flashContentInRam_mutex); mico_rtos_init_semaphore(&context->micoStatus.sys_state_change_sem, 1); MICOReadConfiguration( context ); err = MICOInitNotificationCenter ( context ); err = MICOAddNotification( mico_notify_READ_APP_INFO, (void *)micoNotify_ReadAppInfoHandler ); require_noerr( err, exit ); err = MICOAddNotification( mico_notify_WIFI_CONNECT_FAILED, (void *)micoNotify_ConnectFailedHandler ); require_noerr( err, exit ); err = MICOAddNotification( mico_notify_WIFI_Fatal_ERROR, (void *)micoNotify_WlanFatalErrHandler ); require_noerr( err, exit ); err = MICOAddNotification( mico_notify_Stack_Overflow_ERROR, (void *)micoNotify_StackOverflowErrHandler ); require_noerr( err, exit ); #endif /*wlan driver and tcpip init*/ MicoInit(); MicoSysLed(true); /**********************add ethernet**********************/ add_ethernet(); //sleep(5000); /*********************************************************/ mico_log("Free memory %d bytes", MicoGetMemoryInfo()->free_memory) ; /* Enter test mode, call a build-in test function amd output on STDIO */ if(MicoShouldEnterMFGMode()==true) mico_mfg_test(); /*Read current time from RTC.*/ MicoRtcGetTime(&time); currentTime.tm_sec = time.sec; currentTime.tm_min = time.min; currentTime.tm_hour = time.hr; currentTime.tm_mday = time.date; currentTime.tm_wday = time.weekday; currentTime.tm_mon = time.month - 1; currentTime.tm_year = time.year + 100; mico_log("Current Time: %s",asctime(¤tTime)); micoWlanGetIPStatus(¶, Station); formatMACAddr(context->micoStatus.mac, (char *)¶.mac); MicoGetRfVer(wifi_ver, sizeof(wifi_ver)); mico_log("%s mxchipWNet library version: %s", APP_INFO, MicoGetVer()); mico_log("Wi-Fi driver version %s, mac %s", wifi_ver, context->micoStatus.mac); /*Start system monotor thread*/ err = MICOStartSystemMonitor(context); require_noerr_action( err, exit, mico_log("ERROR: Unable to start the system monitor.") ); err = MICORegisterSystemMonitor(&mico_monitor, APPLICATION_WATCHDOG_TIMEOUT_SECONDS*1000); require_noerr( err, exit ); mico_init_timer(&_watchdog_reload_timer,APPLICATION_WATCHDOG_TIMEOUT_SECONDS*1000 - 100, _watchdog_reload_timer_handler, NULL); mico_start_timer(&_watchdog_reload_timer); /* Regisist notifications */ err = MICOAddNotification( mico_notify_WIFI_STATUS_CHANGED, (void *)micoNotify_WifiStatusHandler ); require_noerr( err, exit ); /*************add ethernet********Why add twice?***********/ //add_ethernet(); if(context->flashContentInRam.micoSystemConfig.configured != allConfigured){ mico_log("Empty configuration. Starting configuration mode..."); #if (MICO_CONFIG_MODE == CONFIG_MODE_EASYLINK) || (MICO_CONFIG_MODE == CONFIG_MODE_EASYLINK_WITH_SOFTAP) err = startEasyLink( context ); require_noerr( err, exit ); #elif (MICO_CONFIG_MODE == CONFIG_MODE_SOFT_AP) err = startEasyLinkSoftAP( context ); require_noerr( err, exit ); #elif (MICO_CONFIG_MODE == CONFIG_MODE_AIRKISS) err = startAirkiss( context ); require_noerr( err, exit ); #elif (MICO_CONFIG_MODE == CONFIG_MODE_WPS) || MICO_CONFIG_MODE == defined (CONFIG_MODE_WPS_WITH_SOFTAP) err = startWPS( context ); require_noerr( err, exit ); #elif ( MICO_CONFIG_MODE == CONFIG_MODE_WAC) WACPlatformParameters_t* WAC_Params = NULL; WAC_Params = calloc(1, sizeof(WACPlatformParameters_t)); require(WAC_Params, exit); str2hex((unsigned char *)para.mac, WAC_Params->macAddress, 6); WAC_Params->isUnconfigured = 1; WAC_Params->supportsAirPlay = 0; WAC_Params->supportsAirPrint = 0; WAC_Params->supports2_4GHzWiFi = 1; WAC_Params->supports5GHzWiFi = 0; WAC_Params->supportsWakeOnWireless = 0; WAC_Params->firmwareRevision = FIRMWARE_REVISION; WAC_Params->hardwareRevision = HARDWARE_REVISION; WAC_Params->serialNumber = SERIAL_NUMBER; WAC_Params->name = context->flashContentInRam.micoSystemConfig.name; WAC_Params->model = MODEL; WAC_Params->manufacturer = MANUFACTURER; WAC_Params->numEAProtocols = 1; WAC_Params->eaBundleSeedID = BUNDLE_SEED_ID; WAC_Params->eaProtocols = (char **)eaProtocols; err = startMFiWAC( context, WAC_Params, 1200); free(WAC_Params); require_noerr( err, exit ); #else #error "Wi-Fi configuration mode is not defined"? #endif } else{ mico_log("Available configuration. Starting Wi-Fi connection..."); err = MICOAddNotification( mico_notify_WiFI_PARA_CHANGED, (void *)micoNotify_WiFIParaChangedHandler ); require_noerr( err, exit ); err = MICOAddNotification( mico_notify_DHCP_COMPLETED, (void *)micoNotify_DHCPCompleteHandler ); require_noerr( err, exit ); if(context->flashContentInRam.micoSystemConfig.rfPowerSaveEnable == true){ micoWlanEnablePowerSave(); } if(context->flashContentInRam.micoSystemConfig.mcuPowerSaveEnable == true){ MicoMcuPowerSaveConfig(true); } /*Local configuration server*/ if(context->flashContentInRam.micoSystemConfig.configServerEnable == true){ err = MICOStartConfigServer(context); require_noerr_action( err, exit, mico_log("ERROR: Unable to start the local server thread.") ); } err = MICOStartNTPClient(context); require_noerr_action( err, exit, mico_log("ERROR: Unable to start the NTP client thread.") ); /*Start mico application*/ err = MICOStartApplication( context ); require_noerr( err, exit ); _ConnectToAP( context ); } mico_log("Free memory %d bytes", MicoGetMemoryInfo()->free_memory) ; /*System status changed*/ while(mico_rtos_get_semaphore(&context->micoStatus.sys_state_change_sem, MICO_WAIT_FOREVER)==kNoErr){ switch(context->micoStatus.sys_state){ case eState_Normal: break; case eState_Software_Reset: sendNotifySYSWillPowerOff(); mico_thread_msleep(500); MicoSystemReboot(); break; case eState_Wlan_Powerdown: sendNotifySYSWillPowerOff(); mico_thread_msleep(500); micoWlanPowerOff(); break; case eState_Standby: mico_log("Enter standby mode"); sendNotifySYSWillPowerOff(); mico_thread_msleep(200); micoWlanPowerOff(); MicoSystemStandBy(MICO_WAIT_FOREVER); break; default: break; } } require_noerr_action( err, exit, mico_log("Closing main thread with err num: %d.", err) ); exit: mico_rtos_delete_thread(NULL); return kNoErr; }
int application_start(void) { OSStatus err = kNoErr; IPStatusTypedef para; struct tm currentTime; mico_rtc_time_t time; char wifi_ver[64] = {0}; mico_log_trace(); /*Read current configurations*/ context = ( mico_Context_t *)malloc(sizeof(mico_Context_t) ); require_action( context, exit, err = kNoMemoryErr ); memset(context, 0x0, sizeof(mico_Context_t)); mico_rtos_init_mutex(&context->flashContentInRam_mutex);//ram互斥初始化 mico_rtos_init_semaphore(&context->micoStatus.sys_state_change_sem, 1);//系统状态信号量 mico_rtos_create_thread( NULL, MICO_APPLICATION_PRIORITY, "sys", _sys_state_thread, 800, NULL ); MICOReadConfiguration( context );//读flash数据 err = MICOInitNotificationCenter ( context ); err = MICOAddNotification( mico_notify_READ_APP_INFO, (void *)micoNotify_ReadAppInfoHandler ); require_noerr( err, exit ); err = MICOAddNotification( mico_notify_WIFI_CONNECT_FAILED, (void *)micoNotify_ConnectFailedHandler ); require_noerr( err, exit ); err = MICOAddNotification( mico_notify_WIFI_Fatal_ERROR, (void *)micoNotify_WlanFatalErrHandler ); require_noerr( err, exit ); err = MICOAddNotification( mico_notify_Stack_Overflow_ERROR, (void *)micoNotify_StackOverflowErrHandler ); require_noerr( err, exit ); /*wlan driver and tcpip init*/ mico_log( "MiCO starting..." ); MicoInit(); #ifdef MICO_CLI_ENABLE MicoCliInit(); #endif MicoSysLed(true); mico_log("Free memory %d bytes", MicoGetMemoryInfo()->free_memory); micoWlanGetIPStatus(¶, Station); formatMACAddr(context->micoStatus.mac, (char *)para.mac); MicoGetRfVer(wifi_ver, sizeof(wifi_ver)); mico_log("ip = %s,mac=%s",para.ip,para.mac); mico_log("%s mxchipWNet library version: %s", APP_INFO, MicoGetVer()); mico_log("Wi-Fi driver version %s, mac %s", wifi_ver, context->micoStatus.mac); /*Start system monotor thread*/ //err = MICOStartSystemMonitor(context); require_noerr_action( err, exit, mico_log("ERROR: Unable to start the system monitor.") ); err = MICORegisterSystemMonitor(&mico_monitor, APPLICATION_WATCHDOG_TIMEOUT_SECONDS*1000); require_noerr( err, exit ); mico_init_timer(&_watchdog_reload_timer,APPLICATION_WATCHDOG_TIMEOUT_SECONDS*1000/2, _watchdog_reload_timer_handler, NULL); mico_start_timer(&_watchdog_reload_timer); /* Enter test mode, call a build-in test function amd output on MFG UART */ if(MicoShouldEnterMFGMode()==true){ mico_log( "Enter MFG mode by MFG button" ); mico_mfg_test(context); } /*Read current time from RTC.*/ if( MicoRtcGetTime(&time) == kNoErr ){ currentTime.tm_sec = time.sec; currentTime.tm_min = time.min; currentTime.tm_hour = time.hr; currentTime.tm_mday = time.date; currentTime.tm_wday = time.weekday; currentTime.tm_mon = time.month - 1; currentTime.tm_year = time.year + 100; mico_log("Current Time: %s",asctime(¤tTime)); }else mico_log("RTC function unsupported"); /* Regisist notifications */ err = MICOAddNotification( mico_notify_WIFI_STATUS_CHANGED, (void *)micoNotify_WifiStatusHandler ); require_noerr( err, exit ); if( context->flashContentInRam.micoSystemConfig.configured == wLanUnConfigured || context->flashContentInRam.micoSystemConfig.configured == unConfigured){ mico_log("Empty configuration. Starting configuration mode..."); //HERE TO config network #if (MICO_CONFIG_MODE == CONFIG_MODE_EASYLINK) || (MICO_CONFIG_MODE == CONFIG_MODE_EASYLINK_WITH_SOFTAP) err = startEasyLink( context ); require_noerr( err, exit ); #elif (MICO_CONFIG_MODE == CONFIG_MODE_SOFT_AP) err = startEasyLinkSoftAP( context ); require_noerr( err, exit ); #elif (MICO_CONFIG_MODE == CONFIG_MODE_AIRKISS) err = startAirkiss( context ); require_noerr( err, exit ); #elif (MICO_CONFIG_MODE == CONFIG_MODE_WPS) || MICO_CONFIG_MODE == defined (CONFIG_MODE_WPS_WITH_SOFTAP) err = startWPS( context ); require_noerr( err, exit ); #elif ( MICO_CONFIG_MODE == CONFIG_MODE_WAC) WACPlatformParameters_t* WAC_Params = NULL; WAC_Params = calloc(1, sizeof(WACPlatformParameters_t)); require(WAC_Params, exit); str2hex((unsigned char *)para.mac, WAC_Params->macAddress, 6); WAC_Params->isUnconfigured = 1; WAC_Params->supportsAirPlay = 0; WAC_Params->supportsAirPrint = 0; WAC_Params->supports2_4GHzWiFi = 1; WAC_Params->supports5GHzWiFi = 0; WAC_Params->supportsWakeOnWireless = 0; WAC_Params->firmwareRevision = FIRMWARE_REVISION; WAC_Params->hardwareRevision = HARDWARE_REVISION; WAC_Params->serialNumber = SERIAL_NUMBER; WAC_Params->name = context->flashContentInRam.micoSystemConfig.name; WAC_Params->model = MODEL; WAC_Params->manufacturer = MANUFACTURER; WAC_Params->numEAProtocols = 1; WAC_Params->eaBundleSeedID = BUNDLE_SEED_ID; WAC_Params->eaProtocols = (char **)eaProtocols; err = startMFiWAC( context, WAC_Params, MICO_I2C_CP, 1200 ); free(WAC_Params); require_noerr( err, exit ); #else #error "Wi-Fi configuration mode is not defined" #endif } else{ mico_log("Available configuration. Starting Wi-Fi connection..."); _ConnectToAP( context ); } #ifdef MFG_MODE_AUTO if( context->flashContentInRam.micoSystemConfig.configured == mfgConfigured ){ mico_log( "Enter MFG mode automatically" ); mico_mfg_test(context); mico_thread_sleep(MICO_NEVER_TIMEOUT); } #endif err = MICOAddNotification( mico_notify_WiFI_PARA_CHANGED, (void *)micoNotify_WiFIParaChangedHandler ); require_noerr( err, exit ); err = MICOAddNotification( mico_notify_DHCP_COMPLETED, (void *)micoNotify_DHCPCompleteHandler ); require_noerr( err, exit ); if(context->flashContentInRam.micoSystemConfig.rfPowerSaveEnable == true){ micoWlanEnablePowerSave(); } if(context->flashContentInRam.micoSystemConfig.mcuPowerSaveEnable == true){ MicoMcuPowerSaveConfig(true); } /*Local configuration server*/ if(context->flashContentInRam.micoSystemConfig.configServerEnable == true){ err = MICOStartConfigServer(context); require_noerr_action( err, exit, mico_log("ERROR: Unable to start the local server thread.") ); } err = MICOStartNTPClient(context); require_noerr_action( err, exit, mico_log("ERROR: Unable to start the NTP client thread.") ); /*Start mico application*/ err = MICOStartApplication( context ); require_noerr( err, exit ); mico_log("Free memory %d bytes", MicoGetMemoryInfo()->free_memory) ; require_noerr_action( err, exit, mico_log("Closing main thread with err num: %d.", err) ); exit: mico_rtos_delete_thread(NULL); return kNoErr; }
static OSStatus _initBonjourForEasyLink( WiFi_Interface interface, mico_Context_t * const inContext ) { char *temp_txt= NULL; char *temp_txt2; OSStatus err; net_para_st para; bonjour_init_t init; temp_txt = malloc(500); require_action(temp_txt, exit, err = kNoMemoryErr); memset(&init, 0x0, sizeof(bonjour_init_t)); micoWlanGetIPStatus(¶, Station); init.service_name = "_easylink_config._tcp.local."; /* name#xxxxxx.local. */ snprintf( temp_txt, 100, "%s#%c%c%c%c%c%c.local.", inContext->flashContentInRam.micoSystemConfig.name, inContext->micoStatus.mac[9], inContext->micoStatus.mac[10], \ inContext->micoStatus.mac[12], inContext->micoStatus.mac[13], \ inContext->micoStatus.mac[15], inContext->micoStatus.mac[16] ); init.host_name = (char*)__strdup(temp_txt); /* name#xxxxxx. */ snprintf( temp_txt, 100, "%s#%c%c%c%c%c%c", inContext->flashContentInRam.micoSystemConfig.name, inContext->micoStatus.mac[9], inContext->micoStatus.mac[10], \ inContext->micoStatus.mac[12], inContext->micoStatus.mac[13], \ inContext->micoStatus.mac[15], inContext->micoStatus.mac[16] ); init.instance_name = (char*)__strdup(temp_txt); init.service_port = FTC_PORT; init.interface = interface; temp_txt2 = __strdup_trans_dot(inContext->micoStatus.mac); sprintf(temp_txt, "MAC=%s.", temp_txt2); free(temp_txt2); temp_txt2 = __strdup_trans_dot(FIRMWARE_REVISION); sprintf(temp_txt, "%sFirmware Rev=%s.", temp_txt, temp_txt2); free(temp_txt2); temp_txt2 = __strdup_trans_dot(HARDWARE_REVISION); sprintf(temp_txt, "%sHardware Rev=%s.", temp_txt, temp_txt2); free(temp_txt2); temp_txt2 = __strdup_trans_dot(MicoGetVer()); sprintf(temp_txt, "%sMICO OS Rev=%s.", temp_txt, temp_txt2); free(temp_txt2); temp_txt2 = __strdup_trans_dot(MODEL); sprintf(temp_txt, "%sModel=%s.", temp_txt, temp_txt2); free(temp_txt2); temp_txt2 = __strdup_trans_dot(PROTOCOL); sprintf(temp_txt, "%sProtocol=%s.", temp_txt, temp_txt2); free(temp_txt2); temp_txt2 = __strdup_trans_dot(MANUFACTURER); sprintf(temp_txt, "%sManufacturer=%s.", temp_txt, temp_txt2); free(temp_txt2); if(interface == Soft_AP) sprintf(temp_txt, "%swlan unconfigured=T.", temp_txt); else sprintf(temp_txt, "%swlan unconfigured=F.", temp_txt); sprintf(temp_txt, "%sSeed=%u.", temp_txt, inContext->flashContentInRam.micoSystemConfig.seed); init.txt_record = (char*)__strdup(temp_txt); bonjour_service_init(init); free(init.host_name); free(init.instance_name); free(init.txt_record); err = MICOAddNotification( mico_notify_SYS_WILL_POWER_OFF, (void *)_EasyLinkNotify_SYSWillPoerOffHandler ); require_noerr( err, exit ); exit: if(temp_txt) free(temp_txt); return err; }
json_object* ConfigCreateReportJsonMessage( mico_Context_t * const inContext ) { OSStatus err = kNoErr; config_delegate_log_trace(); char name[50], *tempString; OTA_Versions_t versions; char rfVersion[50]; char *rfVer = NULL, *rfVerTemp = NULL; json_object *sectors, *sector, *subMenuSectors, *subMenuSector, *mainObject = NULL; MicoGetRfVer( rfVersion, 50 ); rfVer = strstr(rfVersion, "version "); if(rfVer) rfVer = rfVer + strlen("version "); rfVerTemp = rfVer; for(rfVerTemp = rfVer; *rfVerTemp != ' '; rfVerTemp++); *rfVerTemp = 0x0; config_delegate_log("RF version=%s", rfVersion); if(inContext->flashContentInRam.micoSystemConfig.configured == wLanUnConfigured){ /*You can upload a specific menu*/ } mico_rtos_lock_mutex(&inContext->flashContentInRam_mutex); snprintf(name, 50, "%s(%c%c%c%c%c%c)",MODEL, inContext->micoStatus.mac[9], inContext->micoStatus.mac[10], inContext->micoStatus.mac[12], inContext->micoStatus.mac[13], inContext->micoStatus.mac[15], inContext->micoStatus.mac[16]); versions.fwVersion = FIRMWARE_REVISION; versions.hdVersion = HARDWARE_REVISION; versions.protocol = PROTOCOL; versions.rfVersion = NULL; sectors = json_object_new_array(); require( sectors, exit ); err = MICOAddTopMenu(&mainObject, name, sectors, versions); require_noerr(err, exit); /*Sector 1*/ sector = json_object_new_array(); require( sector, exit ); err = MICOAddSector(sectors, "MICO SYSTEM", sector); require_noerr(err, exit); /*name cell*/ err = MICOAddStringCellToSector(sector, "Device Name", inContext->flashContentInRam.micoSystemConfig.name, "RW", NULL); require_noerr(err, exit); //Bonjour switcher cell err = MICOAddSwitchCellToSector(sector, "Bonjour", inContext->flashContentInRam.micoSystemConfig.bonjourEnable, "RW"); require_noerr(err, exit); //RF power save switcher cell err = MICOAddSwitchCellToSector(sector, "RF power save", inContext->flashContentInRam.micoSystemConfig.rfPowerSaveEnable, "RW"); require_noerr(err, exit); //MCU power save switcher cell err = MICOAddSwitchCellToSector(sector, "MCU power save", inContext->flashContentInRam.micoSystemConfig.mcuPowerSaveEnable, "RW"); require_noerr(err, exit); /*sub menu*/ subMenuSectors = json_object_new_array(); require( subMenuSectors, exit ); err = MICOAddMenuCellToSector(sector, "Detail", subMenuSectors); require_noerr(err, exit); subMenuSector = json_object_new_array(); require( subMenuSector, exit ); err = MICOAddSector(subMenuSectors, "", subMenuSector); require_noerr(err, exit); err = MICOAddStringCellToSector(subMenuSector, "Firmware Rev.", FIRMWARE_REVISION, "RO", NULL); require_noerr(err, exit); err = MICOAddStringCellToSector(subMenuSector, "Hardware Rev.", HARDWARE_REVISION, "RO", NULL); require_noerr(err, exit); err = MICOAddStringCellToSector(subMenuSector, "MICO OS Rev.", MicoGetVer(), "RO", NULL); require_noerr(err, exit); err = MICOAddStringCellToSector(subMenuSector, "RF Driver Rev.", rfVer, "RO", NULL); require_noerr(err, exit); err = MICOAddStringCellToSector(subMenuSector, "Model", MODEL, "RO", NULL); require_noerr(err, exit); err = MICOAddStringCellToSector(subMenuSector, "Manufacturer", MANUFACTURER, "RO", NULL); require_noerr(err, exit); err = MICOAddStringCellToSector(subMenuSector, "Protocol", PROTOCOL, "RO", NULL); require_noerr(err, exit); subMenuSector = json_object_new_array(); err = MICOAddSector(subMenuSectors, "WLAN", subMenuSector); require_noerr(err, exit); tempString = DataToHexStringWithColons( (uint8_t *)inContext->flashContentInRam.micoSystemConfig.bssid, 6 ); err = MICOAddStringCellToSector(subMenuSector, "BSSID", tempString, "RO", NULL); require_noerr(err, exit); free(tempString); err = MICOAddNumberCellToSector(subMenuSector, "Channel", inContext->flashContentInRam.micoSystemConfig.channel, "RO", NULL); require_noerr(err, exit); switch(inContext->flashContentInRam.micoSystemConfig.security){ case SECURITY_TYPE_NONE: err = MICOAddStringCellToSector(subMenuSector, "Security", "Open system", "RO", NULL); break; case SECURITY_TYPE_WEP: err = MICOAddStringCellToSector(subMenuSector, "Security", "WEP", "RO", NULL); break; case SECURITY_TYPE_WPA_TKIP: err = MICOAddStringCellToSector(subMenuSector, "Security", "WPA TKIP", "RO", NULL); break; case SECURITY_TYPE_WPA_AES: err = MICOAddStringCellToSector(subMenuSector, "Security", "WPA AES", "RO", NULL); break; case SECURITY_TYPE_WPA2_TKIP: err = MICOAddStringCellToSector(subMenuSector, "Security", "WPA2 TKIP", "RO", NULL); break; case SECURITY_TYPE_WPA2_AES: err = MICOAddStringCellToSector(subMenuSector, "Security", "WPA2 AES", "RO", NULL); break; case SECURITY_TYPE_WPA2_MIXED: err = MICOAddStringCellToSector(subMenuSector, "Security", "WPA2 MIXED", "RO", NULL); break; default: err = MICOAddStringCellToSector(subMenuSector, "Security", "Auto", "RO", NULL); break; } require_noerr(err, exit); if(inContext->flashContentInRam.micoSystemConfig.keyLength == maxKeyLen){ /*This is a PMK key, generated by user key in WPA security type*/ tempString = calloc(maxKeyLen+1, 1); require_action(tempString, exit, err=kNoMemoryErr); memcpy(tempString, inContext->flashContentInRam.micoSystemConfig.key, maxKeyLen); err = MICOAddStringCellToSector(subMenuSector, "PMK", tempString, "RO", NULL); require_noerr(err, exit); free(tempString); } else{ err = MICOAddStringCellToSector(subMenuSector, "KEY", inContext->flashContentInRam.micoSystemConfig.user_key, "RO", NULL); require_noerr(err, exit); } /*Sector 3*/ sector = json_object_new_array(); require( sector, exit ); err = MICOAddSector(sectors, "WLAN", sector); require_noerr(err, exit); /*SSID cell*/ err = MICOAddStringCellToSector(sector, "Wi-Fi", inContext->flashContentInRam.micoSystemConfig.ssid, "RW", NULL); require_noerr(err, exit); /*PASSWORD cell*/ err = MICOAddStringCellToSector(sector, "Password", inContext->flashContentInRam.micoSystemConfig.user_key, "RW", NULL); require_noerr(err, exit); /*DHCP cell*/ err = MICOAddSwitchCellToSector(sector, "DHCP", inContext->flashContentInRam.micoSystemConfig.dhcpEnable, "RW"); require_noerr(err, exit); /*Local cell*/ err = MICOAddStringCellToSector(sector, "IP address", inContext->micoStatus.localIp, "RW", NULL); require_noerr(err, exit); /*Netmask cell*/ err = MICOAddStringCellToSector(sector, "Net Mask", inContext->micoStatus.netMask, "RW", NULL); require_noerr(err, exit); /*Gateway cell*/ err = MICOAddStringCellToSector(sector, "Gateway", inContext->micoStatus.gateWay, "RW", NULL); require_noerr(err, exit); /*DNS server cell*/ err = MICOAddStringCellToSector(sector, "DNS Server", inContext->micoStatus.dnsServer, "RW", NULL); require_noerr(err, exit); /*Sector 4*/ /*Sector 5*/ sector = json_object_new_array(); require( sector, exit ); err = MICOAddSector(sectors, "MCU IOs", sector); require_noerr(err, exit); /*UART Baurdrate cell*/ json_object *selectArray; selectArray = json_object_new_array(); require( selectArray, exit ); json_object_array_add(selectArray, json_object_new_int(9600)); json_object_array_add(selectArray, json_object_new_int(19200)); json_object_array_add(selectArray, json_object_new_int(38400)); json_object_array_add(selectArray, json_object_new_int(57600)); json_object_array_add(selectArray, json_object_new_int(115200)); //err = MICOAddNumberCellToSector(sector, "Baurdrate", 115200, "RW", selectArray); err = MICOAddNumberCellToSector(sector, "Baurdrate", inContext->flashContentInRam.appConfig.virtualDevConfig.USART_BaudRate, "RW", selectArray); require_noerr(err, exit); /*Sector 6: cloud settings*/ sector = json_object_new_array(); require( sector, exit ); err = MICOAddSector(sectors, "Cloud info", sector); require_noerr(err, exit); // device activate status err = MICOAddSwitchCellToSector(sector, "activated", inContext->flashContentInRam.appConfig.virtualDevConfig.isActivated, "RO"); require_noerr(err, exit); // cloud connect status err = MICOAddSwitchCellToSector(sector, "connected", inContext->appStatus.virtualDevStatus.isCloudConnected, "RO"); require_noerr(err, exit); // rom version cell err = MICOAddStringCellToSector(sector, "rom version", inContext->flashContentInRam.appConfig.virtualDevConfig.romVersion, "RO", NULL); require_noerr(err, exit); // device_id cell, is RO in fact, we set RW is convenient for read full string. err = MICOAddStringCellToSector(sector, "device_id", inContext->flashContentInRam.appConfig.virtualDevConfig.deviceId, "RW", NULL); /*sub menu - cloud setting */ /* subMenuSectors = json_object_new_array(); require( subMenuSectors, exit ); err = MICOAddMenuCellToSector(sector, "Cloud settings", subMenuSectors); require_noerr(err, exit); subMenuSector = json_object_new_array(); require( subMenuSector, exit ); err = MICOAddSector(subMenuSectors, "Authentication", subMenuSector); require_noerr(err, exit); err = MICOAddStringCellToSector(subMenuSector, "login_id", inContext->flashContentInRam.appConfig.virtualDevConfig.loginId, "RW", NULL); err = MICOAddStringCellToSector(subMenuSector, "devPasswd", inContext->flashContentInRam.appConfig.virtualDevConfig.devPasswd, "RW", NULL); */ mico_rtos_unlock_mutex(&inContext->flashContentInRam_mutex); exit: if(err != kNoErr && mainObject){ json_object_put(mainObject); mainObject = NULL; } return mainObject; }
OSStatus MiCOStartSiteWhereService(app_context_t* const inContext) { sitewhere_log_trace(); OSStatus err = kUnknownErr; char *bonjour_txt_record = NULL; char *bonjour_txt_field = NULL; // update wifi status err = mico_system_notify_register( mico_notify_WIFI_STATUS_CHANGED, (void *)swNotify_WifiStatusHandler, inContext); require_noerr_action(err, exit, sitewhere_log("ERROR: mico_system_notify_register (mico_notify_WIFI_STATUS_CHANGED) failed!") ); // create uinque hardeareID like: MODEL-HARDWARE_REVISION-MAC memset(hardwareId, '\0', sizeof(hardwareId)); sprintf(hardwareId, "Enjoy_%s-%s-%c%c%c%c%c%c",MODEL, HARDWARE_REVISION, mico_system_context_get()->micoStatus.mac[9], mico_system_context_get()->micoStatus.mac[10], mico_system_context_get()->micoStatus.mac[12], mico_system_context_get()->micoStatus.mac[13], mico_system_context_get()->micoStatus.mac[15], mico_system_context_get()->micoStatus.mac[16] ); sitewhere_log("hardwareId=[%s]", hardwareId); // create system topic like: SiteWhere/commands/<hardwareid> memset(System1, '\0', sizeof(System1)); sprintf(System1, "%s/%s", "SiteWhere/system", hardwareId); sitewhere_log("System1=[%s]", System1); // create command topic like: SiteWhere/<system/hardwareid> memset(Command1, '\0', sizeof(Command1)); sprintf(Command1, "%s/%s", "SiteWhere/commands", hardwareId); sitewhere_log("Command1=[%s]", Command1); // specificationToken sitewhere_log("specificationToken=[%s]", specificationToken); //------------------------------------------------------------------------ // update hardwareid in mdns text record sitewhere_log("update bonjour txt record."); bonjour_txt_record = malloc(550); require_action(bonjour_txt_record, exit, err = kNoMemoryErr); bonjour_txt_field = __strdup_trans_dot(inContext->mico_context->micoStatus.mac); sprintf(bonjour_txt_record, "MAC=%s.", bonjour_txt_field); free(bonjour_txt_field); bonjour_txt_field = __strdup_trans_dot(hardwareId); sprintf(bonjour_txt_record, "%sHardware ID=%s.", bonjour_txt_record, bonjour_txt_field); free(bonjour_txt_field); bonjour_txt_field = __strdup_trans_dot(FIRMWARE_REVISION); sprintf(bonjour_txt_record, "%sFirmware Rev=%s.", bonjour_txt_record, bonjour_txt_field); free(bonjour_txt_field); bonjour_txt_field = __strdup_trans_dot(HARDWARE_REVISION); sprintf(bonjour_txt_record, "%sHardware Rev=%s.", bonjour_txt_record, bonjour_txt_field); free(bonjour_txt_field); bonjour_txt_field = __strdup_trans_dot(MicoGetVer()); sprintf(bonjour_txt_record, "%sMICO OS Rev=%s.", bonjour_txt_record, bonjour_txt_field); free(bonjour_txt_field); bonjour_txt_field = __strdup_trans_dot(MODEL); sprintf(bonjour_txt_record, "%sModel=%s.", bonjour_txt_record, bonjour_txt_field); free(bonjour_txt_field); bonjour_txt_field = __strdup_trans_dot(PROTOCOL); sprintf(bonjour_txt_record, "%sProtocol=%s.", bonjour_txt_record, bonjour_txt_field); free(bonjour_txt_field); bonjour_txt_field = __strdup_trans_dot(MANUFACTURER); sprintf(bonjour_txt_record, "%sManufacturer=%s.", bonjour_txt_record, bonjour_txt_field); free(bonjour_txt_field); sprintf(bonjour_txt_record, "%sSeed=%u.", bonjour_txt_record, inContext->mico_context->flashContentInRam.micoSystemConfig.seed); mdns_update_txt_record(BONJOUR_SERVICE, Station, bonjour_txt_record); if(NULL != bonjour_txt_record) free(bonjour_txt_record); //------------------------------------------------------------------------ err = mico_rtos_create_thread(NULL, MICO_APPLICATION_PRIORITY, "sitewhere", sitewhere_main_thread, STACK_SIZE_SITEWHERE_MAIN_THREAD, inContext ); require_noerr_action( err, exit, sitewhere_log("ERROR: Unable to start sitewhere thread.") ); //err = mico_rtos_create_thread(NULL, MICO_APPLICATION_PRIORITY, "MQTT Client", // mqtt_loop_thread, 0xC00, (void*)inContext->mico_context ); //require_noerr_action( err, exit, sitewhere_log("ERROR: Unable to start the MQTT client thread.") ); exit: return err; }
OSStatus _LocalConfigRespondInComingMessage(int fd, ECS_HTTPHeader_t* inHeader, mico_Context_t * const inContext) { OSStatus err = kUnknownErr; const char * json_str; uint8_t *httpResponse = NULL; size_t httpResponseLen = 0; json_object* report = NULL; char err_msg[32] = {0}; char *bonjour_txt_record = NULL; char *bonjour_txt_field = NULL; MVDActivateRequestData_t devActivateRequestData; MVDAuthorizeRequestData_t devAuthorizeRequestData; MVDResetRequestData_t devResetRequestData; MVDOTARequestData_t devOTARequestData; MVDGetStateRequestData_t devGetStateRequestData; fogcloud_config_log_trace(); if(ECS_HTTPHeaderMatchURL( inHeader, kCONFIGURLDevState ) == kNoErr){ if(inHeader->contentLength > 0){ fogcloud_config_log("Recv device getState request."); memset((void*)&devGetStateRequestData, '\0', sizeof(devGetStateRequestData)); err = getMVDGetStateRequestData(inHeader->extraDataPtr, &devGetStateRequestData); require_noerr( err, exit ); report = json_object_new_object(); err = MicoFogCloudGetState(inContext, devGetStateRequestData, report); require_noerr( err, exit ); fogcloud_config_log("get device state success!"); json_str = (char*)json_object_to_json_string(report); //config_log("json_str=%s", json_str); err = ECS_CreateSimpleHTTPMessage( ECS_kMIMEType_JSON, (uint8_t*)json_str, strlen(json_str), &httpResponse, &httpResponseLen ); require( httpResponse, exit ); err = SocketSend( fd, httpResponse, httpResponseLen ); SocketClose(&fd); } goto exit; } else if(ECS_HTTPHeaderMatchURL( inHeader, kCONFIGURLDevActivate ) == kNoErr){ if(inHeader->contentLength > 0){ fogcloud_config_log("Recv device activate request."); memset((void*)&devActivateRequestData, '\0', sizeof(devActivateRequestData)); err = getMVDActivateRequestData(inHeader->extraDataPtr, &devActivateRequestData); require_noerr( err, exit ); err = MicoFogCloudActivate(inContext, devActivateRequestData); require_noerr( err, exit ); fogcloud_config_log("Device activate success!"); //------------------------------------------------------------------------ fog_config_server_running = false; // stop fog config server fogcloud_config_log("update bonjour txt record."); // update owner binding flag in txt record of bonjour suspend_bonjour_service(true); mico_rtos_lock_mutex(&inContext->flashContentInRam_mutex); inContext->flashContentInRam.appConfig.fogcloudConfig.owner_binding = true; err = MICOUpdateConfiguration(inContext); mico_rtos_unlock_mutex(&inContext->flashContentInRam_mutex); bonjour_txt_record = malloc(550); require_action(bonjour_txt_record, exit, err = kNoMemoryErr); bonjour_txt_field = __strdup_trans_dot(inContext->micoStatus.mac); sprintf(bonjour_txt_record, "MAC=%s.", bonjour_txt_field); free(bonjour_txt_field); bonjour_txt_field = __strdup_trans_dot((inContext->flashContentInRam.appConfig.fogcloudConfig.owner_binding) ? "true" : "false"); sprintf(bonjour_txt_record, "%sBinding=%s.", bonjour_txt_record, bonjour_txt_field); free(bonjour_txt_field); bonjour_txt_field = __strdup_trans_dot(FIRMWARE_REVISION); sprintf(bonjour_txt_record, "%sFirmware Rev=%s.", bonjour_txt_record, bonjour_txt_field); free(bonjour_txt_field); bonjour_txt_field = __strdup_trans_dot(HARDWARE_REVISION); sprintf(bonjour_txt_record, "%sHardware Rev=%s.", bonjour_txt_record, bonjour_txt_field); free(bonjour_txt_field); bonjour_txt_field = __strdup_trans_dot(MicoGetVer()); sprintf(bonjour_txt_record, "%sMICO OS Rev=%s.", bonjour_txt_record, bonjour_txt_field); free(bonjour_txt_field); bonjour_txt_field = __strdup_trans_dot(MODEL); sprintf(bonjour_txt_record, "%sModel=%s.", bonjour_txt_record, bonjour_txt_field); free(bonjour_txt_field); bonjour_txt_field = __strdup_trans_dot(PROTOCOL); sprintf(bonjour_txt_record, "%sProtocol=%s.", bonjour_txt_record, bonjour_txt_field); free(bonjour_txt_field); bonjour_txt_field = __strdup_trans_dot(MANUFACTURER); sprintf(bonjour_txt_record, "%sManufacturer=%s.", bonjour_txt_record, bonjour_txt_field); free(bonjour_txt_field); sprintf(bonjour_txt_record, "%sSeed=%u.", bonjour_txt_record, inContext->flashContentInRam.micoSystemConfig.seed); bonjour_update_txt_record(bonjour_txt_record); if(NULL != bonjour_txt_record) free(bonjour_txt_record); suspend_bonjour_service(false); //------------------------------------------------------------------------ report = json_object_new_object(); require_action(report, exit, err = kNoMemoryErr); json_object_object_add(report, "device_id", json_object_new_string(inContext->flashContentInRam.appConfig.fogcloudConfig.deviceId)); json_str = (char*)json_object_to_json_string(report); //config_log("json_str=%s", json_str); err = ECS_CreateSimpleHTTPMessage( ECS_kMIMEType_JSON, (uint8_t*)json_str, strlen(json_str), &httpResponse, &httpResponseLen ); require_noerr( err, exit ); require( httpResponse, exit ); err = SocketSend( fd, httpResponse, httpResponseLen ); SocketClose(&fd); } goto exit; } else if(ECS_HTTPHeaderMatchURL( inHeader, kCONFIGURLDevAuthorize ) == kNoErr){ if(inHeader->contentLength > 0){ fogcloud_config_log("Recv device authorize request."); memset((void*)&devAuthorizeRequestData, '\0', sizeof(devAuthorizeRequestData)); err = getMVDAuthorizeRequestData( inHeader->extraDataPtr, &devAuthorizeRequestData); require_noerr( err, exit ); err = MicoFogCloudAuthorize(inContext, devAuthorizeRequestData); require_noerr( err, exit ); fogcloud_config_log("Device authorize success!"); report = json_object_new_object(); require_action(report, exit, err = kNoMemoryErr); json_object_object_add(report, "device_id", json_object_new_string(inContext->flashContentInRam.appConfig.fogcloudConfig.deviceId)); json_str = (char*)json_object_to_json_string(report); //config_log("json_str=%s", json_str); err = ECS_CreateSimpleHTTPMessage( ECS_kMIMEType_JSON, (uint8_t*)json_str, strlen(json_str), &httpResponse, &httpResponseLen ); require( httpResponse, exit ); err = SocketSend( fd, httpResponse, httpResponseLen ); SocketClose(&fd); } goto exit; } else if(ECS_HTTPHeaderMatchURL( inHeader, kCONFIGURLResetCloudDevInfo ) == kNoErr){ if(inHeader->contentLength > 0){ fogcloud_config_log("Recv cloud device info reset request."); memset((void*)&devResetRequestData, '\0', sizeof(devResetRequestData)); err = getMVDResetRequestData( inHeader->extraDataPtr, &devResetRequestData); require_noerr( err, exit ); err = MicoFogCloudResetCloudDevInfo(inContext, devResetRequestData); require_noerr( err, exit ); fogcloud_config_log("Device cloud reset success!"); err = ECS_CreateSimpleHTTPOKMessage( &httpResponse, &httpResponseLen ); require_noerr( err, exit ); require( httpResponse, exit ); err = SocketSend( fd, httpResponse, httpResponseLen ); SocketClose(&fd); inContext->micoStatus.sys_state = eState_Software_Reset; require(inContext->micoStatus.sys_state_change_sem, exit); mico_rtos_set_semaphore(&inContext->micoStatus.sys_state_change_sem); } goto exit; } else if(ECS_HTTPHeaderMatchURL( inHeader, kCONFIGURLDevFWUpdate ) == kNoErr){ if(inHeader->contentLength > 0){ fogcloud_config_log("Recv device fw_update request."); memset((void*)&devOTARequestData, '\0', sizeof(devOTARequestData)); err = getMVDOTARequestData( inHeader->extraDataPtr, &devOTARequestData); require_noerr( err, exit ); err = MicoFogCloudFirmwareUpdate(inContext, devOTARequestData); require_noerr( err, exit ); fogcloud_config_log("Device firmware update success!"); err = ECS_CreateSimpleHTTPOKMessage( &httpResponse, &httpResponseLen ); require_noerr( err, exit ); require( httpResponse, exit ); err = SocketSend( fd, httpResponse, httpResponseLen ); SocketClose(&fd); fogcloud_config_log("OTA bin_size=%lld, bin_version=%s", inContext->appStatus.fogcloudStatus.RecvRomFileSize, inContext->flashContentInRam.appConfig.fogcloudConfig.romVersion ); if(0 == inContext->appStatus.fogcloudStatus.RecvRomFileSize){ //no need to update, return size = 0, no need to boot bootloader err = kNoErr; goto exit; } mico_rtos_lock_mutex(&inContext->flashContentInRam_mutex); memset(&inContext->flashContentInRam.bootTable, 0, sizeof(boot_table_t)); inContext->flashContentInRam.bootTable.length = inContext->appStatus.fogcloudStatus.RecvRomFileSize; inContext->flashContentInRam.bootTable.start_address = UPDATE_START_ADDRESS; inContext->flashContentInRam.bootTable.type = 'A'; inContext->flashContentInRam.bootTable.upgrade_type = 'U'; MICOUpdateConfiguration(inContext); mico_rtos_unlock_mutex(&inContext->flashContentInRam_mutex); inContext->micoStatus.sys_state = eState_Software_Reset; require(inContext->micoStatus.sys_state_change_sem, exit); mico_rtos_set_semaphore(&inContext->micoStatus.sys_state_change_sem); } goto exit; } else{ return kNotFoundErr; }; exit: if((kNoErr != err) && (fd > 0)){ //ECS_CreateSimpleHTTPFailedMessage( &httpResponse, &httpResponseLen ); sprintf(err_msg, "{\"error\": %d}", err); ECS_CreateHTTPFailedMessage("500", "FAILED", ECS_kMIMEType_JSON, strlen(err_msg), (uint8_t*)err_msg, strlen(err_msg), &httpResponse, &httpResponseLen ); require( httpResponse, exit ); SocketSend( fd, httpResponse, httpResponseLen ); SocketClose(&fd); } if(httpResponse) free(httpResponse); if(report) json_object_put(report); return err; }