You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用libnm在C语言创建热点无反应,异步回调未触发求排查

使用libnm创建WiFi热点的问题排查与修正

你的代码存在几个关键问题,导致连接未创建、回调未触发,逐一说明:

1. 无线模式错误:误用Adhoc而非AP模式

热点需要使用Access Point(AP)模式,而你设置的mode=adhoc是自组网模式,不符合热点的需求。正确的模式应该是NM_SETTING_WIRELESS_MODE_AP。

2. 未将配置项(Setting)添加到连接对象

你创建了各类Setting(connection、wireless、ip4等),但没有调用nm_connection_add_setting()将它们添加到NMConnection实例中。NetworkManager会忽略未添加到连接的配置项,导致连接配置不完整,无法创建。

3. SSID设置方式错误

nm_setting_wireless_set_ssid()要求传入GBytes类型的字节数组,而非直接传入字符串。需要将SSID字符串转换为字节数组后再设置。

4. 缺少关键的错误检查

  • 调用nm_client_new()时未检查返回值及错误信息,如果NetworkManager服务未运行或权限不足,client会为NULL,后续操作全部无效。
  • 未检查wlan_device是否为NULL,以及设备是否为WiFi类型(NM_IS_DEVICE_WIFI(wlan_device))。

5. 无线安全配置的潜在问题

使用key-mgmt=none搭配WEP时,需确保密钥格式符合要求:

  • 64位WEP:5个ASCII字符或10个十六进制字符
  • 128位WEP:13个ASCII字符或26个十六进制字符
    另外,热点场景下部分设备可能不支持无密钥管理的WEP,建议优先考虑WPA2-PSK(key-mgmt=wpa-psk),兼容性更好。

修正后的关键代码片段

1. 正确初始化客户端与设备

GError *error = NULL;
NMClient *client = nm_client_new(NULL, &error);
if (!client) {
    g_printerr("Failed to connect to NetworkManager: %s\n", error->message);
    g_error_free(error);
    return 1;
}

NMDevice *wlan_device = nm_client_get_device_by_iface(client, "wlan0");
if (!wlan_device || !NM_IS_DEVICE_WIFI(wlan_device)) {
    g_printerr("WiFi device wlan0 not found or invalid\n");
    g_object_unref(client);
    return 1;
}

2. 正确创建并配置连接与Setting

NMConnection *connection = nm_simple_connection_new();

// 配置Connection Setting
NMSettingConnection *s_con = nm_setting_connection_new();
g_object_set(s_con,
             NM_SETTING_CONNECTION_TYPE, "802-11-wireless",
             NM_SETTING_CONNECTION_UUID, HOTSPOT_UUID,
             NM_SETTING_CONNECTION_ID, "MyHotspot",
             NM_SETTING_CONNECTION_AUTOCONNECT, FALSE,
             NULL);
nm_connection_add_setting(connection, NM_SETTING(s_con));

// 配置Wireless Setting(使用AP模式)
NMSettingWireless *s_wifi = nm_setting_wireless_new();
const gchar *ssid_str = "MyHotspotSSID";
GBytes *ssid = g_bytes_new_static(ssid_str, strlen(ssid_str));
g_object_set(s_wifi,
             NM_SETTING_WIRELESS_MODE, NM_SETTING_WIRELESS_MODE_AP,
             NM_SETTING_WIRELESS_SSID, ssid,
             NULL);
g_bytes_unref(ssid);
nm_connection_add_setting(connection, NM_SETTING(s_wifi));

// 配置IPv4(共享模式)
NMSettingIP4Config *s_ip4 = nm_setting_ip4_config_new();
g_object_set(s_ip4, NM_SETTING_IP_CONFIG_METHOD, NM_SETTING_IP4_CONFIG_METHOD_SHARED, NULL);
nm_connection_add_setting(connection, NM_SETTING(s_ip4));

// 配置IPv6(忽略)
NMSettingIP6Config *s_ip6 = nm_setting_ip6_config_new();
g_object_set(s_ip6, NM_SETTING_IP_CONFIG_METHOD, NM_SETTING_IP6_CONFIG_METHOD_IGNORE, NULL);
nm_connection_add_setting(connection, NM_SETTING(s_ip6));

// 配置无线安全(示例:WPA2-PSK,比WEP更推荐)
NMSettingWirelessSecurity *s_wsec = nm_setting_wireless_security_new();
g_object_set(s_wsec,
             NM_SETTING_WIRELESS_SECURITY_KEY_MGMT, "wpa-psk",
             NM_SETTING_WIRELESS_SECURITY_PSK, "your_hotspot_password",
             NULL);
nm_connection_add_setting(connection, NM_SETTING(s_wsec));

3. 异步激活连接与事件循环

GMainLoop *loop = g_main_loop_new(NULL, FALSE);
nm_client_add_and_activate_connection_async(client,
                                            connection,
                                            wlan_device,
                                            NULL,
                                            NULL,
                                            on_connection_added,
                                            loop);
g_main_loop_run(loop);

// 资源释放
g_object_unref(connection);
g_object_unref(client);
g_main_loop_unref(loop);

4. 回调函数的正确实现

static void on_connection_added(GObject *source_object, GAsyncResult *res, gpointer user_data) {
    GError *error = NULL;
    NMClient *client = NM_CLIENT(source_object);
    GMainLoop *loop = G_MAIN_LOOP(user_data);

    NMActiveConnection *active_conn = nm_client_add_and_activate_connection_finish(client, res, &error);
    if (active_conn) {
        g_print("Hotspot activated successfully\n");
        g_object_unref(active_conn);
    } else {
        g_printerr("Failed to activate hotspot: %s\n", error->message);
        g_error_free(error);
    }

    g_main_loop_quit(loop);
}

额外注意事项

  • 程序需要以root权限运行,否则NetworkManager会拒绝创建热点的请求。
  • 确保WiFi设备支持AP模式,可以通过iw list命令查看输出中是否包含AP模式。
  • 如果仍有问题,可通过journalctl -u NetworkManager查看系统日志,获取更详细的错误信息。

内容的提问来源于stack exchange,提问作者Slendi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 18:48:18