为实现Hi3861和ESP-01s(stm32)的通信,考虑在Hi3861上建立一个TCPserver,代码无法实现功能,求指教。 - HarmonyOS技术社区 - 电子技术论坛 - 广受欢迎的专业电子论坛
分享 收藏 返回

[问答]

为实现Hi3861和ESP-01s(stm32)的通信,考虑在Hi3861上建立一个TCPserver,代码无法实现功能,求指教。

  1. #include

  2. #include

  3. #include "ohos_init.h"
  4. #include "cmsis_os2.h"

  5. #include
  6. #include "hi_wifi_api.h"
  7. //#include "wifi_sta.h"
  8. #include "lwip/ip_addr.h"
  9. #include "lwip/netifapi.h"

  10. #include "lwip/sockets.h"



  11. #define SERVER_PORT_TCP                        6666
  12. #define TCP_BACKLOG 10


  13. /* 在sock_fd 进行监听,在 new_fd 接收新的链接 */
  14. int sock_fd, new_fd;

  15. char recvbuf[512];
  16. char *buf = "hello! I'm server!";

  17. int tcp_demo(void)
  18. {

  19.         /* 自己的地址信息 */
  20.         struct sockaddr_in my_addr;
  21.         /*        连接者的地址信息*/
  22.         struct sockaddr_in their_addr;
  23.         int sin_size;

  24.         struct sockaddr_in *cli_addr;

  25.     printf("%s %d rn", __FILE__, __LINE__);

  26.     /* 1 、创建socket  */
  27.         if((sock_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
  28.         {
  29.         printf("%s %d rn", __FILE__, __LINE__);
  30.                 perror("socket is errorrn");
  31.                 exit(1);
  32.         }

  33.     /* 主机字节顺序 */
  34.         /* 协议 */
  35.         my_addr.sin_family = AF_INET;
  36.         my_addr.sin_port = htons(6666);
  37.         /* 当前IP 地址写入 */
  38.         my_addr.sin_addr.s_addr = INADDR_ANY;

  39.         /* 将结构体其余的都清零 */
  40.         bzero(&(my_addr.sin_zero), 8);

  41.     printf("%s %d rn", __FILE__, __LINE__);
  42.         /* bind 绑定*/
  43.         if(bind(sock_fd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == -1)
  44.         {
  45.         printf("%s %d rn", __FILE__, __LINE__);
  46.                 perror("bind is errorrn");
  47.                 exit(1);
  48.         }

  49.     printf("%s %d rn", __FILE__, __LINE__);
  50.         /* 开始监听 */
  51.         if(listen(sock_fd, TCP_BACKLOG) == -1)
  52.         {
  53.                 perror("listen is errorrn");
  54.                 exit(1);
  55.         }

  56.     printf("%s %d rn", __FILE__, __LINE__);
  57.         printf("start acceptn");

  58.     /* accept() 循环 */
  59.         while(1)
  60.         {
  61.                 sin_size = sizeof(struct sockaddr_in);

  62.         printf("%s %d rn", __FILE__, __LINE__);
  63.                 if((new_fd = accept(sock_fd, (struct sockaddr *)&their_addr, (socklen_t *)&sin_size)) == -1)
  64.                 {
  65.                         perror("accept");
  66.                         continue;
  67.                 }

  68.                 cli_addr = malloc(sizeof(struct sockaddr));

  69.                 printf("accept addrrn");

  70.                 if(cli_addr != NULL)
  71.                 {
  72.                         memcpy(cli_addr, &their_addr, sizeof(struct sockaddr));
  73.                 }

  74.                 //处理目标
  75.                 ssize_t ret;
  76.                

  77.                 while(1)
  78.                 {
  79.             printf("%s %d rn", __FILE__, __LINE__);
  80.                         if((ret = recv(new_fd, recvbuf, sizeof(recvbuf), 0)) == -1){
  81.                                 printf("recv error rn");
  82.                                 return -1;
  83.                         }
  84.                         printf("recv :rn");
  85.                         printf("%s", recvbuf);
  86.                         printf("rn");
  87.                         sleep(2);
  88.                         if((ret = send(new_fd, buf, strlen(buf) + 1, 0)) == -1)
  89.                         {
  90.                                 perror("send : ");
  91.                         }

  92.                         sleep(2);
  93.                 }

  94.                

  95.                 close(new_fd);

  96.         return 0;
  97.         }
  98. }


  99. void TCPExampleEntry(void)
  100. {

  101.    

  102.     tcp_demo();

  103. }

  104. SYS_RUN(TCPExampleEntry);
Hi3861的WIFI已经成功开启。通过串口调试ESP01s,可以连接WIFI,但是在连接TCP服务器时失败。
已退回2积分

回帖(4)

emitter

2021-6-2 11:31:35
你好,已经邀请开发者朋友来解答,请暂时稍等

HonestQiao

2021-6-2 11:45:39
先通过串口调试Hi3861,看看进行到了哪一步

呆虫虫

2021-6-3 13:39:30
建议在程序执行过程中添加串口打印,将程序的执行日志打印出来,把server的信息(包括IP,监听的端口)打印出来,注意Socket在创建完成之后需要bind本地端口,accept监听连接请求,如果收到连接请求的话会返回一个新的套接字句柄(liunx下为文件描述符),我们实际上是用这个句柄进行通讯的,所以你需要找到在你的代码运行过程中,SOCKET有没有建立好?端口BIND的是否是你需要的那个端口?有没有接收到连接请求?消息发送时的句柄使用的是否正确?       ~此条回复来自萌新虫,祝好!

呆虫虫

2021-6-3 13:42:19
建议在程序执行过程中添加串口打印,将程序的执行日志打印出来,把server的信息(包括IP,监听的端口)打印出来,注意Socket在创建完成之后需要bind本地端口,accept监听连接请求,如果收到连接请求的话会返回一个新的套接字句柄(liunx下为文件描述符),我们实际上是用这个句柄进行通讯的,所以你需要找到在你的代码运行过程中,SOCKET有没有建立好?端口BIND的是否是你需要的那个端口?有没有接收到连接请求?消息发送时的句柄使用的是否正确?       ~此条回复来自萌新虫,祝好!

更多回帖

×
发帖