ESP8266使用NONOS_SDK获取心知天气数据(HTTP)

一、所需器件工具

        1.ESP8266开发板。模块购买链接

        

二、配置为Station模式

        为了读者容易读懂,该文章里面附的所以代码我都写在了user_main.c里面。

        首先需要在user_init(void)函数里面加入下面的代码来配置ESP

8266为客户端模式,然后自动去连接路由器。

/********************************************************************************************************************
 *
 * 连配置为客户端station模式,自动去连接 WiFi 路由器	( 注意! 注意! 注意! : 不要使用别的定时器,以免在连接WiFi时被打断,从而造成一直连接不上 WiFi )
 *
************************************************************************************************************/
	user_set_station_config();//设置 Wi-Fi Station 接口的配置
    os_timer_disarm (&os_timer_station);//取消定时器器定时
    os_timer_setfn(&os_timer_station, (ETSTimerFunc *)(time_station), NULL);//设置定时器器回调函数。使用定时器器,必须设置回调函数。
    os_timer_arm (&os_timer_station, 200, true);//使能毫秒级定时器器

上面对应的定时器回调函数,如下所示:

/****************************************************************************
 * 功能: Wi-Fi Station(客户端)		定时器
 * 注意:在user_init中调用,则 ESP8266 Station 接口会在系统初始化完成后,自动连接 AP(WiFi路由器)
**************************************************************************/
static os_timer_t os_timer_station;
//软件定时器回调函数
void time_station(void){
	struct ip_info info;
	static uint16 station_x = 0;
	os_printf("time_station: %d !!!!!!!!!!!!!!!!!\r\n",station_x++);
	if(wifi_station_get_connect_status() == STATION_GOT_IP) {//查询 ESP8266 Wi-Fi Station 接口连接 AP 的状态	(连接成功则关闭定时器)
		os_timer_disarm (&os_timer_station);

		wifi_get_ip_info(STATION_IF, &info);//查询 Wi-Fi Station 接口的 IP 地址
		uint8 ESP8266_IP[4];
		ESP8266_IP[0] = info.ip.addr;		//	最高8位
		ESP8266_IP[1] = info.ip.addr>>8;	//	次高8位
		ESP8266_IP[2] = info.ip.addr>>16;	//	次低8位
		ESP8266_IP[3] = info.ip.addr>>24;	//	低8位
		os_printf("station_IP: %d . %d . %d . %d \r\n",ESP8266_IP[0],ESP8266_IP[1],ESP8266_IP[2],ESP8266_IP[3]);


		dns_test();//获取服务器的IP

		espconn_user.type = ESPCONN_TCP;
		espconn_user.proto.tcp = (esp_tcp *)os_zalloc(sizeof(esp_tcp));// 开辟内存
		// 此处需要设置目标IP/端口(ESP8266作为Client,需要预先知道Server的IP/端口)
		espconn_user.proto.tcp->local_port = espconn_port() ;	// 设置本地端口
		espconn_user.proto.tcp->remote_port = 80;	// 设置目标端口

		//uint8 remote_ip[4] = {104,108,185,124};		// 目标ip地址
		os_memcpy(espconn_user.proto.tcp->local_ip,ESP8266_IP,4);	// 拷贝内存


		// 注册连接成功回调函数、异常断开回调函数
		espconn_regist_connectcb(&espconn_user, ESP8266_TCP_Connect_Cb_JX);	// 注册TCP连接成功建立的回调函数
		espconn_regist_reconcb(&espconn_user, ESP8266_TCP_Break_Cb_JX);		// 注册TCP连接异常断开的回调函数
		// 连接 TCP server
		espconn_connect(&espconn_user);	// 连接TCP-server

	}
	system_soft_wdt_feed();//这里我们喂下看门狗  ,不让看门狗复位
}

三、获取服务器的IP地址

在连接远端服务器时,需要获取IP才能进行连接,而我们平常只能知道服务器的域名,乐鑫SDK_API参考手册的espconn_gethostbyname()函数则是通过域名获取对应服务器的IP地址;

上面回调函数里面的dns_test()函数则是调用该函数获取服务器IP,代码如下所示:

// 获取到对应域名 IP 地址的回调函数
struct espconn espconn_user;
struct ip_addr_t *esp_server_ip;
LOCAL void ICACHE_FLASH_ATTR
user_esp_platform_dns_found(const char *name, ip_addr_t *ipaddr, void *arg) {
	struct espconn *pespconn = (struct espconn *)arg;
	if (ipaddr != NULL){
		os_printf("user_esp_platform_dns_found %d.%d.%d.%d \r\n",
			*((uint8 *)&ipaddr->addr), *((uint8 *)&ipaddr->addr + 1),
			*((uint8 *)&ipaddr->addr + 2), *((uint8 *)&ipaddr->addr + 3));

		espconn_user.proto.tcp->remote_ip[0] = *((uint8 *)&ipaddr->addr);	// 设置目标IP地址
		espconn_user.proto.tcp->remote_ip[1] = *((uint8 *)&ipaddr->addr + 1);
		espconn_user.proto.tcp->remote_ip[2] = *((uint8 *)&ipaddr->addr + 2);
		espconn_user.proto.tcp->remote_ip[3] = *((uint8 *)&ipaddr->addr + 3);
	}
}
// 获取到对应域名 IP 地址
void dns_test(void) {
	os_printf("999999%d \r\n");
	espconn_gethostbyname(&espconn_user,"api.seniverse.com", &esp_server_ip,
			user_esp_platform_dns_found);
}

四、服务器连接异常回调函数

在上上面的定时器回调函数里面,注册了TCP连接异常断开的回调函数espconn_regist_reconcb(&espconn_user, ESP8266_TCP_Break_Cb_JX); 函数,对应的回调代码函数代码,如下所示:

// TCP连接异常断开时的回调函数【ESP8266作为TCP_Client,连接TCP_Server失败,也会进入此函数】
void ICACHE_FLASH_ATTR
ESP8266_TCP_Break_Cb_JX(void *arg,sint8 err){
	struct espconn * T_arg = arg;		// 缓存网络连接结构体指针
	os_printf("\nESP8266_TCP_Break\n");

	espconn_connect(&espconn_user);	// 重新连接TCP-server
}

五、服务器连接成功回调函数

在上上上面的定时器回调函数里面,注册了TCP连接成功建立的回调函数espconn_regist_connectcb(&espconn_user, ESP8266_TCP_Connect_Cb_JX);  函数,对应的回调代码函数代码,如下所示:


// TCP连接建立成功的回调函数
void ICACHE_FLASH_ATTR
ESP8266_TCP_Connect_Cb_JX(void *arg){

	#define data "GET /v3/weather/daily.json?key=rrpd2zmqkpwlsckt&location=guangzhou&language=en&unit=c&start=0&days=3 HTTP/1.1\r\nContent-Type: text/html;charset=utf-8\r\nAccept: */*\r\nHost: api.seniverse.com\r\nConnection: Keep-Alive\r\n\r\n"
	os_printf("###################### len: %d \r\n",os_strlen(data));
	os_printf(data);

	// 也可以不打招呼,因为TCP本身就是握手建立连接。只要TCP连接建立,TCP_Server就已经知道TCP_Client的信息
	espconn_send((struct espconn *)arg,data,os_strlen(data));	// 打招呼

	espconn_regist_sentcb((struct espconn *)arg, ESP8266_WIFI_Send_Cb_JX);			// 注册网络数据发送成功的回调函数
	espconn_regist_recvcb((struct espconn *)arg, ESP8266_WIFI_Recv_Cb_JX);			// 注册网络数据接收成功的回调函数
	espconn_regist_disconcb((struct espconn *)arg,ESP8266_TCP_Disconnect_Cb_JX);	// 注册成功断开TCP连接的回调函数

	os_printf("\n--------------- ESP8266_TCP_Connect_OK ---------------\n");

}

六、请问数据发送成功回调函数

在“ 服务器连接成功回调函数 ”中,注册了数据发送成功回调函数,对应的回调函数,如下所示:


// 网络数据发送成功的回调函数
void ICACHE_FLASH_ATTR
ESP8266_WIFI_Send_Cb_JX(void *arg){
	struct espconn * T_arg = arg;		// 缓存网络连接结构体指针
	os_printf("\nESP8266_Send_OK \r\n");
}

七、接收服务器数据成功回调函数

在“ 服务器连接成功回调函数 ”中,注册了接收服务器数据成功回调函数,对应的回调函数,如下所示:

// 成功接收网络数据的回调函数【参数1:网络传输结构体espconn指针、参数2:网络传输数据指针、参数3:数据长度】
void ICACHE_FLASH_ATTR
ESP8266_WIFI_Recv_Cb_JX(void * arg, char * pdata, unsigned short len){
	struct espconn * T_arg = arg;		// 缓存网络连接结构体指针
	os_printf("ESP8266_Receive_Data_len = %d \r\n",len);		// 串口打印接收到的数据长度
	os_printf("ESP8266_Receive_Data = %s \r\n",pdata);		// 串口打印接收到的数据

}

八、断开服务器成功回调函数

在“ 服务器连接成功回调函数 ”中,注册了断开服务器成功回调函数,对应的回调函数,如下所示:

// TCP连接断开成功的回调函数
void ICACHE_FLASH_ATTR
ESP8266_TCP_Disconnect_Cb_JX(void *arg){
	struct espconn * T_arg = arg;		// 缓存网络连接结构体指针
	os_printf("\nESP8266_TCP_Disconnect_OK \r\n");


	// 连接 TCP server
	espconn_connect(&espconn_user);	// 连接TCP-server
}

九、总代码

直接替换SDK的user_main.c文件,清除缓存,重新进行编译下载即可。代码下载地址:https://download.csdn.net/download/qq_26043945/85312127

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
使用 ESP8266 和 Non-OS SDK 获取心知天气数据,你需要遵循以下步骤: 1. 首先,确保你已经正确地配置了 ESP8266 开发环境,并且已经安装了 Non-OS SDK。 2. 在你的代码中,你需要使用 ESP8266 的 Wi-Fi 功能连接到心知天气的服务器。你可以使用 `wifi_station_set_config()` 函数来设置 Wi-Fi 的 SSID 和密码。 3. 一旦连接到了 Wi-Fi,你便可以使用 HTTP 请求获取心知天气数据。你可以使用 `espconn` 库中的函数来实现 HTTP 请求。你需要设置目标服务器的 IP 地址、端口号以及请求的路径。 4. 在发送 HTTP 请求之前,你需要先创建一个 HTTP 请求的数据结构。你可以使用 `espconn` 库中的函数来创建这个数据结构。 5. 接下来,你可以使用 `espconn` 库中的函数发送 HTTP 请求,以获取心知天气数据。你需要指定请求的方法(GET、POST 等),以及请求的头部信息和内容。 6. 在发送请求后,你需要设置一个回调函数来处理接收到的数据。在这个回调函数中,你可以解析接收到的数据,并提取你所需要的天气信息。 7. 最后,你可以将解析出的天气信息进行你所希望的处理,比如显示在终端上,或者保存到某个文件中。 总的来说,使用 ESP8266 和 Non-OS SDK 获取心知天气数据需要连接到 Wi-Fi,发送 HTTP 请求并解析返回的数据。这样你就能够获取并处理心知天气的实时数据了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qq_755682240

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值