首页
友链
关于
搜索
1
ESP-IDF 编程笔记(一) Ubuntu20.04开发环境搭建
16 阅读
2
ESP32编程笔记(五)——WIFI
14 阅读
3
ESP32编辑笔记(6)——事件监听
10 阅读
4
ESP32编程笔记(二)新建一个ESP32工程,并输出Hello world
9 阅读
5
ESP32编程笔记(9)——Smartconfig
9 阅读
默认分类
嵌入式
GD32
ESP32
Web
Java
MySQL
其他
登录
/
注册
搜索
标签搜索
ESP32
ChencyCT
累计撰写
18
篇文章
累计收到
0
条评论
首页
栏目
默认分类
嵌入式
GD32
ESP32
Web
Java
MySQL
其他
页面
友链
关于
搜索到
9
篇与
的结果
2024-02-28
问题解决-esp-idf编译报错undefined reference to ‘app_main‘
新建idf工程,编译报错如下。解决方法在.C文件的同级目录的CMakeLists.txt文件里面添加函数register_component()即可解决错误。
2024年02月28日
3 阅读
0 评论
0 点赞
2024-02-28
ESP32烧录问题
make flash提示A fatal error occurred: Invalid head of packet (0x80)解决方式:make menuconfig设置波特率为115200。保存在make flash就可以了
2024年02月28日
2 阅读
0 评论
0 点赞
2024-02-27
ESP32编程笔记(9)——Smartconfig
前言随着智能家居,物联网的兴起,越来越多的设备需要连接家庭wifi网络。而WIFI网络的接入是需要知道无线路由器的SSID和密码。大部分的设备是没有输入接口的,在设备中预置WIFI的SSID和密码是不现实的,为了解决这个问题,smartconfig配网方式应运而生。ESP8266,ESP32使用了ESP-Touch协议,采用的是Smartconfig(快连)技术。当前设备没有和其他设备建立任何实际连接状态下,使用smartconfig一键配置该设备接入WIFI。smartconfig只需要通过手机UDP发送报文,设备扫描可用无线信道,找到smartconfig的报文,并锁定在这一信道上开始接收数据。使用smartconfig配网只需要以下3个步骤设备初始化,开始监听smartconfig报文数据手机设置wifi的SSID和密码后,发送UDP广播设备获得报文,配置网络,接入WIFI。代码说明头文件#include "esp_smartconfig.h使用 esp_smartconfig_start() 函数配置 smartconfig并开始等待smartconfig报文数据。esp_err_t esp_smartconfig_start(const smartconfig_start_config_t *config)配置完成后使用 esp_err_t esp_smartconfig_stop() 函数停止smartconfig实例代码还是有点问题,先水一篇文章吧。#include <stdio.h> #include <string.h> #include "esp_system.h" #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "freertos/event_groups.h" #include "esp_event.h" #include "esp_log.h" #include "nvs_flash.h" #include "esp_netif.h" #include "esp_wifi.h" #include "esp_smartconfig.h" #include "lwip/sockets.h" #define TCP_SERVER "192.168.8.104" const char *TAG="smartconfig"; static void System_Init(void); static void WiFi_init(void); static void event_handler(void *arg, esp_event_base_t event_base, int32_t event_id, void *data); static void smartconfig_task(void); void app_main(){ System_Init(); WiFi_init(); } static void smartconfig_task(void){ ESP_ERROR_CHECK(esp_smartconfig_set_type(SC_TYPE_ESPTOUCH)); smartconfig_start_config_t cnf = SMARTCONFIG_START_CONFIG_DEFAULT(); ESP_ERROR_CHECK(esp_smartconfig_start(&cnf)); while(1){ vTaskDelay(500 / portTICK_PERIOD_MS); } } static void event_handler(void *arg, esp_event_base_t event_base, int32_t event_id, void *data){ if(event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_START){ ESP_LOGI(TAG, "wifi start"); ESP_LOGI(TAG,"smartconfig"); xTaskCreate(smartconfig_task,"task1",4096,NULL,3,NULL); }else if(event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_DISCONNECTED){ ESP_LOGI(TAG,"wifi disconnected, retry"); esp_wifi_connect(); }else if(event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP){ ESP_LOGI(TAG, "got ip"); ip_event_got_ip_t *event = (ip_event_got_ip_t *)data; ESP_LOGI(TAG,"got ip:"IPSTR,IP2STR(&event->ip_info.ip)); }else if(event_base == SC_EVENT && event_id == SC_EVENT_FOUND_CHANNEL){ ESP_LOGI(TAG,"sc found channel"); }else if(event_base == SC_EVENT && event_id == SC_EVENT_SCAN_DONE){ ESP_LOGI(TAG,"sc done"); }else if(event_base == SC_EVENT && event_id == SC_EVENT_GOT_SSID_PSWD){ ESP_LOGI(TAG,"sc got SSID and PWD"); smartconfig_event_got_ssid_pswd_t *evt = (smartconfig_event_got_ssid_pswd_t *)data; wifi_config_t cnf; bzero(&cnf,sizeof(wifi_config_t)); memcpy(cnf.sta.ssid, evt->ssid,sizeof(cnf.sta.ssid)); memcpy(cnf.sta.password, evt->password,sizeof(cnf.sta.password)); cnf.sta.bssid_set = evt->bssid_set; if(cnf.sta.bssid_set == true){ memcpy(cnf.sta.bssid,evt->bssid,sizeof(cnf.sta.bssid)); } ESP_LOGI(TAG,"GOT SSID: %s", evt->ssid); ESP_LOGI(TAG,"GOT PWD: %s",evt->password); esp_wifi_disconnect(); esp_wifi_set_config(WIFI_IF_STA, &cnf); esp_wifi_connect(); } } static void System_Init(void){ 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(ret); ret = nvs_flash_init(); } ESP_ERROR_CHECK(ret); } static void WiFi_init(void){ ESP_ERROR_CHECK(esp_netif_init()); ESP_ERROR_CHECK(esp_event_loop_create_default()); esp_netif_create_default_wifi_sta(); esp_event_handler_instance_t esp_any_id; esp_event_handler_instance_t esp_ip_id; esp_event_handler_instance_t esp_sc_id; ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT,ESP_EVENT_ANY_ID,event_handler,NULL,&esp_any_id)); ESP_ERROR_CHECK(esp_event_handler_instance_register(IP_EVENT,IP_EVENT_STA_GOT_IP,event_handler,NULL,&esp_ip_id)); ESP_ERROR_CHECK(esp_event_handler_instance_register(SC_EVENT,ESP_EVENT_ANY_ID,event_handler,NULL,&esp_sc_id)); wifi_init_config_t cnf = WIFI_INIT_CONFIG_DEFAULT(); ESP_ERROR_CHECK(esp_wifi_init(&cnf)); ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA)); ESP_ERROR_CHECK(esp_wifi_start()); ESP_ERROR_CHECK(esp_event_handler_instance_unregister(WIFI_EVENT,ESP_EVENT_ANY_ID,&esp_any_id)); ESP_ERROR_CHECK(esp_event_handler_instance_unregister(IP_EVENT,IP_EVENT_STA_GOT_IP,&esp_ip_id)); ESP_ERROR_CHECK(esp_event_handler_instance_unregister(SC_EVENT,ESP_EVENT_ANY_ID,&esp_sc_id)); } 运行结果
2024年02月27日
9 阅读
0 评论
0 点赞
2024-02-22
ESP32编程笔记(8)——TCP client
TCP客户端通信流程使用socket函数创建一个socketint sock = socket(AF_INET, SOCK_STREAM,0);设置服务端ip地址和端口 struct sockaddr_in sock_addr; sock_addr.sin_addr.s_addr=inet_addr(TCP_SERVER_ADDRESS); sock_addr.sin_family=AF_INET; sock_addr.sin_port = htons(7789);连接服务器 int err = connect(sock,(struct sockaddr_in*)&sock_addr, sizeof(sock_addr));收发数据int len = recv(sock,rx_buffer,sizeof(rx_buffer),0); if(len < 0){ ESP_LOGE(TAG,"recv failed: %d",len); break; }else{ memset(rx_buffer,0,sizeof(rx_buffer)); ESP_LOGI(TAG, "received %d bytes from %s",len, TCP_SERVER_ADDRESS); printf("%s\n",rx_buffer); } int err = send(sock,payload,strlen(payload),0); if(err < 0){ ESP_LOGE(TAG, "send error: %d",err); }关闭连接close(sock)实例有点小问题,esp32无法打印接收的数据内容#include <string.h> #include <stdio.h> #include "esp_system.h" #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "freertos/event_groups.h" #include "esp_event.h" #include "esp_log.h" #include "nvs_flash.h" #include "esp_wifi.h" #include "sys/socket.h" #include "lwip/netdb.h" #define TCP_SERVER_ADDRESS "192.168.8.104" const static char* TAG = "TCP"; static int retry_times = 0; char* payload ="this is esp32"; static void System_Iniit(void); static void WiFi_Init(void); static void event_handler(void *arg,esp_event_base_t event_base,int32_t event_id,void *data); static void TCP_Client_Task(void); void app_main(){ System_Iniit(); WiFi_Init(); } static void TCP_Client_Task(void){ char rx_buffer[128]; struct sockaddr_in sock_addr; sock_addr.sin_addr.s_addr=inet_addr(TCP_SERVER_ADDRESS); sock_addr.sin_family=AF_INET; sock_addr.sin_port = htons(7789); int sock = socket(AF_INET, SOCK_STREAM,0); if(sock < 0){ ESP_LOGE(TAG,"create socket failed"); close(sock); return; } ESP_LOGI(TAG,"socket created"); int err = connect(sock,(struct sockaddr_in*)&sock_addr, sizeof(sock_addr)); if(err < 0){ ESP_LOGE(TAG, "Socket unable to connected : %d",err); close(sock); return; } while(1){ int len = recv(sock,rx_buffer,sizeof(rx_buffer),0); if(len < 0){ ESP_LOGE(TAG,"recv failed: %d",len); break; }else{ memset(rx_buffer,0,sizeof(rx_buffer)); ESP_LOGI(TAG, "received %d bytes from %s",len, TCP_SERVER_ADDRESS); printf("%s\n",rx_buffer); } int err = send(sock,payload,strlen(payload),0); if(err < 0){ ESP_LOGE(TAG, "send error: %d",err); } } } static void event_handler(void *arg,esp_event_base_t event_base,int32_t event_id,void *data){ if(event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_START){ ESP_LOGI(TAG, "wifi event sta start"); esp_wifi_connect(); }else if(event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_DISCONNECTED){ if(retry_times < 3){ ESP_LOGI(TAG, "wifi event sta disconnected"); ESP_LOGI(TAG,"retry ..."); esp_wifi_connect(); retry_times++; } }else if(event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_CONNECTED){ ESP_LOGI(TAG ,"wifi connected"); }else if(event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP){ retry_times = 0; ip_event_got_ip_t* event = (ip_event_got_ip_t*)data; ESP_LOGI(TAG,"got ip: "IPSTR,IP2STR(&event->ip_info.ip)); xTaskCreate(TCP_Client_Task,"task1",4096,NULL,4,NULL); } } static void System_Iniit(void){ ESP_LOGI(TAG,"system init"); esp_err_t ret = nvs_flash_init(); if(ret == ESP_ERR_NVS_NEW_VERSION_FOUND || ret == ESP_ERR_NVS_NO_FREE_PAGES){ ESP_ERROR_CHECK(ret); ret = nvs_flash_init(); } ESP_ERROR_CHECK(ret); } static void WiFi_Init(void){ ESP_LOGI(TAG,"WiFi init"); ESP_ERROR_CHECK(esp_event_loop_create_default()); esp_netif_create_default_wifi_sta(); esp_netif_init(); //ESP_ERROR_CHECK(esp_netif_create_default_wifi_sta()); esp_event_handler_instance_t esp_any_id; esp_event_handler_instance_t esp_ip_id; ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT,ESP_EVENT_ANY_ID,&event_handler,NULL,&esp_any_id)); ESP_ERROR_CHECK(esp_event_handler_instance_register(IP_EVENT,IP_EVENT_STA_GOT_IP,&event_handler,NULL,&esp_ip_id)); wifi_init_config_t cnf = WIFI_INIT_CONFIG_DEFAULT(); ESP_ERROR_CHECK(esp_wifi_init(&cnf)); wifi_config_t cof = { .sta = { .ssid="你的wifi ssid", .password = "你的wifi 密码", .threshold.authmode=WIFI_AUTH_WPA2_PSK } }; ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA)); ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_STA, &cof)); ESP_ERROR_CHECK(esp_wifi_start()); ESP_ERROR_CHECK(esp_event_handler_instance_unregister(WIFI_EVENT,ESP_EVENT_ANY_ID,&esp_any_id)); ESP_ERROR_CHECK(esp_event_handler_instance_unregister(IP_EVENT,IP_EVENT_STA_GOT_IP,&esp_ip_id)); }运行结果
2024年02月22日
3 阅读
0 评论
0 点赞
2024-02-21
ESP32编程笔记(7)——UDP通讯
UDP简介UDP是无连接的,即发送数据之前不需要建立连接UDP没有拥塞控制,因此网络出现的拥塞不会使源主机的发送速率降低。UDP支持一对一、一对多、多对一、多对多的交互通信。UDP的首部开销小,只有8字节,比TCP的还要短。流程创建socket使用socket()函数创建socket套接字发送数据使用sendto()函数向目标主机发送数据接收数据使用recvfrom()接收数据,如果没有接收到数据,程序会一直阻塞到这里。socket(套接字)实质上提供了进程通信的端点,进程通信之前,双方首先必须建立各自的端点,否则是没有办法通信的,通过socket将ip地址和端口绑定之后,客户端就可以和服务器通信了。当我们访问套接字时,需要访问文件一样使用 文件描述符int socket(int domain,int type,int product) 参数: domain:通信域,确定通讯特性,包括地址格式 | 域 | 描述 | | AF_INET | ipv4因特网域 | | AF_INET6 | ipv6因特网域 | | AF_UNIX | UNIX域 | | AF_UNSPEC | 未指定 | type:套接字类型 | type | 描述 | | SOCK_DGRAM | 长度固定的,无连接的不可靠报文输出 | | SOCK_RAW | ip协议的数据端口 | | SOCK_SEQPACKET | 长度固定,有序,可靠面向连接报文传递 | | SOCK_STREAM | 有序,可靠,双向的面向连接的字节流| protocol:执行相应的传输协议,也就是诸如TCP或UDP协议等等,系统系统对每一个协议簇类型提供了一个默认的协议,我们通过把protocol设置为0来使用这个默认的值。 返回值: 成功返回套接字文件描述符。 失败返回-1.ip地址在socket程序设计中struct sockaddr_in(或者struct sockaddr)用于记录网络地址。struct sockaddr_in{ short sin_family; //协议簇 unsigned short int sin_port; //端口号 struct in_addr sin_addr; //协议簇特定地址 ip地址 uunsigned char sin_zero; //0 } typedef struct in_addr{ union{ struct{ unsigned char s_b1; s_b2; s_b3; s_b4; }S_un_b; struct{ unsigned short s_w1; s_w2; }S_un_w; unsigned long s_addr; }S_un }IN_ADDRip地址通常由数字加点(192.168.1.1)的形式表示,而在struct in_addr中的ip地址是由32位的整数来表示的,为了转换我们可以使用两个函数int inet_aton(const char *cp, struct in_addr *inp) char *inet_ntoa(struct in_addr in) inet_aton是将a.b.c.d形式的ip转换为32位的ip,存储在inp指针里 inet_ntoa是将32位的ip地址转换为a.b.c.d的形式。不同类型的CPU对变量得到字节存储顺序可能不同,有的系统可能是高位在前,低位在后,而有的系统是低位在前,高位在后,而网络传输的数据顺序一定是统一的,所以当内部字节存储顺序和网络字节序不同时,一定要进行转换。 网络序都是大端htons把unsigned short类型从主机序转换为网络序htonl把unsigned long类型从主机序转换为网络序ntons把unsigned short类型从网络序转换为主机序ntol把unsigned long类型从网络序转换为主机序实例#include <stdio.h> #include <string.h> #include "esp_system.h" #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "freertos/event_groups.h" #include "esp_event.h" #include "esp_log.h" #include "nvs_flash.h" #include "esp_wifi.h" #include "esp_netif.h" #include "sys/socket.h" #include "netinet/in.h" #include <lwip/netdb.h> static const char* TAG = "UDP"; const char *payload = "this is from esp32"; static void System_Init(void); static void WiFi_Init(void); static void event_handler(void *arg,esp_event_base_t event_base, int32_t event_id, void *data); void create_udp_clent(void); void app_main(){ System_Init(); WiFi_Init(); } void create_udp_clent(){ char rx_buf[128]; struct sockaddr_in socket_addr; socket_addr.sin_addr.s_addr = inet_addr("192.168.8.104"); socket_addr.sin_family = AF_INET; socket_addr.sin_port = htons(7778); int sock = socket(AF_INET, SOCK_DGRAM,0); if(sock < 0){ ESP_LOGE(TAG, "Unable to create socket"); close(sock); return;; } ESP_LOGI(TAG,"socket cerated"); while(1){ int err = sendto(sock, payload,strlen(payload),0, (struct sockaddr *)&socket_addr, sizeof(socket_addr)); if(err < 0){ ESP_LOGI(TAG, "sendto error"); close(sock); break; } ESP_LOGI(TAG,"message send"); struct sockaddr_in source_addr; socklen_t socklen = sizeof(source_addr); memset(rx_buf,0,sizeof(rx_buf)); int len = recvfrom(sock,rx_buf,sizeof(rx_buf),0,(struct sockaddr*)&source_addr,&socklen); if(len <0){ ESP_LOGE(TAG, "recvfrom failed"); close(sock); break; }else{ rx_buf[len] = 0; ESP_LOGI(TAG,"recv: %s",rx_buf); } //vTaskDelay(500/ portTICK_PERIOD_MS); } vTaskDelete(NULL); } static void event_handler(void *arg,esp_event_base_t event_base, int32_t event_id, void *data){ if(event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_START){ ESP_LOGI(TAG, "wifi start"); esp_wifi_connect(); }else if(event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_DISCONNECTED){ ESP_LOGI(TAG,"wifi event sta disconnected"); esp_wifi_connect(); }else if(event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_CONNECTED){ ESP_LOGI(TAG,"wifi event connect"); }else if(event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP){ retry_times = 0; ip_event_got_ip_t* event = (ip_event_got_ip_t*)data; ESP_LOGI(TAG, "got ip:" IPSTR,IP2STR(&event->ip_info.ip)); xTaskCreate(&create_udp_clent,"task1",4096,NULL,3,NULL); } } static void System_Init(){ esp_err_t ret = nvs_flash_init(); if(ret == ESP_ERR_NVS_NEW_VERSION_FOUND || ret == ESP_ERR_NVS_NO_FREE_PAGES){ ESP_ERROR_CHECK(ret); ret = nvs_flash_init(); } ESP_ERROR_CHECK(ret); } static void WiFi_Init(){ ESP_ERROR_CHECK(esp_netif_init()); ESP_ERROR_CHECK(esp_event_loop_create_default()); esp_netif_create_default_wifi_sta(); esp_event_handler_instance_t esp_any_id; esp_event_handler_instance_t esp_ip_id; ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT,ESP_EVENT_ANY_ID,&event_handler,NULL,&esp_any_id)); ESP_ERROR_CHECK(esp_event_handler_instance_register(IP_EVENT,IP_EVENT_STA_GOT_IP,&event_handler,NULL,&esp_ip_id)); wifi_init_config_t cnf = WIFI_INIT_CONFIG_DEFAULT(); ESP_ERROR_CHECK(esp_wifi_init(&cnf)); ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA)); wifi_config_t cof = { .sta = { .ssid = "", .password="", .threshold.authmode=WIFI_AUTH_WPA2_PSK } }; ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_STA, &cof)); ESP_ERROR_CHECK(esp_wifi_start()); ESP_ERROR_CHECK(esp_event_handler_instance_unregister(WIFI_EVENT,ESP_EVENT_ANY_ID,&esp_any_id)); ESP_ERROR_CHECK(esp_event_handler_instance_unregister(IP_EVENT,IP_EVENT_STA_GOT_IP,&esp_ip_id)); } 运行结果** 网络调试助手获取 **
2024年02月21日
8 阅读
0 评论
0 点赞
1
2