女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

基于小凌派RK2206開發板wifi-tcp通信實驗

福州市凌睿智捷電子有限公司 ? 2022-06-14 11:10 ? 次閱讀

基于小凌派RK2206開發板wifi-tcp通信實驗

在開發過程中想要與開發板進行通信一般使用串口通信,當開發板使用串口與pc通信還需要專門的串口轉換工具才行。而小凌派開發板自帶wifi功能。因此與pc通信時可以使用wifi功能進行tcp通信這樣就不需要專門的轉換工具非常方便。

一、在使用小凌派開發板wifi進行tcp通信的步驟

1、要確定pc機所連接路由的wifi名稱和密碼。通過修改代碼使小凌派連接到與pc同一網絡。

修改文件device/rockchip/rk2206/sdk_liteos/board/src/config_network.c 中的SSID 即wifi名稱,和PASSWORD 即wifi密碼。

#define SSID "凌智電子"

#define PASSWORD "********"


2、確認小凌派wifi功能是否開啟

查看device/rockchip/rk2206/sdk_liteos/board/main.c 文件

是否調用ExternalTaskConfigNetwork();


3、確認小凌派開發板與開發板在同一網段。

在修改以上配置后先編譯燒錄程序然后查看log確認小凌派開發板獲取到的ip地址。

c34bbe36-e735-11ec-a2f4-dac502259ad0.png

在確認pc的ip地址,在控制臺輸入ipconfig

c3782674-e735-11ec-a2f4-dac502259ad0.png

可以看到兩個ip地址都是點2網段,說明已經在同一局域網。


4、 修改wifi_tcp 例程中服務地址及端口

#define OC_SERVER_IP "192.168.2.49"

#define SERVER_PORT 6666

這個ip地址即PC的ip地址,修改后重新編譯燒錄程序。


5、 pc上打開兩個網絡調試工具,一個客戶端和一個服務端,并設置ip地址和端口號

服務端 ip地址:0.0.0.0

端口號:6666

客戶端ip地址:192.168.2.50 (之前查看到小凌派的ip地址)

端口號:6666

c3b1886a-e735-11ec-a2f4-dac502259ad0.png

6 、查看log等待小凌派的tcp客戶端和服務端任務啟動


c3de5a2a-e735-11ec-a2f4-dac502259ad0.png

可以看到客戶端連接地址192.168.2.49:6666 即pc的ip地址

服務端監聽端口為6666

這表示小凌派tcp客戶端和服務端任務都已經啟動。


7、 在pc網絡調試助手點擊啟動客戶端和服務端

c43ac86e-e735-11ec-a2f4-dac502259ad0.png

可以觀察到網絡調試助手服務端有設備連接成功并且接收到了調試數據。

網絡調試助手的客戶端也顯示連接成功。


8、 使用網絡調試助手發送數據

c46782be-e735-11ec-a2f4-dac502259ad0.png

可以查看log發現小凌派開發板已經可以正常收發數據了。

這樣就可以通過使用wifi與pc進行通信。


二、接下來分析一下代碼的工作流程。

首先包含必要的頭文件

#include "ohos_init.h"#include "cmsis_os2.h"#include "los_task.h"#include "lz_hardware.h"#include "config_network.h"#include "lwip/tcp.h"#include "lwip/ip_addr.h"#include "lwip/priv/tcp_priv.h"#include "lwip/stats.h"#include "lwip/inet_chksum.h"



這些定義主要是 ip地址和端口號以及緩存大小

#define LOG_TAG "tcp"#define OC_SERVER_IP "192.168.2.49"#define SERVER_PORT 6666#define BUFF_LEN 256



這部分是獲取wifi連接信息,通過查詢wifi連接信息確認wifi是否連接成功。只有wifi連接成功了才能進行tcp通信

int get_wifi_info(WifiLinkedInfo *info){ int ret = -1; int gw, netmask; memset(info, 0, sizeof(WifiLinkedInfo)); unsigned int retry = 15; while (retry) { if (GetLinkedInfo(info) == WIFI_SUCCESS) { if (info->connState == WIFI_CONNECTED) { if (info->ipAddress != 0) { LZ_HARDWARE_LOGD(LOG_TAG, "rknetwork IP (%s)", inet_ntoa(info->ipAddress)); if (WIFI_SUCCESS == GetLocalWifiGw(&gw)) { LZ_HARDWARE_LOGD(LOG_TAG, "network GW (%s)", inet_ntoa(gw)); } if (WIFI_SUCCESS == GetLocalWifiNetmask(&netmask)) { LZ_HARDWARE_LOGD(LOG_TAG, "network NETMASK (%s)", inet_ntoa(netmask)); } if (WIFI_SUCCESS == SetLocalWifiGw()) { LZ_HARDWARE_LOGD(LOG_TAG, "set network GW"); } if (WIFI_SUCCESS == GetLocalWifiGw(&gw)) { LZ_HARDWARE_LOGD(LOG_TAG, "network GW (%s)", inet_ntoa(gw)); } if (WIFI_SUCCESS == GetLocalWifiNetmask(&netmask)) { LZ_HARDWARE_LOGD(LOG_TAG, "network NETMASK (%s)", inet_ntoa(netmask)); } ret = 0; goto connect_done; } } } LOS_Msleep(1000); retry--; }

connect_done: return ret;}



這部分是tcp服務端接收消息處理

先進入accept()會處于阻塞狀態,即沒有客戶端連接時一直阻塞。

單客戶端連接后又進入接收數據狀態,此狀態也是阻塞狀態。

沒有數據時一直阻塞,不過需要注意的是在此狀態下當客戶端斷開連接時recv會返回-1

接收到pc客戶端的消息后通過send()發響應消息給PC客戶端。

void tcp_server_msg_handle(int fd){ char buf[BUFF_LEN]; //接收緩沖區 socklen_t client_addr_len; int cnt = 0, count; int client_fd; struct sockaddr_in client_addr = {0}; printf("waitting for client connect...\n"); /* 監聽socket 此處會阻塞 */ client_fd = accept(fd, (struct sockaddr*)&client_addr, &client_addr_len); // client_fd = lwip_accept(fd, (struct sockaddr*)&client_addr, &client_addr_len); printf("[tcp server] accept <%s:%d>\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port)); while (1) { memset(buf, 0, BUFF_LEN); printf("-------------------------------------------------------\n"); printf("[tcp server] waitting client msg\n"); count = recv(client_fd, buf, BUFF_LEN, 0); //read是阻塞函數,沒有數據就一直阻塞 // count = lwip_read(client_fd, buf, BUFF_LEN); //read是阻塞函數,沒有數據就一直阻塞 if (count == -1) { printf("[tcp server] recieve data fail!\n"); LOS_Msleep(3000); break; } printf("[tcp server] rev client msg:%s\n", buf); memset(buf, 0, BUFF_LEN); sprintf(buf, "I have recieved %d bytes data! recieved cnt:%d", count, ++cnt); printf("[tcp server] send msg:%s\n", buf); send(client_fd, buf, strlen(buf), 0); //發送信息給client // lwip_write(client_fd, buf, strlen(buf)); //發送信息給client } lwip_close(client_fd); lwip_close(fd);}



這部分是tcp服務端任務代碼

服務端處理流程

socket-->bind-->listen-->accept-->recv-->send-->lwip_close

先通過socket()接口打開一個服務端socket文件

然后設置需要綁定的服務端ip地址及端口號。

在進行監聽,需要注意的是此處監聽不會處于阻塞態。

int wifi_server(void* arg){ int server_fd, ret;

while(1) { server_fd = socket(AF_INET, SOCK_STREAM, 0); //AF_INET:IPV4;SOCK_STREAM:TCP // server_fd = lwip_socket(AF_INET, SOCK_STREAM, 0); //AF_INET:IPV4;SOCK_STREAM:TCP if (server_fd < 0) { printf("create socket fail!\n"); return -1; }

/*設置調用close(socket)后,仍可繼續重用該socket。調用close(socket)一般不會立即關閉socket,而經歷TIME_WAIT的過程。*/ int flag = 1; ret = setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, &flag, sizeof(int)); if (ret != 0) { printf("[CommInitTcpServer]setsockopt fail, ret[%d]!\n", ret); } struct sockaddr_in serv_addr = {0}; serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); //IP地址,需要進行網絡序轉換,INADDR_ANY:本地地址 // serv_addr.sin_addr.s_addr = inet_addr(OC_SERVER_IP); //IP地址,需要進行網絡序轉換,INADDR_ANY:本地地址 serv_addr.sin_port = htons(SERVER_PORT); //端口號,需要網絡序轉換 /* 綁定服務器地址結構 */ ret = bind(server_fd, (struct sockaddr*)&serv_addr, sizeof(serv_addr)); // ret = lwip_bind(server_fd, (struct sockaddr*)&serv_addr, sizeof(serv_addr)); if (ret < 0) { printf("socket bind fail!\n"); lwip_close(server_fd); return -1; } /* 監聽socket 此處不阻塞 */ ret = listen(server_fd, 64); // ret = lwip_listen(server_fd, 64); if(ret != 0) { printf("socket listen fail!\n"); lwip_close(server_fd); return -1; } printf("[tcp server] listen:%d<%s:%d>\n",server_fd, inet_ntoa(serv_addr.sin_addr), ntohs(serv_addr.sin_port)); tcp_server_msg_handle(server_fd); //處理接收到的數據 LOS_Msleep(1000); }}

這部分是tcp客戶端的接收消息處理函數

先進行嘗試連接pc機的服務端,如果失敗則延遲5秒后重新連接直到連接成功。

連接成功后先發消息給PC的服務端,然后進入接收狀態,此狀態是阻塞態。

當接收到pc的消息后進入循環發送狀態。

void tcp_client_msg_handle(int fd, struct sockaddr* dst){ socklen_t len = sizeof(*dst);

int cnt = 0, count = 0; while (connect(fd, dst, len) < 0) { printf("connect server failed...%d\n", ++count); lwip_close(fd); LOS_Msleep(5000); fd = socket(AF_INET, SOCK_STREAM, 0); //AF_INET:IPV4;SOCK_STREAM:TCP } while (1) { char buf[BUFF_LEN]; sprintf(buf, "TCP TEST cilent send:%d", ++cnt); count = send(fd, buf, strlen(buf), 0); //發送數據給server // count = lwip_write(fd, buf, strlen(buf)); //發送數據給server printf("------------------------------------------------------------\n"); printf("[tcp client] send:%s\n", buf); printf("[tcp client] client sendto msg to server %d,waitting server respond msg!!!\n", count); memset(buf, 0, BUFF_LEN); count = recv(fd, buf, BUFF_LEN, 0); //接收來自server的信息 // count = lwip_read(fd, buf, BUFF_LEN); //接收來自server的信息 if(count == -1) { printf("[tcp client] recieve data fail!\n"); LOS_Msleep(3000); break; } printf("[tcp client] rev:%s\n", buf); } lwip_close(fd);}

這部分代碼是tcp客戶端代碼

客戶端處理流程

socket-->connect-->send-->recv-->lwip_close

先通過socket()接口創建客戶端的socket文件。

然后設置客戶端連接PC服務端的ip地址及端口號。

在進行connect連接。

int wifi_client(void* arg){ int client_fd, ret; struct sockaddr_in serv_addr; while(1) { client_fd = socket(AF_INET, SOCK_STREAM, 0);//AF_INET:IPV4;SOCK_STREAM:TCP if (client_fd < 0) { printf("create socket fail!\n"); return -1; }

/*設置調用close(socket)后,仍可繼續重用該socket。調用close(socket)一般不會立即關閉socket,而經歷TIME_WAIT的過程。*/ int flag = 1; ret = setsockopt(client_fd, SOL_SOCKET, SO_REUSEADDR, &flag, sizeof(int)); if (ret != 0) { printf("[CommInitTcpServer]setsockopt fail, ret[%d]!\n", ret); } memset(&serv_addr, 0, sizeof(serv_addr)); serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = inet_addr(OC_SERVER_IP); serv_addr.sin_port = htons(SERVER_PORT); printf("[tcp client] connect:%d<%s:%d>\n",client_fd, inet_ntoa(serv_addr.sin_addr), ntohs(serv_addr.sin_port)); tcp_client_msg_handle(client_fd, (struct sockaddr*)&serv_addr); LOS_Msleep(1000); }

return 0;}

這部分是tcp創建客戶端和服務端任務

可以看到在創建客戶端和服務端任務前先阻塞判斷wifi的連接狀態。

只有wifi連接成功后才創建客戶端和服務端任務。

void wifi_process(void *args){ unsigned int threadID_client, threadID_server; unsigned int ret = LOS_OK; WifiLinkedInfo info;

while(get_wifi_info(&info) != 0) ;

CreateThread(&threadID_client, wifi_client, NULL, "client@ process"); CreateThread(&threadID_server, wifi_server, NULL, "server@ process");}

這部分是創建wifi tcp 通信任務主要是為了使用APP_FEATURE_INIT(wifi_tcp_example);

這樣當OpenHarmony初始化完成后會自動執行此任務。

void wifi_tcp_example(void){ unsigned int ret = LOS_OK; unsigned int thread_id; TSK_INIT_PARAM_S task = {0}; printf("%s start ....\n", __FUNCTION__);

task.pfnTaskEntry = (TSK_ENTRY_FUNC)wifi_process; task.uwStackSize = 10240; task.pcName = "wifi_process"; task.usTaskPrio = 24; ret = LOS_TaskCreate(&thread_id, &task); if (ret != LOS_OK) { printf("Falied to create wifi_process ret:0x%x\n", ret); return; }}APP_FEATURE_INIT(wifi_tcp_example);


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 小凌派
    +關注

    關注

    0

    文章

    28

    瀏覽量

    1377
收藏 人收藏

    評論

    相關推薦
    熱點推薦

    基于小RK2206開發板:OpenHarmony如何使用IoT接口控制FLASH外設

    1、實驗簡介 本實驗將演示如何在小-RK2206開發板上使用IOT庫的FLASH接口,進行F
    發表于 04-22 15:02

    基于小RK2206開發板:OpenHarmony如何使用IoT接口控制FLASH外設

    1、實驗簡介本實驗將演示如何在小-RK2206開發板上使用IOT庫的FLASH接口,進行FL
    的頭像 發表于 04-22 14:49 ?258次閱讀
    基于小<b class='flag-5'>凌</b><b class='flag-5'>派</b><b class='flag-5'>RK2206</b><b class='flag-5'>開發板</b>:OpenHarmony如何使用IoT接口控制FLASH外設

    基于小RK2206開發板:OpenHarmony如何使用IoT接口控制UART外設

    1、實驗簡介 本實驗將演示如何在小-RK2206開發板上使用IOT庫的UART接口,進行UA
    發表于 04-22 14:27

    基于小RK2206開發板:OpenHarmony如何使用IoT接口控制UART外設

    1、實驗簡介本實驗將演示如何在小-RK2206開發板上使用IOT庫的UART接口,進行UAR
    的頭像 發表于 04-22 14:22 ?309次閱讀
    基于小<b class='flag-5'>凌</b><b class='flag-5'>派</b><b class='flag-5'>RK2206</b><b class='flag-5'>開發板</b>:OpenHarmony如何使用IoT接口控制UART外設

    基于小RK2206開發板:OpenHarmony如何使用IoT接口控制GPIO中斷

    1、實驗簡介 本實驗將演示如何在小-RK2206開發板上使用IOT庫的GPIO中斷模式,進行
    發表于 04-21 11:08

    基于小RK2206開發板:OpenHarmony如何使用IoT接口控制GPIO中斷

    1、實驗簡介本實驗將演示如何在小-RK2206開發板上使用IOT庫的GPIO中斷模式,進行G
    的頭像 發表于 04-21 10:39 ?343次閱讀
    基于小<b class='flag-5'>凌</b><b class='flag-5'>派</b><b class='flag-5'>RK2206</b><b class='flag-5'>開發板</b>:OpenHarmony如何使用IoT接口控制GPIO中斷

    基于小RK2206開發板:OpenHarmony如何使用IoT接口控制GPIO外設

    1、案例簡介 本案例主要是如何在小-RK2206開發板上使用IOT庫的GPIO接口,進行GPIO編程開發。 例程將創建一個任務,通過配置
    發表于 04-11 15:45

    基于小RK2206開發板:OpenHarmony如何使用IoT接口控制GPIO外設

    1、案例簡介本案例主要是如何在小-RK2206開發板上使用IOT庫的GPIO接口,進行GPIO編程開發。例程將創建一個任務,通過配置GP
    的頭像 發表于 04-11 15:36 ?723次閱讀
    基于小<b class='flag-5'>凌</b><b class='flag-5'>派</b><b class='flag-5'>RK2206</b><b class='flag-5'>開發板</b>:OpenHarmony如何使用IoT接口控制GPIO外設

    基于小RK2206開發板:OpenHarmony如何使用IoT接口控制ADC外設

    1、案例簡介 本案例主要講解如何在小-RK2206開發板上使用IoT庫的ADC接口,進行ADC編程開發。 例程內容為創建一個任務,讀取按
    發表于 04-10 16:20

    基于小RK2206開發板:OpenHarmony如何使用IoT接口控制ADC外設

    1、案例簡介本案例主要講解如何在小-RK2206開發板上使用IoT庫的ADC接口,進行ADC編程開發。例程內容為創建一個任務,讀取按鍵的
    的頭像 發表于 04-10 16:00 ?318次閱讀
    基于小<b class='flag-5'>凌</b><b class='flag-5'>派</b><b class='flag-5'>RK2206</b><b class='flag-5'>開發板</b>:OpenHarmony如何使用IoT接口控制ADC外設

    基于小RK2206開發板:OpenHarmony如何使用IoT接口控制PWM外設

    1、案例簡介 本案例是在小-RK2206開發板上使用IoT庫PWM接口,進行PWM編程開發。 例程將創建一個任務,每隔5秒將PWM0~1
    發表于 04-09 09:37

    基于小RK2206開發板:OpenHarmony如何使用IoT接口控制PWM外設

    1、案例簡介本案例是在小-RK2206開發板上使用IoT庫PWM接口,進行PWM編程開發。例程將創建一個任務,每隔5秒將PWM0~10依
    的頭像 發表于 04-09 08:59 ?709次閱讀
    基于小<b class='flag-5'>凌</b><b class='flag-5'>派</b><b class='flag-5'>RK2206</b><b class='flag-5'>開發板</b>:OpenHarmony如何使用IoT接口控制PWM外設

    【「OpenHarmony開發與實踐 | 基于紅莓RK2206開發板」閱讀體驗】+初體驗1

    愛好者沒有bug,「OpenHarmony開發與實踐 | 基于紅莓RK2206開發板」大賣吧!哦對了 你們的開發板是怎么準備的呢?【小
    發表于 09-18 18:30

    基于OpenHarmony輕量級操作系統實現RK2206 WiFi-AP模式通信開發案例

    實驗內容本示例將演示如何在小-RK2206開發板上使用WiFi-AP模式(即將
    的頭像 發表于 08-08 08:23 ?818次閱讀
    基于OpenHarmony輕量級操作系統實現<b class='flag-5'>RK2206</b> <b class='flag-5'>WiFi</b>-AP模式<b class='flag-5'>通信</b><b class='flag-5'>開發</b>案例

    基于OpenHarmony輕量級操作系統實現RK2206 WiFi-AP模式通信開發案例

    實驗內容 本示例將演示如何在小-RK2206開發板上使用WiFi-AP模式(即將
    發表于 08-07 15:50