国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

ESP32接入網(wǎng)絡(luò)后,循環(huán)掃描服務器IP及端口狀態(tài)信息(ESP-IDF)

這篇具有很好參考價值的文章主要介紹了ESP32接入網(wǎng)絡(luò)后,循環(huán)掃描服務器IP及端口狀態(tài)信息(ESP-IDF)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

0、代碼說明

????????本文使用的是ESP32系列的ESP32S3設(shè)備開發(fā),ESP-IDF框架版本為ESP-IDF V5.1,在VScode下以ESP-IDF插件的形式對設(shè)備開發(fā)。后期經(jīng)過對程序的測試發(fā)現(xiàn),在ESP-IDF v4.4框架下編譯開發(fā),也可以實現(xiàn)循環(huán)掃描功能,實現(xiàn)功能的程序源碼Demo見文末。

1、實現(xiàn)背景

????????在嵌入式物聯(lián)網(wǎng)這一類的項目開發(fā)中,硬件設(shè)備常作為客戶端,通過固定的或非固定的服務器IP地址和端口號向服務器進行通信,上傳本地數(shù)據(jù)到服務器中或接收來自服務器的請求數(shù)據(jù)。本文主要解決當服務器IP地址并未固定或者因某種原因?qū)е路掌鞯腎P地址發(fā)生變動,而硬件設(shè)備產(chǎn)品可能已經(jīng)上市交付等其它因素,并不能及時的通過OTA升級更新客戶端的MCU硬件程序,但硬件產(chǎn)品依然需要連接服務器的端口,進行數(shù)據(jù)交互。

????????為了預防避免這些意外,在硬件設(shè)備程序的編寫中,并不能和往常一樣直接固定了服務器IP地址。本博客文章中提供了一種簡單可行的方法,即:客戶端固定了目標服務器的IP端口,但服務器的IP地址并不固定。當然,也可以先進行對某一固定了IP和端口的服務器進行連接,在多次或者一定時間都不能正常接入服務器后,開啟循環(huán)掃描同一網(wǎng)段的服務器IP,連接該固定端口或備用端口。

2、開發(fā)資料參考

樂鑫官方的ESP-IDF編程API參考指南鏈接:API 指南 - ESP32-S3 - — ESP-IDF 編程指南 latest 文檔 (espressif.com)

通過API編程參考,可以查看ESP32所需要的常用API及其使用的Demo案例。

ESP32接入網(wǎng)絡(luò)后,循環(huán)掃描服務器IP及端口狀態(tài)信息(ESP-IDF),ESP32系列經(jīng)驗教程,網(wǎng)絡(luò),嵌入式硬件,mcu,tcp/ip,arm開發(fā),網(wǎng)絡(luò)協(xié)議

3、程序效果圖

ESP32接入WiFi網(wǎng)絡(luò)后獲取到的IP地址信息

ESP32接入網(wǎng)絡(luò)后,循環(huán)掃描服務器IP及端口狀態(tài)信息(ESP-IDF),ESP32系列經(jīng)驗教程,網(wǎng)絡(luò),嵌入式硬件,mcu,tcp/ip,arm開發(fā),網(wǎng)絡(luò)協(xié)議

ESP32掃描到在線的IP地址,但未掃描到對應的端口,如果服務器未開啟,則ESP32會一直循環(huán)掃描服務器的IP及端口。

ESP32接入網(wǎng)絡(luò)后,循環(huán)掃描服務器IP及端口狀態(tài)信息(ESP-IDF),ESP32系列經(jīng)驗教程,網(wǎng)絡(luò),嵌入式硬件,mcu,tcp/ip,arm開發(fā),網(wǎng)絡(luò)協(xié)議

ESP32掃描到服務器的IP地址和端口

ESP32接入網(wǎng)絡(luò)后,循環(huán)掃描服務器IP及端口狀態(tài)信息(ESP-IDF),ESP32系列經(jīng)驗教程,網(wǎng)絡(luò),嵌入式硬件,mcu,tcp/ip,arm開發(fā),網(wǎng)絡(luò)協(xié)議

服務器的IP地址

ESP32接入網(wǎng)絡(luò)后,循環(huán)掃描服務器IP及端口狀態(tài)信息(ESP-IDF),ESP32系列經(jīng)驗教程,網(wǎng)絡(luò),嵌入式硬件,mcu,tcp/ip,arm開發(fā),網(wǎng)絡(luò)協(xié)議

ESP32接入服務器后,服務器端收到來自客戶端發(fā)送的數(shù)據(jù)

ESP32接入網(wǎng)絡(luò)后,循環(huán)掃描服務器IP及端口狀態(tài)信息(ESP-IDF),ESP32系列經(jīng)驗教程,網(wǎng)絡(luò),嵌入式硬件,mcu,tcp/ip,arm開發(fā),網(wǎng)絡(luò)協(xié)議

4、程序源碼

?①、main.c

#include <stdio.h>
#include <string.h>
#include "esp_wifi.h"
#include "esp_log.h"
#include "nvs_flash.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "network.h"

//設(shè)備啟動接入WiFi后,循環(huán)掃描服務器ip是否在線,通信端口是否打開

int app_main()
{
    printf("Program starting...\n");

    int ret = 0;
    char server_ip[128] = {0};
    uint8_t wifi_ssid[] = "imi-12-1719";
    uint8_t wifi_passwd[] = "imi?61415926";
    
    device_connect_wifi_ap(wifi_ssid, wifi_passwd);
    vTaskDelay(500);


    while(1)
    {
        ret = device_scan_dest_server(server_ip);
        if(ret == 0)
        {
            printf("Server ip:%s\n", server_ip);
            break;
        }
        vTaskDelay(30000 / portTICK_PERIOD_MS);
    }
    
    //連接服務器
    extern int tcp_sock;
    tcp_client_init(server_ip);
    char str[] = "hello server!";
    send(tcp_sock, str, strlen(str)+1, 0);
    close(tcp_sock);

    return 0;
}

②、network.c

#include "network.h"

//ESP-IDF v5.1
static const char *TAG = "wifi_station";

int tcp_sock = -1;
int udp_sock = -1;

esp_ping_handle_t ping;
int ping_flag = -1;
enum {
    PING_IP_OK = 0,
    PING_IP_ERR
};
struct sockaddr_in dest_addr;

/**
  * @brief  連接WiFi事件處理器---處理WiFi和IP事件
  * @param  arg:用戶定義的參數(shù)
  * @param  event_base:事件基類型
  * @param  event_id:事件具體ID
  * @param  event_data:指向事件數(shù)據(jù)的指針
  * @retval void
  */
void connect_wifi_ap_event_handler(void* arg, esp_event_base_t event_base, int32_t event_id, void* event_data)
{
    if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_START) {
        esp_wifi_connect();
    } else if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_DISCONNECTED) {
        esp_wifi_connect();
    } else if (event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP) {
        ip_event_got_ip_t* event = (ip_event_got_ip_t*) event_data;
        char addr_str[IP4ADDR_STRLEN_MAX];
        ESP_LOGI(TAG, "got ip:%s", esp_ip4addr_ntoa(&event->ip_info.ip, addr_str, IP4ADDR_STRLEN_MAX));
    }
}

/**
  * @brief  設(shè)備連接WiFi AP熱點
  * @param  wifi_ssid:WiFi 熱點ID
  * @param  wifi_passwd:WiFi密碼
  * @retval void
  */
void device_connect_wifi_ap(uint8_t *wifi_ssid, uint8_t *wifi_passwd)
{
    esp_err_t ret = nvs_flash_init();
    if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) {
        ESP_ERROR_CHECK(nvs_flash_erase());
        ret = nvs_flash_init();
    }
    ESP_ERROR_CHECK(ret);

    ESP_ERROR_CHECK(esp_netif_init());
    ESP_ERROR_CHECK(esp_event_loop_create_default());
    esp_netif_create_default_wifi_sta();

    wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
    ESP_ERROR_CHECK(esp_wifi_init(&cfg));

    ESP_ERROR_CHECK(esp_event_handler_register(WIFI_EVENT, ESP_EVENT_ANY_ID, &connect_wifi_ap_event_handler, NULL));
    ESP_ERROR_CHECK(esp_event_handler_register(IP_EVENT, IP_EVENT_STA_GOT_IP, &connect_wifi_ap_event_handler, NULL));

    wifi_config_t wifi_config;
    memcpy(wifi_config.sta.ssid, wifi_ssid, strlen((char *)wifi_ssid)+1);
    memcpy(wifi_config.sta.password, wifi_passwd, strlen((char *)wifi_passwd)+1);

    ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA));
    ESP_ERROR_CHECK(esp_wifi_set_config(ESP_IF_WIFI_STA, &wifi_config));
    ESP_ERROR_CHECK(esp_wifi_start());
}

/**
  * @brief  udp客戶端初始化
  * @param  None
  * @retval 成功返回0,失敗返回-1
  */
int udp_client_init(void)
{
    char host_ip[] = HOST_IP_ADDR;
    int addr_family = 0;
    int ip_protocol = 0;  
#if defined(CONFIG_EXAMPLE_IPV4)
    //struct sockaddr_in dest_addr;
    dest_addr.sin_addr.s_addr = inet_addr(host_ip);
    dest_addr.sin_family = AF_INET;
    dest_addr.sin_port = htons(PORT);
    addr_family = AF_INET;
    ip_protocol = IPPROTO_IP;
#elif defined(CONFIG_EXAMPLE_IPV6)
    struct sockaddr_in6 dest_addr = {0};
    inet6_aton(HOST_IP_ADDR, &dest_addr.sin6_addr);
    dest_addr.sin6_family = AF_INET6;
    dest_addr.sin6_port = htons(PORT);
    dest_addr.sin6_scope_id = esp_netif_get_netif_impl_index(EXAMPLE_INTERFACE);
    addr_family = AF_INET6;
    ip_protocol = IPPROTO_IPV6;
#elif defined(CONFIG_EXAMPLE_SOCKET_IP_INPUT_STDIN)
    struct sockaddr_storage dest_addr = {0};
    ESP_ERROR_CHECK(get_addr_from_stdin(PORT, SOCK_DGRAM, &ip_protocol, &addr_family, &dest_addr));
#endif
    extern int udp_sock;
    udp_sock = socket(addr_family, SOCK_DGRAM, ip_protocol);
    if (udp_sock < 0)
    {
        ESP_LOGE(TAG, "Unable to create socket: errno %d", errno);
        return -1;
    }
    ESP_LOGI(TAG, "Socket created, sending to %s:%d", HOST_IP_ADDR, PORT);
    return 0;
}

/**
  * @brief  tcp客戶端初始化
  * @param  None
  * @retval 成功返回0,失敗返回-1
  */
int tcp_client_init(char ip_addr[])
{
    //char host_ip[128] = HOST_IP_ADDR;
    char host_ip[128] = {0};
    memcpy(host_ip, ip_addr, strlen(ip_addr));
    int addr_family = 0;
    int ip_protocol = 0;
    int err = 0;
#if defined(CONFIG_EXAMPLE_IPV4)
    struct sockaddr_in dest_addr;
    dest_addr.sin_addr.s_addr = inet_addr(host_ip);
    dest_addr.sin_family = AF_INET;
    dest_addr.sin_port = htons(PORT);
    addr_family = AF_INET;
    ip_protocol = IPPROTO_IP;
#elif defined(CONFIG_EXAMPLE_IPV6)
    struct sockaddr_in6 dest_addr = { 0 };
    inet6_aton(host_ip, &dest_addr.sin6_addr);
    dest_addr.sin6_family = AF_INET6;
    dest_addr.sin6_port = htons(PORT);
    dest_addr.sin6_scope_id = esp_netif_get_netif_impl_index(EXAMPLE_INTERFACE);
    addr_family = AF_INET6;
    ip_protocol = IPPROTO_IPV6;
#elif defined(CONFIG_EXAMPLE_SOCKET_IP_INPUT_STDIN)
    struct sockaddr_storage dest_addr = { 0 };
    ESP_ERROR_CHECK(get_addr_from_stdin(PORT, SOCK_STREAM, &ip_protocol, &addr_family, &dest_addr));
#endif
    extern int tcp_sock;
    tcp_sock = socket(addr_family, SOCK_STREAM, ip_protocol);
    if (tcp_sock < 0) {
        ESP_LOGE(TAG, "Unable to create socket: errno %d", errno);
        return -1;
    }
    ESP_LOGI(TAG, "Socket created, connecting to server");
    DPRINTF("Socket created, connecting to %s:%d\n", host_ip, PORT);
    err = connect(tcp_sock, (struct sockaddr *)&dest_addr, sizeof(struct sockaddr_in6));
    if (err != 0) {
        ESP_LOGE(TAG, "Socket unable to connect: errno %d", errno);
        return -1;
    }
    ESP_LOGI(TAG, "Successfully connected");
    return 0;
}

/**
  * @brief  設(shè)備連接服務器
  * @param  target_ip:目標IP地址
  * @retval 成功返回0,失敗返回-1
  */
int device_connect_to_server(char *target_ip)
{
    int sock = 0;
    struct sockaddr_in serv_addr;
    //#define PORT 5005
    DPRINTF("FUNCTION:%s\tLINE:%d\n", __FUNCTION__, __LINE__);
    if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
        DPRINTF("\n Socket creation error \n");
        close(sock);
        return -1;
    }
    DPRINTF("FUNCTION:%s\tLINE:%d\n", __FUNCTION__, __LINE__);
    memset(&serv_addr, '0', sizeof(serv_addr));
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_port = htons(PORT);

    if(inet_pton(AF_INET, target_ip, &serv_addr.sin_addr)<=0) {
        DPRINTF("\nInvalid address/ Address not supported \n");
        close(sock);
        return -1;
    }
    DPRINTF("FUNCTION:%s\tLINE:%d\n", __FUNCTION__, __LINE__);
    if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {
        //send(sock, "hello", strlen("hello"), 0);
        DPRINTF("\nConnection Failed %s\t%d\n", target_ip, PORT);
        close(sock);
        return -1;
    }
    DPRINTF("Connected to %s:%d\n", target_ip, PORT);
    //char str[] = "hello server!";
    //send(sock, str, strlen(str)+1, 0);
    close(sock);

    return 0;
}

/**
  * @brief  TCP掃描同一網(wǎng)段下的目標服務器設(shè)備
  * @param  target_ip:目標IP地址
  * @retval 成功返回0, 失敗返回-1
  */
int device_scan_dest_server(char ip_addr[])
{
    char ip_local_addr[128]  = {0};
    char ip_search_addr[256] = {0};
    esp_netif_t *netif = esp_netif_get_handle_from_ifkey("WIFI_STA_DEF");
    esp_netif_ip_info_t ip_info;
    esp_netif_get_ip_info(netif, &ip_info); 
    memcpy(ip_local_addr, ip4addr_ntoa((ip4_addr_t *)&ip_info.ip), strlen(ip4addr_ntoa((ip4_addr_t *)&ip_info.ip)));
    
    //char *ip4addr_ntoa(const ip4_addr_t *addr);
    printf("device ip:%s\n", ip_local_addr);
    //192.168.1.8
    int i, self_ip_com = 0;
    int tok_cnt = 1;
    int ret = -1;
    for(i = 0; i < 128; i++)
    {
        if(ip_local_addr[i] == '.')//獲取所在網(wǎng)段
        {
            if(tok_cnt == 3)
            {
                self_ip_com =  ip_local_addr[i+1] - '0';
                break;
            }
            tok_cnt++;
        }
        //DPRINTF("%c %d\n", ip_local_addr[i], i);
    }
    DPRINTF("self_ip_com:%d\n", self_ip_com);
    DPRINTF("%s\t%d\n", __FUNCTION__,__LINE__);
    char ip_addr_temp[128] = {0};
    strncpy(ip_addr_temp, ip_local_addr, i+1);
    DPRINTF("%s\n", ip_addr_temp);
    int com;
    for(com = 1; com < 255; com++)
    {
        if(com == self_ip_com)
            continue;
        sprintf(ip_search_addr, "%s%d", ip_addr_temp, com);
        //DPRINTF("%s\n", ip_search_addr);
        DPRINTF("%s\t%d\n", __FUNCTION__,__LINE__);
        device_ping_ip_addr(ip_search_addr);//ping傳入的ip地址
        vTaskDelay(500 / portTICK_PERIOD_MS);
        //ping通ip地址后,繼續(xù)判斷是否能夠連接端口(5005)
        if(ping_flag == PING_IP_OK)
        {
            esp_ping_stop(ping);
            esp_ping_delete_session(ping);
            DPRINTF("%s\t%d\n", __FUNCTION__,__LINE__);
            ret = device_connect_to_server(ip_search_addr);
            if (ret == 0)
            {
                DPRINTF("Found the target server.\n");
                memcpy(ip_addr, ip_search_addr, strlen(ip_search_addr));
                break;
            }
        }else{
            DPRINTF("%s\t%d\n", __FUNCTION__,__LINE__);
            //vTaskDelay(300 / portTICK_PERIOD_MS);
            esp_ping_stop(ping);
            esp_ping_delete_session(ping);
        }
        DPRINTF("%s\t%d\n", __FUNCTION__,__LINE__);
        //DPRINTF("try again.\n");
        memset(ip_search_addr, 0, sizeof(ip_search_addr));
    }
    DPRINTF("%s\t%d\n", __FUNCTION__,__LINE__);
    printf("com = %d\n", com);
    if(com < 255)
    {
        DPRINTF("Device scan server success.\n");
        
        return 0;
    }else{
        DPRINTF("Device scan server failed.\n");
        return -1;
    }
}

/**
  * @brief  ping ip地址成功的回調(diào)函數(shù)
  * @param  handle:ping ip句柄
  * @param  args:傳入給回調(diào)函數(shù)的參數(shù)
  * @retval None
  */
void ping_ip_success(esp_ping_handle_t handle, void *args)
{
    // optionally, get callback arguments
    // const char* str = (const char*) args;
    // DPRINTF("%s\r\n", str); // "foo"
    ping_flag = PING_IP_OK;
    uint8_t ttl;
    uint16_t seqno;
    uint32_t elapsed_time, recv_len;
    ip_addr_t target_addr;
    esp_ping_get_profile(handle, ESP_PING_PROF_SEQNO, &seqno, sizeof(seqno));
    esp_ping_get_profile(handle, ESP_PING_PROF_TTL, &ttl, sizeof(ttl));
    esp_ping_get_profile(handle, ESP_PING_PROF_IPADDR, &target_addr, sizeof(target_addr));
    esp_ping_get_profile(handle, ESP_PING_PROF_SIZE, &recv_len, sizeof(recv_len));
    esp_ping_get_profile(handle, ESP_PING_PROF_TIMEGAP, &elapsed_time, sizeof(elapsed_time));
    printf("%ld bytes from %s icmp_seq=%d ttl=%d time=%ld ms\n",
           recv_len, inet_ntoa(target_addr.u_addr.ip4), seqno, ttl, elapsed_time);
}

/**
  * @brief  ping ip地址超時的回調(diào)函數(shù)
  * @param  handle:ping ip句柄
  * @param  args:傳入給回調(diào)函數(shù)的參數(shù)
  * @retval None
  */
void ping_ip_timeout(esp_ping_handle_t handle, void *args)
{
    ping_flag = PING_IP_ERR;
    uint16_t seqno;
    ip_addr_t target_addr;
    esp_ping_get_profile(handle, ESP_PING_PROF_SEQNO, &seqno, sizeof(seqno));
    esp_ping_get_profile(handle, ESP_PING_PROF_IPADDR, &target_addr, sizeof(target_addr));
    printf("From %s icmp_seq=%d timeout\n", inet_ntoa(target_addr.u_addr.ip4), seqno);
}

/**
  * @brief  ping ip地址結(jié)束的回調(diào)函數(shù)
  * @param  handle:ping ip句柄
  * @param  args:傳入給回調(diào)函數(shù)的參數(shù)
  * @retval None
  */
void ping_ip_end(esp_ping_handle_t handle, void *args)
{
    uint32_t transmitted;
    uint32_t received;
    uint32_t total_time_ms;
    ping_flag = -1;
    esp_ping_get_profile(handle, ESP_PING_PROF_REQUEST, &transmitted, sizeof(transmitted));
    esp_ping_get_profile(handle, ESP_PING_PROF_REPLY, &received, sizeof(received));
    esp_ping_get_profile(handle, ESP_PING_PROF_DURATION, &total_time_ms, sizeof(total_time_ms));
    DPRINTF("%ld packets transmitted, %ld received, time %ldms\n", transmitted, received, total_time_ms);
}

/**
  * @brief  ping ip地址
  * @param  ip_str:字符串格式的IP地址   "192.168.1.8"
  * @retval None
  */
void device_ping_ip_addr(char *ip_str)
{
    DPRINTF("%s\t%d\n", __FUNCTION__,__LINE__);
    ip_addr_t target_addr;
    esp_ping_config_t ping_config = ESP_PING_DEFAULT_CONFIG();
    ping_config.interval_ms = 400;
    ping_config.timeout_ms  = 400;
    memset(&target_addr, 0, sizeof(ip_addr_t));
    //字符串IP地址轉(zhuǎn)換為ping_addr
    if (ipaddr_aton(ip_str, &target_addr)) {
        //DPRINTF("轉(zhuǎn)換成功.\n");
        ping_config.target_addr = target_addr;
    } else {
        DPRINTF("Invalid IP address\n");
        return ;
    }
    DPRINTF("%s\t%d\n", __FUNCTION__,__LINE__);
    //ping_config.target_addr = target_addr;          // target IP address
    ping_config.count = ESP_PING_COUNT_INFINITE;    // ping in infinite mode, esp_ping_stop can stop it
    
    //設(shè)置回調(diào)函數(shù)
    esp_ping_callbacks_t cbs;
    cbs.on_ping_success = ping_ip_success;
    cbs.on_ping_timeout = ping_ip_timeout;
    cbs.on_ping_end = ping_ip_end;
    cbs.cb_args = "ping ip";  // arguments that will feed to all callback functions, can be NULL
    DPRINTF("%s\t%d\n", __FUNCTION__,__LINE__);
    esp_ping_new_session(&ping_config, &cbs, &ping);
    DPRINTF("%s\t%d\n", __FUNCTION__,__LINE__);
    esp_ping_start(ping);
    DPRINTF("%s\t%d\n", __FUNCTION__,__LINE__);
}

③、network.h

#ifndef __NETWORK_H
#define __NETWORK_H

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#include "sdkconfig.h"
#include <sys/param.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/event_groups.h"
#include "freertos/queue.h"

#include "esp_system.h"
#include "esp_wifi.h"
#include "esp_event.h"
#include "esp_log.h"
#include "nvs_flash.h"
#include "esp_netif.h"

#include "lwip/err.h"
#include "lwip/sockets.h"
#include "lwip/inet.h"
#include "lwip/ip4_addr.h"
#include "lwip/sys.h"
#include <lwip/netdb.h>
#include "esp_ping.h"
#include "ping/ping_sock.h"
#include "driver/gpio.h"

#include <unistd.h>
#include <sys/socket.h>
#include <errno.h>
#include <netdb.h>            // struct addrinfo
#include <arpa/inet.h>

//#define __DEBUG__    //宏定義調(diào)試打印開關(guān)

#ifdef __DEBUG__
    #define DPRINTF(...) printf(__VA_ARGS__)  //宏調(diào)試打印函數(shù)定義
#else
    #define DPRINTF(...)
#endif


#define WIFI_SSID "tony"
#define WIFI_PASS "1008611123"

#if defined(CONFIG_EXAMPLE_IPV4)
#define HOST_IP_ADDR CONFIG_EXAMPLE_IPV4_ADDR
#elif defined(CONFIG_EXAMPLE_IPV6)
#define HOST_IP_ADDR CONFIG_EXAMPLE_IPV6_ADDR
#else
#define HOST_IP_ADDR "192.168.1.100"
#endif

#define PORT 6666



void connect_wifi_ap_event_handler(void* arg, esp_event_base_t event_base, int32_t event_id, void* event_data);
void device_connect_wifi_ap(uint8_t *wifi_ssid, uint8_t *wifi_passwd);
int  udp_client_init(void);
int  tcp_client_init(char ip_addr[]);
void udp_client_task(void *pvParameters);
void tcp_client_task(void *pvParameters);
void key_udp_task(void *pvParameters);
void key_tcp_task(void *pvParameters);

int  device_connect_to_server(char *target_ip);
int  device_scan_dest_server(char ip_addr[]);
void ping_ip_success(esp_ping_handle_t handle, void *args);
void ping_ip_timeout(esp_ping_handle_t handle, void *args);
void ping_ip_end(esp_ping_handle_t handle, void *args);
void device_ping_ip_addr(char *ip_str);

extern esp_ping_handle_t ping;
extern int ping_flag;
extern int tcp_sock;
extern int udp_sock;
extern struct sockaddr_in dest_addr;

#endif

④、完整工程源碼

? ??【免費】ESP32接入網(wǎng)絡(luò)后,循環(huán)掃描服務器IP及端口是否在線的完整工程demo(ESP-IDF)資源-CSDN文庫文章來源地址http://www.zghlxwxcb.cn/news/detail-788322.html

到了這里,關(guān)于ESP32接入網(wǎng)絡(luò)后,循環(huán)掃描服務器IP及端口狀態(tài)信息(ESP-IDF)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務器費用

相關(guān)文章

  • 手把手帶你使用ESP8266 與 STM32F103C8實現(xiàn)網(wǎng)絡(luò)服務器

    手把手帶你使用ESP8266 與 STM32F103C8實現(xiàn)網(wǎng)絡(luò)服務器

    隨著現(xiàn)在物聯(lián)網(wǎng)設(shè)備的而越來越多,現(xiàn)在市場上出現(xiàn)越來越多的物聯(lián)網(wǎng)設(shè)備,其中 ESP8266 是最受歡迎、價格便宜且易于使用的模塊,它可以將您的硬件連接到互聯(lián)網(wǎng)。 今天我們就以ESP8266和STM32來實現(xiàn)一臺網(wǎng)絡(luò)服務器,我們使用 ESP8266 將 STM32F103C8 連接到互聯(lián)網(wǎng)。 ESP8266 Wi-Fi 模

    2024年01月23日
    瀏覽(673)
  • ESP32構(gòu)建簡單WebServer服務器

    ESP32構(gòu)建簡單WebServer服務器

    WebServer 服務器 此案例中,我們將創(chuàng)建一個最簡單的 webserver 服務器 案例實現(xiàn):ESP32 通過 SPIFFS 上傳網(wǎng)頁文件并保存,之后手機開啟熱點,ESP32 連接到該熱點;與手機處于同一熱點下的任何一個設(shè)備(下面用電腦演示)都可以通過 ESP32 反饋的內(nèi)網(wǎng)地址訪問其構(gòu)建的網(wǎng)頁! ESP

    2024年02月11日
    瀏覽(22)
  • ESP32連接云服務器【W(wǎng)ebSocket】

    ESP32連接云服務器【W(wǎng)ebSocket】

    ??????????相關(guān)文章?????????? ESP32連接MQ Sensor實現(xiàn)氣味反應 ?? https://blog.csdn.net/ws15168689087/article/details/131365573 ESP32+MQTT+MySQL實現(xiàn)發(fā)布訂閱【氣味數(shù)據(jù)收集】 ?? https://blog.csdn.net/ws15168689087/article/details/131627595 個人云服務器搭建MQTT服務器 ?? https://blog.csdn.net/ws15168689

    2024年02月16日
    瀏覽(23)
  • 基于ESP32的簡易web服務器

    基于ESP32的簡易web服務器

    本文介紹一下如何使用ESP32快速方便的搭建一個簡易的web服務器。 使用ESP32或ESP8266搭建web服務器的方式有很多,但是大多數(shù)都的web頁面代碼都是內(nèi)嵌在程序中的,這樣如果要修改web頁面就十分的不方便。今天介紹一種方法將web頁面的代碼以文件的形式上傳到存儲器中,然后在

    2024年02月09日
    瀏覽(21)
  • 基于ESP32搭建物聯(lián)網(wǎng)服務器十二(使用MQTT協(xié)議與ESP32互動)

    基于ESP32搭建物聯(lián)網(wǎng)服務器十二(使用MQTT協(xié)議與ESP32互動)

    在之前的文章中:基于ESP32搭建物聯(lián)網(wǎng)服務器十一(用WEB頁面控制引腳(GPIO)功能)_esp32webserver 控制io_你的幻境的博客-CSDN博客 已經(jīng)簡單地介紹了MQTT協(xié)議,對比于其它網(wǎng)絡(luò)協(xié)議,MQTT協(xié)議在物聯(lián)網(wǎng)的開發(fā)中,它的特點使它適用于大多數(shù)受限的環(huán)境。例如網(wǎng)絡(luò)代價昂貴,帶寬低、不可

    2024年02月02日
    瀏覽(54)
  • ESP32作為服務器,使用網(wǎng)頁控制LED小燈

    ESP32作為服務器,使用網(wǎng)頁控制LED小燈

    項目描述 ESP32-S開發(fā)板加入局域網(wǎng),使用platformIO編寫好ESP32的代碼后,編譯下載到ESP32中,訪問ESP32的IP地址,使用網(wǎng)頁控制連接著的LED小燈 項目準備: ESP32-S開發(fā)板 一根數(shù)據(jù)線 電腦 LED小燈 開發(fā)環(huán)境:vscode + PlatformIO 原理剖析 這個ESP32作為服務器,瀏覽器作為客戶端,這是一個簡

    2023年04月26日
    瀏覽(19)
  • STM32通過ESP8266連接MQTT服務器

    STM32通過ESP8266連接MQTT服務器

    ? ? ? ? ESP8266有多種連接MQTT方式,本文介紹使用的是AT MQTT版本固件的ESP01s,基于此固件版本進行說明。本文所需硬件:STM32F103RCT6、LED、ESP01s、DHT11,實現(xiàn)功能:溫濕度上傳和遠程開關(guān)燈的基本功能。 B站視頻教程:STM32+ESP8266+DHT11_嗶哩嗶哩_bilibili gitee:?STM32_Share: STM32、DHT

    2024年02月09日
    瀏覽(24)
  • esp32通過NBIoT模塊連入MQTT服務器

    title: esp32通過NBIoT模塊連入MQTT服務器 keywords: nbiot,esp32,c++,python,mqtt tags: [esp32,c++,python,mqtt,nbiot] categories: [嵌入式,前后端] esp32通過NBIoT模塊連入MQTT服務器 (Message Queuing Telemetry Transport),是一種輕量級、開放的發(fā)布-訂閱式通信協(xié)議。它適用于物聯(lián)網(wǎng)、移動應用和其他帶有低帶寬

    2024年04月17日
    瀏覽(23)
  • 基于ESP32搭建物聯(lián)網(wǎng)服務器一(AP配網(wǎng))

    基于ESP32搭建物聯(lián)網(wǎng)服務器一(AP配網(wǎng))

    目錄 一、WiFi.mode();設(shè)置配網(wǎng)模式 二、WiFi.softAP();設(shè)置ESP32的WIFI屬性 三、WiFi.softAPConfig();設(shè)置ESP32的IP,網(wǎng)關(guān),子網(wǎng)掩碼,DHCP??? ESP32的AP配網(wǎng)模式可以通過無線WIFI連接的方式來連接來控制ESP32或獲取ESP32的數(shù)據(jù)。 設(shè)置ESP32的AP配網(wǎng)需要的庫為 WiFi.h 默認情況下,arduino IDE安裝好

    2024年02月13日
    瀏覽(36)
  • ESP32+ 繼電器-控制交流電器(Web 服務器)

    ESP32+ 繼電器-控制交流電器(Web 服務器)

    采用繼電器配合esp32遠程控制電燈的方法,繼電器也可以改成多路繼電器,這樣單個esp32可以控制多個電器原件 以下是esp32的io引腳,本文采用IO26作為信號輸入 ?將繼電器模塊連接到esp32,如下圖所示 本例子中用的是一個繼電器模塊 以下是實物的接線圖,圖中沒有用AC接燈泡而

    2024年02月16日
    瀏覽(31)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包