在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

3天內不再提示

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

福州市凌睿智捷電子有限公司 ? 2024-08-08 08:23 ? 次閱讀

實驗內容

本示例將演示如何在小凌派-RK2206開發板上使用WiFi-AP模式(即將RK2206作為WiFi路由器),實現與PC端進行TCP通信

程序設計

API設計

FlashInit()

頭文件:

//device/rockchip/rk2206/adapter/include/lz_hadware.h

函數描述:

unsigned int FlashInit(void);

作用描述:

初始化RK2206的Flash。

參數描述:

返回值:

LZ_HARDWARE_SUCCESS為成功,反之為失敗。

VendorSet()

頭文件:

//device/rockchip/rk2206/adapter/include/lz_hadware.h

實際定義在:

//device/rockchip/rk2206/adapter/include/lz_hardware/vendor.h

函數描述:

unsigned int VendorSet(VendorID id, unsigned char *buf, int len);

作用描述:

在Flash區域中設置WiFi相關參數。

參數描述:

名字描述
id配置的參數,例如:VENDOR_ID_WIFI_SSID:設備作為終端,連接WiFi路由器的SSID,32字節 + '\0'VENDOR_ID_WIFI_PASSWD:設備作為終端,連接WiFi路由器的密鑰,64字節 + '\0'VENDOR_ID_WIFI_ROUTE_SSID:設備作為WiFi路由器,配置SSID,32字節 + '\0'VENDOR_ID_WIFI_ROUTE_PASSWD:設備作為WiFi路由器,配置密鑰,64字節 + '\0'VENDOR_ID_WIFI_MODE:配置設備作為終端或WiFi路由器,3字節 + '\0'
buf配置內容字符串
len配置內容字符串長度

返回值:

LZ_HARDWARE_SUCCESS為成功,反之為失敗。

SetApModeOff()

頭文件:

/device/rockchip/rk2206/sdk_liteos/board/include/config_network.h

函數描述:

WifiErrorCode SetApModeOff();

作用描述:

關閉WiFi-AP模式。

參數描述:

返回值:

0為成功,反之為失敗。

SetApModeOn()

頭文件:

/device/rockchip/rk2206/sdk_liteos/board/include/config_network.h

函數描述:

WifiErrorCode SetApModeOn();

作用描述:

開啟WiFi-AP模式。

參數描述:

返回值:

0為成功,反之為失敗。

軟件設計

整個例程主要分為2個部分:

配置RK2206為WiFi-AP模式

創建TCP服務端,監聽并等待TCP客戶端

配置WiFi-AP模式

該任務主要分為如下幾個步驟:

(1)配置WiFi相關參數

首先,定義幾個WiFi相關參數,并予以賦值。

void wifi_process(void *args){ unsigned int threadID_client, threadID_server; unsigned int ret = LOS_OK; WifiLinkedInfo info; uint8_t wifi_mode[4]; // 注意:wifi_mode字符串長度為4, 不能超過4 uint8_t mac_address[6]; // 注意:mac_address字符串長度為6, 不能超過6 uint8_t route_ssid[WIFI_MAX_SSID_LEN]; // config_network.h有定義該宏定義 uint8_t route_passwd[WIFI_MAX_KEY_LEN]; // config_network.h有定義該宏定義

// 配置WiFi模式字符串 memset(wifi_mode, 0, sizeof(wifi_mode)); snprintf(wifi_mode, sizeof(wifi_mode), "AP"); // 配置MAC地址字符串 memset(mac_address, 0, sizeof(mac_address)); mac_address[0] = 0x00; mac_address[1] = 0xdc; mac_address[2] = 0xb6; mac_address[3] = 0x90; mac_address[4] = 0x11; mac_address[5] = 0x00; // 配置route_ssid和route_passwd memset(route_ssid, 0, WIFI_MAX_SSID_LEN); snprintf(route_ssid, sizeof(route_ssid), WIFI_SSID); memset(route_passwd, 0, WIFI_MAX_KEY_LEN); snprintf(route_passwd, sizeof(route_passwd), WIFI_PASSWORD); ......}

注意:上述wifi_mode、mac_address、route_ssid和route_passwd都有嚴格的字符串長度定義。

(2)寫入Flash

將之前定義好的WiFi相關參數寫入到Flash。

void wifi_process(void *args){ ........ // Flash初始化 FlashInit(); // 配置RK2206為WiFi-AP模式,并設置WiFi路由器的SSID和密碼 VendorSet(VENDOR_ID_WIFI_MODE, wifi_mode, sizeof(wifi_mode)); // 配置為Wifi AP模式 VendorSet(VENDOR_ID_MAC, mac_address, sizeof(mac_address)); // 配置MAC地址 VendorSet(VENDOR_ID_WIFI_SSID, route_ssid, sizeof(route_ssid)); // 配置WiFi路由器的SSID VendorSet(VENDOR_ID_WIFI_PASSWD, route_passwd, sizeof(route_passwd)); // 配置WiFi路由器的密碼 ......}

注意:

在調用VendorSet()之前必須調用FlashInit(),初始化Flash相關操作,否則VendorSet()無效。

VendorSet()第1個參數在vendor.h有定義。

(3)重啟WiFi-AP模式

void wifi_process(void *args){ ........ // 開啟WiFi-AP模式 SetApModeOff(); SetApModeOn(); ......}

TCP服務端

首先,在wifi_process()調用CreateThread()創建1個線程,運行wifi_tcp_server()

void wifi_process(void *args){ ........ // 創建TCP服務端線程 CreateThread(&threadID_server, wifi_tcp_server, NULL, "tcp_server");}

其次,運行TCP服務端,綁定IP地址和端口號,監聽端口,等待TCP客戶端連接

int wifi_tcp_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_server_msg_handle()負責與TCP客戶端進行實際通信。

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);}

編譯調試

修改BUILD.gn文件

修改 vendor/lockzhiner/rk2206/sample 路徑下 BUILD.gn 文件,指定 wifi_ap_example 參與編譯。

"./b14_wifi_ap:wifi_ap_example",

修改 device/lockzhiner/rk2206/sdk_liteos 路徑下 Makefile 文件,添加 -lwifi_ap_example 參與編譯。

app_LIBS = -lwifi_ap_example

運行結果

示例代碼編譯燒錄代碼后,按下開發板的RESET按鍵,通過串口助手查看日志,顯示如下:

entering kernel init...hilog will init.[IOT:D]IotInit: start ....[MAIN:D]Main: LOS_Start ...Entering scheduler[IOT:D]IotProcess: start ....wifi_ap_example start ....[FLASH:I]FlashInit: blockSize 4096, blockStart 0, blockEnd 8388608[config_network:D]rknetwork SetApModeOff start ...

[config_network:D]rknetwork AP is inactive

[config_network:D]rknetwork SetApModeOff end ...

[config_network:D]rknetwork SetApModeOn start ...

[FLASH:E]FlashInit: id 0, controller has already been initialized[config_network:D]rknetwork EnableHotspot ...

[wifi_api:D]ip=192.168.2.10 gw=192.168.2.1 mask=255.255.255.0[wifi_api:D]HWADDR (00b611:00)[bcore_device:E]start bb ...[bcore_device:E]start bb done[wifi_api:D]netif setup ...[wifi_api_internal:D]Start AP (SSID=rk2206_nano channel=1)[wifi_api_internal:D]derive psk ...[wifi_api_internal:D]derive psk done[wifi_dhcp:D]lann_ipaddr:192.168.2.1[wifi_dhcp:D]lann_mask:255.255.255.0[config_network:D]rknetwork EnableHotspot done[tcp server] listen:50<0.0.0.0:6666>waitting for client connect...

注意:設備WiFi路由器IP地址為192.168.2.10。

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

    關注

    18

    文章

    6145

    瀏覽量

    137156
  • 操作系統
    +關注

    關注

    37

    文章

    7025

    瀏覽量

    124699
  • OpenHarmony
    +關注

    關注

    26

    文章

    3804

    瀏覽量

    17846
收藏 人收藏

    評論

    相關推薦

    基于Openharmony輕量級操作系統的分布式數據管理開發案

    實驗內容本例程演示如何在小凌派-RK2206開發板上使用OpenHarmony輕量級操作系統進行KvStore(即分布式數據管理)數據讀寫。
    的頭像 發表于 08-07 08:23 ?1267次閱讀
    基于<b class='flag-5'>Openharmony</b><b class='flag-5'>輕量級</b><b class='flag-5'>操作系統</b>的分布式數據管理<b class='flag-5'>開發案</b>例

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

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

    首發!成功移植OpenHarmony到瑞芯微RK2206開發板,2022年2月即將開源~

    、CapSense、I2S、PDM、i8080顯示接口、相機串行接口等,使產品開發更加簡單多樣。凌智RK2206開發板搭載OpenHarmony操作
    發表于 12-15 18:30

    輕量系統開發套件介紹:凌睿智捷 | 小凌派-RK2206 開發板套件

    凌睿智捷 | 小凌派-RK2206 開發板套件是由福州市凌睿智捷電子有限公司出品,主控器為瑞芯微高性能、高性價比的RK2206芯片,搭載OpenHarmony
    發表于 04-21 13:39

    RK2206開發板搭載OpenHarmony操作系統簡介

    1、小凌派-RK2206開發板簡介小凌派-RK2206開發板主控器為瑞芯微高性能、高性價比的RK2206芯片,搭載
    發表于 07-28 17:28

    RK2206開發板搭載OpenHarmony操作系統

    OTG、I2C、UART、PWM、SPI、CapSense、I2S、PDM、i8080顯示接口、相機串行接口等,使產品開發更加簡單多樣。凌智RK2206開發板搭載OpenHarmony
    發表于 09-07 17:15

    一款小凌派RK2206開發的智能電子寵物展示

    一款小凌派RK2206開發的智能電子寵物,OpenHarmony輕量級操作系統設計。以房間內聲源,物體,無線信號,人等為研究對象,組成一體多
    發表于 01-31 09:53

    【新書推薦】《OpenHarmony嵌入式系統原理與應用--基于RK2206芯片(微課視頻版)》

    OpenHarmony可以基于同-·套系統能力,適配多種終端形態,是一款面向未來、面向全場景的分布式操作系統。本書以 OpenHarmony 為主題,詳細講解了基于瑞芯微
    發表于 03-23 18:30

    好書推薦|《OpenHarmony嵌入式操作原理與應用》

    OpenHarmony嵌入式操作原理與應用》一書以物聯網應用為切入點,以瑞芯微 RK2206芯片為核心控制器,詳細講解了 OpenHarmony(開源鴻蒙)
    發表于 03-25 16:01

    OpenHarmony嵌入式系統原理與應用——基于RK2206芯片(微課視頻版)》學習記錄1 環境配置與源碼編譯

    。 OpenHarmony編程模型:OpenHarmony支持多進程和多線程編程,進程和線程的管理由操作系統內核負責。線程間通信可以使用信號量、消息隊列等方式。
    發表于 06-25 11:26

    基于小凌派RK2206開發板所制作的簡易示波器

    RK2206開發板而做的簡易示波器開發。 本開發以瑞芯微RK2206芯片 + OpenHarmony
    的頭像 發表于 05-06 17:09 ?2030次閱讀
    基于小凌派<b class='flag-5'>RK2206</b><b class='flag-5'>開發</b>板所制作的簡易示波器

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

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

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

    1、實驗簡介本實驗將演示如何在小凌派-RK2206開發板上使用IOT庫的GPIO中斷模式,進行GPIO編程開發。例程將創建一個任務,通過配置GPIO引腳為中斷
    的頭像 發表于 04-21 10:39 ?231次閱讀
    基于小凌派<b class='flag-5'>RK2206</b><b class='flag-5'>開發</b>板:<b class='flag-5'>OpenHarmony</b>如何使用IoT接口控制GPIO中斷

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

    1、實驗簡介本實驗將演示如何在小凌派-RK2206開發板上使用IOT庫的UART接口,進行UART編程開發。例程將創建一個任務,通過配置UART引腳,實現UART讀寫
    的頭像 發表于 04-22 14:22 ?225次閱讀
    基于小凌派<b class='flag-5'>RK2206</b><b class='flag-5'>開發</b>板:<b class='flag-5'>OpenHarmony</b>如何使用IoT接口控制UART外設

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

    1、實驗簡介本實驗將演示如何在小凌派-RK2206開發板上使用IOT庫的FLASH接口,進行FLASH編程開發。例程將創建一個任務,實現FLASH讀寫
    的頭像 發表于 04-22 14:49 ?167次閱讀
    基于小凌派<b class='flag-5'>RK2206</b><b class='flag-5'>開發</b>板:<b class='flag-5'>OpenHarmony</b>如何使用IoT接口控制FLASH外設
    主站蜘蛛池模板: 久久免费精品国产72精品剧情 | 天天爽夜夜爽夜夜爽精品视频 | 流不尽奶水的大乳h | 美女被异性狂揉下部羞羞视频 | 91久久天天躁狠狠躁夜夜 | 久久国产乱子伦精品免费午夜 | 四虎国产精品永久地址49 | 国产1024一区二区你懂的 | 激情五月婷婷在线 | 91成人午夜性a一级毛片 | 午夜操操 | 一本到中文字幕高清不卡在线 | 欧美日韩一区二区视频图片 | se94se最新网站 | 一级毛片一级毛片一级毛片 | 四虎精品免费国产成人 | 五月丁五月丁开行停停乱 | 一女被多男玩很肉很黄文 | 亚洲精品老司机综合影院 | 高h细节肉爽文bl1v1 | 天天伊人 | 美女张开腿让男生桶出水 | 久久国产成人精品国产成人亚洲 | 激情五月播播 | 久久久久琪琪免费影院 | 波多野结衣在线观看一区二区三区 | 国产一级做a爱免费观看 | 七月丁香八月婷婷综合激情 | 久久手机视频 | 特黄特色 | 资源种子在线观看 | 一本到视频在线 | 男女爱爱免费高清 | avtt天堂网永久资源 | 小雪被撑暴黑人黑人与亚洲女人 | 九九热国产在线 | 五月丁五月丁开行停停乱 | 日韩高清成人毛片不卡 | 欧美日本一区 | 最近在线视频免费观看2019 | 中国china体内裑精亚洲毛片 |