[文章]【HarmonyOS HiSpark Wi-Fi IoT 套件试用连载】基于LwIP的Web Server 的演示与代码分享

阅读量0
0
0
硬件模块:
WF-H861-SSA1 WiFi 模组

实现功能:在上电后进入AP 模式,热点名称:Soon-WiFi-IoT,连接上热点后用浏览器访问http://192.168.10.1/
显示“Hello Wifi IoT”
1.png

http://192.168.10.1/wifiiot
显示“欢迎访问wifi-iot页面”
2.png

http://192.168.10.1/error
显示“404-Page not found”
3.png


主要代码如下
  1. #include <stdio.h>
  2. #include <unistd.h>
  3. #include <string.h>
  4. #include <hi_i2c.h>
  5. #include "ohos_init.h"
  6. #include "cmsis_os2.h"
  7. #include "wifi/ap_mode.h"
  8. #include "lwip/sockets.h"

  9. const unsigned char htmldata[] = "
  10.       <html>
  11.             <meta charset="utf-8 ">
  12.             <head>
  13.                <title>Wifi-iot</title>
  14.             </head>
  15.             <body>
  16.                <h1>欢迎访问wifi-iot页面</h1>
  17.             </body>
  18.      </html>";
  19. const unsigned char hellowifiiot[] = "
  20.         <html>
  21.             <head>
  22.                <title>Hello Wifi IoT</title>
  23.             </head>
  24.             <body>
  25.                <h1>Hello Wifi IoT</h1>
  26.             </body>
  27.         </html>";
  28. const unsigned char errhtml[] = "
  29.         <html>
  30.             <head>
  31.                <title>Error!</title>
  32.             </head>
  33.             <body>
  34.                <h1>404-Page not found</h1>
  35.             </body>
  36.         </html>";

  37. /**
  38.   * [url=home.php?mod=space&uid=2666770]@Brief[/url] serve tcp connection  
  39.   * [url=home.php?mod=space&uid=3142012]@param[/url] conn: connection socket
  40.   * @retval None
  41.   */
  42. void http_server(int conn)
  43. {
  44.     int buflen = 1500;
  45.     int ret;
  46.     unsigned char recv_buffer[1500];

  47.     /* Read in the request */
  48.     ret = read(conn, recv_buffer, buflen);
  49.     if (ret <= 0)
  50.     {
  51.         close(conn);
  52.         printf("read failedrn");
  53.         return;
  54.     }

  55.     if (strncmp((char *)recv_buffer, "GET /wifiiot", 9) == 0)
  56.     {
  57.         write(conn, htmldata, sizeof(htmldata) - 1);
  58.     }
  59.     else if (strncmp((char *)recv_buffer, "GET /error", 9) == 0)
  60.     {
  61.         write(conn, errhtml, sizeof(errhtml) - 1);
  62.     }
  63.     else
  64.     {
  65.         write(conn, hellowifiiot, sizeof(hellowifiiot) - 1);
  66.     }
  67.     /* Close connection socket */
  68.     close(conn);
  69. }

  70. /**
  71.   * @brief  http_task
  72.   * @param None
  73.   * @retval None
  74.   */
  75. static void http_task(void)
  76. {
  77.     int sock, newconn, size;
  78.     struct sockaddr_in address, remotehost;

  79.     /* create a TCP socket */
  80.     if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0)
  81.     {
  82.         printf("can not create socket");
  83.         return;
  84.     }

  85.     /* bind to port 80 at any interface */
  86.     address.sin_family = AF_INET;
  87.     address.sin_port = htons(80);
  88.     address.sin_addr.s_addr = INADDR_ANY;
  89.     if (bind(sock, (struct sockaddr *)&address, sizeof(address)) < 0)
  90.     {
  91.         printf("can not bind socket");
  92.         close(sock);
  93.         return;
  94.     }

  95.     /* listen for connections (TCP listen backlog = 1) */
  96.     listen(sock, 1);
  97.     size = sizeof(remotehost);
  98.     while (1)
  99.     {
  100.         newconn = accept(sock, (struct sockaddr *)&remotehost, (socklen_t *)&size);
  101.         if (newconn >= 0)
  102.         {
  103.             printf("newconn");
  104.             http_server(newconn);
  105.         }
  106.         else
  107.         {
  108.             close(newconn);
  109.         }
  110.     }
  111. }

  112. static void *Lwip_Web_Task(const char *arg)
  113. {
  114.     (void)arg;
  115.     wifi_start_softap();
  116.     http_task();
  117.     return NULL;
  118. }

  119. static void Lwip_Web_Entry(void)
  120. {
  121.     osThreadAttr_t attr = {0};

  122.     attr.name = "Lwip_Web_Task";
  123.     attr.attr_bits = 0U;
  124.     attr.cb_mem = NULL;
  125.     attr.cb_size = 0U;
  126.     attr.stack_mem = NULL;
  127.     attr.stack_size = 8192;
  128.     attr.priority = osPriorityNormal;

  129.     if (osThreadNew((osThreadFunc_t)Lwip_Web_Task, NULL, &attr) == NULL)
  130.     {
  131.         printf("Falied to create Lwip_Web_Entry!n");
  132.     }
  133. }

  134. SYS_RUN(Lwip_Web_Entry);
复制代码


完整代码,如附件
lwip_webserver.7z
(2.69 KB, 下载次数: 3)

1


编译好的测试bin
Hi3861_wifiiot_app_allinone.bin
(761.04 KB, 下载次数: 5)


参考文章
LwIP之socket应用--WebServer和Modbus TCP

回帖

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