日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
基于TCP控制鴻蒙3861三色燈板亮滅(附Demo指導(dǎo))

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

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

https://harmonyos./#zz

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

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

這玩意,說簡單也不簡單,說復(fù)雜吧也不復(fù)雜。

這里先說一下demo源碼如何使用:

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

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

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

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

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

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

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

下面開始按照大概思路來分成三塊講解代碼

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

1.1 首先定義了wifi需要的兩個(gè)監(jiān)聽事件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 開始真正的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ā)來的消息

 
 
 
 
  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)指令來進(jìn)行相應(yīng)的控制三色燈板的操作。

3.1 先進(jìn)行Hi3861控制三色開發(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)行三色燈開關(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.   } 

 上述所有源碼見附件,有什么問題歡迎留言交流

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

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

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

https://harmonyos./#zz


名稱欄目:基于TCP控制鴻蒙3861三色燈板亮滅(附Demo指導(dǎo))
新聞來源:http://www.dlmjj.cn/article/dhphsij.html