/****************************************************************************** * Copyright 2013-2014 Espressif Systems (Wuxi) * * FileName: user_devicefind.c * * Description: Find your hardware's information while working any mode. * * Modification history: * 2014/3/12, v1.0 create this file. *******************************************************************************/ #include "ets_sys.h" #include "os_type.h" #include "osapi.h" #include "mem.h" #include "user_interface.h" #include "espconn.h" #include "user_json.h" #include "user_devicefind.h" const char *device_find_request = "Are You Espressif IOT Smart Device?"; #if PLUG_DEVICE const char *device_find_response_ok = "I'm Plug."; #elif LIGHT_DEVICE const char *device_find_response_ok = "I'm Light."; #elif SENSOR_DEVICE #if HUMITURE_SUB_DEVICE const char *device_find_response_ok = "I'm Humiture."; #elif FLAMMABLE_GAS_SUB_DEVICE const char *device_find_response_ok = "I'm Flammable Gas."; #endif #endif /*---------------------------------------------------------------------------*/ LOCAL struct espconn ptrespconn; /****************************************************************************** * FunctionName : user_devicefind_recv * Description : Processing the received data from the host * Parameters : arg -- Additional argument to pass to the callback function * pusrdata -- The received data (or NULL when the connection has been closed!) * length -- The length of received data * Returns : none *******************************************************************************/ LOCAL void ICACHE_FLASH_ATTR user_devicefind_recv(void *arg, char *pusrdata, unsigned short length) { char DeviceBuffer[40] = {0}; char Device_mac_buffer[60] = {0}; char hwaddr[6]; remot_info *premot = NULL; struct ip_info ipconfig; if (wifi_get_opmode() != STATION_MODE) { wifi_get_ip_info(SOFTAP_IF, &ipconfig); wifi_get_macaddr(SOFTAP_IF, hwaddr); if (!ip_addr_netcmp((struct ip_addr *)ptrespconn.proto.udp->remote_ip, &ipconfig.ip, &ipconfig.netmask)) { wifi_get_ip_info(STATION_IF, &ipconfig); wifi_get_macaddr(STATION_IF, hwaddr); } } else { wifi_get_ip_info(STATION_IF, &ipconfig); wifi_get_macaddr(STATION_IF, hwaddr); } if (pusrdata == NULL) { return; } if (length == os_strlen(device_find_request) && os_strncmp(pusrdata, device_find_request, os_strlen(device_find_request)) == 0) { os_sprintf(DeviceBuffer, "%s" MACSTR " " IPSTR, device_find_response_ok, MAC2STR(hwaddr), IP2STR(&ipconfig.ip)); os_printf("%s\n", DeviceBuffer); length = os_strlen(DeviceBuffer); if (espconn_get_connection_info(&ptrespconn, &premot, 0) != ESPCONN_OK) return; os_memcpy(ptrespconn.proto.udp->remote_ip, premot->remote_ip, 4); ptrespconn.proto.udp->remote_port = premot->remote_port; espconn_sent(&ptrespconn, DeviceBuffer, length); } else if (length == (os_strlen(device_find_request) + 18)) { os_sprintf(Device_mac_buffer, "%s " MACSTR , device_find_request, MAC2STR(hwaddr)); os_printf("%s", Device_mac_buffer); if (os_strncmp(Device_mac_buffer, pusrdata, os_strlen(device_find_request) + 18) == 0) { //os_printf("%s\n", Device_mac_buffer); length = os_strlen(DeviceBuffer); os_sprintf(DeviceBuffer, "%s" MACSTR " " IPSTR, device_find_response_ok, MAC2STR(hwaddr), IP2STR(&ipconfig.ip)); os_printf("%s\n", DeviceBuffer); length = os_strlen(DeviceBuffer); if (espconn_get_connection_info(&ptrespconn, &premot, 0) != ESPCONN_OK) return; os_memcpy(ptrespconn.proto.udp->remote_ip, premot->remote_ip, 4); ptrespconn.proto.udp->remote_port = premot->remote_port; espconn_sent(&ptrespconn, DeviceBuffer, length); } else { return; } } } /****************************************************************************** * FunctionName : user_devicefind_init * Description : the espconn struct parame init * Parameters : none * Returns : none *******************************************************************************/ void ICACHE_FLASH_ATTR user_devicefind_init(void) { ptrespconn.type = ESPCONN_UDP; ptrespconn.proto.udp = (esp_udp *)os_zalloc(sizeof(esp_udp)); ptrespconn.proto.udp->local_port = 1025; espconn_regist_recvcb(&ptrespconn, user_devicefind_recv); espconn_create(&ptrespconn); }