【开鸿智谷NiobeU4开发板免费试用体验】使用wifi获取实时天气数据

描述

本文来源电子发烧友社区,作者:xiaopeng, 帖子地址:https://bbs.elecfans.com/jishu_2308707_1_1.html


前言

上一篇帖子已经完成了多线程操作和LCD的基本驱动,本篇在上一篇的工程基础上加上wifi功能,实现实时天气的获取。

新建wifi处理任务

既然是基于OpenHarmony的程序开发,自然要发挥多线程的优势。所以对于相对独立的程序最好是单独建立一个独立的任务,方便管理。

1、新建源文件TaskWifi.c

该源文件处理两件事情:
① 创建wifi任务

②处理wifi联网,连接服务器,数据收发等与wifi相关的所以事情

详细如下:

NiobeU4

2、新建weather.c和weather.h

weather.c负责所以函数的具体实现,主要包括如下:

NiobeU4

weather.h是其对应的函数声明和相关宏定义,如下:

NiobeU4

3、添加wifi_connect.c文件

该文件可以直接从官方wifi例程里复制过来,wifi目前只能连接无密码的wifi热点,所以需要进行一处修改:

NiobeU4

4、修改BUILD.gn文件

每次新增源文件都需要将源文件添加到BUILD.gn文件中,如下

NiobeU4

socket tcp数据收发

socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层负责复杂的操作抽象为几个简单的接口供应用层调用已以实现进程在网络中的通信。

主要接口如下:

socket() :创建socket
bind() :绑定socket到本地地址和端口,通常由服务器调用
listen() :TCP专用,开启监听模式
accept() :TCP专用,服务器等待客户端连接,一般是阻塞态
connect() :TCP专用,客户端主动连接服务器
send() :TCP专用,发送数据
recv() :TCP专用,接收数据
sendto() :UDP专用,发送数据到指定的IP地址和端口
recvfrom() :UDP专用,接收数据,返回数据远端的IP地址和端口
closesocket() :关闭socket

本文主要用到其中的四个:
socket()
send()
recv()
closesocket()

本文发送和接收都使用阻塞的方式进行。

发送:

static int send_data_to_server(char* data, int len)
{
    int ret;

    ret = send(sock, data, len, 0);
    if(ret == -1)
    {
        printf("data send failrn");
    }

    return ret;
}

接收:

void data_recv(char* buffer)
{
    int ret;
    uint16_t recv_len = 0;
    while(1)
    {
        ret = recv(sock, buffer + recv_len, sizeof(buffer), 0);
        if (ret > 0)
        {
            recv_len += ret;
        }
        else
        {
            buffer[recv_len] = '';
            printf("rec len:%drn,recv data:%srn", recv_len, buffer);
            break;
        }
    }
}

数据接收的时候调用recv函数时,第三个参数不能是表达式,如果是表达式,则只能读回来四个字节,后面再调用recv函数读回来的长度都是0,这一点还不知道原因。

NiobeU4

效果展示

接收到的天气数据目前暂时通过uart打印,数据如下:

NiobeU4

后面将对这些数据进行解析和显示。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分