/*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
最新推荐文章于 2024-04-13 20:28:23 发布