text: /******************************************************************************
   * 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);
  }
  