当前位置:网站首页>ESP8266 AP_UDP_Server
ESP8266 AP_UDP_Server
2022-07-26 22:44:00 【Paradise_Violet】
目录
2.接下来我们需要将网络连接结构体赋值,在这里我们将它设置为udp通信有两个方法
udp通信 8266作为服务器等待客户端向他主动发起通信
1.定义espconn型结构体(网络连接结构体)
struct espconn ST_NetCon; // 注:必须定义为全局变量,内核将会使用此变量(内存)
struct espconn {
/** type of the espconn (TCP, UDP) */
enum espconn_type type; //网络连接的类型 tcp/udp
/** current state of the espconn */
enum espconn_state state; //网络连接的状态
union {
esp_tcp *tcp;
esp_udp *udp;
} proto;
/** A callback function that is informed about events for this espconn */
espconn_recv_callback recv_callback; //回调函数
espconn_sent_callback sent_callback; //回调函数
uint8 link_cnt; //连接数量
void *reverse; //void* 指针
};
typedef struct _esp_udp {
int remote_port; //远端主机端口号
int local_port; //8266端口号
uint8 local_ip[4]; //8266ip地址
uint8 remote_ip[4]; //远端主机ip地址
} esp_udp;2.接下来我们需要将网络连接结构体赋值,在这里我们将它设置为udp通信有两个方法
法一:创建一个udp通信结构体,并且将udp通信结构体的指针赋值给网络连接结构体中存放upd结构体指针的成员
esp_udp ST_UDP; // UDP通信结构体 ST_NetCon.proto.udp = &ST_UDP;
法二: ST_NetCon.proto.udp = (esp_udp *)os_zalloc(sizeof(esp_udp)); // 申请内存
sizeof(esp_udp) : 计算udp通信结构体的大小os_zalloc(sizeof(esp_udp)): 分配udp通信结构体大小的内存
(esp_udp *) :将这块内存的首地址强制转换为udp通信结构体指针类型
之后赋值给网络连接结构体中存放udp通信结构体的成员
•void * os zalloc (sizet size)
申请一块指定大小(参数决定) 的内存,并返回这块内存的首地址。
注意:这块内存申请完毕后,就不能分配给其他变量。如果申请内存的操作过多,内存将不够用。
使用【os_free(指针参数)】来释放这块内存。
接下来我们需要将udp通信结构体赋值
此处无需设置目标IP/端口(ESP8266作为Server,不需要预先知道Client的IP/端口)
//ST_NetCon.proto.udp->local_port = espconn_port(); // 获取8266可用端口 ST_NetCon.proto.udp->local_port = 8266 ; // 设置本地端口 //把8266端口设置为8266 //ST_NetCon.proto.udp->remote_port = 8888; // 设置目标端口 //ST_NetCon.proto.udp->remote_ip[0] = 192; // 设置目标IP地址 //ST_NetCon.proto.udp->remote_ip[1] = 168; //ST_NetCon.proto.udp->remote_ip[2] = 4; //ST_NetCon.proto.udp->remote_ip[3] = 2;
3.注册/定义回调函数
ESP8266_WIFI_Recv_Cb_JX(void * arg, char * pdata, unsigned short len)
参数一void*指针,参数二网络传输数据指针,参数三是数据长度
espconn_regist_sentcb(&ST_NetCon,ESP8266_WIFI_Send_Cb_JX); // 注册网络数据发送成功的回调函数 espconn_regist_recvcb(&ST_NetCon,ESP8266_WIFI_Recv_Cb_JX); // 注册网络数据接收成功的回调函数// 成功接收网络数据的回调函数【参数1:网络传输结构体espconn指针、参数2:网络传输数据指针、参数3:数据长度】 void ICACHE_FLASH_ATTR ESP8266_WIFI_Recv_Cb_JX(void * arg, char * pdata, unsigned short len) { struct espconn * T_arg = arg; // 缓存网络连接结构体指针 remot_info * P_port_info = NULL; // 远端连接信息结构体指针 // 根据数据设置LED的亮/灭 根据接收到数据的首字符来控制灯的亮灭 //------------------------------------------------------------------------------- if(pdata[0] == 'k' || pdata[0] == 'K') LED_ON; // 首字母为'k'/'K',灯亮 else if(pdata[0] == 'g' || pdata[0] == 'G') LED_OFF; // 首字母为'g'/'G',灯灭 os_printf("\nESP8266_Receive_Data = %s\n",pdata); // 串口打印接收到的数据 // 获取远端信息【UDP通信是无连接的,向远端主机回应时需获取对方的IP/端口信息】 //------------------------------------------------------------------------------------ if(espconn_get_connection_info(T_arg, &P_port_info, 0)==ESPCONN_OK) // 获取远端信息 { T_arg->proto.udp->remote_port = P_port_info->remote_port; // 获取对方端口号 T_arg->proto.udp->remote_ip[0] = P_port_info->remote_ip[0]; // 获取对方IP地址 T_arg->proto.udp->remote_ip[1] = P_port_info->remote_ip[1]; T_arg->proto.udp->remote_ip[2] = P_port_info->remote_ip[2]; T_arg->proto.udp->remote_ip[3] = P_port_info->remote_ip[3]; //os_memcpy(T_arg->proto.udp->remote_ip,P_port_info->remote_ip,4); // 内存拷贝 } //-------------------------------------------------------------------- OLED_ShowIP(24,6,T_arg->proto.udp->remote_ip); // 显示远端主机IP地址 //-------------------------------------------------------------------- espconn_send(T_arg,"ESP8266_WIFI_Recv_OK",os_strlen("ESP8266_WIFI_Recv_OK")); // 向对方发送应答 }espconn_get_connection_info(T_arg, &P_port_info, 0)
参数一:成功接收网络数据回调函数参数一传递过来的指针
参数二:是远端连接信息结构体指针的指针
参数三:设为0
T_arg->proto.udp->remote_ip[0] = P_port_info->remote_ip[0]; // 获取对方IP地址 T_arg->proto.udp->remote_ip[1] = P_port_info->remote_ip[1]; T_arg->proto.udp->remote_ip[2] = P_port_info->remote_ip[2]; T_arg->proto.udp->remote_ip[3] = P_port_info->remote_ip[3];可以用这个API来替换掉上面四行os_memcpy(T_arg->proto.udp->remote_ip,P_port_info->remote_ip,4); // 内存拷贝
os_memcpy(void *des, void *src, size_t n)
从原内存指针(参数二)指向处,将指定长度(参数三)数据,复制到目标内存指针(参数一)指向处
void *des 目标内存块指针
void *src 源内存块指针
size_n 拷贝长度
4.调用UDP初始化API
espconn_create(&ST_NetCon); // 初始化UDP通信
成功发送网络数据的回调函数
void ICACHE_FLASH_ATTR ESP8266_WIFI_Send_Cb_JX(void *arg)
{
os_printf("\nESP8266_WIFI_Send_OK\n");
}
边栏推荐
- ks 怎么抓salt值?api,did?
- 并发编程之生产者消费者模式
- Jenkins--基础--5.3--系统配置--全局安全配置
- Flinksql window triggered in advance
- Li Hongyi machine learning (2017 Edition)_ P21: convolutional neural network CNN
- Six ways for the Internet of things to improve our lives
- Spark ---- shuffle and partition of RDD
- Database interim (II)
- Verilog过程赋值语句
- C语言之数据存储汇总
猜你喜欢

Unity 使用NavMesh实现简易的摇杆功能

Unity uses navmesh to realize simple rocker function

Website log collection and analysis process

Code merging of centralized version control tools

Unity line access

Mqtt---- bottom (precautions)

快来帮你三分钟了解物联网

Li Hongyi machine learning (2017 Edition)_ P6-8: gradient descent

随着5G越来越普及,我们的生活会受到哪些积极的影响

链表常规OJ
随机推荐
梦想的旅程
5. Legal bracket string
复杂度OJ题
下一代互联网:视联网
FaceNet
Li Hongyi machine learning (2017 Edition)_ P21: convolutional neural network CNN
Jenkins--基础--5.3--系统配置--全局安全配置
Unity[1] 学习目录
7. Formula F1 champion
Li Hongyi machine learning (2017 Edition)_ P6-8: gradient descent
Unity Twitter登录接入
Square root of X
Jenkins -- Basic -- 5.2 -- system configuration -- system configuration
As 5g becomes more and more popular, what positive effects will our lives be affected
1. 众数
5. 合法的括号串
The MySQL character set is set to UTF-8, but the console still has the problem of Chinese garbled code
Mqtt---- bottom (precautions)
Play guest cloud brush machine 5.9
快来帮你三分钟了解物联网