Bài 5 - Kết nối ESP8266 với wifi

 


ESP8266 có thể hoạt động ở các chế độ sau: station(kết nối với wifi router), Access point (phát wifi để các thiết bị kết nối vào), vừa station vừa AP. Ở đây mình chỉ nói nó hoạt động ở chế độ station.

              ESP8266 hoạt động ở chế độ station

              Để cấu hình esp8266 kết nối wifi ta dùng hàm

wifi_set_opmode_current(STATION_MODE).

              APIs có đưa ra struct station_config ( trong file header user_interface.h) có chứa các thống số: SSID, password,… của Wifi mà ESP8266 muốn kết nối.

              struct station_config {

    uint8 ssid[32];

    uint8 password[64];

    uint8 bssid_set;    // Note: If bssid_set is 1, station will just connect to the router

                        // with both ssid[] and bssid[] matched. Please check about this.

    uint8 bssid[6];

    wifi_fast_scan_threshold_t threshold;

};

              Sau khi cài đặt các thông số SSID, password ta gọi hàm wifi_station_set_config()

              ví dụ:

void wifi_init()

{

       struct station_config sta_conf;

       wifi_set_opmode(STATION_MODE);

       os_strcpy(sta_conf.ssid, "Openwrt");

       os_strcpy(sta_conf.password, "12345678");

       wifi_station_set_config(&sta_conf);

       wifi_station_connect();

}

              Khi khởi động ESP8266 sẽ nhớ station_config mà chúng ta đã cài đặt thông qua hàm: wifi_station_set_config(). Còn nếu không muốn lưu lại thông số cho lần khởi động sau thì ta dùng hàm sau wifi_station_set_config_current().

              Để kết nối ESP8266 với AP ta dùng hàm wifi_station_connect().

              Trong quá trình ESP8266 kết nối với AP wifi, một số sự kiện có thể  xảy ra như sau:

                            

                             + ESP8266 đã kết nối AP

                             + ESP8266 đã ngắt kết nối AP

                             + ESP8266 đã nhận được IP

                             …..

enum {

    EVENT_STAMODE_CONNECTED = 0,

    EVENT_STAMODE_DISCONNECTED,

    EVENT_STAMODE_AUTHMODE_CHANGE,

    EVENT_STAMODE_GOT_IP,

    EVENT_STAMODE_DHCP_TIMEOUT,

    EVENT_SOFTAPMODE_STACONNECTED,

    EVENT_SOFTAPMODE_STADISCONNECTED,

    EVENT_SOFTAPMODE_PROBEREQRECVED,

    EVENT_OPMODE_CHANGED,

    EVENT_SOFTAPMODE_DISTRIBUTE_STA_IP,

    EVENT_MAX

};

              Nhiệm vụ của chúng ta là khai báo hàm callback được gọi khi sự kiện ở trên xảy ra.



              Ví dụ khí có sự kiện ESP8266 đã nhận địa chỉ IP ta khởi động kết nối TCP trên ESP8266 như sau:

void ICACHE_FLASH_ATTR

wifi_event_cb(System_Event_t *event)

{

       switch (event->event){

       case EVENT_STAMODE_GOT_IP:

             os_printf("IP: %d.%d.%d.\n", IP2STR(&event->event_info.got_ip.ip));

             tcp_init(); //khởi tạo kết nối TCP

             break;

       }

}

void ICACHE_FLASH_ATTR

user_init(void)

{

   

    wifi_set_event_handler_cb(wifi_event_cb);

}

 

BIÊN DỊCH VÀ NẠP VÀO ESP8266

Copy thư mục HelloWorld, đổi tên thành 5-connect-wifi sau đó mở Eclipse import vào (xem hướng dẫn import ở bài trước).

 



Chỉnh sửa file user_main.c trong thư mục 5-connect-wifi /app/user có nội dung toàn bộ như sau:

 

#include "osapi.h"

#include "user_interface.h"

 

void wifi_init()

{

       struct station_config sta_conf;

       wifi_set_opmode(STATION_MODE);

       os_strcpy(sta_conf.ssid, "Openwrt");

       os_strcpy(sta_conf.password, "12345678");

       wifi_station_set_config(&sta_conf);

       wifi_station_connect();

}

 

void ICACHE_FLASH_ATTR

wifi_event_cb(System_Event_t *event)

{

       switch (event->event){

       case EVENT_STAMODE_GOT_IP:

             os_printf("IP: %d.%d.%d.\n", IP2STR(&event->event_info.got_ip.ip));

             break;

       }

}

 

void ICACHE_FLASH_ATTR

user_init(void)

{

       uart_init(115200,115200);

       os_delay_us(10000);

   os_printf("\r\n=======================================\r\n");

    os_printf("\t\t Hello World\r\n");

    os_printf("\t\t SDK version: %s \n", system_get_sdk_version());

    os_printf("\r\n=======================================\r\n");

 

    wifi_init();

    wifi_set_event_handler_cb(wifi_event_cb);

}

 

/******************************************************************************

 * FunctionName : user_rf_cal_sector_set

 * Description  : SDK just reversed 4 sectors, used for rf init data and paramters.

 *                We add this function to force users to set rf cal sector, since

 *                we don't know which sector is free in user's application.

 *                sector map for last several sectors : ABCCC

 *                A : rf cal

 *                B : rf init data

 *                C : sdk parameters

 * Parameters   : none

 * Returns      : rf cal sector

*******************************************************************************/

uint32 ICACHE_FLASH_ATTR

user_rf_cal_sector_set(void)

{

    enum flash_size_map size_map = system_get_flash_size_map();

    uint32 rf_cal_sec = 0;

 

    switch (size_map) {

        case FLASH_SIZE_4M_MAP_256_256:

            rf_cal_sec = 128 - 5;

            break;

 

        case FLASH_SIZE_8M_MAP_512_512:

            rf_cal_sec = 256 - 5;

            break;

 

        case FLASH_SIZE_16M_MAP_512_512:

        case FLASH_SIZE_16M_MAP_1024_1024:

            rf_cal_sec = 512 - 5;

            break;

 

        case FLASH_SIZE_32M_MAP_512_512:

        case FLASH_SIZE_32M_MAP_1024_1024:

            rf_cal_sec = 1024 - 5;

            break;

 

        case FLASH_SIZE_64M_MAP_1024_1024:

            rf_cal_sec = 2048 - 5;

            break;

        case FLASH_SIZE_128M_MAP_1024_1024:

            rf_cal_sec = 4096 - 5;

            break;

        default:

            rf_cal_sec = 0;

            break;

    }

 

    return rf_cal_sec;

}

 

void ICACHE_FLASH_ATTR

user_rf_pre_init(void)

{

}

 

  Biên dịch vào nạp vào ESP8266, xem  có hướng dẫn nạp.

 



             


Nhận xét

Bài đăng phổ biến từ blog này

Điều khiển đèn bằng router Dlink DIR615C2 thông qua web.

Bài 3 - Blink LED

Mod USB cho Router wifi DLink DIR615 E4