boboP 发表于 2016-7-13 14:30:23

ESP8266学习笔记5:ESP8266接入yeelink(转)

版权**:本文为博主原创文章,未经博主允许不得转载。

目录(?)[+]

搞定了SmartConfig,前头也用cURL玩过了yeelink,今天就编写代码,让ESP8266接入yeelink。
转载请注明:http://blog.csdn.net/sadshen/article/details/46897479

一、代码处理。
主要是将http的sample加入到SmartConfig_DEMO中。ESP8266的运行流程是SmartConfig->DNS->Connect yeelink->Get /devices
这里的pheadbuffer 格式要注意加上U-ApiKey。我是通过wireshark捕捉了curl Get /devices的动作才知道要怎么写的。
http://img.blog.csdn.net/20150715192824206?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center




view plain copy



[*]#include "ets_sys.h"
[*]#include "osapi.h"
[*]
[*]#include "user_interface.h"
[*]#include "smartconfig.h"
[*]
[*]#include "espconn.h"
[*]#include "mem.h"
[*]
[*]
[*]#define NET_DOMAIN "api.yeelink.net"
[*]#define pheadbuffer "GET /v1.0/devices HTTP/1.1\r\nHost: %s\r\nAccept: */*\r\nU-ApiKey: e510ad132988d34c6fc9c3a9322f6f10\r\n\r\n"
[*]
[*]#define packet_size   (2 * 1024)
[*]
[*]LOCAL os_timer_t test_timer;
[*]LOCAL struct espconn user_tcp_conn;
[*]LOCAL struct _esp_tcp user_tcp;
[*]ip_addr_t tcp_server_ip;
[*]
[*]/****************************************************
[*] * FunctionName : user_tcp_recv_cb
[*] * Description: receive callback.
[*] * Parameters   : arg -- Additional argument to pass to the callback function
[*] * Returns      : none
[*]*****************************************************/
[*]LOCAL void ICACHE_FLASH_ATTR
[*]user_tcp_recv_cb(void *arg, char *pusrdata, unsigned short length)
[*]{
[*]   //received some data from tcp connection
[*]   
[*]    os_printf("tcp recv !!! %s \r\n", pusrdata);
[*]}
[*]
[*]/****************************************************
[*] * FunctionName : user_tcp_sent_cb
[*] * Description: data sent callback.
[*] * Parameters   : arg -- Additional argument to pass to the callback function
[*] * Returns      : none
[*]*****************************************************/
[*]LOCAL void ICACHE_FLASH_ATTR
[*]user_tcp_sent_cb(void *arg)
[*]{
[*]   //data sent successfully
[*]
[*]    os_printf("tcp sent succeed !!! \r\n");
[*]}
[*]/****************************************************
[*] * FunctionName : user_tcp_discon_cb
[*] * Description: disconnect callback.
[*] * Parameters   : arg -- Additional argument to pass to the callback function
[*] * Returns      : none
[*]*****************************************************/
[*]LOCAL void ICACHE_FLASH_ATTR
[*]user_tcp_discon_cb(void *arg)
[*]{
[*]   //tcp disconnect successfully
[*]   
[*]    os_printf("tcp disconnect succeed !!! \r\n");
[*]}
[*]/****************************************************
[*] * FunctionName : user_esp_platform_sent
[*] * Description: Processing the application data and sending it to the host
[*] * Parameters   : pespconn -- the espconn used to connetion with the host
[*] * Returns      : none
[*]*****************************************************/
[*]LOCAL void ICACHE_FLASH_ATTR
[*]user_sent_data(struct espconn *pespconn)
[*]{
[*]    char *pbuf = (char *)os_zalloc(packet_size);
[*]
[*]    os_sprintf(pbuf, pheadbuffer, NET_DOMAIN);
[*]
[*]    espconn_sent(pespconn, pbuf, os_strlen(pbuf));
[*]   
[*]    os_free(pbuf);
[*]
[*]}
[*]
[*]/****************************************************
[*] * FunctionName : user_tcp_connect_cb
[*] * Description: A new incoming tcp connection has been connected.
[*] * Parameters   : arg -- Additional argument to pass to the callback function
[*] * Returns      : none
[*]*****************************************************/
[*]LOCAL void ICACHE_FLASH_ATTR
[*]user_tcp_connect_cb(void *arg)
[*]{
[*]    struct espconn *pespconn = arg;
[*]
[*]    os_printf("connect succeed !!! \r\n");
[*]
[*]    espconn_regist_recvcb(pespconn, user_tcp_recv_cb);
[*]    espconn_regist_sentcb(pespconn, user_tcp_sent_cb);
[*]    espconn_regist_disconcb(pespconn, user_tcp_discon_cb);
[*]   
[*]    user_sent_data(pespconn);
[*]}
[*]
[*]/****************************************************
[*] * FunctionName : user_tcp_recon_cb
[*] * Description: reconnect callback, error occured in TCP connection.
[*] * Parameters   : arg -- Additional argument to pass to the callback function
[*] * Returns      : none
[*]*****************************************************/
[*]LOCAL void ICACHE_FLASH_ATTR
[*]user_tcp_recon_cb(void *arg, sint8 err)
[*]{
[*]   //error occured , tcp connection broke. user can try to reconnect here.   
[*]   
[*]    os_printf("reconnect callback, error code %d !!! \r\n",err);
[*]}
[*]
[*]/****************************************************
[*] * FunctionName : user_dns_found
[*] * Description: dns found callback
[*] * Parameters   : name -- pointer to the name that was looked up.
[*] *                ipaddr -- pointer to an ip_addr_t containing the IP address of
[*] *                the hostname, or NULL if the name could not be found (or on any
[*] *                other error).
[*] *                callback_arg -- a user-specified callback argument passed to
[*] *                dns_gethostbyname
[*] * Returns      : none
[*]*****************************************************/
[*]LOCAL void ICACHE_FLASH_ATTR
[*]user_dns_found(const char *name, ip_addr_t *ipaddr, void *arg)
[*]{
[*]    struct espconn *pespconn = (struct espconn *)arg;
[*]
[*]    if (ipaddr == NULL) {
[*]      os_printf("user_dns_found NULL \r\n");
[*]      return;
[*]    }
[*]
[*]    //dns got ip
[*]    os_printf("user_dns_found %d.%d.%d.%d \r\n",
[*]            *((uint8 *)&ipaddr->addr), *((uint8 *)&ipaddr->addr + 1),
[*]            *((uint8 *)&ipaddr->addr + 2), *((uint8 *)&ipaddr->addr + 3));
[*]
[*]    if (tcp_server_ip.addr == 0 && ipaddr->addr != 0) {
[*]      // dns succeed, create tcp connection
[*]      os_timer_disarm(&test_timer);
[*]      tcp_server_ip.addr = ipaddr->addr;
[*]      os_memcpy(pespconn->proto.tcp->remote_ip, &ipaddr->addr, 4); // remote ip of tcp server which get by dns
[*]      pespconn->proto.tcp->remote_port = 80; // remote port of tcp server
[*]      pespconn->proto.tcp->local_port = espconn_port(); //local port of ESP8266
[*]
[*]      espconn_regist_connectcb(pespconn, user_tcp_connect_cb); // register connect callback
[*]      espconn_regist_reconcb(pespconn, user_tcp_recon_cb); // register reconnect callback as error handler
[*]
[*]      espconn_connect(pespconn); // tcp connect
[*]    }
[*]}
[*]
[*]/****************************************************
[*] * FunctionName : user_esp_platform_dns_check_cb
[*] * Description: 1s time callback to check dns found
[*] * Parameters   : arg -- Additional argument to pass to the callback function
[*] * Returns      : none
[*]*****************************************************/
[*]LOCAL void ICACHE_FLASH_ATTR
[*]user_dns_check_cb(void *arg)
[*]{
[*]    struct espconn *pespconn = arg;
[*]
[*]    espconn_gethostbyname(pespconn, NET_DOMAIN, &tcp_server_ip, user_dns_found); // recall DNS function
[*]
[*]    os_printf("dns_check\n");
[*]    os_timer_arm(&test_timer, 1000, 0);
[*]}
[*]
[*]/****************************************************
[*] * FunctionName : CheckIpStart
[*] * Description: set the router info which ESP8266 station will connect to
[*] * Parameters   : none
[*] * Returns      : none
[*]*****************************************************/
[*]void ICACHE_FLASH_ATTR
[*]CheckIpStart(void)
[*]{
[*]    // Connect to tcp server as NET_DOMAIN
[*]    user_tcp_conn.proto.tcp = &user_tcp;
[*]    user_tcp_conn.type = ESPCONN_TCP;
[*]    user_tcp_conn.state = ESPCONN_NONE;
[*]    tcp_server_ip.addr = 0;
[*]    espconn_gethostbyname(&user_tcp_conn, NET_DOMAIN, &tcp_server_ip, user_dns_found); // DNS function
[*]
[*]    os_timer_disarm(&test_timer);
[*]    os_timer_setfn(&test_timer, (os_timer_func_t *)user_dns_check_cb, user_tcp_conn);
[*]    os_timer_arm(&test_timer, 1000, 0);
[*]}
[*]
[*]void ICACHE_FLASH_ATTR
[*]smartconfig_done(sc_status status, void *pdata)
[*]{
[*]    switch(status) {
[*]      case SC_STATUS_WAIT:
[*]            os_printf("SC_STATUS_WAIT\n");
[*]            break;
[*]      case SC_STATUS_FIND_CHANNEL:
[*]            os_printf("SC_STATUS_FIND_CHANNEL\n");
[*]            break;
[*]      case SC_STATUS_GETTING_SSID_PSWD:
[*]            os_printf("SC_STATUS_GETTING_SSID_PSWD\n");
[*]            sc_type *type = pdata;
[*]            if (*type == SC_TYPE_ESPTOUCH) {
[*]                os_printf("SC_TYPE:SC_TYPE_ESPTOUCH\n");
[*]            } else {
[*]                os_printf("SC_TYPE:SC_TYPE_AIRKISS\n");
[*]            }
[*]            break;
[*]      case SC_STATUS_LINK:
[*]            os_printf("SC_STATUS_LINK\n");
[*]            struct station_config *sta_conf = pdata;
[*]      
[*]            wifi_station_set_config(sta_conf);
[*]            wifi_station_disconnect();
[*]            wifi_station_connect();
[*]            break;
[*]      case SC_STATUS_LINK_OVER:
[*]            os_printf("SC_STATUS_LINK_OVER\n");
[*]            if (pdata != NULL) {
[*]                uint8 phone_ip = {0};
[*]
[*]                os_memcpy(phone_ip, (uint8*)pdata, 4);
[*]                os_printf("Phone ip: %d.%d.%d.%d\n",phone_ip,phone_ip,phone_ip,phone_ip);
[*]                CheckIpStart();
[*]            }
[*]            smartconfig_stop();
[*]            break;
[*]    }
[*]      
[*]}
[*]
[*]void user_rf_pre_init(void)
[*]{
[*]}
[*]
[*]void user_init(void)
[*]{
[*]    os_printf("SDK version:%s\n", system_get_sdk_version());
[*]      
[*]    wifi_set_opmode(STATION_MODE);
[*]    smartconfig_start(smartconfig_done);
[*]}



二、测试http://img.blog.csdn.net/20150715192958742?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center


页: [1]
查看完整版本: ESP8266学习笔记5:ESP8266接入yeelink(转)