基于ESP8266_NONOS_SDK-2.2.0

本程序实现,给域名,得到域名的IP,这就叫DNS域名解析。

/********* 全局变量 ********/
//ap dhcp
struct espconn ST_NetCon;
esp_tcp ST_TCP;
ip_addr_t IP_SEVER;
/********* 宏定义 ********/
#define ESP8266_STA_SSID "wifiname"
#define ESP8266_STA_PASS "123456"
#define DNS_SERVER "blog.openpilot.cc" //域名

void ICACHE_FLASH_ATTR delay_ms(u32 ms)
{
  for(;0<ms;ms--)
  {
	  os_delay_us(1000);
  }
}

void ICACHE_FLASH_ATTR ESP8266_WIFI_Send_cb(void * arg)
{
	os_printf("esp8266 send OK!\r\n");
}
void ICACHE_FLASH_ATTR ESP8266_WIFI_Rev_cb(void * arg,char * pdata,unsigned short len)
{
	struct espconn *T_arg=arg;
	remot_info *P_port_info=NULL;
	if(pdata[0]=='k'||pdata[0]=='K')gpio16_output_set(0);//开
	else if(pdata[0]=='g'||pdata[0]=='G')gpio16_output_set(1);//关
	os_printf("esp8266 rev data =%s\r\n",pdata);
	os_printf("remot rev cb ip =%d.%d.%d.%d\r\n",T_arg->proto.udp->remote_ip[0],T_arg->proto.udp->remote_ip[1],T_arg->proto.udp->remote_ip[2],T_arg->proto.udp->remote_ip[3]);
	//tcp是面向连接的,直接T_arg信息
	espconn_send(T_arg,"ESP8266 wifi rev TCP OK",os_strlen("ESP8266 wifi rev TCP OK"));//向对方发送应答
}
void ICACHE_FLASH_ATTR ESP8266_TCP_Dissconnect_cb(void *arg)
{
	os_printf("----ESP_TCP_Dissconnect CB!----\r\n");
}
void ICACHE_FLASH_ATTR ESP_TCP_Connect_cb(void *arg)
{
	espconn_regist_sentcb((struct espconn *)arg,ESP8266_WIFI_Send_cb);
	espconn_regist_recvcb((struct espconn *)arg,ESP8266_WIFI_Rev_cb);
	espconn_regist_disconcb((struct espconn *)arg,ESP8266_TCP_Dissconnect_cb);
	os_printf("----ESP_TCP_CONNECT OK!----\r\n");
}
void ICACHE_FLASH_ATTR ESP_TCP_Break_cb(void *arg,sint8 err)
{
	os_printf("----ESP_TCP_BREAK!----\r\n");
}

void ICACHE_FLASH_ATTR DNS_OK_cb(const char *name,ip_addr_t *ipaddr,void *arg)
{
	struct espconn *T_arg=(struct espconn *)arg;//缓存网络结构体指针
	if(ipaddr==NULL)
	{
		os_printf("\r\n----Domain jiexi fail---\r\n");
		return;
	}
	else if(ipaddr!=NULL && ipaddr!=0)
	{
		os_printf("\r\n----Domain jiexi Succe!---\r\n");
		IP_SEVER.addr=ipaddr->addr;//得到ip地址
		os_memcpy(T_arg->proto.tcp->remote_ip,&IP_SEVER.addr,4);//设置服务器IP地址
		os_printf("Server IP =%d.%d.%d.%d\r\n",*((u8*)&IP_SEVER.addr),*((u8*)&IP_SEVER.addr+1),*((u8*)&IP_SEVER.addr+2),*((u8*)&IP_SEVER.addr+3));

		espconn_connect(&ST_NetCon);//连接TCP服务端
	}
}


void ICACHE_FLASH_ATTR ESP8266_NetCon_init(void)
{
	ST_NetCon.type=ESPCONN_TCP;//通信协议TCP
	ST_NetCon.proto.tcp=&ST_TCP;
	//esp8266作为客户端,要知道服务端ip地址
	ST_NetCon.proto.tcp->local_port=espconn_port();//设置本地端口,获取可用端口
	ST_NetCon.proto.tcp->remote_port=80;//设置远程端口,服务端【http端口号80】
	//因为要用域名访问,所以我们这个时候只知道域名,还不知道目标网站的ip地址

	espconn_gethostbyname(&ST_NetCon,DNS_SERVER,&IP_SEVER,DNS_OK_cb);

	espconn_regist_connectcb(&ST_NetCon,ESP_TCP_Connect_cb);//tcp连接成功建立后回调函数
	espconn_regist_reconcb(&ST_NetCon,ESP_TCP_Break_cb);//tcp连接异常断开的回调函数
}

void ICACHE_FLASH_ATTR ESP8266_STA_init(void)
{
	struct station_config STA_config;//STA参数结构体
	struct ip_info ST_ESP8266_IP;//STA信息结构体

	wifi_set_opmode(0x01);//设置STA模式,并保存到FLASH

	os_memset(&STA_config,0,sizeof(struct station_config));//STA参数结构体清零
	os_strcpy(STA_config.ssid,ESP8266_STA_SSID);//设置wifi名
	os_strcpy(STA_config.password,ESP8266_STA_PASS);//设置wifi密码
	wifi_station_set_config(&STA_config);//设置STA参数,并保存到flash
}


void ICACHE_FLASH_ATTR OS_Timer_1_cb(void)//软件定时器的回调函数
{
    u8 C_LED_flash=0;//led闪烁计数
	u8 S_WIFI_STA_connect; //wifi接入状态标志
	struct ip_info ST_ESP8266_ip;//esp8266 ip 信息
	u8 esp8266_ip[4];//esp8266 ip地址
	S_WIFI_STA_connect=wifi_station_get_connect_status();//查询STA接入wifi状态
	switch(S_WIFI_STA_connect)
	{
		case 0: os_printf("\nSTA IDLE\n");break;
		case 1: os_printf("\nSTA connecting...\n");break;
		case 2: os_printf("\nSTA password error...\n");break;
		case 3: os_printf("\nSTA no AP found...\n");break;
		case 4: os_printf("\nSTA connect fail...\n");break;
		case 5: os_printf("\nSTA geted IP,suss!\n");break;
	}
	if(S_WIFI_STA_connect==STATION_GOT_IP)//判断是否获取IP
	{
		wifi_get_ip_info(STATION_IF,&ST_ESP8266_ip);//获取STATION_IF下的ip地址
		if(ST_ESP8266_ip.ip.addr!=0)
		{
			esp8266_ip[0]=ST_ESP8266_ip.ip.addr;
			esp8266_ip[1]=ST_ESP8266_ip.ip.addr>>8;
			esp8266_ip[2]=ST_ESP8266_ip.ip.addr>>16;
			esp8266_ip[3]=ST_ESP8266_ip.ip.addr>>24;
			os_printf("ESP8266 ip=%d.%d.%d.%d\r\n",esp8266_ip[0],esp8266_ip[1],esp8266_ip[2],esp8266_ip[3]);
		}
		for(;C_LED_flash<=5;C_LED_flash++)//接入WIFI,LED快闪3次
		{
			gpio16_output_set(C_LED_flash%2);
			delay_ms(100);
		}
		os_timer_disarm(&OS_Timer_1);//关闭软件定时器
		ESP8266_NetCon_init();//初始化网路UDP通信
	}
}
void ICACHE_FLASH_ATTR OS_Timer_1_Init(u32 timemsm,bool time_repetitive)//软件定时器初始化
{
	os_timer_disarm(&OS_Timer_1);//关闭软件定时器
	os_timer_setfn(&OS_Timer_1,(os_timer_func_t *)OS_Timer_1_cb,NULL);//设置定时器,设置回调函数
	os_timer_arm(&OS_Timer_1,timemsm, time_repetitive);//使能定时器
}



//主函数
ESP8266_STA_init();
OS_Timer_1_Init(1000,1);