ESP8266

開發環境地址
樂鑫芯片論壇網站
安信集成商可論壇

系統啓動基本調節
1)電源穩定純淨,如果esp工作不正常(可能商因爲ttl轉換模塊工具),
16管腳必須穿了104陶片電容
2)電容0.1uf,耐壓大於3.3v
3)啓動時候gpio15必須那裏,gpi0 gpio2爲高
CH_PD這個引腳必須拉高


SDK目錄
->Config
->project 項目目錄
->at-firmware at例子源碼
->esp_iot_rtos_sdk 時時操作系統源碼
->iot-firmware iot源碼
->nodemcu-firmware nodemcu源碼
ESP8266CON.exe 編譯程序
->cygwin 編譯器目錄
ESP8266Flasher.exe 下載程序
ESP8266IDE.exe 編輯程序
->eclipse 編輯器目錄

編譯官方SDK
1.打開esp8266con.exe
dir 查看project目錄
2.在命令行中進入編譯的工程目錄
cd at-firmware
3.使用make clean清除當前編譯文件
make clean
4.使用make進行編譯
make
生成文件在at-firmware/bin目錄下
下載0x00000.bin 0x40000.bin到wifi芯片裏面
SDK概述
sdk爲用戶提供了一套數據接受,發送數據的接口,用戶不必關係底層網絡的具體實現
只需要專注於物聯網上層應用開發
ESP8266物聯網平臺所以網絡功能均在庫中實現,對用戶不透明,用戶初始化功能可以
在user_mian.c中實現
void user_init(void)是上層的入口函數給用戶提供一個初始化接口,用戶可以在該函數內添
加硬件初始化,網絡參數設置,定時器初始化等
SDK_v1.1以後版本,請在user_main.c添加user_rf_pre_init(void)

創建自己的工程,輸出hello world
1.複製相關必要的工程文件到工程目錄中
2.在eclipse中選擇導入自己的工程目錄
3.編譯器選擇cygwin gcc
4.在user_mian.c文件中創建兩個必要的函數user_init()user_rf_pre_init()
5.在user_init()函數中配置串口波特率爲115200.並輸出hello word

/********************************************wifi ap station start******************************************/
/*
* user_main.c
*
* Created on: 2018年5月13日
* Author: Administrator
*/
#include "driver/uart.h"
#include "osapi.h"
#include "user_interface.h"
#include "espconn.h"
#include "mem.h"
//wifi連接的定時器
ETSTimer connect_timer;
//udp不停的發送廣播的定時器
ETSTimer send_udp_timer;
//檢查新設備連接到ap的定時器
ETSTimer check_timer;
//udp conn
struct espconn user_udp_espconn;
//tcp client conn
struct espconn user_tcp_client_espconn;
//tcp service conn
struct espconn user_tcp_service_espconn;

void ICACHE_FLASH_ATTR Wifi_conned(void *arg) {
static uint8 count = 0;
uint8 status;
//關閉定時器
os_timer_disarm(&connect_timer);
count++;
//獲取當前wifi連接狀態
status = wifi_station_get_connect_status();
if (status == STATION_GOT_IP) {
os_printf("Wifi connect success!");
return;
} else {
if (count >= 7) {
os_printf("Wifi connect fail!");
return;
}
}
//啓動定時器
os_timer_arm(&connect_timer, 2000, NULL);
}

void ICACHE_FLASH_ATTR user_upd_send(void *arg){
struct espconn *user_udp_espconn=(struct espconn *)arg;
static int send_count=0;
send_count++;
char macaddr[6];
char drive_buffer[40]={0};
wifi_get_macaddr(STATION_IF,macaddr);
os_sprintf(drive_buffer,"send count %d, macadd is "MACSTR"!!\r\n",send_count,MAC2STR(macaddr));
//發送udp廣播
espconn_sent(user_udp_espconn, drive_buffer, os_strlen(drive_buffer));
}

void ICACHE_FLASH_ATTR user_udp_recv_callback(void *arg, char *pdata, unsigned short len){
struct espconn *user_udp_espconn=(struct espconn *)arg;
os_printf("udp接收成功");
}

void ICACHE_FLASH_ATTR user_udp_sent_callback(void *arg){
struct espconn *user_udp_espconn=(struct espconn *)arg;
os_printf("udp發送成功");
os_timer_disarm(&send_udp_timer);
//設置回調函數以及參數
os_timer_setfn(&send_udp_timer, user_upd_send, user_udp_espconn);
os_timer_arm(&send_udp_timer, 2000, NULL);
}


void ICACHE_FLASH_ATTR user_tcp_recv_callback(void *arg, char *pdata, unsigned short len){
struct espconn *user_tcp_espconn=(struct espconn *)arg;
//延時300毫秒後斷開
os_delay_us(300);
espconn_disconnect((struct espconn *)arg);
}

void ICACHE_FLASH_ATTR user_tcp_dis_callback(void *arg){
struct espconn *user_tcp_espconn=(struct espconn *)arg;
os_printf("tcp斷開連接");
}

void ICACHE_FLASH_ATTR user_tcp_sent_callback(void *arg){
struct espconn *user_tcp_espconn=(struct espconn *)arg;
os_printf("tcp發送成功");
}


void ICACHE_FLASH_ATTR user_tcp_connect_cb(void *arg)
{
struct espconn *user_tcp_espconn=(struct espconn *)arg;
//註冊接收回調
espconn_regist_recvcb(user_tcp_espconn, user_tcp_recv_callback);
//註冊發送回調
espconn_regist_sentcb(user_tcp_espconn, user_tcp_sent_callback);
//註冊斷開回調
espconn_regist_disconcb(user_tcp_espconn, user_tcp_dis_callback);
//發送信息
espconn_sent(user_tcp_espconn,"這是esp8226",strlen("這是esp8226"));
}

void ICACHE_FLASH_ATTR user_tcp_recon_cb(void *arg, sint8 err)
{
struct espconn *user_tcp_espconn=(struct espconn *)arg;
os_printf("連接錯誤,錯誤代碼爲%d\r\n",err);
//連接失敗後重新連接
espconn_connect(user_tcp_espconn);
}


void ICACHE_FLASH_ATTR user_service_listen(void *arg)
{
struct espconn *user_tcp_espconn=(struct espconn *)arg;
espconn_regist_recvcb(user_tcp_espconn, user_tcp_recv_callback);
espconn_regist_sentcb(user_tcp_espconn, user_tcp_sent_callback);
espconn_regist_disconcb(user_tcp_espconn, user_tcp_dis_callback);

}

void ICACHE_FLASH_ATTR user_service_listen_cb(void *arg, sint8 err)
{
struct espconn *user_tcp_espconn=(struct espconn *)arg;
os_printf("連接錯誤,錯誤代碼爲%d\r\n",err);
}

void ICACHE_FLASH_ATTR wifi_init(void)
{
struct station_config stationConf;
//設置wifi的ssid
os_memcpy(stationConf.ssid, "TP-LINK", 32);
//設置密碼
os_memcpy(stationConf.password, "1122334455", 64);
//設置wifi但不保存到flash
wifi_station_set_config_current(&stationConf);
//wifi連接
wifi_station_connect();
//設置定時器回調
os_timer_setfn(&connect_timer, Wifi_conned, NULL);
//啓動定時器
os_timer_arm(&connect_timer, 2000, NULL);
}

void ICACHE_FLASH_ATTR udp_init(void)
{
//設置爲廣播發送方式爲ap+station
wifi_set_broadcast_if(STATIONAP_MODE);
user_udp_espconn.type = ESPCONN_UDP;
esp_udp *udp = (esp_udp *)os_zalloc(sizeof(esp_udp));
user_udp_espconn.proto.udp = udp;
udp->local_port=2525;
udp->remote_port=2525;
const char remote_udp_ip[4]={255,255,255,255};
os_memcpy(udp->remote_ip,remote_udp_ip,sizeof(remote_udp_ip));
//設置接收回調
espconn_regist_recvcb(&user_udp_espconn, user_udp_recv_callback);
//設置發送回調
espconn_regist_sentcb(&user_udp_espconn, user_udp_sent_callback);
//發送廣播
user_upd_send(&user_udp_espconn);
}

void ICACHE_FLASH_ATTR tcp_client_init(void)
{
struct ip_info info;
wifi_get_ip_info(STATION_IF,&info);
const char remote_ip[4]={192,168,0,1};
esp_tcp *tcp_client = (esp_tcp *)os_zalloc(sizeof(esp_tcp));
user_tcp_client_espconn.type = ESPCONN_TCP;
user_tcp_client_espconn.proto.tcp=tcp_client;
tcp_client->local_port=espconn_port();
os_memcpy(tcp_client->local_ip,&info.ip,sizeof(remote_ip));
tcp_client->remote_port=espconn_port();
os_memcpy(tcp_client->remote_ip,remote_ip,sizeof(remote_ip));
//設置連接成功回調
espconn_regist_connectcb(&user_tcp_client_espconn,user_tcp_connect_cb);
//設置連接失敗回調
espconn_regist_reconcb(&user_tcp_client_espconn,user_tcp_recon_cb);
//啓動連接
espconn_connect(&user_tcp_client_espconn);
}

void ICACHE_FLASH_ATTR tcp_service_init(void)
{
struct ip_info info;
wifi_get_ip_info(STATION_IF,&info);
esp_tcp *tcp_service = (esp_tcp *)os_zalloc(sizeof(esp_tcp));
user_tcp_service_espconn.type = ESPCONN_TCP;
user_tcp_service_espconn.state = ESPCONN_NONE;
user_tcp_service_espconn.proto.tcp = tcp_service;
os_memcpy(tcp_service->local_ip,&info.ip,sizeof(struct ip_addr));
tcp_service->local_port=1213;
espconn_regist_connectcb(&user_tcp_service_espconn,user_service_listen);
espconn_regist_reconcb(&user_tcp_service_espconn,user_service_listen_cb);
//啓動監聽連接
espconn_accept(&user_tcp_service_espconn);
}

void ICACHE_FLASH_ATTR scan_done(void *arg, STATUS status) {
uint8 ssid[33];

if (status == OK) {
struct bss_info *bss_link = (struct bss_info *) arg;
bss_link = bss_link->next.stqe_next; //ignore first

while (bss_link != NULL ) {
os_memset(ssid, 0, 33);
if (os_strlen(bss_link->ssid) <= 32) {
os_memcpy(ssid, bss_link->ssid, os_strlen(bss_link->ssid));
} else {
os_memcpy(ssid, bss_link->ssid, 32);
}
os_printf("+CWLAP:(%d,\"%s\",%d,\""MACSTR"\",%d)\r\n",
bss_link->authmode, ssid, bss_link->rssi,
MAC2STR(bss_link->bssid), bss_link->channel);

bss_link = bss_link->next.stqe_next;
}
wifi_init();
//初始化udp
udp_init();
//初始化tcp_client
tcp_client_init();
//初始化tcp_service
tcp_service_init();
} else {
// os_sprintf(temp,"err, scan status %d\r\n", status);
// uart0_sendStr(temp);
}

}

void to_scan(void) {
wifi_station_scan(NULL, scan_done);
}
void ICACHE_FLASH_ATTR check_clients(void)
{
os_timer_disarm(&check_timer);
//獲取的所有設備信息
struct station_info * station = wifi_softap_get_station_info();
while(station){
os_printf("mack:"MACSTR" ip:"IPSTR"\n", MAC2STR(station->bssid), IP2STR(&station->ip));
station = STAILQ_NEXT(station, next);
}
wifi_softap_free_station_info(); // Free it by calling functions
}

void ICACHE_FLASH_ATTR wifi_event_callback(System_Event_t *evt)
{
os_printf("event %x\n", evt->event);
switch (evt->event) {
case EVENT_STAMODE_CONNECTED:
os_printf("connect to ssid %s, channel %d\n",
evt->event_info.connected.ssid,
evt->event_info.connected.channel);
break;
case EVENT_STAMODE_DISCONNECTED:
os_printf("disconnect from ssid %s, reason %d\n",
evt->event_info.disconnected.ssid,
evt->event_info.disconnected.reason);
break;
case EVENT_STAMODE_AUTHMODE_CHANGE:
os_printf("mode: %d -> %d\n", evt->event_info.auth_change.old_mode,
evt->event_info.auth_change.new_mode);
break;
case EVENT_STAMODE_GOT_IP:
os_printf("ip:" IPSTR ",mask:" IPSTR ",gw:" IPSTR,
IP2STR(&evt->event_info.got_ip.ip),
IP2STR(&evt->event_info.got_ip.mask),
IP2STR(&evt->event_info.got_ip.gw));
os_printf("\n");
break;
case EVENT_SOFTAPMODE_STACONNECTED://ap模式有設備連接wifi
os_printf("station: " MACSTR "join, AID = %d\n",
MAC2STR(evt->event_info.sta_connected.mac),
evt->event_info.sta_connected.aid);
os_timer_disarm(&check_timer);
os_timer_setfn(&check_timer, check_clients, NULL);
os_timer_arm(&check_timer, 1000, NULL);
break;
case EVENT_SOFTAPMODE_STADISCONNECTED:
os_printf("station: " MACSTR "leave, AID = %d\n",
MAC2STR(evt->event_info.sta_disconnected.mac),
evt->event_info.sta_disconnected.aid);
break;
default:
break;
}
}

void user_init() {
struct softap_config config;
uart_init(115200, 115200);
//設置模式爲ap+station模式
wifi_set_opmode_current(STATIONAP_MODE);
//獲取當前ap信息
wifi_softap_get_config(&config);
os_memcpy(config.ssid,"esp8266",os_strlen("esp8266"));
os_memcpy(config.password,"123456789",os_strlen("123456789"));
config.ssid_len=os_strlen("esp8266");
//設置ap信息
wifi_softap_set_config(&config);
//監聽設備狀態
wifi_set_event_handler_cb(wifi_event_callback);
//設置初始化完成後回調
system_init_done_cb(to_scan);
}
void user_rf_pre_init() {
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章