萤火工场 GD32VW553-IOT-V2 WIFI连接手机热点通信

分享作者:wx17688191592076
评测品牌:萤火工场
评测型号:GD32VW553-IOT-V2
发布时间:2026-02-03 10:20:52
2
概要
主要讲述通过WIFI连接到手机热点,然后向手机发送并接收数据,需要修改的参数是WiFi名、WiFi密码、接收的IP地址、IP端口号
开源口碑分享内容

对于软件下载和烧录的流程可以参考我发的视频,这里说一下一些配置

1.首先要导入下载的三个文件中的GD32VW55x_RELEASE_V1.0.3f->MSDK->examples->wifi->https_client历程代码

2.选择这个文件夹后,点击finish,可以看到左边导入的工程文件,点开文件夹,再点开main文件夹,点击https_client_main.c,ctrl+A选择全部代码,ctrl+v粘贴下列的代码

3.之后修改代码里的参数WiFi名、WiFi密码、接收的IP地址、IP端口号,记得可以参考视频的内容

4.然后就是代码的编译烧录了

日志如图所示

手机端收发如图所示

代码如下,直接覆盖掉https_client_main.c的内容即可:

#include <stdint.h>
#include <stdio.h>
#include <string.h>
#include "app_cfg.h"
#include "gd32vw55x_platform.h"
#include "wifi_management.h"
#include "wifi_init.h"
#include "FreeRTOS.h"
#include "task.h"
#include "gd32vw55x_gpio.h"
#include "gd32vw55x_rcu.h"
#include "mbedtls/net_sockets.h"

// ======================== 核心配置==============================
#define PHONE_HOTSPOT_SSID     "TTTT"//自己的WiFi名称
#define PHONE_HOTSPOT_PASSWORD "12345"//自己的WiFi密码
#define PHONE_TCP_IP           "192.168.228.68"//手机端软件设置的IP地址
#define PHONE_TCP_PORT         "8080"//手机端软件设置的IP端口号
#define SEND_DATA              "Hello Phone! GD32VW553 Data: temp=25.5, hum=60.1\r\n"//发送的数据
#define RECV_BUF_SIZE          256
#define DELAY_DISCONNECT_MS    5000  // 收到数据后延迟5秒断开

// 全局变量
volatile uint8_t g_wifi_connected = 0;
volatile uint8_t g_recv_phone_data = 0;

// ======================== LED硬件初始化 ========================
static void pb2_led_init(void)
{
    rcu_periph_clock_enable(RCU_GPIOB);
    gpio_mode_set(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_2);
    gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_MAX, GPIO_PIN_2);
    gpio_bit_reset(GPIOB, GPIO_PIN_2);
}

// ======================== LED闪烁任务(连接成功持续闪烁,断开后熄灭)=======================
static void pb2_led_blink_task(void *param)
{
    while(1)
    {
        if(g_wifi_connected == 1)
        {
            gpio_bit_toggle(GPIOB, GPIO_PIN_2);
            vTaskDelay(pdMS_TO_TICKS(500));
        }
        else
        {
            gpio_bit_reset(GPIOB, GPIO_PIN_2);
            vTaskDelay(pdMS_TO_TICKS(100));
        }
    }
}

// ======================== TCP收发核心函数(发数据→等手机数据→收到后标记)=======================
static int tcp_send_and_recv(void)
{
    int ret, len;
    mbedtls_net_context server_fd;
    unsigned char send_buf[512];
    unsigned char recv_buf[RECV_BUF_SIZE];

    // 1. 初始化网络上下文
    mbedtls_net_init(&server_fd);
    printf("Connect to phone TCP server %s:%s...\r\n", PHONE_TCP_IP, PHONE_TCP_PORT);

    // 2. 连接手机TCP服务器
    ret = mbedtls_net_connect(&server_fd, PHONE_TCP_IP, PHONE_TCP_PORT, MBEDTLS_NET_PROTO_TCP);
    if(ret != 0)
    {
        printf("TCP connect failed! Error code: %d\r\n", ret);
        mbedtls_net_free(&server_fd);
        return -1;
    }
    printf("TCP connect to phone success!\r\n");

    // 3. 主动发送数据到手机
    len = strlen(SEND_DATA);
    memcpy(send_buf, SEND_DATA, len);
    printf("Send data to phone: %s\r\n", send_buf);

    ret = mbedtls_net_send(&server_fd, send_buf, len);
    if(ret <= 0)
    {
        printf("Data send failed! Error code: %d\r\n", ret);
        mbedtls_net_free(&server_fd);
        return -2;
    }
    printf("Data send success! Total bytes: %d\r\n", ret);

    // 4. 阻塞循环等待手机数据(核心:收到任意数据才标记)
    printf("Waiting for data from phone...\r\n");
    while(1)
    {
        memset(recv_buf, 0, RECV_BUF_SIZE);
        ret = mbedtls_net_recv(&server_fd, recv_buf, RECV_BUF_SIZE - 1);

        if(ret > 0)
        {
            // 收到手机数据,打印并标记
            printf("Received data from phone: %s\r\n", recv_buf);
            printf("Received bytes: %d\r\n", ret);
            g_recv_phone_data = 1;
            break;
        }
        else if(ret == 0)
        {
            // 手机主动断开TCP
            printf("Phone TCP disconnected actively!\r\n");
            break;
        }
        else
        {
            // 接收暂未就绪,短延时重试,不占用高CPU
            vTaskDelay(pdMS_TO_TICKS(100));
        }
    }

    // 5. 释放TCP网络资源
    mbedtls_net_free(&server_fd);
    printf("TCP connection closed\r\n");

    return 0;
}

// ======================== WiFi连接+业务逻辑主任务(核心流程实现)=======================
static void wifi_connect_and_send_task(void *param)
{
    int status = 0;
    struct mac_scan_result candidate;
    char *ssid = PHONE_HOTSPOT_SSID;
    char *password = PHONE_HOTSPOT_PASSWORD;

    if (ssid == NULL) {
        printf("SSID can not be NULL!\r\n");
        goto exit;
    }

    // 步骤1:扫描手机热点
    printf("Scan phone hotspot %s...\r\n", ssid);
    status = wifi_management_scan(1, ssid);
    if (status != 0) {
        printf("Hotspot scan failed!\r\n");
        goto exit;
    }

    // 步骤2:查找目标热点
    sys_memset(&candidate, 0, sizeof(struct mac_scan_result));
    status = wifi_netlink_candidate_ap_find(WIFI_VIF_INDEX_DEFAULT, NULL, ssid, &candidate);
    if (status != 0) {
        printf("Target hotspot %s not found!\r\n", ssid);
        goto exit;
    }

    // 步骤3:连接手机热点,标记连接状态(LED开始闪烁)
    printf("Connect to phone hotspot %s...\r\n", ssid);
    if (wifi_management_connect(ssid, password, 1) != 0) {
        printf("Hotspot connect failed! Check password\r\n");
        goto exit;
    }
    printf("Phone hotspot connect success!\r\n");
    g_wifi_connected = 1;

    // 步骤4:执行TCP收发(发数据→等待手机数据)
    tcp_send_and_recv();

    // 步骤5:仅当收到手机数据时,延迟5秒再断开WiFi
    if(g_recv_phone_data == 1)
    {
        printf("Received data from phone, delay %dms to disconnect Wi-Fi...\r\n", DELAY_DISCONNECT_MS);
        vTaskDelay(pdMS_TO_TICKS(DELAY_DISCONNECT_MS));  // 核心延迟5秒逻辑
        printf("Start disconnect Wi-Fi...\r\n");
        wifi_management_disconnect();
        g_wifi_connected = 0;
        printf("Phone hotspot disconnected successfully!\r\n");
    }
    else
    {
        // 未收到手机数据,保持WiFi连接
        printf("No data received from phone, keep Wi-Fi connected...\r\n");
    }

exit:
    printf("Wi-Fi main task finished!\r\n");
    sys_task_delete(NULL);
}

// ======================== 主函数(初始化+创建任务+启动RTOS)=======================
int main(void)
{
    // 系统底层初始化
    platform_init();
    // LED硬件初始化
    pb2_led_init();
    // WiFi初始化
    if (wifi_init()) {
        printf("Wi-Fi init failed!\r\n");
    }
    printf("System init success!\r\n");

    // 创建LED闪烁任务
    sys_task_create_dynamic((const uint8_t *)"led_blink",
                            1024,
                            OS_TASK_PRIORITY(1),
                            pb2_led_blink_task,
                            NULL);

    // 创建WiFi+TCP主任务
    sys_task_create_dynamic((const uint8_t *)"wifi_tcp_main",
                            4096,
                            OS_TASK_PRIORITY(0),
                            wifi_connect_and_send_task,
                            NULL);

    // 启动RTOS内核,开始任务调度
    sys_os_start();

    // 死循环,不会执行到
    for ( ; ; );
}


全部评论
暂无评论
0/144