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机器翻译深度学习实战课程. 本系列课程将从原理讲解与数据处理深入到如何动手实践与应用部署,将包括以下内容:(更新 ...
随机推荐
- C# 将Excel转为PDF时自定义表格纸张大小
通过后端程序将Excel表格转为PDF格式时,直接转换后的PDF效果可能出现表格页面过小或者过大,导致页面内容分布不均.要改善转换后的文档效果,只需在转换前自定义表格纸张大小,即可调整转换后的PDF页 ...
- python网络自动化运维之telnetlib实验(EVE-NG+pycharm)
运行环境: 物理机:win10 1903 网络设备:EVE-NG模拟器上运行思科三层路由器 网络设备OS版本:cisco ios(versions 15.6) python环境:pycharm 3.3 ...
- BZOJ 3694&&DTOJ 1972: 最短路
题目描述 给出一个n个点m条边的无向图,n个点的编号从1~n,定义源点为1.定义最短路树如下:从源点1经过边集T到任意一点i有且仅有一条路径,且这条路径是整个图1到i的最短路径,边集T构成最短路树. ...
- R语言与医学统计图形-【26】ggplot2主题函数
ggplot2绘图系统--主题函数 1. theme函数 theme_*系列函数提供了9种不同的风格. theme_grey/gray/bw/linedraw/light/minimal/classi ...
- 学习Java的第三天
一.今日收获 1.今天家里有白事,忙了一整天,也没有看更多的资料 二.今日问题 无 三.明日目标 补全今天耽误的功课,继续学习java!
- acre, across
acre The acre is a unit of land area used in the imperial and US customary systems. It is traditiona ...
- FTP 文件传输服务
昨晚心血来潮,尝试用python写了一个ftp文件传输服务,可以接收指令,从远程ftp服务器同步指定目录数据,最后没用上,开源出来. https://github.com/jadepeng/ftp_t ...
- 【leetcode】170. Two Sum III - Data structure design 两数之和之三 - 数据结构设计
Design and implement a TwoSum class. It should support the following operations: add and find. add ...
- Docker学习(四)——Docker容器连接
Docker容器连接 容器中可以运行一些网络应用,要让外部也可以访问这些应用,可以通过-P或-p参数来指定端口映射. 下面我们来实现通过端口连接到一个docker容器. 1.网络端口映射 ...
- windows下的_vimrc
折腾了一天 在https://keelii.github.io/2016/06/13/awsome-window-vimrc/的基础上进行了一些改动 " ------------------ ...