我正在尝试编写一些代码来使用DBUS与wpa_supplicant进行通信.当我在嵌入式系统(ARM)中工作时,我想避免使用Python或GLib.我想知道我是不是很愚蠢,因为我真的觉得没有关于D-Bus的清晰文档.即使使用官方文档,我发现文档的级别太高,或者显示的示例都使用了Glib!我看过的文档:http://www.freedesktop.org/wiki/Software/dbus
我发现了一篇关于在C中使用D-Bus的好文章:http://www.matthew.ath.cx/articles/dbus
但是,这篇文章已经很老了,还不够完整!我也找到了c ++ - dbus API,但在这里,我找不到任何文档!我一直在深入研究wpa_supplicant和NetworkManager源代码,但这真是一场噩梦!我一直在研究"低级D-Bus API",但这并没有告诉我如何从D-Bus消息中提取字符串参数!http://dbus.freedesktop.org/doc/api/html/index.html
下面是我编写的一些代码来测试,但我真的很难提取字符串值.很抱歉有很长的源代码,但如果有人想尝试...我的D-Bus配置似乎很好,因为它"已经"从wpa_supplicant捕获"StateChanged"信号,但无法打印状态:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <string.h>
#include <dbus/dbus.h>
//#include "wpa_supp_dbus.h"
/* Content of wpa_supp_dbus.h */
#define WPAS_DBUS_SERVICE "fi.epitest.hostap.WPASupplicant"
#define WPAS_DBUS_PATH "/fi/epitest/hostap/WPASupplicant"
#define WPAS_DBUS_INTERFACE "fi.epitest.hostap.WPASupplicant"
#define WPAS_DBUS_PATH_INTERFACES WPAS_DBUS_PATH "/Interfaces"
#define WPAS_DBUS_IFACE_INTERFACE WPAS_DBUS_INTERFACE ".Interface"
#define WPAS_DBUS_NETWORKS_PART "Networks"
#define WPAS_DBUS_IFACE_NETWORK WPAS_DBUS_INTERFACE ".Network"
#define WPAS_DBUS_BSSIDS_PART "BSSIDs"
#define WPAS_DBUS_IFACE_BSSID WPAS_DBUS_INTERFACE ".BSSID"
int running = 1;
void stopLoop(int sig)
{
running = 0;
}
void sendScan() …Run Code Online (Sandbox Code Playgroud) 我正在使用菜单选项来连接到使用OpenFrameworks构建的C ++应用程序中的wifi。我想使用wpa_ctrl库,但无法编译。
程式码片段:
NetworkWrapper.h:
#ifndef NETWORKWRAPPER_H_
#define NETWORKWRAPPER_H_
class NetworkWrapper {
public:
NetworkWrapper():
private:
struct wpa_ctrl* m_ctrl;
};
#endif
Run Code Online (Sandbox Code Playgroud)
NetworkWrapper.cpp:
#include "NetworkWrapper.h"
extern "C" {
#include "wpa_ctrl.h"
}
NetworkWrapper::NetworkWrapper() {
m_ctrl = wpa_ctrl_open("wlan0");
}
Run Code Online (Sandbox Code Playgroud)
错误:
***/NetworkWrapper.cpp:7: undefined reference to `wpa_ctrl_open'
collect2: error: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
我试过抛出include并使用和不使用extern“ C”,但是看到wpa_ctrl.h也包含在extern“ C”标签中没有什么区别,尽管使用#ifdef __cplusplus(已定义,我将选中)。
我现在几乎没有主意了。我应该注意,我尝试将wpa_ctrl.c包含在外部的“ C”标记中,据我所知,不应将其编译(?)。这也给出了完全相同的结果。这导致我手动编译wpa_ctrl库并将其复制到obj目录,但再次出现:同样的结果。
感谢您抽出宝贵的时间阅读我的问题,希望对您有所帮助!
*编辑* 根据请求,我的链接选项(我将其修剪了一下):
g ++ -o bin / application_debug obj / linux64 / Debug / src / main.o [...] obj / linux64 / Debug / …