ESP32:2.搭建UDP服務器

硬件:ESP32-Devkit-V4 MODEL:ESP32-32U
庫:ESP-IDF v5.4.1
系統:windows中的虛擬機 ubuntu 22.04

實現STA,主動連接AP后,打印IP地址,獲取IP后,創建socket,搭建UDP 服務器,實現接收數據的反向回傳

#include "esp_wifi.h"
#include "esp_event.h"
#include "esp_log.h"
#include "nvs_flash.h"
#include "lwip/sockets.h"   // 添加UDP套接字支持
#include "lwip/netdb.h"     // 添加網絡地址轉換#define WIFI_SSID "wifi name"
#define WIFI_PASS "wifi password"
#define UDP_PORT  12345      // UDP服務器監聽端口
static const char *TAG = "WIFI_DEMO";// 全局UDP套接字變量
static int udp_socket = -1;// 事件處理器
static void wifi_event_handler(void* arg, esp_event_base_t event_base, int32_t event_id, void* event_data) {if (event_id == WIFI_EVENT_STA_DISCONNECTED) {// 關閉現有UDP套接字(如果存在)if (udp_socket >= 0) {close(udp_socket);udp_socket = -1;ESP_LOGW(TAG, "UDP socket closed due to disconnection");}esp_wifi_connect();  // 斷線自動重連} else if (event_id == IP_EVENT_STA_GOT_IP) {ip_event_got_ip_t* event = (ip_event_got_ip_t*) event_data;ESP_LOGI(TAG, "Got IP: " IPSTR, IP2STR(&event->ip_info.ip));// 創建UDP服務器udp_socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);if (udp_socket < 0) {ESP_LOGE(TAG, "Failed to create UDP socket: errno %d", errno);return;}// 配置服務器地址struct sockaddr_in server_addr = {.sin_family = AF_INET,.sin_port = htons(UDP_PORT),.sin_addr.s_addr = htonl(INADDR_ANY)  // 監聽所有接口};// 綁定套接字if (bind(udp_socket, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {ESP_LOGE(TAG, "Socket bind failed: errno %d", errno);close(udp_socket);udp_socket = -1;return;}ESP_LOGI(TAG, "UDP server started on port %d", UDP_PORT);}
}// UDP數據處理任務
static void udp_server_task(void *pvParameters) {struct sockaddr_in source_addr;socklen_t addr_len = sizeof(source_addr);char rx_buffer[128];while (1) {if (udp_socket < 0) {vTaskDelay(1000 / portTICK_PERIOD_MS);continue;}// 接收數據int len = recvfrom(udp_socket, rx_buffer, sizeof(rx_buffer) - 1, 0,(struct sockaddr *)&source_addr, &addr_len);if (len > 0) {rx_buffer[len] = '\0';  // 確保字符串終止// 記錄接收信息char source_ip[16];inet_ntoa_r(source_addr.sin_addr, source_ip, sizeof(source_ip));ESP_LOGI(TAG, "Received %d bytes from %s:%d", len, source_ip, ntohs(source_addr.sin_port));ESP_LOGI(TAG, "Data: %s", rx_buffer);// 數據處理示例(反轉字符串)char response[128];for (int i = 0; i < len; i++) {response[i] = rx_buffer[len - 1 - i];}response[len] = '\0';// 發送處理后的數據sendto(udp_socket, response, len, 0, (struct sockaddr *)&source_addr, addr_len);ESP_LOGI(TAG, "Sent response: %s", response);} else if (len < 0 && errno != EAGAIN) {ESP_LOGE(TAG, "recvfrom failed: errno %d", errno);}vTaskDelay(10 / portTICK_PERIOD_MS);}
}void app_main() {// 初始化NVSESP_ERROR_CHECK(nvs_flash_init());// 初始化網絡棧和事件循環esp_netif_init();esp_event_loop_create_default();esp_netif_create_default_wifi_sta();// WiFi驅動配置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, &wifi_event_handler, NULL));ESP_ERROR_CHECK(esp_event_handler_register(IP_EVENT, IP_EVENT_STA_GOT_IP, &wifi_event_handler, NULL));// 設置WiFi憑證wifi_config_t wifi_config = {.sta = { .ssid = WIFI_SSID,.password = WIFI_PASS,.threshold.authmode = WIFI_AUTH_WPA2_PSK}};ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA));ESP_ERROR_CHECK(esp_wifi_set_config(ESP_IF_WIFI_STA, &wifi_config));// 啟動WiFiESP_ERROR_CHECK(esp_wifi_start());esp_wifi_connect();// 創建UDP處理任務xTaskCreate(udp_server_task, "udp_server", 4096, NULL, 5, NULL);
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/917826.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/917826.shtml
英文地址,請注明出處:http://en.pswp.cn/news/917826.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Linux】動靜態庫制作

&#x1f43c;故事背景假設今天你有一位舍友。你需要幫助他完成老師的作業。而他寫的代碼依賴兩個文件&#xff08;mymath.h,mystdio.h&#xff09;。但是這兩個文件的功能他不會寫&#xff0c;他只會調用。他的調用代碼:#include"mystdio.h" #include"mymath.h…

使用Database Navigator插件進行連接sqlite報錯invalid or incomplete database

解決方案 &#xff0c;將這個db.sqlite3文件拷貝到盤的文件中 &#xff0c;修改文件夾名字&#xff0c;重新使用絕對路徑訪問 db.sqlite3&#xff0c;將路徑名字的中文去掉 &#xff0c;不能有中文

【Linux】重生之從零開始學習運維之主從MGR高可用

MGR集群部署12、15、18主機環境準備ssh免密碼登錄\rm -rf .ssh/* ssh-keygen ssh-copy-id 127.1 scp -r .ssh 10.0.0.12:/root/ ssh root10.0.0.12還原基礎環境systemctl stop mysqld \rm -rf /var/lib/mysql/* id mysqlvim /etc/my.cnf.d/mysql-server.cnf [mysqld] datadir/v…

如何在虛擬機(Linux)安裝Qt5.15.2

1.進入到阿里的網站下載在線安裝包 qt-official_releases-online_installers安裝包下載_開源鏡像站-阿里云 https://mirrors.aliyun.com/qt/official_releases/online_installers/?spma2c6h.13651104.d-5201.2.60ad4773ZZNPNm 2.下載完畢后&#xff0c;進入到下載地址&…

【運維進階】DHCP服務配置和DNS域名解析

DHCP服務配置和DNS域名解析 DHCP 服務介紹 在大型網絡中&#xff0c;系統靜態分配IP地址面臨問題&#xff1a; 確保不要同時在多個系統上使用同一個地址。部署新系統通常需要手動分配其IP地址。在云環境中&#xff0c;實例的網絡是自動化配置的。 動態主機配置協議&#xff08;…

VisionPro MR環境下虛擬物體與現實的透明度混合

display.rgb (virtualcontent.rgb*1)(passthrough.rgb*(1 - vistualcontent.a) viirtualcontent預乘過a值了&#xff0c;跟透明度混合公式一致 人頭檢測挖孔不清晰問題&#xff0c;這個a值變成設備層動態檢測人頭的a值&#xff0c;當面前的渲染壓力過大時&#xff0c;會導致…

css怪異模式(Quirks Mode)和標準模式(Standards Mode)最明顯的區別

文章目錄css怪異模式&#xff08;Quirks Mode&#xff09;和標準模式&#xff08;Standards Mode&#xff09;最明顯的區別詳細對比示例對比&#xff08;盒模型&#xff09;標準模式&#xff08;Standards Mode&#xff09;怪異模式&#xff08;Quirks Mode&#xff09;如何觸發…

一種簡單的3dnr去噪算法介紹

一段未經過插補的視頻圖像可以分解為若干幀&#xff0c;為了能正確地找到并去除圖像幀中的噪聲污染&#xff0c;由于視頻圖像各幀的連續性&#xff0c;在去噪的過程中就必須考慮幀圖像的空間性和時間性&#xff0c;一個簡單的例子&#xff0c;在去噪算法中就必須考慮&#xff0…

【數據結構初階】--排序(四):歸并排序

&#x1f525;個人主頁&#xff1a;草莓熊Lotso &#x1f3ac;作者簡介&#xff1a;C研發方向學習者 &#x1f4d6;個人專欄&#xff1a; 《C語言》 《數據結構與算法》《C語言刷題集》《Leetcode刷題指南》 ??人生格言&#xff1a;生活是默默的堅持&#xff0c;毅力是永久的…

GaussDB 并行創建索引

1 背景當業務數據在單表存儲達到一定的數量級時&#xff0c;此時對表創建索引是要花費時間的。GaussDB為了解決這個問題采用并行創建索引技術&#xff0c;以提高創建索引的效率。2 示例步驟1&#xff1a;根據實際情況調整maintenance_work_mem參數該大小。[Rubydtest1 ~]$ gsq…

LOOP Finance:一場 Web3 共和國中的金融制度實驗

LOOP Finance 是建構于幣安智能鏈&#xff08;BNB Chain&#xff09;上的定投型DEFI理財協議。 它以凱因斯經濟學為啟發&#xff0c;設計出一套長期、安全、穩定收益的全新DEFI玩法&#xff0c;兼顧穩健利息回報與DEFI高速成長的潛力。 通過生態機制&#xff0c;LOOP要求每位參…

【golang面試題】Golang遞歸函數完全指南:從入門到性能優化

引言&#xff1a;遞歸的本質與挑戰 在Golang中&#xff0c;遞歸函數是一把鋒利的雙刃劍。它通過函數自身調用實現問題分解&#xff0c;讓代碼變得簡潔優雅&#xff0c;但也容易因無限遞歸、棧溢出或性能問題讓開發者陷入困境。本文將從基礎到高級&#xff0c;全面解析Golang遞歸…

功能安全和網絡安全的綜合保障流程

摘要網絡物理系統是控制機械部件的計算機化系統。這些系統必須既功能安全又網絡安全。因此&#xff0c;已建立的功能安全與網絡安全標準需求創建網絡安全檔案&#xff08;ACs&#xff09;&#xff0c;以論證系統是功能安全與網絡安全的&#xff0c;即所有功能安全與網絡安全目標…

數據科學首戰:用機器學習預測世界杯冠軍

數據科學首戰&#xff1a;用機器學習預測世界杯冠軍Scikit-learn實戰&#xff1a;從數據清洗到冠軍預測的完整指南一、足球預測&#xff1a;數據科學的終極挑戰??世界杯數據價值??&#xff1a;歷史比賽數據&#xff1a;44,000場球隊特征指標&#xff1a;200球員數據點&…

一個php 連sqlserver 目標計算機積極拒絕,無法連接問題的解決

一個接口查詢數據耗時15秒&#xff0c;還沒數據&#xff0c;經查報錯日志&#xff1a;SQLSTATE[08001]: [Microsoft][ODBC Driver 17 for SQL Server]TCP 提供程序: 由于目標計算機積極拒絕&#xff0c;無法連接。 命令行執行&#xff1a;netstat -ano | findstr :1433發現結…

生成網站sitemap.xml地圖教程

要生成 sitemap.xml 文件&#xff0c;需要通過爬蟲程序抓取網站的所有有效鏈接。以下是完整的解決方案&#xff1a; 步驟 1&#xff1a;安裝必要的 Python 庫 ounter(line pip install requests beautifulsoup4 lxml 步驟 2&#xff1a;創建 Python 爬蟲腳本 (sitemap_genera…

idea拉取新項目第一次啟動報內存溢出(java.lang.OutOfMemoryError: Java heap space)

背景&#xff1a; 新拉取一個項目后&#xff0c;第一次啟動的時候報錯內存溢出&#xff1a; Java 堆內存溢出 (java.lang.OutOfMemoryError: Java heap space) 這個錯誤表示你的 Java 應用程序需要的內存超過了 JVM 堆內存的分配上限。 解決方案 1.增加堆內存大小 啟動應用時添…

安卓雷電模擬器安裝frida調試

1.在模擬器中設置調試root和adb 2.在vscode中安裝autox.js 3.在github上下載auto.js組件 新地址鏈接看來大佬的項目也經歷了波折https://blog.csdn.net/weixin_41961749/article/details/145669531 github地址https://github.com/aiselp/AutoX/releases 將下載的apk放入雷電…

Godot ------ 初級人物血條制作02

Godot ------ 初級人物血條制作02引言正文血條動態顯示引言 在 Godot ------ 初級人物血條制作01 一文中我們介紹了如何構建一個初級血條&#xff0c;但是我們并沒有涉及如何動態顯示血條。本文我們將介紹如何動態顯示血條。 正文 血條動態顯示 首先&#xff0c;我們為當前…

(Python)待辦事項升級網頁版(html)(Python項目)

源代碼&#xff1a; app.py from flask import Flask, render_template, request, redirect, url_for, jsonify import json import osapp Flask(__name__)# 數據存儲文件 DATA_FILE "todos.json"def load_todos():"""從文件加載待辦事項"&q…