【4】WiFi——————ESP8266 SDK编程 之 UDP通信

  1. 简述
    1. UDP介绍请点击此链接-————> TCP/IP协议之————>UDP
    2. UDP分类
      1. udp client   
      2. udp server
    3. 区别
      1. server:不需要建立连接,也不监听,被动的接收消息,客户端发送消息自带IP,回复消息时,需要加对方IP【4】WiFi——————ESP8266 SDK编程 之 UDP通信_第1张图片
      2. 不主动连接,监听端口,任意方设置好目标IP和端口就可以发送数据;双向通信【4】WiFi——————ESP8266 SDK编程 之 UDP通信_第2张图片
    4. ESP有三种工作模式
      1. 0x01: Station 模式  只能连接路由器,不能被其他设备连接,比如用于UDP通信
      2.  0x02: SoftAP 模式  自身是个路由器,可以被其他设备连接
      3.  0x03: Station+SoftAP 模式  即可连接他人,也可被他人连接
  2. 初始化流程
    1. 设置ESP8266工作模式
    2. IP地址设置
      1. 动态IP:默认为DHCP方式
      2. 静态IP:关闭DHCP,设置IP、网关、子网
    3. 设置WIFI用户名/密码
    4. 保存设置信息
    5. ESP8266获取IP地址
    6. 初始化UDP通信网络 
      1. 设置通信协议
      2. 开辟内存
      3. 目标主机IP信息、端口
      4. 注册发送回调函数
      5. 注册接收回调函数
      6. 初始化UDP通信
  3. 例程
    1. 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
      
      }

       

    2. 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_IP.netmask,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]】
      }
      //==============================================================================
      

       

  4. 总结:
    1. 回调函数
  5. 文档资料:
    1. ESP8266 Non-OS SDK API参考
    2. ESP8266 技术参考手册
  6. 工具篇:
    1. 编译器:安信可一体化开发环境(Eclipse),需要安装JAVA环境
    2. 烧录工具:flash_download_tools_v3.6.6.zip
    3. http://wiki.ai-thinker.com/tools
  7. 固件
    1. AT指令:通过串口发送AT指令(串口数据)到ESP8266
    2. SDK编程:8266内部集成了32bit的处理器,通过SDK编程实现所需功能
      1. 分类:带RTOS的SDK和不带RTOS的SDK
    3. SDK版本:ESP8266_NONOS_SDK 2.2.0
  8. 硬件平台
    1. 技新 物联网开发板_ESP8266_V1.0
    2. 安信可 ESP8266模块:ESP12F
      1. 电源:3.3V
      2. 晶振:26Mhz
      3. 外部Flash:4MB = = 32Mbit
      4. 4MB Flash => 0x000 000 ~ 0x3FF FFF
      5. 扇区编号:0x000~0x3FF【Flash扇区 == 4KB】
      6. 外部射频电路:PCB板载天线
  9. 参考资料:
    1. 技新资料:https://www.jixin.pro/bbs/topic/6498
    2. 乐鑫官网:https://www.espressif.com/zh-hans/support/documents/technical-documents?keys=&field_type_tid%5B%5D=14
    3. 安信可官网:www.ai-thinker.com
    4. ESP12F资料:http://wiki.ai-thinker.com/esp8266

你可能感兴趣的:(WIFI,ESP8266)