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机器翻译深度学习实战课程. 本系列课程将从原理讲解与数据处理深入到如何动手实践与应用部署,将包括以下内容:(更新 ...
随机推荐
- Kafka连接器建立数据管道
1.概述 最近,有同学留言咨询Kafka连接器的相关内容,今天笔者给大家分享一下Kafka连接器建立数据管道的相关内容. 2.内容 Kafka连接器是一种用于Kafka系统和其他系统之间进行功能扩展. ...
- java Scanner类与String类
Scanner类的使用: 导入Scanner包,new Scanner对象,记得调用System.in参数,调用对应next方法实现键盘录入. import java.util.Arrays; i ...
- [APIO2020]有趣的旅途
注意到第一个点是可以钦定的. 那么我们考虑在重心的子树里反复横跳. 每次选择不同子树里的深度最大的点. 在同一颗子树里可能会在lca处出现问题. 那么我们选择重心,要考虑到会不会出现一颗子树不够选的操 ...
- 关于 n 个 [0,1] 的随机变量第 k 小的期望值
今天做到一道题,感觉里面一个结论有点意思,就到网上扒了篇证明(bushi)下来了. 知乎回答习惯,先抛结论,再给证明(大雾 结论:对于 \(n\) 个取值范围为 \([0,1]\) 的随机变量 \(x ...
- 洛谷 P6860 - 象棋与马(找性质+杜教筛)
题面传送门 首先我们来探究一下什么样的 \((a,b)\) 满足 \(p(a,b)=1\).不难发现只要点 \((1,0)\) 能够到达,那么网格上所有点都能到达,因为由于 \((1,0)\) 能够到 ...
- Linux文件系统属性和权限概念详解(包含inode、block、文件权限、文件软硬链接等)
Linux中的文件属性 ls -lih 包括:索引节点(inode),文件类型,权限属性,硬链接数,所归属的用户和用户组,文件大小,最近修改时间,文件名等等 索引节点:相当于身份证号,系统唯一,系统读 ...
- 『与善仁』Appium基础 — 17、元素定位工具(一)
目录 1.uiautomatorviewer介绍 2.uiautomatorviewer工具打开方式 3.uiautomatorviewer布局介绍 4.uiautomatorviewer工具的使用 ...
- 日常Java测试 2021/11/14
课堂测试三 package word_show; import java.io.*;import java.util.*;import java.util.Map.Entry; public clas ...
- Spark(十)【RDD的读取和保存】
目录 一.文件类型 1.Text文件 2.Json文件 3.对象文件 4.Sequence文件 二.文件系统 1. MySQL 2. Hbase 一.文件类型 1.Text文件 读写 读取 scala ...
- 【leetcode】653. Two Sum IV - Input is a BST
Given the root of a Binary Search Tree and a target number k, return true if there exist two element ...