Я работаю с последней доступной версией Ubuntu.
Мне дали задание создать файл . c, который может подключаться к точке доступа, зная ее SSID. Я решил использовать nmlib . Я успешно установил библиотеку и могу запустить примеры, содержащиеся в папке / examples / C / glib .
Я написал файл. c на основе этих примеров. До сих пор мой файл мог:
- Обнаружить мою сетевую карту (которая считается моим устройством из nmlib);
- Сканировать все возможные подключения
Я хотел бы подключиться к точке доступа (которая в настоящее время является горячей точкой моего смартфона). Здесь начинаются некоторые сомнения. Из [документации 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