[Wi-Fi/蓝牙/Zigbee…] 【WFI32E04分享】-4-TCP点灯

[复制链接]
211|0
南来之风 发表于 2025-11-11 22:47 | 显示全部楼层 |阅读模式
本帖最后由 南来之风 于 2025-11-11 22:51 编辑

结合官方文档TCP-SERVER,本文体验在MPLAB X IDE 6.25版本中体验TCP的使用。


基于MHC图形化配置,可以在Content Manager中添加Wi-Fi相关的组件


然后添加WI-FI service,软件会自动添加相关联的大概20多个子模块。一直点击OK即可。




可以通过下拉选择不同的层级。点击不同的组件,可以在右侧配置详细信息:



电脑连接开发板的接入点:



使用Putty连接到TCP Server:


发送GREEN_TOGGLE,绿色LED灯颜色翻转。


发送RED_TOGGLE,红色LED灯颜色翻转。



也可以使用Python脚本作为一个TCP Client与开发板TCP Server进行通信。
  1. import socket
  2. import time

  3. def auto_tcp_client(server_ip, port=5555):
  4.     """自动发送数据的TCP客户端"""
  5.     try:
  6.         # 创建并连接socket
  7.         client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  8.         client_socket.connect((server_ip, port))
  9.         print(f"已连接到 {server_ip}:{port}")
  10.         
  11.         # 自动发送测试数据
  12.         messages = [
  13.             "Hello Server!",
  14.             "GREEN_TOGGLE",
  15.             "This is a test message",
  16.             "TCP Client is working",
  17.             "RED_TOGGLE",
  18.             "Goodbye!"
  19.         ]
  20.         
  21.         for message in messages:
  22.             client_socket.sendall(message.encode('utf-8'))
  23.             print(f"已发送: {message}")
  24.             time.sleep(1)  # 等待1秒
  25.             
  26.     except Exception as e:
  27.         print(f"错误: {e}")
  28.     finally:
  29.         client_socket.close()
  30.         print("连接已关闭")

  31. # 使用示例
  32. if __name__ == "__main__":
  33.     import sys
  34.     if len(sys.argv) != 2:
  35.         print("请提供服务器IP地址")
  36.         sys.exit(1)
  37.    
  38.     auto_tcp_client(sys.argv[1])
TCP服务器端主要的代码有初始化:
  1. void APP_Initialize(void) {
  2.     SYS_CONSOLE_MESSAGE("APP_Initialize\n");

  3.     g_tcpServCfg.mode = SYS_NET_INDEX0_MODE;
  4.     g_tcpServCfg.port = SYS_NET_INDEX0_PORT;
  5.     g_tcpServCfg.enable_tls = SYS_NET_INDEX0_ENABLE_TLS;
  6.     g_tcpServCfg.ip_prot = SYS_NET_INDEX0_IPPROT;
  7.     g_tcpServCfg.enable_reconnect = SYS_NET_INDEX0_RECONNECT;
  8.     g_tcpServHandle = SYS_NET_Open(&g_tcpServCfg, TcpServCallback, 0);
  9.     if (g_tcpServHandle != SYS_MODULE_OBJ_INVALID)
  10.         SYS_CONSOLE_PRINT("TCP Service Initialized Successfully\r\n");

  11. }


还有服务器的回调:
  1. void TcpServCallback(uint32_t event, void *data, void* cookie) {
  2.     switch (event) {
  3.         case SYS_NET_EVNT_CONNECTED:
  4.         {
  5.             SYS_CONSOLE_PRINT("TcpServCallback(): Status UP\r\n");
  6.             while (SYS_NET_SendMsg(g_tcpServHandle, (uint8_t*) "hello", 5) <= 0);
  7.             break;
  8.         }

  9.         case SYS_NET_EVNT_DISCONNECTED:
  10.         {
  11.             SYS_CONSOLE_PRINT("TcpServCallback(): Status DOWN\r\n");
  12.             break;
  13.         }

  14.         case SYS_NET_EVNT_RCVD_DATA:
  15.         {
  16.             int32_t cumm_len = 0;
  17.             int32_t len = RECV_BUFFER_LEN;
  18.             while (len == RECV_BUFFER_LEN) {
  19.                 len = SYS_NET_RecvMsg(g_tcpServHandle, recv_buffer, RECV_BUFFER_LEN);
  20.                 if (len > 0) {
  21.                     if (cumm_len == 0) {
  22.                         char buffer[33];
  23.                         int32_t tmp_len = (len > 32) ? 32 : len;

  24.                         memcpy(buffer, recv_buffer, tmp_len);
  25.                         buffer[tmp_len] = '\0';
  26.                         SYS_CONSOLE_PRINT("TcpServCallback(): Data Rcvd = %s\r\n", buffer);

  27.                         if (strstr(buffer, "GREEN_TOGGLE") != NULL) {
  28.                             GPIO_RK3_GREEN_Toggle();
  29.                         }
  30.                         if (strstr(buffer, "RED_TOGGLE") != NULL) {
  31.                             GPIO_RK1_RED_Toggle();
  32.                         }

  33.                     }
  34.                     cumm_len += len;
  35.                     SYS_NET_SendMsg(g_tcpServHandle, recv_buffer, len);
  36.                 }
  37.             }
  38.             SYS_CONSOLE_PRINT("TcpServCallback(): Total Data Rcvd = %d Bytes\r\n", cumm_len);

  39.             break;
  40.         }

  41.         case SYS_NET_EVNT_LL_INTF_DOWN:
  42.         {
  43.             /*
  44.              ** User needs to take a decision if they want to close the socket or
  45.              ** wait for the Lower layer to come up
  46.              */
  47.             SYS_CONSOLE_PRINT("TcpServCallback(): Lower Layer Down\r\n");
  48.             break;
  49.         }

  50.         case SYS_NET_EVNT_LL_INTF_UP:
  51.         {
  52.             /*
  53.              ** The lower layer was down and now it has come up again.
  54.              ** The socket was in connected state all this while
  55.              */
  56.             SYS_CONSOLE_PRINT("TcpServCallback(): Lower Layer Up\r\n");
  57.             break;
  58.         }

  59.         case SYS_NET_EVNT_SERVER_AWAITING_CONNECTION:
  60.         {
  61.             /*
  62.              ** The server is awaiting connection from the client
  63.              */
  64.             SYS_CONSOLE_PRINT("TcpServCallback(): Server Awaiting Connection\r\n");
  65.             break;
  66.         }
  67.     }
  68. }


总结:
借助于Microchip丰富的资源与开发文档,可以快速的找到可借鉴的方案。借助于MPLABX ide可以图形化配置,自动代码生成,也节约了大量的时间。
虽然MPLABX ide有一点不太容易上手,熟悉后就发现是开发的一大利器。




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
您需要登录后才可以回帖 登录 | 注册

本版积分规则

76

主题

304

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部