admin管理员组文章数量:1620366
- 简述
- UDP介绍请点击此链接-————> TCP/IP协议之————>UDP
- UDP分类
- udp client
- udp server
- 区别
- server:不需要建立连接,也不监听,被动的接收消息,客户端发送消息自带IP,回复消息时,需要加对方IP
- 不主动连接,监听端口,任意方设置好目标IP和端口就可以发送数据;双向通信
- ESP有三种工作模式
- 0x01: Station 模式 只能连接路由器,不能被其他设备连接,比如用于UDP通信
- 0x02: SoftAP 模式 自身是个路由器,可以被其他设备连接
- 0x03: Station+SoftAP 模式 即可连接他人,也可被他人连接
- 初始化流程
- 设置ESP8266工作模式
- IP地址设置
- 动态IP:默认为DHCP方式
- 静态IP:关闭DHCP,设置IP、网关、子网
- 设置WIFI用户名/密码
- 保存设置信息
- ESP8266获取IP地址
- 初始化UDP通信网络
- 设置通信协议
- 开辟内存
- 目标主机IP信息、端口
- 注册发送回调函数
- 注册接收回调函数
- 初始化UDP通信
- 例程
- user_main.c
void ICACHE_FLASH_ATTR user_init(void) { u8 F_Led = 0; //Led状态标志位 u8 led_count; //led闪烁计数 uart_init(115200,115200); //设置串口1,串口2波特率为115200 os_printf("\r\n--------------------------------------------\r\n"); os_printf("SPT SDK Project: %s \r\n", ProjectName); //打印项目名称 os_printf("SPT SDK version: %s \r\n", system_get_sdk_version()); //打印版本信息 os_printf("\r\n--------------------------------------------\r\n"); // OLED显示初始化 //-------------------------------------------------------- OLED_Init(); // OLED初始化 OLED_ShowString(0,0,"ESP8266 = STA"); // ESP8266模式 OLED_ShowString(0,2,"IP:"); // ESP8266_IP地址 OLED_ShowString(0,4,"Remote = STA"); // 远端主机模式 OLED_ShowString(0,6,"IP:"); // 远端主机IP地址 //-------------------------------------------------------- LED_Init(); //led初始化 ESP8266_STA_Init_UDP(); //UDP初始化 OS_Timer1_Init_UDP(1000, 1); //软件定时器,1S调用次回调函数,检查有没有连接到WiFi }
- user_udp.c
// 头文件引用 //============================================================================== #include "driver/oled.h" //oled屏 #include "driver/user_udp.h" #include "driver/led.h" //============================================================================== // 宏定义 //============================================================================= os_timer_t os_timer_1; //定时器,回调用 struct espconn UDP_NetCon; //网络连接结构体 //============================================================================= // UDP相关函数 //============================================================================== //esp8266初始化,自动分配IP,连接路由器 void ICACHE_FLASH_ATTR ESP8266_STA_Init_UDP(void) { struct station_config STA_Config; //STA 参数结构体 struct ip_info ST_ESP8266_IP; //STA信息结构体 //STA模式下的IP地址,默认开启DHCP,接入WiFi自动分配IP wifi_set_opmode(0x01); //设置为STA模式,并保存到Flash /* // 设置STA模式下的IP地址【ESP8266默认开启DHCP Client,接入WIFI时会自动分配IP地址】 //-------------------------------------------------------------------------------- wifi_station_dhcpc_stop(); // 关闭 DHCP Client IP4_ADDR(&ST_ESP8266_IP.ip,192,168,8,88); // 配置IP地址 IP4_ADDR(&ST_ESP8266_IP.gw,192,168,8,1); // 配置网关地址 IP4_ADDR(&ST_ESP8266_IPmask,255,255,255,0); // 配置子网掩码 wifi_set_ip_info(STATION_IF,&ST_ESP8266_IP); // 设置STA模式下的IP地址 */ //结构体赋值,配置STA模式参数 os_memset(&STA_Config, 0, sizeof(struct station_config)); //sta参数结构体=0; os_strcpy(STA_Config.ssid, ESP8266_STA_SSID); //配置wifi名 os_strcpy(STA_Config.password, ESP8266_STA_PASS); //配置wifi密码 wifi_station_set_config(&STA_Config); //设置sta参数,并保存到flash } //发送网络数据的回调函数 void ICACHE_FLASH_ATTR EP8266_STA_UDP_Send_cb(void *arg) { os_printf("\r\nESP8266 WiFi 发送成功\r\n"); } //接收网络数据的回调函数 void ICACHE_FLASH_ATTR EP8266_STA_UDP_Rcev_cb(void *arg, char *pusrdata, unsigned short length) { struct espconn *pesp_conn = arg; //缓存网络连接结构体指针 remot_info *premot = NULL; //定义远端连接信息指针 os_printf("\nESP8266_Receive_Data = %s\n",pusrdata); // 串口打印接收到的数据 if (espconn_get_connection_info(pesp_conn, &premot, 0) == ESPCONN_OK) //获取远端IP、端口信息 { pesp_conn->proto.udp->remote_port = premot->remote_port; //获取对方端口号 pesp_conn->proto.udp->remote_ip[0] = premot->remote_ip[0]; //获取对方IP地址 pesp_conn->proto.udp->remote_ip[1] = premot->remote_ip[1]; pesp_conn->proto.udp->remote_ip[2] = premot->remote_ip[2]; pesp_conn->proto.udp->remote_ip[3] = premot->remote_ip[3]; } //液晶屏IP地址显示 //-------------------------------------------------------------------------------- OLED_ShowIP(24, 6, pesp_conn->proto.udp->remote_ip); //显示远端主机IP地址 //-------------------------------------------------------------------------------- espconn_send(pesp_conn, pusrdata, os_strlen(pusrdata)); //向对方发送应答 } //初始化网络通信udp void ICACHE_FLASH_ATTR ESP8266_STA_NetConnect_UDP(void) { //结构体赋值 //-------------------------------------------------------------------------------- UDP_NetCon.type = ESPCONN_UDP; //通信协议设置为UDP UDP_NetCon.proto.udp = (esp_udp *)os_zalloc(sizeof(esp_udp)); //开辟内存 //设置目标IP、端口,ESP8266作为Client,需要预先知道Server的IP、端口 UDP_NetCon.proto.udp->local_port = 6354; //设置本地端口 UDP_NetCon.proto.udp->remote_port = 6354; //设置目标端口 UDP_NetCon.proto.udp->remote_ip[0] = 192; //目标IP地址 UDP_NetCon.proto.udp->remote_ip[1] = 168; UDP_NetCon.proto.udp->remote_ip[2] = 0; UDP_NetCon.proto.udp->remote_ip[3] = 103; //注册回调函数 espconn_regist_sentcb(&UDP_NetCon, EP8266_STA_UDP_Send_cb); //注册网络数据发送成功的回调函数 espconn_regist_recvcb(&UDP_NetCon, EP8266_STA_UDP_Rcev_cb); //注册网络数据接收成功的回调函数 //建立UDP传输 espconn_create(&UDP_NetCon); //主动向UDP_Server发送信息 espconn_send(&UDP_NetCon, "Hi,WiFi", os_strlen("Hi,WiFi")); //向对方发送消息 } //============================================================================== //软件定时器 //软件定时的回调函数 void ICACHE_FLASH_ATTR os_timer1_cb(void) { u8 led_count; //led闪烁计数 struct ip_info STA_ESP8266_IP; //ip信息 u8 ESP8266_IP[4]; //存放8266的IP地址 //接入成功,自动分配IP, if(wifi_station_get_connect_status() == STATION_GOT_IP) { wifi_get_ip_info(STATION_IF, &STA_ESP8266_IP); //获取STA的IP信息 ESP8266_IP[0] = STA_ESP8266_IP.ip.addr; // IP地址高八位 == addr低八位 ESP8266_IP[1] = STA_ESP8266_IP.ip.addr>>8; // IP地址次高八位 == addr次低八位 ESP8266_IP[2] = STA_ESP8266_IP.ip.addr>>16; // IP地址次低八位 == addr次高八位 ESP8266_IP[3] = STA_ESP8266_IP.ip.addr>>24; // IP地址低八位 == addr高八位 //oled上显示IP地址 //----------------------------------------------------------------------------------------------- os_printf("ESP8266_IP = %d.%d.%d.%d\n",ESP8266_IP[0],ESP8266_IP[1],ESP8266_IP[2],ESP8266_IP[3]); OLED_ShowIP(24,2,ESP8266_IP); // OLED显示ESP8266的IP地址 //----------------------------------------------------------------------------------------------- //接入WIFI成功,led快闪3次 for(led_count = 0; led_count<6; led_count++ ) { LED_ON; os_delay_ms(100); LED_OFF; os_delay_ms(100); } os_timer_disarm(&os_timer_1); //入网成功,关闭定时器 ESP8266_STA_NetConnect_UDP(); //建立UDP连接 } } //软件定时器,1S调用次回调函数,检测设备有无连接到WiFi void ICACHE_FLASH_ATTR OS_Timer1_Init_UDP(u32 ms, bool flag) { //关闭软件定时器 os_timer_disarm(&os_timer_1); //设置定时器 //参数1:设置的定时器 //参数2:回调函数,需要强制类型转换 //参数3:回调函数参数 os_timer_setfn(&os_timer_1, (os_timer_func_t *)os_timer1_cb, NULL); //启动定时器 //参数1:使能的定时器 //参数2:定时时长 //参数3:1重复,0只用一次 os_timer_arm(&os_timer_1, ms, flag); // 【如未调用system_timer_reinit,可支持范围:[5ms ~ 6,870,947ms]】 // 【如果调用system_timer_reinit,可支持范围:[100ms ~ 428,496 ms]】 } //==============================================================================
- user_main.c
- 总结:
- 回调函数
- 文档资料:
- ESP8266 Non-OS SDK API参考
- ESP8266 技术参考手册
- 工具篇:
- 编译器:安信可一体化开发环境(Eclipse),需要安装JAVA环境
- 烧录工具:flash_download_tools_v3.6.6.zip
- http://wiki.ai-thinker/tools
- 固件
- AT指令:通过串口发送AT指令(串口数据)到ESP8266
- SDK编程:8266内部集成了32bit的处理器,通过SDK编程实现所需功能
- 分类:带RTOS的SDK和不带RTOS的SDK
- SDK版本:ESP8266_NONOS_SDK 2.2.0
- 硬件平台
- 技新 物联网开发板_ESP8266_V1.0
- 安信可 ESP8266模块:ESP12F
- 电源:3.3V
- 晶振:26Mhz
- 外部Flash:4MB = = 32Mbit
- 4MB Flash => 0x000 000 ~ 0x3FF FFF
- 扇区编号:0x000~0x3FF【Flash扇区 == 4KB】
- 外部射频电路:PCB板载天线
- 参考资料:
- 技新资料:https://www.jixin.pro/bbs/topic/6498
- 乐鑫官网:https://www.espressif/zh-hans/support/documents/technical-documents?keys=&field_type_tid%5B%5D=14
- 安信可官网:www.ai-thinker
- ESP12F资料:http://wiki.ai-thinker/esp8266
版权声明:本文标题:【4】WiFi——————ESP8266 SDK编程 之 UDP通信 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/dianzi/1728818447a1175168.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论