ESP8266学习实战之UdpClient与UdpSever(FreeRTOS)
Udpclient 任务流程
①判断是否获取ip地址
新建状态变量
STATION_STATUS stastatus;
调用wifi接口,并判断是否获取IP地址
·do
{
stastatus = wifi_station_get_connect_status();
vTaskDelay(100);
}
while (stastatus != STATION_GOT_IP);
②创建Socket
int fd = -1;
fd = socket(PF_INET,SOCK_DGRAM,0);
if(fd = -1)
{
printf("get socket fail!");
vTaskDelete(NULL);
}
③设置接收超时时间
int setsockopt(int sock,int level,int optname,void *optval,socklen to optlen );
sock:将要被设置或者获取选项的套接字
level:选项所在的协议层
optname:需要访问的选项名
optval:对于getsockopt()指向返回值的缓冲,对于setsockopt()指向包含新选项的缓冲。
optlen:对于getsockop(),作为入口参数时,选项值得最大长度;作为出口参数时,选项值得实际长度。对于setsockopt(),现选项的长度。
int NetTimeOut = 1000;
setsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, &NetTimeOut, sizeof(int))
④赋值sever信息
定义一个struct_sockaddr_in类型的变量并清空
struct sockaddr_in myaddr;
memset(&myaddr,0,sizeof(myaddr));
填充地址信息
myaddr.sin_family = PF_INET;
myaddr.sin_port = htons(8888);
myaddr.sin_addr.s_addr = inet_addr("192.168.x.xxx");
将该变量强制转换为struct sockaddr 类型在函数中使用
bind(listenfd,(struct sockaddr*)(&myaddr),sizeof(myaddr));
#define SEVERADDR "192.168.0.207"
#define SEVERPORT 8000
struct sockaddr_in SeverAddr;
memset(&SeverAddr,0,sizeof(SeverAddr)); SeverAddr.sin_family = AF_INET;
SeverAddr.sin_addr.s_addr = inet_addr(SEVERADDR);
SeverAddr.sin_port = htons(SEVERPORT);
SeverAddr.sin_len = sizeof(SeverAddr);
⑤发送数据到sever端
ssize t send(int socket,const void *buffer,size t length,int flages);
ssize t sendto( int s,const void *data ,size t size ,int falges,const struct sockaddr *to,socklen t tolen);
头文件:#include<sys/socket.h>
buffer:发送缓冲区首地址
length:发送字节数
flages:发送方式(通常为0)
//发送数据
sendto(fd, "I am Udp", sizeof("I am Udp"), 0, (struct sockaddr *)&SeverAddr, (socklen_t)SeverAddr.sin_len);
⑥从sever端接收数据
int ret;
char udpmsg[48];
do
{
ret = recvfrom(fd, udpmsg, 48, 0, (struct sockaddr *)&SeverAddr, (socklen_t*)(&SeverAddr.sin_len));
vTaskDelay(100);
if(ret > 0)
{
printf("UdpSever:%s\n",udpmsg);
}
else
printf("UdpSever data is no\n");
}
while (ret == -1);
udpsever任务流程
直接复制SDK中的udpclient文件夹的所有文件到新建文件夹udpsever中
在udpsever中新建udpsever.c和udpsever.h
将udpcline.c和udpcline.h中的代码分别复制到udpsever.c和udpsever.h中并修改头文件以及函数名




修改sever地址


sever地址后添加
if(bind(fd,(struct sockaddr*)&SeverAddr,SeverAddr.sin_len) != 0)
{
printf("bind socket fail!\n");
vTaskDelete(NULL);
return;
}
修改发射接收端
struct sockaddr from;
socklen_t fromlen = sizeof(struct sockaddr);
for(;;)
{
do
{
ret = recvfrom(fd, udpmsg, 48, 0, &from, &fromlen);
vTaskDelay(100);
if(ret > 0)
{
printf("UdpClient:%s\n",udpmsg);
}
else
printf("UdpClient data is Null\n");
}
while (ret == -1); //发送返回数据
sendto(fd, "I am UdpSever", sizeof("I am UdpSever"), 0, &from, fromlen); }
vTaskDelete( NULL );
UDPClient源码:
//udpclient.c
#include "esp_common.h" #include "freertos/FreeRTOS.h"
#include "freertos/task.h" #include "lwip/sockets.h"
#include "lwip/dns.h"
#include "lwip/netdb.h"
#include "udpclient.h" #define SEVERADDR "192.168.0.207"
#define SEVERPORT 8000 /******************************************************************************
* FunctionName : ATaskUdpclient
* Description : ATaskUdpclient 任务
* Parameters : none
* Returns : none
*******************************************************************************/
void ATaskUdpclient(void *pvParameters)
{
int iVariableExample = 0;
int fd = -1;
int NetTimeOut = 5000;
int ret;
char udpmsg[48]; STATION_STATUS stastatus; struct sockaddr_in SeverAddr;
do
{
stastatus = wifi_station_get_connect_status();
vTaskDelay(100);
}while (stastatus != STATION_GOT_IP); fd = socket(PF_INET,SOCK_DGRAM,0); if(fd == -1)
{
printf("get socket fail!");
vTaskDelete(NULL);
} setsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, &NetTimeOut, sizeof(int));
memset(&SeverAddr,0,sizeof(SeverAddr)); SeverAddr.sin_family = AF_INET;
SeverAddr.sin_addr.s_addr = inet_addr(SEVERADDR);
SeverAddr.sin_port = htons(SEVERPORT);
SeverAddr.sin_len = sizeof(SeverAddr);
for(;;)
{
//发送数据
sendto(fd, "I am Udp", sizeof("I am Udp"), 0, (struct sockaddr *)&SeverAddr, (socklen_t)SeverAddr.sin_len);
do
{
ret = recvfrom(fd, udpmsg, 48, 0, (struct sockaddr *)&SeverAddr, (socklen_t*)(&SeverAddr.sin_len));
vTaskDelay(100);
if(ret > 0)
{
printf("UdpSever:%s\n",udpmsg);
}
else
printf("UdpSever data is no\n");
}
while (ret == -1); }
vTaskDelete( NULL );
} /******************************************************************************
* FunctionName : Udpclient_init
* Description : Udpclient_init 初始化
* Parameters : none
* Returns : none
*******************************************************************************/
void Udpclient_init(void)
{
xTaskCreate(ATaskUdpclient, "Udpclient", 256, NULL, 4 , NULL);
}
//udpclient.h
#ifndef __UART_H__
#define __UART_H__ #ifdef __cplusplus
extern "C" {
#endif void ATaskUdpclient(void *pvParameters);
void Udpclient_init(void); #ifdef __cplusplus
}
#endif #endif
UDPSever源码:
//udpsever.c
#include "esp_common.h" #include "freertos/FreeRTOS.h"
#include "freertos/task.h" #include "lwip/sockets.h"
#include "lwip/dns.h"
#include "lwip/netdb.h"
#include "udpsever.h" #define SEVERADDR "192.168.0.207"
#define SEVERPORT 8000 /******************************************************************************
* FunctionName : ATaskUdpsever
* Description : ATaskUdpsever 任务
* Parameters : none
* Returns : none
*******************************************************************************/
void ATaskUdpsever(void *pvParameters)
{
int iVariableExample = 0;
int fd = -1;
int NetTimeOut = 5000;
int ret;
char udpmsg[48]; STATION_STATUS stastatus; struct sockaddr_in SeverAddr;
struct sockaddr from;
socklen_t fromlen = sizeof(struct sockaddr); do
{
stastatus = wifi_station_get_connect_status();
vTaskDelay(100);
}while (stastatus != STATION_GOT_IP); fd = socket(PF_INET,SOCK_DGRAM,0); if(fd == -1)
{
printf("get socket fail!");
vTaskDelete(NULL);
return;
} setsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, &NetTimeOut, sizeof(int));
memset(&SeverAddr,0,sizeof(SeverAddr)); SeverAddr.sin_family = AF_INET;
SeverAddr.sin_addr.s_addr = INADDR_ANY;
SeverAddr.sin_port = htons(SEVERPORT);
SeverAddr.sin_len = sizeof(SeverAddr); if(bind(fd,(struct sockaddr*)&SeverAddr,SeverAddr.sin_len) != 0)
{
printf("bind socket fail!\n");
vTaskDelete(NULL);
return;
} for(;;)
{
do
{
ret = recvfrom(fd, udpmsg, 48, 0, &from, &fromlen);
vTaskDelay(100);
if(ret > 0)
{
printf("UdpClient:%s\n",udpmsg);
}
else
printf("UdpClient data is Null\n");
}
while (ret == -1); //发送数据
sendto(fd, "I am UdpSever", sizeof("I am UdpSever"), 0, &from, fromlen); }
vTaskDelete( NULL );
} /******************************************************************************
* FunctionName : Udpsever_init
* Description : Udpsever_init 初始化
* Parameters : none
* Returns : none
*******************************************************************************/
void Udpsever_init(void)
{
xTaskCreate(ATaskUdpsever, "Udpsever", 256, NULL, 4 , NULL);
}
//udpsever.h
#ifndef __UDPSEVER_H__
#define __UDPSEVER_H__ #ifdef __cplusplus
extern "C" {
#endif void ATaskUdpsever(void *pvParameters);
void Udpsever_init(void); #ifdef __cplusplus
}
#endif #endif
ESP8266学习实战之UdpClient与UdpSever(FreeRTOS)的更多相关文章
- 【FreeRTOS实战汇总】小白博主的RTOS学习实战快速进阶之路(持续更新)
博主是个小白,打算把这段时间系统学习RTOS的文章统一整理到这里,另外本文会给出一些参考性资料和指导性建议: 本文宗旨 FreeRTOS 是由Richard Barry在2003年由设计的,由于其设计 ...
- 【FreeRTOS学习01】CubeIDE快速整合FreeRTOS创建第一个任务
整个专栏主要是博主结合自身对FreeRTOS的实战学习以及源码分析,基于STM32F767 Nucleo-144平台,在CubeIDE下进行开发,结合官方的HAL库,将硬件环节的问题减少到最小,将精力 ...
- RPC之Thrift学习实战
关于Thrift的学习实战请参考:http://blog.csdn.net/column/details/slimina-thrift.html
- 【转】Esp8266学习之旅① 搭建开发环境,开始一个“hellow world”串口打印。
@2019-02-28 [小记] Esp8266学习之旅① 搭建开发环境,开始一个“hellow world”串口打印.
- 深度学习实战篇-基于RNN的中文分词探索
深度学习实战篇-基于RNN的中文分词探索 近年来,深度学习在人工智能的多个领域取得了显著成绩.微软使用的152层深度神经网络在ImageNet的比赛上斩获多项第一,同时在图像识别中超过了人类的识别水平 ...
- 学习Keras:《Keras快速上手基于Python的深度学习实战》PDF代码+mobi
有一定Python和TensorFlow基础的人看应该很容易,各领域的应用,但比较广泛,不深刻,讲硬件的部分可以作为入门人的参考. <Keras快速上手基于Python的深度学习实战>系统 ...
- 对比学习:《深度学习之Pytorch》《PyTorch深度学习实战》+代码
PyTorch是一个基于Python的深度学习平台,该平台简单易用上手快,从计算机视觉.自然语言处理再到强化学习,PyTorch的功能强大,支持PyTorch的工具包有用于自然语言处理的Allen N ...
- 『深度应用』NLP机器翻译深度学习实战课程·零(基础概念)
0.前言 深度学习用的有一年多了,最近开始NLP自然处理方面的研发.刚好趁着这个机会写一系列NLP机器翻译深度学习实战课程. 本系列课程将从原理讲解与数据处理深入到如何动手实践与应用部署,将包括以下内 ...
- 『深度应用』NLP机器翻译深度学习实战课程·壹(RNN base)
深度学习用的有一年多了,最近开始NLP自然处理方面的研发.刚好趁着这个机会写一系列NLP机器翻译深度学习实战课程. 本系列课程将从原理讲解与数据处理深入到如何动手实践与应用部署,将包括以下内容:(更新 ...
随机推荐
- Codeforces 724G - Xor-matic Number of the Graph(线性基)
Codeforces 题目传送门 & 洛谷题目传送门 一道还算不套路的线性基罢-- 首先由于图不连通,并且不同连通块之间的点显然不可能产生贡献,因此考虑对每个连通块单独计算贡献.按照 P415 ...
- 洛谷 P4621 - [COCI2012-2013#6] BAKTERIJE(exCRT)
洛谷题面传送门 发篇正常点的题解. 首先对于这样的题暴力枚举肯定是不行的,因为最小时间显然可能达到 \((4nm)^5\approx 10^{20}\),就算数据很难卡到这个上界,构造出一些使你暴力超 ...
- Glib 对 C 函数进行单元测试
1. Glib 单元测试框架 Glib 为单元测试提供了一套完整的测试框架,每个测试运行包括以下几个部分 测试数据结构 测试 setup 与 teardown 函数 测试函数 2. 单元测试数据结构 ...
- Excel-统一小括号格式(中文小括号,英文小括号)
1.统一小括号格式(中文小括号,英文小括号) 公式=ASC("(") #"(" 解释函数: ASC(A1)#对于双字节字符集(DBCS)语言,将全角英文字符(即 ...
- fastboot烧写Andriod 以及SD 卡烧写LinuxQT,
EMMC是一种FLASH,SD(TF)卡是另外的一种存储,通过控制拨码开关指引CPU去读EMMC还是SD卡的u-boot文件. u-boot的作用 初始化内存控制区,访问存储器,把内核从存储器读取出来 ...
- jquery chosen onchange 值改变时触发方法
jquery chosen onchange 值改变时触发方法如下:$(".chzn-select").chosen().on("change", functi ...
- java中接口可以继承接口
今天阅读别人的代码才发现,接口是可以继承接口的 一个类只能extends一个父类,但可以implements多个接口. 一个接口则可以同时extends多个接口,却不能implements任何接口. ...
- python函数初体验
函数 函数参数w 形式参数>>>>(被指定具体的值)默认参数, 实际参数是调用时候的实际指定参数 我们把函数⾥⾯的参数叫形式函数,函数实际调⽤的时候,赋予的参数叫实际函数 定义 ...
- 【.Net】使用委托实现被引用的项目向上级项目的消息传递事件
前言:在实际项目过程中,经常可能遇到被引用的项目要向上传递消息,但是又不能通过方法进行返回等操作,这个时候委托就派上用场了.以下使用委托,来实现被引用的项目向上传递消息的小教程,欢迎各位大佬提供建议. ...
- YARP+AgileConfig 5分钟实现一个支持配置热更新的代理网关
YARP 是微软开源的一个反向代理项目,英文名叫 Yet Another Reverse Proxy .所谓反向代理最有名的那就是 nginx 了,没错 YARP 也可以用来完成 nginx 的大部分 ...