- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
尝试列出网络属性时 - https://w1.fi/wpa_supplicant/devel/dbus.html#dbus_network使用 dbus-cpp 我收到一些关于丢失 operator==
的错误对于 core::dbus::types::Variant
/usr/include/core/dbus/impl/object.h:185:17: required from ‘std::shared_ptr<core::dbus::Property<PropertyDescription> > core::dbus::Object::get_property() [with PropertyDescription = fi::w1::wpa_supplicant1::Network::Properties::Propertiez]’ /home/martin/ClionProjects/ang-wifi-controller/src/wpasupplicantclient.cpp:149:118: required from here /usr/include/c++/6/bits/stl_pair.h:364:51: error: no match for ‘operator==’ (operand types are ‘const core::dbus::types::Variant’ and ‘const core::dbus::types::Variant’)
{ return __x.first == __y.first && __x.second == __y.second; }
我的代码基于 dbus-cpp 示例和 http://quaintous.com/2015/08/30/cpp11-dbus/ ,但他们只提供有限的帮助。表示Properties属性的代码如下:
namespace fi {
namespace w1 {
struct wpa_supplicant1 {
struct Network {
struct Properties {
struct Propertiez {
inline static std::string name() { return "Properties"; };
typedef Network Interface;
typedef std::map<std::string, core::dbus::types::Variant> ValueType;
static const bool readable = true;
static const bool writable = true;
};
};
};
.cpp 中的违规行是 networkProxy->get_property<fi::w1::wpa_supplicant1::Network::Properties::Propertiez>();
我发现这个问题已经在https://answers.launchpad.net/ubuntu/+source/dbus-cpp/+question/593271被问到,但没有人提供任何建议。查看 apt-cache rdepends libdbus-cpp5
列出的包的代码也没有结果。我试过弄乱 ValueType
但这一切都导致了运行时错误,因为预期结果可能确实是 map 。老实说,这对我来说似乎是库中的一个错误,但由于这一定是一个明显的用例,我试图找出我在使用库时的错误。那我做错了什么?
编辑:由于我没有收到任何回复,因此我包含了最少的样本。
#include <core/dbus/bus.h>
#include <core/dbus/object.h>
#include <core/dbus/property.h>
#include <core/dbus/service.h>
#include <core/dbus/result.h>
#include <core/dbus/asio/executor.h>
#include <core/dbus/interfaces/properties.h>
#include <core/dbus/types/stl/string.h>
#include <core/dbus/types/stl/tuple.h>
#include <core/dbus/types/stl/vector.h>
#include <core/dbus/types/struct.h>
#include <core/dbus/types/variant.h>
using namespace std::chrono_literals;
using DBusDict = std::map<std::string, core::dbus::types::Variant>;
namespace fi {
namespace w1 {
struct wpa_supplicant1
{
struct GetInterface {
typedef wpa_supplicant1 Interface;
static const std::string &name()
{
static const std::string s("GetInterface");
return s;
}
inline static const std::chrono::milliseconds default_timeout() { return 1s; }
};
struct Iface
{
struct AddNetwork {
typedef Iface Interface;
static const std::string &name()
{
static const std::string s("AddNetwork");
return s;
}
inline static const std::chrono::milliseconds default_timeout() { return 1s; }
};
struct Properties
{
struct Networks
{
inline static std::string name()
{ return "Networks"; };
typedef Iface Interface;
typedef std::vector<core::dbus::types::ObjectPath> ValueType;
static const bool readable = true;
static const bool writable = false;
};
};
};
struct Network
{
struct Properties
{
struct Propertiez
{
inline static std::string name()
{ return "Properties"; };
typedef Network Interface;
typedef DBusDict ValueType;
static const bool readable = true;
static const bool writable = true;
};
};
};
};
};
};
namespace core {
namespace dbus {
namespace traits {
template <> struct Service<fi::w1::wpa_supplicant1> {
inline static const std::string &interface_name()
{
static const std::string s("fi.w1.wpa_supplicant1");
return s;
}
};
template <> struct Service<fi::w1::wpa_supplicant1::Iface> {
inline static const std::string &interface_name()
{
static const std::string s("fi.w1.wpa_supplicant1.Interface");
return s;
}
};
template <> struct Service<fi::w1::wpa_supplicant1::Network> {
inline static const std::string &interface_name()
{
static const std::string s("fi.w1.wpa_supplicant1.Network");
return s;
}
};
}
}
}
int main()
{
//bus
auto systemBus = std::make_shared<core::dbus::Bus>(core::dbus::WellKnownBus::system);
systemBus->install_executor(core::dbus::asio::make_executor(systemBus));
auto busThread = std::thread(std::bind(&core::dbus::Bus::run, systemBus));
//service
auto wpaService = core::dbus::Service::use_service<fi::w1::wpa_supplicant1>(systemBus);
auto wpaObjectPath = core::dbus::types::ObjectPath("/fi/w1/wpa_supplicant1");
auto wpaRootProxy = wpaService->object_for_path(wpaObjectPath);
//iface
auto ifacePath = wpaRootProxy->transact_method<fi::w1::wpa_supplicant1::GetInterface,
core::dbus::types::ObjectPath,
std::string>("wlan0"); //change this to your own wireless interface
auto wpaIfaceProxy = wpaService->object_for_path(ifacePath.value());
auto networkPaths = wpaIfaceProxy->get_property<fi::w1::wpa_supplicant1::Iface::Properties::Networks>();
//network
std::string ssid("network");
std::string password("password");
DBusDict args = {
{"ssid", core::dbus::types::Variant::encode(ssid)},
{"psk", core::dbus::types::Variant::encode(password)},
};
auto networkPath = wpaIfaceProxy->transact_method<fi::w1::wpa_supplicant1::Iface::AddNetwork,
core::dbus::types::ObjectPath,
DBusDict>(args);
auto networkProxy = wpaService->object_for_path(networkPath.value());
//get properties - uncomment line below to get compiler errors
//auto netProps = networkProxy->get_property<fi::w1::wpa_supplicant1::Network::Properties::Propertiez>();
while (true) {
continue;
}
}
编译使用:g++ $(pkg-config --cflags dbus-1 dbus-cpp) ./main.cpp $(pkg-config --libs dbus-1 dbus-cpp) -lpthread
最佳答案
更新:
dbus-cpp 有一个 org.freedesktop.DBus.Properties.Get 方法的实现。
获取:
auto resultVariant = dbus_object->invoke_method_synchronously
/*Method*/ <dbus::interfaces::Properties::Get,
/*Output Type*/ dbus::types::Variant,
/*Input Types*/ std::string, std::string>
("fi.w1.wpa_supplicant1.Network","Properties").value();
auto props = resultVariant.as<std::map<std::string, dbus::types::Variant>>();
遗憾的是,Set 方法虽然也已实现,但似乎不适用于任何带有嵌套变体的 ArgumentType。所以:
std::map<std::string, core::dbus::types::Variant>
std::vector<core::dbus::types::Variant>
在一个Set方法中调用实际上会导致程序崩溃。 (没有测试更多)
旧帖:
我今天遇到了同样的错误并找到了至少获取属性值的解决方法。
而不是使用
auto prop = dbus_object->get_property<fi::w1::wpa_supplicant1::Network::Properties::Propertiez>();
尝试
//returns std::map<std::string, core::dbus::types::Variant>>
auto props = dbus_object->get_all_properties<fi::w1::wpa_supplicant1::Network>();
auto prop = props["Properties"];
auto prop_value = prop.as<std::map<std::string, core::dbus::types::Variant>>();
据我所知,dbus-cpp 使用了org.freedesktop.DBus.Properties 接口(interface)读出属性。
因此 dbus_object->get_property() 尝试调用 org.freedesktop.DBus.Properties.Get 并且由于缺少 == 运算符实现而无法编译。 (我猜它需要类型转换特定的 ValueType 的东西)
dbus_object->get_all_properties() 调用 org.freedesktop.DBus.Properties.GetAll,它不需要特定的 ValueType,所以它可以工作。
当然这只是获取属性的一种变通方法,因为设置属性值与获取属性值绑定(bind)到同一个 shared_pointer。
关于c++ - 使用 dbus-cpp 列出 WPA 请求者网络属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44003627/
我为 CLR 提供程序记录 ETW 事件: xperf -start clr -on e13c0d23-ccbc-4e12-931b-d9cc2eee27e4 -f clr.etl ... xperf
我正在编写一个应用程序,允许用户使用 PEAP 或 TTLS 和证书轻松地将 android 连接到企业无线网络。 我可以添加一个基于 EAP 的 wifi 配置文件,并让它使用正确的凭据和证书将 w
我经常乘公共(public)汽车旅行,其中大部分都提供某种形式的车载 WiFi。使用像 Wicd 这样的自动连接管理器连接到它们的通常方法是选择网络,然后在启动浏览器时进行一些额外的身份验证,我就完成
当我使用NEHotspotConfigurationManager加入具有64个十六进制数字的wpa2网络时,我收到错误: NEHotspotConfiguration invalid WPA/WPA
我尝试编写一个 Python 程序来计算 WPA 握手,但我在哈希方面遇到了问题。为了比较,我安装了 cowpatty (看看我从哪里开始出错)。 我的 PMK 生成工作正常,但 PTK 计算似乎总是
我需要将 headless 物联网设备 (Raspberry Pi) 连接到 Wi-Fi 网络。我有使用 YoctoProject 构建的自定义 Linux。我没有安装 connman 或 Netwo
Cydia中的eWifi、WiFiFoFum等wifi扫描应用程序可以知道安全类型。使用 Apple80211 api 时,应用程序如何知道 OPEN、WPA、WPA2、WEP 等安全类型? CAPA
因此,在我的应用程序中,我将连接到给定 SSID 和网络 key 的 WiFi 网络。它运行良好,如果使用广播接收器连接成功,用户会收到通知。现在我只需要能够告诉用户是否存在身份验证问题(即给定的 k
我正在尝试获取 2 个函数来验证 SSID 和 WPA2 密码。 function isValidSSID(ssid) { return (regex) } 和 function isVali
我正在用 C 为 linux 编写一个程序,以从 Windows 注册表配置单元中提取 wpa/wep key 。 最初我希望使用 wine 的 CryptUnprotectData 函数,但现在我意
我正在尝试验证用户为 WPA 连接输入的 SSID 和 WPA 密码。我的程序是运行在嵌入式Linux平台上的Python程序。我可以通过解析 iwlist scan 子进程的输出来验证具有 SSID
这是我的问题: 如果我连接到网络(所以我知道 WPA/WPA2-PSK),我希望能够解密我从网络中的其他设备捕获的流量。 (如果使用 WEP,tcpdump 会自动执行此操作)。 据我所知,WPA 为
我在 React+Nodejs 上有一个中等规模的项目,我需要为移动部分选择最合适的技术。为此,我正在考虑使用 React Native 或 Web Progressive Apps。我想问你们,到目
我浏览过 stackoverflow 本身以及其他博客和网站上关于以编程方式连接到 WiFi 网络的几个话题。我得到了他们的指南并开发了一个代码 fragment ,发布在下面。我的住处有一个 pro
我试图计算 WPA 握手数据包的 MIC,但不幸的是它失败了。更准确地说,我采用了 802.1x 数据包(如规范所述)。 MIC = HMAC_MD5(MIC Key, 16, 802.1x data
尝试以编程方式从 Android 连接到我的无线网络。 安全类型是WPA2,加密AES。 这没有按预期工作: private WifiConfiguration saveWepConfig(Strin
几个月前,我开始开发一些 WiFi-Direct 应用程序。几天前,我将我的两个 Galaxy Nexus 都更新为 Jelly Bean (4.1.x) 并测试了我的应用程序,但似乎又出现了问题。获
我的 Nexus One (Gingerbread) 和 Samsung Galaxy Tab (Honeycomb) 都停止连接到我使用 WPA/WPA2 无线连接的公司网络。奇怪的是,这两种设备至
尝试列出网络属性时 - https://w1.fi/wpa_supplicant/devel/dbus.html#dbus_network使用 dbus-cpp 我收到一些关于丢失 operator=
我正在尝试使用 java 创建一个随机 WPA 密码生成器,以便为我提供尽可能安全的 Wifi 密码,并且可以在我需要时进行更改。 是否有一种方法可以使用 WPA(2) 密码中允许使用的所有字符快速填
我是一名优秀的程序员,十分优秀!