- Home
- Hardware
- SDKs
- Cloud
- Solutions
- Support
- Ecosystem
- Company
- Contact
Sample Codes
- Collapse all
- Expand all
[ESP8266] SoftAP Config
Sample code below is based on ESP8266_NONOS_SDK.
Set SSID, password and other information about ESP8266 soft-AP.
Download blank.bin to flash for initialization.
Please notice that wifi_softap_get_config(&softap_config); // Get config first is recommended to be called first.
Or you have to set value for every parameter in softap_config, for example, softap_config.beacon_interval and softap_config.ssid_len, otherwise they will be random value which may make ESP8266 softAP hardly to be connected.
/******************************************************************************
* FunctionName : user_set_softap_config
* Description : set SSID and password of ESP8266 softAP
* Parameters : none
* Returns : none
*******************************************************************************/
void ICACHE_FLASH_ATTR
user_set_softap_config(void)
{
struct softap_config config;
wifi_softap_get_config(&config); // Get config first.
os_memset(config.ssid, 0, 32);
os_memset(config.password, 0, 64);
os_memcpy(config.ssid, "ESP8266", 7);
os_memcpy(config.password, "12345678", 8);
config.authmode = AUTH_WPA_WPA2_PSK;
config.ssid_len = 0;// or its actual length
config.max_connection = 4; // how many stations can connect to ESP8266 softAP at most.
wifi_softap_set_config(&config);// Set ESP8266 softap config .
}
/******************************************************************************
* FunctionName : user_init
* Description : entry of user application, init user function here
* Parameters : none
* Returns : none
*******************************************************************************/
void user_init(void)
{
os_printf("SDK version:%s\n", system_get_sdk_version());
wifi_set_opmode(STATIONAP_MODE);
// ESP8266 softAP set config.
user_set_softap_config();
}
[ESP8266] Station mode: Connect to router
user_init is the entry of program.
Notice that call
//need not mac address stationConf.bssid_set = 0;
before
wifi_station_set_config(&stationConf);
Otherwise it may check target AP's MAC address
LOCAL os_timer_t test_timer;
/******************************************************************************
* FunctionName : user_esp_platform_check_ip
* Description : check whether get ip addr or not
* Parameters : none
* Returns : none
*******************************************************************************/
void ICACHE_FLASH_ATTR
user_esp_platform_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 !!! \r\n");
} 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 !!! \r\n");
} else {
//re-arm timer to check ip
os_timer_setfn(&test_timer, (os_timer_func_t *)user_esp_platform_check_ip, NULL);
os_timer_arm(&test_timer, 100, 0);
}
}
}
/******************************************************************************
* FunctionName : user_set_station_config
* Description : set the router info which ESP8266 station will connect to
* Parameters : none
* Returns : none
*******************************************************************************/
void ICACHE_FLASH_ATTR
user_set_station_config(void)
{
// Wifi configuration
char ssid[32] = SSID;
char password[64] = PASSWORD;
struct station_config stationConf;
os_memset(stationConf.ssid, 0, 32);
os_memset(stationConf.password, 0, 64);
//need not mac address
stationConf.bssid_set = 0;
//Set ap settings
os_memcpy(&stationConf.ssid, ssid, 32);
os_memcpy(&stationConf.password, password, 64);
wifi_station_set_config(&stationConf);
//set a timer to check whether got ip from router succeed or not.
os_timer_disarm(&test_timer);
os_timer_setfn(&test_timer, (os_timer_func_t *)user_esp_platform_check_ip, NULL);
os_timer_arm(&test_timer, 100, 0);
}
/******************************************************************************
* FunctionName : user_init
* Description : entry of user application, init user function here
* Parameters : none
* Returns : none
*******************************************************************************/
void user_init(void)
{
os_printf("SDK version:%s\n", system_get_sdk_version());
//Set softAP + station mode
wifi_set_opmode(STATIONAP_MODE);
// ESP8266 connect to router.
user_set_station_config();
}
[ESP8266] Station mode: Scan for routers
Sample code below is based on ESP8266_NONOS_SDK.
ESP8266 init with station mode,then it can scan routers nearby.
Notice that call
/******************************************************************************
* FunctionName : scan_done
* Description : scan done callback
* Parameters : arg: contain the aps information;
status: scan over status
* Returns : none
*******************************************************************************/
void ICACHE_FLASH_ATTR
scan_done(void *arg, STATUS status)
{
uint8 ssid[33];
char temp[128];
if (status == OK)
{
struct bss_info *bss_link = (struct bss_info *)arg;
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("(%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;
}
}
else
{
os_printf("Scan failed!\r\n");
}
}
/******************************************************************************
* FunctionName : user_scan
* Description : wifi scan, only can be called after system init done.
* Parameters : none
* Returns : none
*******************************************************************************/
void ICACHE_FLASH_ATTR
user_scan(void)
{
if(wifi_get_opmode() == SOFTAP_MODE)
{
os_printf("SoftAP mode is enabled. Enable station mode to scan...\r\n");
return;
}
wifi_station_scan(NULL,scan_done);
}
/******************************************************************************
* FunctionName : user_init
* Description : entry of user application, init user function here
* Parameters : none
* Returns : none
*******************************************************************************/
void user_init(void)
{
os_printf("SDK version:%s\n", system_get_sdk_version());
//Set softAP + station mode
wifi_set_opmode(STATIONAP_MODE);
// wifi scan has to after system init done.
system_init_done_cb(user_scan);
}
If you want to scan a specific AP,for example,scan an AP of which SSID is “ESP8266”. You only need to set the value of parameter "SSID" in structure "scan_config" when calling wifi_station_scan.
void ICACHE_FLASH_ATTR
user_scan(void)
{
if(wifi_get_opmode() == SOFTAP_MODE)
{
os_printf("ap mode can't scan !!!\r\n");
return;
}
struct scan_config config;
os_memset(&config, 0, sizeof(config));
config.ssid = "ESP8266";
wifi_station_scan(&config,scan_done);
}
ESP8266 creates a UDP listening
Sample code below is based on ESP8266_NONOS_SDK.
Note: for ESP8266_RTOS_SDK, please call espconn_init() in the user_init to initialize espconn first.
Create a UDP listening on ESP8266,if ESP8266 got UDP message "Are You ESP8266 Device?",it will response "Yes,I'm ESP8266!" with its MAC address and IP address

UDP_Test.png (12.31 KiB) Viewed 2639 times
/******************************************************************************
* Copyright 2013-2014 Espressif Systems
*
*******************************************************************************/
#include "ets_sys.h"
#include "os_type.h"
#include "osapi.h"
#include "mem.h"
#include "user_interface.h"
#include "espconn.h"
#include "user_json.h"
#include "user_devicefind.h"
const char *device_find_request = "Are You ESP8266 Device?";
const char *device_find_response_ok = "Yes,I'm ESP8266!";
/*---------------------------------------------------------------------------*/
LOCAL struct espconn ptrespconn;
/******************************************************************************
* FunctionName : user_devicefind_recv
* Description : Processing the received udp packet
* Parameters : arg -- Additional argument to pass to the callback function
* pusrdata -- The received data (or NULL when the connection has been closed!)
* length -- The length of received data
* Returns : none
*******************************************************************************/
LOCAL void ICACHE_FLASH_ATTR
user_udp_recv(void *arg, char *pusrdata, unsigned short length)
{
char DeviceBuffer[40] = {0};
char Device_mac_buffer[60] = {0};
char hwaddr[6];
struct ip_info ipconfig;
if (wifi_get_opmode() != STATION_MODE)
{
wifi_get_ip_info(SOFTAP_IF, &ipconfig);
wifi_get_macaddr(SOFTAP_IF, hwaddr);
if (!ip_addr_netcmp((struct ip_addr *)ptrespconn.proto.udp->remote_ip, &ipconfig.ip, &ipconfig.netmask))
{
//udp packet is received from ESP8266 station
wifi_get_ip_info(STATION_IF, &ipconfig);
wifi_get_macaddr(STATION_IF, hwaddr);
}
else
{
//udp packet is received from ESP8266 softAP
}
}
else
{
//udp packet is received from ESP8266 station
wifi_get_ip_info(STATION_IF, &ipconfig);
wifi_get_macaddr(STATION_IF, hwaddr);
}
if (pusrdata == NULL)
return;
if (length == os_strlen(device_find_request) &&
os_strncmp(pusrdata, device_find_request, os_strlen(device_find_request)) == 0)
{
//received device find message
os_sprintf(DeviceBuffer, "%s" MACSTR " " IPSTR, device_find_response_ok,
MAC2STR(hwaddr), IP2STR(&ipconfig.ip));
os_printf("%s\n", DeviceBuffer);
length = os_strlen(DeviceBuffer);
//if received "Are You ESP8266 ?" , response "Yes,I'm ESP8266!" + ESP8266 mac + ESP8266 ip
espconn_sent(&ptrespconn, DeviceBuffer, length);
}
else
{
//received some other data
}
}
/******************************************************************************
* FunctionName : user_devicefind_init
* Description : create a udp listening
* Parameters : none
* Returns : none
*******************************************************************************/
void ICACHE_FLASH_ATTR
user_udp_init(void)
{
ptrespconn.type = ESPCONN_UDP;
ptrespconn.proto.udp = (esp_udp *)os_zalloc(sizeof(esp_udp));
ptrespconn.proto.udp->local_port = 1025; // ESP8266 udp port
espconn_regist_recvcb(&ptrespconn, user_udp_recv); // register a udp packet receiving callback
espconn_create(&ptrespconn); // create udp
}
/******************************************************************************
* FunctionName : user_init
* Description : entry of user application, init user function here
* Parameters : none
* Returns : none
*******************************************************************************/
void user_init(void)
{
os_printf("SDK version:%s\n", system_get_sdk_version());
//Set softAP + station mode
wifi_set_opmode(STATIONAP_MODE);
// Create udp listening.
user_udp_init();
}
ESP8266 as TCP client
Sample code below is based on ESP8266 SDK without OS.
1. Start from user_init
2. Connect to router
3. Connect to cn.bing.com as example
4. Send some HTTP packet..
Note: for ESP8266_RTOS_SDK, please call espconn_init() in the user_init to initialize espconn first.
#include "espconn.h"
#include "mem.h"
#define NET_DOMAIN "cn.bing.com"
#define pheadbuffer "GET / HTTP/1.1\r\nUser-Agent: curl/7.37.0\r\nHost: %s\r\nAccept: */*\r\n\r\n"
#define packet_size (2 * 1024)
LOCAL os_timer_t test_timer;
LOCAL struct espconn user_tcp_conn;
LOCAL struct _esp_tcp user_tcp;
ip_addr_t tcp_server_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("Received data string: %s \r\n", 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("Sent callback: data sent successfully.\r\n");
}
/******************************************************************************
* 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("Disconnected from server.\r\n");
}
/******************************************************************************
* 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_send_data(struct espconn *pespconn)
{
char *pbuf = (char *)os_zalloc(packet_size);
os_sprintf(pbuf, pheadbuffer, NET_DOMAIN);
espconn_send(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("Connected to server...\r\n");
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_send_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 called, error code: %d !!! \r\n",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 \r\n");
return;
}
//dns got ip
os_printf("user_dns_found %d.%d.%d.%d \r\n",
*((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 = 80; // remote port of tcp server
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("Connected to router and assigned IP!\r\n");
// 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 = XXXX; // 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("Connection to router failed!\r\n");
}
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);
}
}
}
/******************************************************************************
* FunctionName : user_set_station_config
* Description : set the router info which ESP8266 station will connect to
* Parameters : none
* Returns : none
*******************************************************************************/
void ICACHE_FLASH_ATTR
user_set_station_config(void)
{
// Wifi configuration
char ssid[32] = SSID;
char password[64] = PASSWORD;
struct station_config stationConf;
os_memset(stationConf.ssid, 0, 32);
os_memset(stationConf.password, 0, 64);
// No MAC-specific scanning
stationConf.bssid_set = 0;
//Set ap settings
os_memcpy(&stationConf.ssid, ssid, 32);
os_memcpy(&stationConf.password, password, 64);
wifi_station_set_config(&stationConf);
// Set timer to check whether router allotted an IP
os_timer_disarm(&test_timer);
os_timer_setfn(&test_timer, (os_timer_func_t *)user_check_ip, NULL);
os_timer_arm(&test_timer, 100, 0);
}
/******************************************************************************
* FunctionName : user_init
* Description : entry of user application, init user function here
* Parameters : none
* Returns : none
*******************************************************************************/
void user_init(void)
{
os_printf("SDK version:%s\n", system_get_sdk_version());
//Set softAP + station mode
wifi_set_opmode(STATIONAP_MODE);
//ESP8266 connect to router
user_set_station_config();
}
ESP8266 sends TCP packets continuously
Sample code below is based on ESP8266_NONOS_SDK.
Note: for ESP8266_RTOS_SDK, please call espconn_init() in the user_init to initialize espconn first.
We suggest to call the next espconn_send in espconn_sent_callback which means that the previous packet is sent.
Or users could enable the espconn_write_finish_callback which means the data sending by espconn_send was written into the write-buffer or already sent, and call the next espconn_send in espconn_write_finish_callback.
The write-buffer can store 8 packets at most, waiting for the TCP ACK. The size of write-buffer is 2920 bytes.
Introduce an API here:
Function: Set option of TCP connection
Prototype:
sint8 espconn_set_opt(
struct espconn *espconn,
uint8 opt
)
Parameter:
struct espconn *espconn : corresponding connected control structure
uint8 opt : Option of TCP connection
bit 0: 1: free memory after TCP disconnection happen need not wait 2 minutes;
bit 1: 1: disable nalgo algorithm during TCP data transmission, quiken the data transmission.
bit 2: 1: enable espconn_write_finish_callback.
bit 3: 1: enable TCP keep-alive function
Return:
0 : succeed
Non-0 : error (please refer to espconn.h for details.)
e.g. ESPCONN_ARG: illegal argument,can’t find TCP connection according to structure espconn
Note:
In general, we need not call this API;
If call espconn_set_opt, please call it in TCP connected callback.
Sample code of send TCP data continually is as bellow
1. call espconn_set_opt to enable write buffer;
2. register a write finish callback;
3. send next packet in write finish callback.
* 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 \r\n", 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
}
/******************************************************************************
* 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 !!! \r\n");
}
/******************************************************************************
* FunctionName : user_tcp_write_finish
* Description : Data need to be sent by espconn_sent has been written into write buffer successfully,
call espconn_sent to send next packet is allowed.
* Parameters : pespconn -- the espconn used to connetion with the host
* Returns : none
*******************************************************************************/
LOCAL void ICACHE_FLASH_ATTR
user_tcp_write_finish(void *arg)
{
struct espconn *pespconn = arg;
espconn_sent(pespconn, "Hello World!", 12);
}
/******************************************************************************
* FunctionName : user_sent_data
* 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)
{
espconn_sent(pespconn, "Hello World!", 12);
}
/******************************************************************************
* 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 !!! \r\n");
espconn_regist_recvcb(pespconn, user_tcp_recv_cb);
espconn_regist_sentcb(pespconn, user_tcp_sent_cb);
espconn_regist_disconcb(pespconn, user_tcp_discon_cb);
espconn_set_opt(pespconn, 0x04); // enable write buffer
espconn_regist_write_finish(pespconn, user_tcp_write_finish); // register write finish callback
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 !!! \r\n",err);
}
/******************************************************************************
* 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 !!! \r\n");
// 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;
const char esp_server_ip[4] = {X, X, X, X}; // remote IP of tcp server
os_memcpy(user_tcp_conn.proto.tcp->remote_ip, esp_server_ip, 4); // remote ip of tcp server
user_tcp_conn.proto.tcp->remote_port = TCP_SERVER_PORT; // remote port of tcp server
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); // tcp connect
}
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 !!! \r\n");
}
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);
}
}
}
/******************************************************************************
* FunctionName : user_set_station_config
* Description : set the router info which ESP8266 station will connect to
* Parameters : none
* Returns : none
*******************************************************************************/
void ICACHE_FLASH_ATTR
user_set_station_config(void)
{
// Wifi configuration
char ssid[32] = "SSID";
char password[64] = "PASSWORD";
struct station_config stationConf;
//need not mac address
stationConf.bssid_set = 0;
//Set ap settings
os_memcpy(&stationConf.ssid, ssid, 32);
os_memcpy(&stationConf.password, password, 64);
wifi_station_set_config(&stationConf);
//set a timer to check whether got ip from router succeed or not.
os_timer_disarm(&test_timer);
os_timer_setfn(&test_timer, (os_timer_func_t *)user_check_ip, NULL);
os_timer_arm(&test_timer, 100, 0);
}
/******************************************************************************
* FunctionName : user_init
* Description : entry of user application, init user function here
* Parameters : none
* Returns : none
*******************************************************************************/
void user_init(void)
{
os_printf("SDK version:%s\n", system_get_sdk_version());
//Set softAP + station mode
wifi_set_opmode(STATIONAP_MODE);
//ESP8266 connect to router
user_set_station_config();
}
ESP8266 as TCP SSL client
Here is a demo code of ESP8266 as TCP SSL client . It is based on ESP8266 SDK without OS.
It just like ESP8266 to be normal TCP client except change espconn_xxx to be espconn_secure_xxx
If your SSL packet is larger than 2048 bytes, please try to call espconn_secure_set_size to enlarge SSL buffer size (max:8192 )
#include "espconn.h"
#include "mem.h"
#define DNS_ENABLE
unsigned char *default_certificate;
unsigned int default_certificate_len = 0;
unsigned char *default_private_key;
unsigned int default_private_key_len = 0;
#define NET_DOMAIN "iot.espressif.cn"
const char* TLSHEAD = "GET / HTTP/1.1\r\nHost: %d.%d.%d.%d\r\nConnection: keep-alive\r\n\r\n";
#define packet_size (2 * 1024)
LOCAL os_timer_t test_timer;
LOCAL struct espconn user_tcp_conn;
LOCAL struct _esp_tcp user_tcp;
ip_addr_t tcp_server_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("Received data string: %s \r\n", 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("Sent callback: data sent successfully.\r\n");
}
/******************************************************************************
* 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("Disconnected from server.\r\n");
}
/******************************************************************************
* 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_send_data(struct espconn *pespconn)
{
char *pbuf = (char *)os_zalloc(packet_size);
os_sprintf(pbuf, TLSHEAD,
pespconn->proto.tcp->remote_ip[0], pespconn->proto.tcp->remote_ip[1],
pespconn->proto.tcp->remote_ip[2], pespconn->proto.tcp->remote_ip[3]);
espconn_secure_send(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("Connected to server...\r\n");
espconn_regist_recvcb(pespconn, user_tcp_recv_cb);
espconn_regist_sentcb(pespconn, user_tcp_sent_cb);
user_send_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 called, error code: %d !!! \r\n",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 \r\n");
return;
}
//dns got ip
os_printf("user_dns_found %d.%d.%d.%d \r\n",
*((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 = 8443; // remote SSL port of tcp server
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_regist_disconcb(pespconn, user_tcp_discon_cb); // register disconnect callback here, because that SSL handshake may fail.
//espconn_secure_set_size(ESPCONN_CLIENT,5120); // set SSL buffer size, if your SSL packet larger than 2048 bytes
espconn_secure_connect(pespconn); // tcp SSL 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("Connected to router and assigned IP!\r\n");
// 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_server_ip[4] = {192, 185, 229, 242};
os_memcpy(user_tcp_conn.proto.tcp->remote_ip, esp_server_ip, 4);
user_tcp_conn.proto.tcp->remote_port = 443; // remote SSL port of tcp server
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_secure_set_size(ESPCONN_CLIENT,5120); // set SSL buffer size, if your SSL packet larger than 2048 bytes
espconn_secure_connect(&user_tcp_conn); // tcp SSL connect
#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("Connection to router failed.\r\n");
}
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);
}
}
}
/******************************************************************************
* FunctionName : user_set_station_config
* Description : set the router info which ESP8266 station will connect to
* Parameters : none
* Returns : none
*******************************************************************************/
void ICACHE_FLASH_ATTR
user_set_station_config(void)
{
// Wifi configuration
char ssid[32] = SSID;
char password[64] = PASSWORD;
struct station_config stationConf;
//need not mac address
stationConf.bssid_set = 0;
//Set ap settings
os_memcpy(&stationConf.ssid, ssid, 32);
os_memcpy(&stationConf.password, password, 64);
wifi_station_set_config(&stationConf);
//set a timer to check whether got ip from router succeed or not.
os_timer_disarm(&test_timer);
os_timer_setfn(&test_timer, (os_timer_func_t *)user_check_ip, NULL);
os_timer_arm(&test_timer, 100, 0);
}
/******************************************************************************
* FunctionName : user_init
* Description : entry of user application, init user function here
* Parameters : none
* Returns : none
*******************************************************************************/
void user_init(void)
{
os_printf("SDK version:%s\n", system_get_sdk_version());
//Set station mode
wifi_set_opmode(STATION_MODE);
//ESP8266 connect to router
user_set_station_config();
}
ESP8266 Sends UDP data
Sample code below is based on ESP8266_NONOS_SDK.
Note: for ESP8266_RTOS_SDK, please call espconn_init() in the user_init to initialize espconn first.
/******************************************************************************
* Copyright 2013-2014 Espressif Systems
*
*******************************************************************************/
#include "ets_sys.h"
#include "os_type.h"
#include "osapi.h"
#include "mem.h"
#include "user_interface.h"
#include "espconn.h"
#include "user_json.h"
#include "user_devicefind.h"
LOCAL os_timer_t test_timer;
LOCAL struct espconn user_udp_espconn;
const char *ESP8266_MSG = "I'm ESP8266 ";
/*---------------------------------------------------------------------------*/
LOCAL struct espconn ptrespconn;
/******************************************************************************
* FunctionName : user_udp_recv_cb
* Description : Processing the received udp packet
* Parameters : arg -- Additional argument to pass to the callback function
* pusrdata -- The received data (or NULL when the connection has been closed!)
* length -- The length of received data
* Returns : none
*******************************************************************************/
LOCAL void ICACHE_FLASH_ATTR
user_udp_recv_cb(void *arg, char *pusrdata, unsigned short length)
{
os_printf("recv udp data: %s\n", pusrdata);
}
/******************************************************************************
* FunctionName : user_udp_send
* Description : udp send data
* Parameters : none
* Returns : none
*******************************************************************************/
LOCAL void ICACHE_FLASH_ATTR
user_udp_send(void)
{
char DeviceBuffer[40] = {0};
char hwaddr[6];
struct ip_info ipconfig;
const char udp_remote_ip[4] = { 255, 255, 255, 255};
os_memcpy(user_udp_espconn.proto.udp->remote_ip, udp_remote_ip, 4); // ESP8266 udp remote IP need to be set everytime we call espconn_sent
user_udp_espconn.proto.udp->remote_port = 1112; // ESP8266 udp remote port need to be set everytime we call espconn_sent
wifi_get_macaddr(STATION_IF, hwaddr);
os_sprintf(DeviceBuffer, "%s" MACSTR "!" , ESP8266_MSG, MAC2STR(hwaddr));
espconn_sent(&user_udp_espconn, DeviceBuffer, os_strlen(DeviceBuffer));
}
/******************************************************************************
* FunctionName : user_udp_sent_cb
* Description : udp sent successfully
* Parameters : arg -- Additional argument to pass to the callback function
* Returns : none
*******************************************************************************/
LOCAL void ICACHE_FLASH_ATTR
user_udp_sent_cb(void *arg)
{
struct espconn *pespconn = arg;
os_printf("user_udp_send successfully !!!\n");
//disarm timer first
os_timer_disarm(&test_timer);
//re-arm timer to check ip
os_timer_setfn(&test_timer, (os_timer_func_t *)user_udp_send, NULL); // only send next packet after prev packet sent successfully
os_timer_arm(&test_timer, 1000, 0);
}
/******************************************************************************
* 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 !!! \r\n");
wifi_set_broadcast_if(STATIONAP_MODE); // send UDP broadcast from both station and soft-AP interface
user_udp_espconn.type = ESPCONN_UDP;
user_udp_espconn.proto.udp = (esp_udp *)os_zalloc(sizeof(esp_udp));
user_udp_espconn.proto.udp->local_port = espconn_port(); // set a available port
const char udp_remote_ip[4] = {255, 255, 255, 255};
os_memcpy(user_udp_espconn.proto.udp->remote_ip, udp_remote_ip, 4); // ESP8266 udp remote IP
user_udp_espconn.proto.udp->remote_port = 1112; // ESP8266 udp remote port
espconn_regist_recvcb(&user_udp_espconn, user_udp_recv_cb); // register a udp packet receiving callback
espconn_regist_sentcb(&user_udp_espconn, user_udp_sent_cb); // register a udp packet sent callback
espconn_create(&user_udp_espconn); // create udp
user_udp_send(); // send udp data
}
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 !!! \r\n");
}
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);
}
}
}
/******************************************************************************
* FunctionName : user_set_station_config
* Description : set the router info which ESP8266 station will connect to
* Parameters : none
* Returns : none
*******************************************************************************/
void ICACHE_FLASH_ATTR
user_set_station_config(void)
{
// Wifi configuration
char ssid[32] = SSID;
char password[64] = PASSWORD;
struct station_config stationConf;
//need not mac address
stationConf.bssid_set = 0;
//Set ap settings
os_memcpy(&stationConf.ssid, ssid, 32);
os_memcpy(&stationConf.password, password, 64);
wifi_station_set_config(&stationConf);
//set a timer to check whether got ip from router succeed or not.
os_timer_disarm(&test_timer);
os_timer_setfn(&test_timer, (os_timer_func_t *)user_check_ip, NULL);
os_timer_arm(&test_timer, 100, 0);
}
/******************************************************************************
* FunctionName : user_init
* Description : entry of user application, init user function here
* Parameters : none
* Returns : none
*******************************************************************************/
void user_init(void)
{
os_printf("SDK version:%s\n", system_get_sdk_version());
//Set softAP + station mode
wifi_set_opmode(STATIONAP_MODE);
//ESP8266 connect to router
user_set_station_config();
}
If you want to send back a response when received one,
LOCAL void ICACHE_FLASH_ATTR
user_udp_recv_cb(void *arg, char *pusrdata, unsigned short length)
{
os_printf("recv udp data: %s\n", pusrdata);
struct espconn *pesp_conn = arg;
remot_info *premot = NULL;
sint8 value = ESPCONN_OK;
if (espconn_get_connection_info(pesp_conn,&premot,0) == ESPCONN_OK){
pesp_conn->proto.tcp->remote_port = premot->remote_port;
pesp_conn->proto.tcp->remote_ip[0] = premot->remote_ip[0];
pesp_conn->proto.tcp->remote_ip[1] = premot->remote_ip[1];
pesp_conn->proto.tcp->remote_ip[2] = premot->remote_ip[2];
pesp_conn->proto.tcp->remote_ip[3] = premot->remote_ip[3];
espconn_sent(pesp_conn, pusrdata, os_strlen(pusrdata));
}
} ESP8266 as TCP server
Sample code below is based on ESP8266 SDK without OS.
1. Start from user_init
2. ESP8266 is in station mode and connect to a router
3. Set up a TCP server listening to TCP client
4. If TCP server received data from TCP client, it will reply the same data back to TCP client.
Note: for ESP8266_RTOS_SDK, please call espconn_init() in the user_init to initialize espconn first.
#include "ets_sys.h"
#include "osapi.h"
#include "user_interface.h"
#include "espconn.h"
LOCAL struct espconn esp_conn;
LOCAL esp_tcp esptcp;
#define SERVER_LOCAL_PORT 1112
/******************************************************************************
* FunctionName : tcp_server_sent_cb
* Description : data sent callback.
* Parameters : arg -- Additional argument to pass to the callback function
* Returns : none
*******************************************************************************/
LOCAL void ICACHE_FLASH_ATTR
tcp_server_sent_cb(void *arg)
{
//data sent successfully
os_printf("tcp sent cb \r\n");
}
/******************************************************************************
* FunctionName : tcp_server_recv_cb
* Description : receive callback.
* Parameters : arg -- Additional argument to pass to the callback function
* Returns : none
*******************************************************************************/
LOCAL void ICACHE_FLASH_ATTR
tcp_server_recv_cb(void *arg, char *pusrdata, unsigned short length)
{
//received some data from tcp connection
struct espconn *pespconn = arg;
os_printf("tcp recv : %s \r\n", pusrdata);
espconn_sent(pespconn, pusrdata, length);
}
/******************************************************************************
* FunctionName : tcp_server_discon_cb
* Description : disconnect callback.
* Parameters : arg -- Additional argument to pass to the callback function
* Returns : none
*******************************************************************************/
LOCAL void ICACHE_FLASH_ATTR
tcp_server_discon_cb(void *arg)
{
//tcp disconnect successfully
os_printf("tcp disconnect succeed !!! \r\n");
}
/******************************************************************************
* FunctionName : tcp_server_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
tcp_server_recon_cb(void *arg, sint8 err)
{
//error occured , tcp connection broke.
os_printf("reconnect callback, error code %d !!! \r\n",err);
}
LOCAL void tcp_server_multi_send(void)
{
struct espconn *pesp_conn = &esp_conn;
remot_info *premot = NULL;
uint8 count = 0;
sint8 value = ESPCONN_OK;
if (espconn_get_connection_info(pesp_conn,&premot,0) == ESPCONN_OK){
char *pbuf = "tcp_server_multi_send\n";
for (count = 0; count < pesp_conn->link_cnt; count ++){
pesp_conn->proto.tcp->remote_port = premot[count].remote_port;
pesp_conn->proto.tcp->remote_ip[0] = premot[count].remote_ip[0];
pesp_conn->proto.tcp->remote_ip[1] = premot[count].remote_ip[1];
pesp_conn->proto.tcp->remote_ip[2] = premot[count].remote_ip[2];
pesp_conn->proto.tcp->remote_ip[3] = premot[count].remote_ip[3];
espconn_sent(pesp_conn, pbuf, os_strlen(pbuf));
}
}
}
/******************************************************************************
* FunctionName : tcp_server_listen
* Description : TCP server listened a connection successfully
* Parameters : arg -- Additional argument to pass to the callback function
* Returns : none
*******************************************************************************/
LOCAL void ICACHE_FLASH_ATTR
tcp_server_listen(void *arg)
{
struct espconn *pesp_conn = arg;
os_printf("tcp_server_listen !!! \r\n");
espconn_regist_recvcb(pesp_conn, tcp_server_recv_cb);
espconn_regist_reconcb(pesp_conn, tcp_server_recon_cb);
espconn_regist_disconcb(pesp_conn, tcp_server_discon_cb);
espconn_regist_sentcb(pesp_conn, tcp_server_sent_cb);
tcp_server_multi_send();
}
/******************************************************************************
* FunctionName : user_tcpserver_init
* Description : parameter initialize as a TCP server
* Parameters : port -- server port
* Returns : none
*******************************************************************************/
void ICACHE_FLASH_ATTR
user_tcpserver_init(uint32 port)
{
esp_conn.type = ESPCONN_TCP;
esp_conn.state = ESPCONN_NONE;
esp_conn.proto.tcp = &esptcp;
esp_conn.proto.tcp->local_port = port;
espconn_regist_connectcb(&esp_conn, tcp_server_listen);
sint8 ret = espconn_accept(&esp_conn);
os_printf("espconn_accept [%d] !!! \r\n", ret);
}
LOCAL os_timer_t test_timer;
/******************************************************************************
* FunctionName : user_esp_platform_check_ip
* Description : check whether get ip addr or not
* Parameters : none
* Returns : none
*******************************************************************************/
void ICACHE_FLASH_ATTR
user_esp_platform_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 !!! \r\n");
user_tcpserver_init(SERVER_LOCAL_PORT);
} 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 !!! \r\n");
} else {
//re-arm timer to check ip
os_timer_setfn(&test_timer, (os_timer_func_t *)user_esp_platform_check_ip, NULL);
os_timer_arm(&test_timer, 100, 0);
}
}
}
/******************************************************************************
* FunctionName : user_set_station_config
* Description : set the router info which ESP8266 station will connect to
* Parameters : none
* Returns : none
*******************************************************************************/
void ICACHE_FLASH_ATTR
user_set_station_config(void)
{
// Wifi configuration
char ssid[32] = SSID;
char password[64] = PASSWORD;
struct station_config stationConf;
//need not mac address
stationConf.bssid_set = 0;
//Set ap settings
os_memcpy(&stationConf.ssid, ssid, 32);
os_memcpy(&stationConf.password, password, 64);
wifi_station_set_config(&stationConf);
//set a timer to check whether got ip from router succeed or not.
os_timer_disarm(&test_timer);
os_timer_setfn(&test_timer, (os_timer_func_t *)user_esp_platform_check_ip, NULL);
os_timer_arm(&test_timer, 100, 0);
}
/******************************************************************************
* FunctionName : user_init
* Description : entry of user application, init user function here
* Parameters : none
* Returns : none
*******************************************************************************/
void user_init(void)
{
os_printf("SDK version:%s\n", system_get_sdk_version());
//Set station mode
wifi_set_opmode(STATIONAP_MODE);
// ESP8266 connect to router.
user_set_station_config();
}
[ESP8266] APP_IR_TxRx_Demo
The attachment is a demo about Infrared communications based on ESP8266_NONOS_SDK.
If using ESP8266_NONOS_SDK_V1.5.0 or later version, please add "-lcrypto" in 'LINKFLAGS_eagle.app.v6" area of the Makefile.
Infrared communications Documentation

