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机器翻译深度学习实战课程. 本系列课程将从原理讲解与数据处理深入到如何动手实践与应用部署,将包括以下内容:(更新 ...
随机推荐
- round函数和获取当前时间函数
round函数:对一个浮点类型的数据进行四舍五入:round(3.14) 运行结果就是3 获取当前时间: time.time() ,time函数需要导入才能使用,import time
- 从头带你撸一个Springboot Starter
我们知道 SpringBoot 提供了很多的 Starter 用于引用各种封装好的功能: 名称 功能 spring-boot-starter-web 支持 Web 开发,包括 Tomcat 和 spr ...
- c++基础知识02
1.前置与后置区别 #include<iostream> using namespace std; int main() { //前置和后置区别 //前置递增或递减 先让变量加减1 然后进 ...
- NOIp2021 原地退役记
JS-0013 Day -2 - 2021.11.17 打了场 cmd_blk 出的模拟赛,T2 T3 都是做过的原题(AGC010C & ARC092D),于是直接摆烂交暴力垫底,成功为我的 ...
- HAOI 2018 Round 1 题解
无聊了开一套省选题刷刷--u1s1 感觉三个题都不错,难度也挺有梯度,是一道标准的省选难度的题(话说 CSP 前你刷省选题干嘛/ts/ts) 小 C 珂海星 T1:P4495 [HAOI2018]奇怪 ...
- 【Pathview web】通路映射可视化
前言 pathview是一个通路可视化友好的R包,最主要的是它支持多组学数据映射(基因/蛋白-代谢).自己用过它的R包,后来发现有网页版的,果断介绍给学员.因为不常用,记录要点,以后温习备用. 目前w ...
- C++ STL算法之:copy
C++ STL算法:copy 目录(?)[+] 前面十二个算法所展现的都属于非变易算法(Non-mutating algorithms)系列,现在我们来看看变易算法.所谓变易算法(Mutating a ...
- 04 Windows安装python运行环境
安装python运行环境 使用微信扫码关注微信公众号,并回复:"Python工具包",免费获取下载链接! 1.卸载程序(电脑未装此程序,跳过此过程) 卸载这两个程序 出现下图所示, ...
- SparkStreaming消费Kafka,手动维护Offset到Mysql
目录 说明 整体逻辑 offset建表语句 代码实现 说明 当前处理只实现手动维护offset到mysql,只能保证数据不丢失,可能会重复 要想实现精准一次性,还需要将数据提交和offset提交维护在 ...
- HTTP初识
HTTP(HyperText Transfer Protocol):超文本传输协议. URL(Uniform Resource Locator):统一资源定位符. URI(Uniform Resour ...