Соединитесь с AP с nmlib в C - PullRequest
0 голосов
/ 21 января 2020

Я работаю с последней доступной версией Ubuntu.

Мне дали задание создать файл . c, который может подключаться к точке доступа, зная ее SSID. Я решил использовать nmlib . Я успешно установил библиотеку и могу запустить примеры, содержащиеся в папке / examples / C / glib .

Я написал файл. c на основе этих примеров. До сих пор мой файл мог:

  1. Обнаружить мою сетевую карту (которая считается моим устройством из nmlib);
  2. Сканировать все возможные подключения

Я хотел бы подключиться к точке доступа (которая в настоящее время является горячей точкой моего смартфона). Здесь начинаются некоторые сомнения. Из [документации NMClient] [1] я решил использовать метод nm_client_add_and_activate_connection_asyn c () , который требует (в качестве входных данных): клиента, устройства (из 1), соединения (из 2) ), путь текущего устройства и некоторые другие параметры. Я явно неправильно понял его поведение, так как у меня нет доступа к сети. Чего мне не хватает в настоящее время? Кроме того, моя горячая точка имеет пароль (то есть «pass-1234»). Как я могу связать SSID моего AP с этим паролем? Я не вижу ничего подобного в документации. Я выкладываю свой код, чтобы все прояснить. Чтобы иметь возможность скомпилировать его, вставьте его в вышеупомянутую папку и скомпилируйте его с g cc -Wall имя_файла. c -o имя_файла pkg-config --libs --cflags libnm, где имя_файла это имя, которое вы хотите дать файлу. Более того, если вы видите какие-либо простые примеры, которые действительно подключаются к точке доступа, не стесняйтесь делиться ею. Мне все еще нужно найти что-то тесно связанное с моим вопросом. Я знаю, что C не лучший язык для выполнения sh моей задачи, но проект требует этого. Если я не был достаточно ясен, попросите больше объяснений.

#include <glib.h>
#include <stdio.h>
#include <stdbool.h>
#include <string.h>
#include <NetworkManager.h>

static voidadded_cb (GObject *client,GAsyncResult *result,gpointer user_data)
{
    GMainLoop *loop = user_data;
    NMRemoteConnection *remote;
    GError *error = NULL;

    remote = nm_client_add_connection_finish (NM_CLIENT (client), result, &error);

    if (error) 
    {
        g_print ("Error adding connection: %s", error->message);
        g_error_free (error);
    }
    else 
    {
        g_print ("Added: %s\n", nm_connection_get_path (NM_CONNECTION (remote)));
        g_object_unref (remote);
    }


    g_main_loop_quit (loop);
}

int main (int argc, char *argv[])
{
    GMainLoop *loop;
    const GPtrArray *devices;
    const char* deviceName;
    const char* devicePath;
    const GPtrArray *connections;
    NMClient *client;
    GError *error = NULL;
    //Connect to NetworkManager 
    client = nm_client_new (NULL, &error);
    if (!client) 
    {
        g_message ("Error: Could not connect to NetworkManager: %s.", error->message);
        g_error_free (error);
        return 1;
    }
    connections = nm_client_get_connections (client);
    devices = nm_client_get_devices (client);
    NMDevice *current_device;
    //Go through the array and process Wi-Fi devices */
    for (int i = 0; i < devices->len; i++) {
        current_device = g_ptr_array_index (devices, i);
        if (NM_IS_DEVICE_WIFI (current_device))
        {
            deviceName  = nm_device_get_iface (current_device);
            devicePath = nm_object_get_path(NM_OBJECT (current_device));
            printf("Device name is: %s\n",deviceName);
            printf("Device path is: %s\n",devicePath);
        }
    }

    connections = nm_client_get_connections (client);

    printf ("Connections:\n===================\n");
    const char *connectionSSID;
    const char *knownAP = "AndroidAP";
    NMSettingConnection * current_connection_settings;
    NMConnection *current_connection;
    for (int i = 0; i < connections->len; i++)
    {
        current_connection = connections->pdata[i];
        current_connection_settings = nm_connection_get_setting_connection  
        (current_connection); // IT GOES ON THE LIVE ABOVE!

        if (current_connection_settings) 
        {
            connectionSSID = nm_setting_connection_get_id (current_connection_settings);
            if(strcmp(connectionSSID,knownAP)==0)
            {
                printf("SSID: %s\n", connectionSSID);
                nm_client_add_and_activate_connection_async (client,current_connection,current_device,devicePath,NULL, added_cb, loop);
            }

        }
    }

}


  [1]: https://developer.gnome.org/libnm-glib/stable/NMClient.html
...