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

Mod USB cho Router wifi DLink DIR615 E4

Bài 3 - Blink LED

Bài 2 - Nút nhấn điều khiển LED