本文來源電子發燒友社區,作者:xiaopeng, 帖子地址:https://bbs.elecfans.com/jishu_2308707_1_1.html
前言
上一篇帖子已經完成了多線程操作和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 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,這一點還不知道原因。
效果展示
接收到的天氣數據目前暫時通過uart打印,數據如下:
后面將對這些數據進行解析和顯示。
-
開鴻智谷
+關注
關注
2文章
125瀏覽量
1153 -
NiobeU4
+關注
關注
3文章
31瀏覽量
508
發布評論請先 登錄
相關推薦
評論