前言
上一篇帖子已经完成了多线程操作和LCD的基本驱动,本篇在上一篇的工程基础上加上wifi功能,实现实时天气的获取。
新建wifi处理任务
既然是基于OpenHarmony的程序开发,自然要发挥多线程的优势。所以对于相对独立的程序最好是单独建立一个独立的任务,方便管理。
1、新建源文件TaskWifi.c
该源文件处理两件事情:
① 创建wifi任务
②处理wifi联网,连接服务器,数据收发等与wifi相关的所以事情
详细如下:
2、新建weather.c和weather.h
weather.c负责所以函数的具体实现,主要包括如下:
weather.h是其对应的函数声明和相关宏定义,如下:
3、添加wifi_connect.c文件
该文件可以直接从官方wifi例程里复制过来,wifi目前只能连接无密码的wifi热点,所以需要进行一处修改:
4、修改BUILD.gn文件
每次新增源文件都需要将源文件添加到BUILD.gn文件中,如下
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 fail\r\n");
}
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] = '\0';
printf("rec len:%d\r\n,recv data:%s\r\n", recv_len, buffer);
break;
}
}
}
数据接收的时候调用recv函数时,第三个参数不能是表达式,如果是表达式,则只能读回来四个字节,后面再调用recv函数读回来的长度都是0,这一点还不知道原因。
效果展示
接收到的天气数据目前暂时通过uart打印,数据如下:
后面将对这些数据进行解析和显示。