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机器翻译深度学习实战课程. 本系列课程将从原理讲解与数据处理深入到如何动手实践与应用部署,将包括以下内容:(更新 ...
随机推荐
- 详解Threejs中的光源对象
光源的分类 AmbientLight(环境光),PointLight(点光源),SpotLight(聚光源) 和 DirectionalLight(平行光)是基础光源 HemisphereLight( ...
- 洛谷 P7450 - [THUSCH2017] 巧克力(斯坦纳树+随机化)
洛谷题面传送门 9.13 补之前 8.23 做的题,不愧是鸽子 tzc( 首先我们先来探讨一下如果 \(c_{i,j}\le k\) 怎么做,先考虑第一问.显然一个连通块符合条件当且仅当它能够包含所有 ...
- Atcoder Regular Contest 125 E - Snack(最小割转化+贪心)
Preface: 这是生平第一道现场 AC 的 arc E,也生平第一次经历了 performance \(\ge 2800\),甚至还生平第一次被 hb 拉到会议里讲题,讲的就是这个题,然鹅比较尬 ...
- Kubernetes:Pod 升级、回滚
本篇主要讨论如何实现滚动更新和回滚,任意更换版本并且回滚以前的版本(版本更新),而下一章会讨论到 Pod 缩放,根据机器资源自动拓展和收缩应用(自动扩容实例). 本文为作者的 Kubernetes 系 ...
- 【每天五分钟大数据-第一期】 伪分布式+Hadoopstreaming
说在前面 之前一段时间想着把 LeetCode 每个专题完结之后,就开始着手大数据和算法的内容. 想来想去,还是应该穿插着一起做起来. 毕竟,如果只写一类的话,如果遇到其他方面,一定会遗漏一些重要的点 ...
- JVM2 类加载子系统
目录 类加载子系统 类加载器子系统 类加载器ClassLoader角色 类加载的过程 案例 加载Loading 连接Linking 初始化Intialization clinit() 类的加载器 虚拟 ...
- A Child's History of England.50
'Knave [man without honor]!' said King Richard. 'What have I done to thee [you] that thou [you] shou ...
- A Child's History of England.35
The other two clung to the yard for some hours. At length the young noble said faintly, 'I am exhaus ...
- 深入理解mysql锁与事务隔离级别
一.锁 1.锁的定义 锁即是一种用来协调多线程或进程并发使用同一共享资源的机制 2.锁的分类 从性能上分类:乐观锁和悲观锁 从数据库操作类型上分类:读锁和写锁 从操作粒度上分类:表锁和行锁 2 ...
- Redis(一)【基础入门】
目录 一.大型网站的系统特点 二.大型网站架构发展历程 三.从NoSQL说起 四.Redis简介 五.Redis安装 1.上传并解压 2.安装C语言编译环境 3.修改安装位置 4.编译安装 5.启动R ...