• Esp8266 网络结构体


    Esp8266建立网络连接相关结构体如下:

    结构体头文件espconn.h

    /** Protocol family and type of the espconn */
    enum espconn_type {
        ESPCONN_INVALID    = 0,
        /* ESPCONN_TCP Group */
        ESPCONN_TCP        = 0x10,
        /* ESPCONN_UDP Group */
        ESPCONN_UDP        = 0x20,
    };
    
    /** Current state of the espconn. Non-TCP espconn are always in state ESPCONN_NONE! */
    enum espconn_state {
        ESPCONN_NONE,
        ESPCONN_WAIT,
        ESPCONN_LISTEN,
        ESPCONN_CONNECT,
        ESPCONN_WRITE,
        ESPCONN_READ,
        ESPCONN_CLOSE
    };
    typedef struct _esp_tcp {
        int remote_port;
        int local_port;
        uint8 local_ip[4];
        uint8 remote_ip[4];
        espconn_connect_callback connect_callback;
        espconn_reconnect_callback reconnect_callback;
        espconn_connect_callback disconnect_callback;
    	espconn_connect_callback write_finish_fn;
    } esp_tcp;
    
    typedef struct _esp_udp {
        int remote_port;
        int local_port;
        uint8 local_ip[4];
    	uint8 remote_ip[4];
    } esp_udp;
    
    /** A callback prototype to inform about events for a espconn */
    typedef void (* espconn_recv_callback)(void *arg, char *pdata, unsigned short len);
    typedef void (* espconn_sent_callback)(void *arg);
    
    /** A espconn descriptor */
    struct espconn {
        /** type of the espconn (TCP, UDP) */
        enum espconn_type type;
        /** current state of the espconn */
        enum espconn_state state;
        union {
            esp_tcp *tcp;
            esp_udp *udp;
        } proto;
        /** A callback function that is informed about events for this espconn */
        espconn_recv_callback recv_callback;
        espconn_sent_callback sent_callback;
        uint8 link_cnt;
        void *reverse;
    };
    

    域名解析相关

    /******************************************************************************
     * TypedefName : dns_found_callback
     * Description : Callback which is invoked when a hostname is found.
     * 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
    *******************************************************************************/
    
    typedef void (*dns_found_callback)(const char *name, ip_addr_t *ipaddr, void *callback_arg);
    
    /******************************************************************************
     * FunctionName : espconn_gethostbyname
     * Description  : Resolve a hostname (string) into an IP address.
     * Parameters   : pespconn -- espconn to resolve a hostname
     *                hostname -- the hostname that is to be queried
     *                addr -- pointer to a ip_addr_t where to store the address if 
     *                it is already cached in the dns_table (only valid if ESPCONN_OK
     *                is returned!)
     *                found -- a callback function to be called on success, failure
     *                or timeout (only if ERR_INPROGRESS is returned!)
     * Returns      : err_t return code
     *                - ESPCONN_OK if hostname is a valid IP address string or the host
     *                  name is already in the local names table.
     *                - ESPCONN_INPROGRESS enqueue a request to be sent to the DNS server
     *                  for resolution if no errors are present.
     *                - ESPCONN_ARG: dns client not initialized or invalid hostname
    *******************************************************************************/
    
    err_t espconn_gethostbyname(struct espconn *pespconn, const char *hostname, ip_addr_t *addr, dns_found_callback found);
    

    建立连接步骤示例(Tcp,直接连接ip)

        struct espconn pro_TcpClient_conn;//连接结构体
        pro_TcpClient_conn.type = ESPCONN_TCP;//TCP
        pro_TcpClient_conn.state = ESPCONN_NONE;//连接初始状态
        pro_TcpClient_conn.proto.tcp = (esp_tcp *)os_zalloc(sizeof(esp_tcp));//初始化Tcp连接结构体
        os_memcpy(pro_TcpClient_conn.proto.tcp->remote_ip, user_param.remote_server_ip, 4);//用户服务器ip地址
        pro_TcpClient_conn.proto.tcp->remote_port = user_param.remote_port;   // remote port//用户服务器端口
        pro_TcpClient_conn.proto.tcp->local_port = espconn_port(); //配置自动本地端口
        espconn_regist_connectcb(&pro_TcpClient_conn, pro_client_connect_cb); // 注册连接回调
        espconn_regist_reconcb(&pro_TcpClient_conn, pro_client_recon_cb); // 注册重连回调
        espconn_connect(&pro_TcpClient_conn);//开始连接
    

    建立连接步骤示例(Tcp,连接域名)

    #define NET_DOMAIN "fofso.com"//连接域名
    LOCAL os_timer_t test_timer;//定时器
    LOCAL struct espconn user_tcp_conn;//Esp网络相关结构体
    LOCAL struct _esp_tcp user_tcp;//Tcp结构体
    ip_addr_t tcp_server_ip;//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 
    ", 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 !!! 
    ");
    }
    
    /******************************************************************************
     * 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 !!! 
    ");
    }
    
    /******************************************************************************
     * 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 !!! 
    ");
        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 !!! 
    ",err);
    }
    
    #ifdef DNS_ENABLE
    /******************************************************************************
     * 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 
    ");
            return;
        }
       //dns got ip
        os_printf("user_dns_found %d.%d.%d.%d 
    ",
                *((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 =  user_param.remote_port;     
            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_timer_arm(&test_timer, 1000, 0);
    }
    #endif
    /******************************************************************************
     * FunctionName : user_check_ip
     * Description  : check whether get ip addr or not
     * Parameters   : none
     * Returns      : none
    *******************************************************************************/
    void ICACHE_FLASH_ATTR
    user_check_ip(void)
    {
        struct ip_info ipconfig;
    
       //disarm timer first
        os_timer_disarm(&test_timer);
    
       //get ip info of ESP8266 station
        wifi_get_ip_info(STATION_IF, &ipconfig);
    
        if (wifi_station_get_connect_status() == STATION_GOT_IP && ipconfig.ip.addr != 0)
       {
          os_printf("got ip !!! 
    ");
          // 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;
          
    #ifdef DNS_ENABLE
          tcp_server_ip.addr = 0;
           espconn_gethostbyname(&user_tcp_conn, NET_DOMAIN, &tcp_server_ip, user_dns_found); // DNS function
           os_timer_setfn(&test_timer, (os_timer_func_t *)user_dns_check_cb, &user_tcp_conn);
           os_timer_arm(&test_timer, 1000, 0);
    #else
            const char esp_tcp_server_ip[4] = {X, X, X, X}; // remote IP of TCP server
           os_memcpy(user_tcp_conn.proto.tcp->remote_ip, esp_tcp_server_ip, 4);
           user_tcp_conn.proto.tcp->remote_port = user_param.remote_port;  
           user_tcp_conn.proto.tcp->local_port = espconn_port(); //local port of ESP8266
           espconn_regist_connectcb(&user_tcp_conn, user_tcp_connect_cb); // register connect callback
           espconn_regist_reconcb(&user_tcp_conn, user_tcp_recon_cb); // register reconnect callback as error handler
           espconn_connect(&user_tcp_conn);
    #endif
        }
       else
       {       
            if ((wifi_station_get_connect_status() == STATION_WRONG_PASSWORD ||
                    wifi_station_get_connect_status() == STATION_NO_AP_FOUND ||
                    wifi_station_get_connect_status() == STATION_CONNECT_FAIL))
            {
             os_printf("connect fail !!! 
    ");
            }
          else
          {
               //re-arm timer to check ip
                os_timer_setfn(&test_timer, (os_timer_func_t *)user_check_ip, NULL);
                os_timer_arm(&test_timer, 100, 0);
            }
        }
    }
    
    
  • 相关阅读:
    pycharm的集成vim
    几款在线脑图制作工具
    编辑器vim简介
    常用服务器ftp、ssh
    56. Merge Intervals
    58. Length of Last Word
    55. Jump Game
    53. Maximum Subarray
    52. N-Queens II
    51. N-Queens
  • 原文地址:https://www.cnblogs.com/hztd/p/11792515.html
Copyright © 2020-2023  润新知