UDP 通信

今天讲一下如何用ESP和电脑进行UDP通信;废话不多说,直接上主题
在前面我已经讲述了如何去配置ESP作为station模式,现在讲一下station+ap模式UDP 通信_第1张图片
这个函数就是用来设置我们的station+ap模式的。这里有一个参数,这个参数就是一个struct softap_config的结构体,现在我们来看看这个结构体;
UDP 通信_第2张图片
ssid是你的ESP的名字,password是你的ESP的密码,ssid_len是你的ESP的名字的长度,channel是你的ESP的设置的通道,authmode是你要设置的WiFi的加密方式,ssid_hidden是你是否要进行隐藏ESP的热点,max_connection是你的ESP最多可以有几个station连进来,beacon_initerval(信标,这里一般默认是100)。
配置好这些参数我们就可以调用wifi_softap_set_config()这个函数了;

好了配置好ap,(因为前面已经讲述如何配置station,所以不在重复);
接下来就是设置udp通信,因为要和电脑进行通信,我们先要下载一个网络串口助手(我放在附件中了).然后,我们让我们的ESP作为接受端就是从机,让电脑作为主机,就是让ESP去链接电脑,在以前已经讲述了如何去判断链接上电脑的热点,现在在链接上电脑以后,我们开始发送udp广播;UDP 通信_第3张图片
这个就是设置udp的函数,在这里我们选择的是0x03;
选择好以后,我们还需要配置我们的udp的接口;UDP 通信_第4张图片
图片中有一个espconn_create()函数,它有一个参数,UDP 通信_第5张图片
struct espconn这个结构体,下面我们来配置这个结构体;
UDP 通信_第6张图片
type我们选择的是udp模式,然后我们去配置一个proto共同体,UDP 通信_第7张图片
remote_port是你的链接的WiFi的端口号,local 是你的ESP的端口号,remote_ip是你要连接的WiFi的ip地址;lcoal_ip是你自己的ip地址
配置完这些以后,我们调用相应的函数去初始化他,就是上边的那个espconn_create()函数,我们还需要注册两个回调函数,
UDP 通信_第8张图片
这个是配置你的接受数据的回调函数,一个参数就是刚才设置的那个struct espconn结构体一个是你的回调函数的名字;
同理设置一下发送的回调函数;UDP 通信_第9张图片

注册好回调函数,我们就去写一下这两个函数;发送的就让他定时去发送数据就好,接受的就让他接受到数据以后再去打印出来就好;
UDP 通信_第10张图片
在这里我们在发送的回调函数中还去配置了一个定时器的回调函数(定时器的中断服务函数);让他去定时打印他自己的Mac地址
UDP 通信_第11张图片

配置这些一些,我们就可以进udp通信了
上结果图

;

UDP 通信_第12张图片

终于好了,吃饭去.

差点忘了贴代码

///*
// * user_main.c
// *
// * Created on: 2015年6月9日
// * Author: zailushang
// */

include “driver/uart.h”

include “user_main.h”

ETSTimer Timer;//定时器的一个结构体参数
ETSTimer TestTimer;
struct espconn espconn_construction;
void ICACHE_FLASH_ATTR send_servery(void)
{
char hwaddr[6];//
char DeviceBuffer[40]={0};
wifi_get_macaddr(STATION_IF,hwaddr);//这个是获取WiFi的MAC地址
os_sprintf(DeviceBuffer,”设备MAC地址为”MACSTR”!!\r\n”,MAC2STR(hwaddr));
espconn_sent(&espconn_construction,DeviceBuffer,os_strlen(DeviceBuffer));//发送数据;
}
void ICACHE_FLASH_ATTR sent_service(void *arg)
{
os_printf(“\r\n UDP 发送成功!\r\n”);
os_timer_disarm(&TestTimer);
os_timer_setfn(&TestTimer,send_servery,NULL);//隔一段时间去发送一个MAC地址
os_timer_arm(&TestTimer,2000,NULL);
}
void ICACHE_FLASH_ATTR recv_service(void *arq,char *pdata,unsigned short length)
{
os_printf(“UDP 已经接受到数据:%s”,pdata);//将接收到的数据发送出去
}
void ICACHE_FLASH_ATTR Wifi_conned(void *arg)
{
static uint8 count=0;//记录不成功的次数
uint8 status;//记录连接状态
os_timer_disarm(&Timer);//将定时器关闭
count++;
status=wifi_station_get_connect_status();//获得连接的状态
if(status == STATION_GOT_IP)
{
os_printf(“Wifi Connected successfully”);//如果成功打印信息
wifi_set_broadcast_if(0x03);
espconn_construction.type = ESPCONN_UDP;
espconn_construction.proto.udp->remote_port = 1112;//这个是你要与主机相连接的的端口号
espconn_construction.proto.udp->local_port = 2525;//这个是你自己的端口号
os_memcpy(&(espconn_construction.proto.udp->remote_ip),”255,255,255,255”,os_strlen(“255,255,255,255”));
espconn_regist_sentcb(&espconn_construction,sent_service);//这个是注册你的发送回调函数
espconn_regist_recvcb(&espconn_construction,recv_service);//这个是注册你的接收回调函数
espconn_create(&espconn_construction);//创建连接
send_servery();//发送一次数据
}
else
{
if(count>=7)
{
os_printf(“Wifi Connected failly”);//如果查看了7次还没连接上的话,就打印连接失败
}
}
os_timer_arm(&connect_timer,2000,NULL);
}
void ICACHE_FLASH_ATTR scan_done(void *arg,STATUS status)
{
uint8 ssid[33];//WiFi名字的一个数组
struct station_config stationConf;//这个station的一个配置的结构体
if(status == OK)//如果状态是NULL
{
struct bss_info bss_link = (struct bss_info )arg;//将其强制转换成bss_inf的结构体
bss_link = bss_link->next.stqe_next;//bss_info之指向下一个wifi
while(bss_link != NULL)
{
os_memset(ssid,0,33);//初始化ssid这个是数组
if(os_strlen(bss_link->ssid)<= 33)//名字下小于33
{
os_memcpy(ssid,bss_link->ssid,os_strlen(bss_link->ssid));//直接copy过去
}
else
{
os_memcpy(ssid,bss_link->ssid,33);//大于33只将前33个字copy过去
}
os_printf(“+CWLAP:(%d,\”%s\”,%d,\”“MACSTR”\”,%d)\r\n”,
bss_link->authmode,ssid,bss_link->rssi,
MAC2STR(bss_link->bssid),bss_link->channel);//打印输出获得WiFi的各个参数
bss_link = bss_link->next.stqe_next;//指向下一个wifi
}
os_memcpy(&stationConf.ssid,”HelloWord”,os_strlen(“HelloWord”));//配置你要连接的WiFi的名字
os_memcpy(&stationConf.password,”0123456789”,os_strlen(“0123456789”));//你要连接的WiFi的密码
wifi_station_set_config(&stationConf);//配置你刚才设置的wifi配置
wifi_station_connect();//连接那个wifi
os_timer_disarm(&Timer);//不使能定时器
os_timer_setfn(&Timer,Wifi_conned,NULL);//将回调函数绑定
os_timer_arm(&Timer,2000,NULL);//初始化定时器的时间以及使能定时器
}

}
void to_scan(void)
{
wifi_station_scan(NULL,scan_done);//扫描WiFi函数
}
void user_init()
{
uint8 mode=0;

struct softap_config SoftAP_configtion;//这个是AP+STATION模式的结构体

uart_init(115200,115200);//初始化串口(波特率是115200);
mode = wifi_get_opmode();//获得当前的模式
os_printf("当前的工作模式是:%d\r\n",mode);//打印出来
wifi_set_opmode(0x03);//设置成station模式
mode = wifi_get_opmode();//获得当前模式
os_printf("当前工作模式是:%d\r\n",mode);//打印出模式看看是否设置成功了没
os_memcpy(&SoftAP_configtion.ssid,"ESP8266",os_strlen("ESP8266"));//这个是设置你的ESP的名字
os_memcpy(&SoftAP_configtion.password,"0123456789",os_strlen("0123456789"));//这个是设置你的ESP的密码
SoftAP_configtion.ssid_len = os_strlen("ESP8266");//你的ESP的名字的长度
SoftAP_configtion.channel = 1;//你的ESP的通道
SoftAP_configtion.authmode = AUTH_WPA_WPA2_PSK;//加密方式
SoftAP_configtion.ssid_hidden = 0;//不隐藏
SoftAP_configtion.max_connection = 4;//最大的连接个数
SoftAP_configtion.beacon_interval = 100;//
wifi_softap_set_config(&SoftAP_configtion);//初始化刚才的配置
system_init_done_cb(to_scan);//这个回调函数必须在station模式配置成功下才可以调用

}
void user_rf_pre_init(){}

你可能感兴趣的:(esp)