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)
{
}
Nhận xét
Đăng nhận xét