偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

基于TCP控制鴻蒙3861三色燈板亮滅(附Demo指導(dǎo))

開(kāi)發(fā)
文章由鴻蒙社區(qū)產(chǎn)出,想要了解更多內(nèi)容請(qǐng)前往:51CTO和華為官方戰(zhàn)略合作共建的鴻蒙技術(shù)社區(qū)https://harmonyos.51cto.com/#zz

[[374609]]

想了解更多內(nèi)容,請(qǐng)?jiān)L問(wèn):

51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)

https://harmonyos.51cto.com/#zz

跟著許思維老師的腳步,在許大神的影響之下才誕生了這個(gè)demo。

首先把整個(gè)demo跑起來(lái)的演示視頻放上來(lái),讓大家看看最終實(shí)現(xiàn)的一個(gè)效果,視頻鏈接(點(diǎn)擊可看):基于TCP來(lái)控制鴻蒙Hi3861三色燈板的燈的亮滅。

這玩意,說(shuō)簡(jiǎn)單也不簡(jiǎn)單,說(shuō)復(fù)雜吧也不復(fù)雜。

這里先說(shuō)一下demo源碼如何使用:

這里我已經(jīng)把整個(gè)demo源碼作為附件上傳了,大家把文件解壓后放在源碼目錄中:applications/sample/wifi-iot/app文件夾下,然后修改該文件夾下的BUILD.gn,將其內(nèi)容修改為:

  1. import("//build/lite/config/component/lite_component.gni"
  2.  
  3. lite_component("app") { 
  4.     features = [ 
  5.         "iothardware:wifi_demo"
  6.     ] 

 這里我還是先按照老規(guī)矩說(shuō)一下總體的大概思路:

1.PC和Hi3861開(kāi)發(fā)板之間使用無(wú)線連接到同一個(gè)局域網(wǎng)中。

2.Hi3861作為客戶端,PC作為服務(wù)端建立TCP連接。

3.Hi3861作為客戶端接受到PC端發(fā)送的相應(yīng)指令來(lái)進(jìn)行相應(yīng)的控制三色燈板的操作。

說(shuō)完了大概思路,就可以說(shuō)操作需要注意的一個(gè)點(diǎn)了:在把Hi3861燒好之后進(jìn)行測(cè)試的時(shí)候,需要先開(kāi)啟服務(wù)端(這里我是直接拿linux下的netcat,小伙伴完全可以換成自己熟悉的,都可以),然后在reset一下Hi3861開(kāi)發(fā)板。

下面開(kāi)始按照大概思路來(lái)分成三塊講解代碼

1.PC和Hi3861開(kāi)發(fā)板之間使用無(wú)線連接到同一個(gè)局域網(wǎng)中

1.1 首先定義了wifi需要的兩個(gè)監(jiān)聽(tīng)事件OnWifiConnectionChanged和OnWifiScanStateChanged

  1. static void OnWifiConnectionChanged(int state, WifiLinkedInfo* info) 
  2.     if (!info) return
  3.  
  4.     printf("%s %d, state = %d, info = \r\n", __FUNCTION__, __LINE__, state); 
  5.     PrintLinkedInfo(info); 
  6.  
  7.     if (state == WIFI_STATE_AVALIABLE) { 
  8.         g_connected = 1; 
  9.     } else { 
  10.         g_connected = 0; 
  11.     } 
  12. static void OnWifiScanStateChanged(int state, int size
  13.     printf("%s %d, state = %X, size = %d\r\n", __FUNCTION__, __LINE__, state, size); 

 1.2 定義了一個(gè)打印wifi信息的輔助函數(shù) 

  1. static void PrintLinkedInfo(WifiLinkedInfo* info) 
  2.     if (!info) return
  3.     static char macAddress[32] = {0}; 
  4.     unsigned char* mac = info->bssid; 
  5.     snprintf(macAddress, sizeof(macAddress), "%02X:%02X:%02X:%02X:%02X:%02X"
  6.         mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); 
  7.     printf("bssid: %s, rssi: %d, connState: %d, reason: %d, ssid: %s\r\n"
  8.         macAddress, info->rssi, info->connState, info->disconnectedReason, info->ssid); 

 1.3 開(kāi)始真正的wifi連接流程

  1. (void)arg; 
  2. WifiErrorCode errCode; 
  3. WifiEvent eventListener = { 
  4.     .OnWifiConnectionChanged = OnWifiConnectionChanged, 
  5.     .OnWifiScanStateChanged = OnWifiScanStateChanged 
  6. }; 
  7. WifiDeviceConfig apConfig = {0}; 
  8. int netId = -1; 
  9. osDelay(10); 
  10. errCode = RegisterWifiEvent(&eventListener); 
  11. printf("RegisterWifiEvent: %d\r\n", errCode); 
  12. strcpy(apConfig.ssid, "helloworld"); 
  13. strcpy(apConfig.preSharedKey, "12345678"); 
  14. apConfig.securityType = WIFI_SEC_TYPE_PSK; 
  15. errCode = EnableWifi(); 
  16. printf("EnableWifi: %d\r\n", errCode); 
  17. osDelay(10); 
  18. errCode = AddDeviceConfig(&apConfig, &netId); 
  19. printf("AddDeviceConfig: %d\r\n", errCode); 
  20. g_connected = 0; 
  21. errCode = ConnectTo(netId); 
  22. printf("ConnectTo(%d): %d\r\n", netId, errCode); 
  23. while (!g_connected) { 
  24.     osDelay(10); 
  25. printf("g_connected: %d\r\n", g_connected); 
  26. osDelay(50); 
  27. struct netif* iface = netifapi_netif_find("wlan0"); 
  28. if (iface) { 
  29.     err_t ret = netifapi_dhcp_start(iface); 
  30.     printf("netifapi_dhcp_start: %d\r\n", ret); 
  31.     osDelay(200); // wait DHCP server give me IP 
  32.     ret = netifapi_netif_common(iface, dhcp_clients_info_show, NULL); 
  33.     printf("netifapi_netif_common: %d\r\n", ret); 

 2.Hi3861作為客戶端,PC作為服務(wù)端建立TCP連接。

2.1 先配置TCP協(xié)議

  1. ssize_t retval = 0; 
  2. int sockfd = socket(AF_INET, SOCK_STREAM, 0); // TCP socket 
  3. unsigned short port=5678; 
  4. struct sockaddr_in serverAddr = {0}; 
  5. serverAddr.sin_family = AF_INET;  // AF_INET表示IPv4協(xié)議 
  6. serverAddr.sin_port = htons(port);  // 端口號(hào),從主機(jī)字節(jié)序轉(zhuǎn)為網(wǎng)絡(luò)字節(jié)序 
  7. if (inet_pton(AF_INET, PARAM_SERVER_ADDR, &serverAddr.sin_addr) <= 0) {  // 將主機(jī)IP地址從“點(diǎn)分十進(jìn)制”字符串 轉(zhuǎn)化為 標(biāo)準(zhǔn)格式(32位整數(shù)) 
  8. printf("inet_pton failed!\r\n"); 
  9. goto do_cleanup; 

 2.2 調(diào)用connect函數(shù)進(jìn)行連接,這里確保連接之后,才可以

  1. if (connect(sockfd, (struct sockaddr *)&serverAddr, sizeof(serverAddr)) < 0) { 
  2.       printf("connect failed!\r\n"); 
  3.       goto do_cleanup; 
  4.   } 
  5.   printf("connect to server %s success!\r\n", PARAM_SERVER_ADDR); 

 2.3 調(diào)用recv接口接收從PC服務(wù)端發(fā)來(lái)的消息

  1. retval = recv(sockfd, &response, sizeof(response), 0); 
  2. if (retval <= 0) { 
  3.     printf("send response from server failed or done, %ld!\r\n", retval); 
  4.     goto do_cleanup; 
  5. response[retval] = '\0'
  6. printf("recv response{%s} %ld from server done!\r\n", response, retval); 

 3.Hi3861作為客戶端接受到PC端發(fā)送的相應(yīng)指令來(lái)進(jìn)行相應(yīng)的控制三色燈板的操作。

3.1 先進(jìn)行Hi3861控制三色開(kāi)發(fā)板的基礎(chǔ)設(shè)置

  1. GpioInit(); 
  2.   IoSetFunc(RED_LED_PIN_NAME,RED_LED_PIN_FUNCTION); 
  3.   IoSetFunc(GREEN_LED_PIN_NAME,GREEN_LED_PIN_FUNCTION); 
  4.   IoSetFunc(RELLOW_LED_PIN_NAME,RELLOW_LED_PIN_FUNCTION); 
  5.   GpioSetDir(RED_LED_PIN_NAME,WIFI_IOT_GPIO_DIR_OUT); 
  6.   GpioSetDir(GREEN_LED_PIN_NAME,WIFI_IOT_GPIO_DIR_OUT); 
  7.   GpioSetDir(RELLOW_LED_PIN_NAME,WIFI_IOT_GPIO_DIR_OUT); 

 3.2 根據(jù)TCP協(xié)議接收到的信息,判斷后選擇GpioSetOutputVal進(jìn)行三色燈開(kāi)關(guān)控制

  1. if(strncmp(RED_ON,response,5) == 0){ 
  2.       printf("red on----------------"); 
  3.       GpioSetOutputVal(RED_LED_PIN_NAME,LED_BRIGHT); 
  4.   } 
  5.   else if(strncmp(RED_OFF,response,6) == 0){ 
  6.       printf("red off--------------"); 
  7.       GpioSetOutputVal(RED_LED_PIN_NAME,LED_DARK); 
  8.   }else if(strncmp(GREEN_ON,response,7) == 0){ 
  9.       printf("red on----------------"); 
  10.       GpioSetOutputVal(GREEN_LED_PIN_NAME,LED_BRIGHT); 
  11.   } 
  12.   else if(strncmp(GREEN_OFF,response,8) == 0){ 
  13.       printf("red off--------------"); 
  14.       GpioSetOutputVal(GREEN_LED_PIN_NAME,LED_DARK); 
  15.   }else 
  16.       if(strncmp(RELLOW_ON,response,8) == 0){ 
  17.       printf("red on----------------"); 
  18.       GpioSetOutputVal(RELLOW_LED_PIN_NAME,LED_BRIGHT); 
  19.   } 
  20.   else if(strncmp(RELLOW_OFF,response,9) == 0){ 
  21.       printf("red off--------------"); 
  22.       GpioSetOutputVal(RELLOW_LED_PIN_NAME,LED_DARK); 
  23.   }else 
  24.   { 
  25.       printf("error index"); 
  26.   } 

 上述所有源碼見(jiàn)附件,有什么問(wèn)題歡迎留言交流

ps:分享一個(gè)調(diào)試中困擾了我好長(zhǎng)時(shí)間的一個(gè)問(wèn)題,就是在調(diào)試過(guò)程中Hi3861的無(wú)線很不穩(wěn)定,連接上一會(huì)兒就會(huì)掉,然后又連接,我一度以為是代碼的問(wèn)題,苦苦探求,之后才發(fā)現(xiàn)問(wèn)題的根源是我公司的同時(shí)使用的wifi太多了,把無(wú)線信道都占了,導(dǎo)致我使用的只支持2.4G的小破路由器根本不穩(wěn)定,給大家分享這個(gè)坑,遇到的話直接跳過(guò)去,別重蹈我的覆轍了......

想了解更多內(nèi)容,請(qǐng)?jiān)L問(wèn):

51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)

https://harmonyos.51cto.com/#zz

 

責(zé)任編輯:jianghua 來(lái)源: 鴻蒙社區(qū)
相關(guān)推薦

2022-08-05 19:37:59

鴻蒙Api框架

2023-01-08 13:46:49

2022-04-02 20:11:50

智慧交通燈鴻蒙操作系統(tǒng)

2021-08-06 11:46:46

Go三色標(biāo)記法

2021-08-16 10:35:52

JVM標(biāo)記法屏障

2020-12-31 12:22:15

鴻蒙Hi3861應(yīng)用開(kāi)發(fā)

2021-06-25 15:32:13

鴻蒙HarmonyOS應(yīng)用

2025-01-06 08:22:41

2022-08-15 08:01:00

三色標(biāo)記JVM算法

2021-09-09 10:06:09

鴻蒙HarmonyOS應(yīng)用

2022-01-07 09:56:16

鴻蒙HarmonyOS應(yīng)用

2020-12-15 11:57:49

Hi3861 HarmonyOS開(kāi)發(fā)板

2020-07-09 15:45:22

GoGC內(nèi)存

2011-04-08 11:13:50

CISCO IOS令牌桶雙桶

2023-06-19 07:12:51

JVM三色標(biāo)記

2021-12-14 14:45:38

鴻蒙HarmonyOS應(yīng)用

2012-06-12 11:28:51

精益掃描儀

2021-09-16 10:03:39

鴻蒙HarmonyOS應(yīng)用

2020-10-30 09:41:44

鴻蒙Hi3861WiFi小車(chē)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)