[]基于HiSpark_WiFi_IoT智能家居项目实战1-灯光控制UDP版本

阅读量0
0
2
`        这是一个基于HiSpark_WiFi_IoT智能家居项目实战1-灯光控制例程, 之前有看下润和许老师以及连志安老师视频和开源码,HiSpark_WiFi_IoT Hi3861的底层驱动,和一些移植案例做都非常好,如MQTT,Oled 等,非常感谢他们的付出. 他们的案例很值得我们去学习参考 ,在此,我就不必重复造轮子. 下列是我一个智能家居项目实战1-灯光控制例程, 客户APP端的软件包含一个UDP 服务器, Hi3861只要请求连接成功就可以通讯了.如下图:

具体看源码:
  1. //------------------------------------------------------------------------
  2. //#include "MQTTPacket.h"
  3. #include "transport.h"
  4. #include <stdio.h>
  5. #include <string.h>
  6. #include <unistd.h>
  7. #include "wifi_device.h"
  8. #include "wifiiot_gpio.h"
  9. #include "wifiiot_gpio_ex.h"
  10. #include "lwip/netifapi.h"
  11. #include "lwip/api_shell.h"
  12. #include "net_common.h"
  13. #define PARAM_HOTSPOT_SSID "Honor"   // your AP SSID
  14. #define PARAM_HOTSPOT_PSK  "12345678"  // your AP PSK
  15. #define PARAM_SERVER_ADDR  "192.168.43.36"
  16. #define PARAM_SERVER_PORT   6201
  17. #define PARAM_HOTSPOT_TYPE WIFI_SEC_TYPE_PSK // defined in wifi_device_config.h
  18. #define R_LED WIFI_IOT_GPIO_IDX_10
  19. #define B_LED WIFI_IOT_GPIO_IDX_12
  20. #define G_LED WIFI_IOT_GPIO_IDX_11

  21. static char request[] = "light:0
  22. ";
  23. static char response[128] = "";
  24. static char light_status = 0;

  25. void UdpClient(const char* host, unsigned short port);
  26. static void PrintLinkedInfo(WifiLinkedInfo* info)
  27. {
  28.     if (!info) return;
  29.    static char macAddress[32] = {0};
  30.     unsigned char* mac = info->bssid;
  31.     snprintf(macAddress, sizeof(macAddress), "%02X:%02X:%02X:%02X:%02X:%02X",
  32.         mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
  33.     printf("bssid: %s, rssi: %d, connState: %d, reason: %d, ssid: %s
  34. ",
  35.         macAddress, info->rssi, info->connState, info->disconnectedReason, info->ssid);
  36. }
  37. static volatile int g_connected = 0;
  38. static void OnWifiConnectionChanged(int state, WifiLinkedInfo* info)
  39. {
  40.     if (!info) return;
  41.     printf("%s %d, state = %d, info =
  42. ", __FUNCTION__, __LINE__, state);
  43.     PrintLinkedInfo(info);
  44.     if (state == WIFI_STATE_AVALIABLE) {
  45.         g_connected = 1;
  46.     } else {
  47.         g_connected = 0;
  48.     }
  49. }


  50. static void OnWifiScanStateChanged(int state, int size)
  51. {
  52.     printf("%s %d, state = %X, size = %d
  53. ", __FUNCTION__, __LINE__, state, size);
  54. }


  55. static WifiEvent g_defaultWifiEventListener = {
  56.     .OnWifiConnectionChanged = OnWifiConnectionChanged,
  57.     .OnWifiScanStateChanged = OnWifiScanStateChanged
  58. };
  59. static struct netif* g_iface = NULL;


  60. int ConnectToHotspot(WifiDeviceConfig* apConfig)
  61. {
  62.     WifiErrorCode errCode;
  63.     int netId = -1;
  64.     errCode = RegisterWifiEvent(&g_defaultWifiEventListener);
  65.     printf("RegisterWifiEvent: %d
  66. ", errCode);
  67.     errCode = EnableWifi();
  68.     printf("EnableWifi: %d
  69. ", errCode);
  70.    errCode = AddDeviceConfig(apConfig, &netId);
  71.     printf("AddDeviceConfig: %d
  72. ", errCode);
  73.     g_connected = 0;
  74.     errCode = ConnectTo(netId);
  75.     printf("ConnectTo(%d): %d
  76. ", netId, errCode);
  77.     while (!g_connected) { // wait until connect to AP
  78.         osDelay(10);
  79.     }
  80.     printf("g_connected: %d
  81. ", g_connected);
  82.     g_iface = netifapi_netif_find("wlan0");
  83.     if (g_iface) {
  84.         err_t ret = netifapi_dhcp_start(g_iface);
  85.         printf("netifapi_dhcp_start: %d
  86. ", ret);
  87.         osDelay(100); // wait DHCP server give me IP
  88.         ret = netifapi_netif_common(g_iface, dhcp_clients_info_show, NULL);
  89.         printf("netifapi_netif_common: %d
  90. ", ret);
  91.     }
  92.     return netId;
  93. }


  94. void DisconnectWithHotspot(int netId)
  95. {
  96.     if (g_iface) {
  97.         err_t ret = netifapi_dhcp_stop(g_iface);
  98.         printf("netifapi_dhcp_stop: %d
  99. ", ret);
  100.     }
  101.     WifiErrorCode errCode = Disconnect(); // disconnect with your AP
  102.     printf("Disconnect: %d
  103. ", errCode);
  104.     errCode = UnRegisterWifiEvent(&g_defaultWifiEventListener);
  105.     printf("UnRegisterWifiEvent: %d
  106. ", errCode);
  107.     RemoveDevice(netId); // remove AP config
  108.     printf("RemoveDevice: %d
  109. ", errCode);
  110.     errCode = DisableWifi();
  111.     printf("DisableWifi: %d
  112. ", errCode);
  113. }

  114. static void NetDemoTask(void *arg)
  115. {
  116.     (void)arg;
  117.     WifiDeviceConfig config = {0};
  118.     // 准备AP的配置参数
  119.     strcpy(config.ssid, PARAM_HOTSPOT_SSID);
  120.     strcpy(config.preSharedKey, PARAM_HOTSPOT_PSK);
  121.     config.securityType = PARAM_HOTSPOT_TYPE;
  122. for(;;){
  123.     osDelay(10);
  124.     int netId = ConnectToHotspot(&config);
  125.     int timeout = 2;
  126.     while (timeout--) {
  127.         printf("After %d seconds, I will start
  128. ", timeout);
  129.         osDelay(100);
  130.     }
  131.     UdpClient(PARAM_SERVER_ADDR, PARAM_SERVER_PORT);
  132.     // mqtt_connect();
  133.     printf("disconnect to AP ...
  134. ");
  135.     DisconnectWithHotspot(netId);
  136.     printf("disconnect to AP done!
  137. ");
  138.   }
  139. }

  140. static void NetDemoEntry(void)
  141. {
  142.         GpioInit();
  143.         //设置红色,蓝 色,绿色 LED IO为输出状态
  144.         IoSetFunc(WIFI_IOT_IO_NAME_GPIO_10,          WIFI_IOT_IO_FUNC_GPIO_10_GPIO);
  145.         GpioSetDir(WIFI_IOT_IO_NAME_GPIO_10, WIFI_IOT_GPIO_DIR_OUT);
  146.         IoSetFunc(WIFI_IOT_IO_NAME_GPIO_11, WIFI_IOT_IO_FUNC_GPIO_11_GPIO);
  147.         GpioSetDir(WIFI_IOT_IO_NAME_GPIO_11, WIFI_IOT_GPIO_DIR_OUT);
  148.         IoSetFunc(WIFI_IOT_IO_NAME_GPIO_12, WIFI_IOT_IO_FUNC_GPIO_12_GPIO);
  149.         GpioSetDir(WIFI_IOT_IO_NAME_GPIO_12, WIFI_IOT_GPIO_DIR_OUT);
  150.     osThreadAttr_t attr;
  151.     attr.name = "NetDemoTask";
  152.     attr.attr_bits = 0U;
  153.     attr.cb_mem = NULL;
  154.     attr.cb_size = 0U;
  155.     attr.stack_mem = NULL;
  156.     attr.stack_size = 40960;
  157.     attr.priority = osPriorityNormal;
  158.     if (osThreadNew(NetDemoTask, NULL, &attr) == NULL) {
  159.         printf("[NetDemoEntry] Falied to create NetDemoTask!
  160. ");
  161.     }
  162. }
  163. SYS_RUN(NetDemoEntry);
  164. //=================================================
  165. void UdpClient(const char* host, unsigned short port)
  166. {
  167.        ssize_t retval = 0;
  168.         GpioSetOutputVal(R_LED, 1);
  169.         GpioSetOutputVal(B_LED, 1);
  170.         GpioSetOutputVal(G_LED, 1);
  171.         light_status = 1;
  172.         while (g_connected){
  173.            int sockfd = socket(AF_INET, SOCK_DGRAM, 0); // UDP socket
  174.           printf("ip%s:%d
  175. ",host,port);
  176.           struct sockaddr_in toAddr = {0};
  177.           toAddr.sin_family = AF_INET;
  178.           toAddr.sin_port = htons(port);
  179.      if (inet_pton(AF_INET, host, &toAddr.sin_addr) <= 0) {
  180.            printf("inet_pton failed!
  181. ");
  182.            goto do_cleanup;
  183.     }


  184.     if(light_status == 1){
  185.             request[6] = '1';
  186.     }else{
  187.             request[6] = '0';
  188.     }
  189.     retval = sendto(sockfd, request, sizeof(request), 0, (struct sockaddr *)&toAddr, sizeof(toAddr));
  190.     if (retval < 0) {
  191.         printf("sendto failed!
  192. ");
  193.         goto do_cleanup;
  194.     }
  195.     printf("send UDP message {%s} %ld done!
  196. ", request, retval);
  197.     struct sockaddr_in fromAddr = {0};
  198.     socklen_t fromLen = sizeof(fromAddr);
  199.     retval = recvfrom(sockfd, &response, sizeof(response), 0, (struct sockaddr *)&fromAddr, &fromLen);
  200.     if (retval <= 0) {
  201.         printf("recvfrom failed or abort, %ld, %d!
  202. ", retval, errno);
  203.         goto do_cleanup;
  204.     }
  205.     response[retval] = '\0';
  206.     printf("recv UDP message {%s} %ld done!
  207. ", response, retval);
  208.     printf("peer info: ipaddr = %s, port = %d
  209. ", inet_ntoa(fromAddr.sin_addr), ntohs(fromAddr.sin_port));
  210.         if (strncmp((char *)response, (char *)"light", 5) == 0){
  211.             printf("response[6]= %c
  212. ",response[6]);
  213.             if(response[6]=='1'){
  214.                                   GpioSetOutputVal(R_LED, 1);
  215.                                   GpioSetOutputVal(B_LED, 1);
  216.                                   GpioSetOutputVal(G_LED, 1);
  217.                                   light_status = 1;
  218.             }
  219.             else{
  220.                                   GpioSetOutputVal(R_LED, 0);
  221.                                   GpioSetOutputVal(B_LED, 0);
  222.                                   GpioSetOutputVal(G_LED, 0);
  223.                                   light_status = 0;
  224.             }
  225.         }
  226. do_cleanup:
  227.     printf("do_cleanup...
  228. ");
  229.     close(sockfd);
  230.     }
  231. }
复制代码


--------------------------------------------------------------------
附上源码:
  

附上高清视频
  
模拟APP测试软件




`
2020-11-15_144933.png
[attach]976213[/attach]

回帖

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。 侵权投诉
链接复制成功,分享给好友