示例代码
- 收起全部
- 展开全部
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(); }
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(); }
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); }
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(); }
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(); }
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(); }
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(); }
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)); } }
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(); }
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