BeagleBone Black的D-BUS

时间:2016-07-06 22:57:33

标签: c linux debian dbus beagleboneblack

我的目标:通过D-Bus接口监控wpa_supplicant,从我的固件(在C中)监控我的网络接口(主要是无线)的状态。 我想坚持使用C和D-bus的低级API。

到目前为止我有什么

  1. 我在C中编写了一个小程序,从this SO用户那里复制了大部分代码。
  2. 我已经浏览了所有可能的D-Bus教程和wpa_supplicant
  3. 我的程序编译并正常运行。但是它不会产生预期的输出。
  4. 这是我的代码:

    #include <stdio.h>                                                                                                                                                                                  
    #include <dbus/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.WPASupplicantAAA"
    
    #define WPAS_DBUS_PATH_INTERFACES   WPAS_DBUS_PATH "/Interfaces"
    #define WPAS_DBUS_IFACE_INTERFACE   WPAS_DBUS_INTERFACE ".Interfaces"
    
    #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 ret;
    char signalDesc[1024];     // Signal description as string
    
    // Signal handling
    signal(SIGKILL, stopLoop);
    signal(SIGTERM, stopLoop);
    
    void loop(DBusConnection* conn)
    
    {
    DBusMessage* msg;
    DBusMessageIter args;
    DBusMessageIter subArgs;
    int argType;
    int i;
    int buffSize = 1024;
    char strValue[buffSize];
    const char* member = 0;
    
    
    while (1)
    {
    // non blocking read of the next available message
    dbus_connection_read_write(conn, 0);
    msg = dbus_connection_pop_message(conn);
    
    // loop again if we haven't read a message
    if (!msg)
    {
    printf("No message received, waiting a little ...\n");
    sleep(1);
    continue;
    }
    else printf("Got a message, will analyze it ...\n");
    
    // Print the message member
    printf("Got message for interface %s\n",
    dbus_message_get_interface(msg));
    member = dbus_message_get_member(msg);
    if(member) printf("Got message member %s\n", member);
    
    // Check has argument
    
    if (!dbus_message_iter_init(msg, &args))
    {       
    printf("Message has no argument\n");
    continue;
    }
    else
    {
    // Go through arguments
    while(1)
    {
    argType = dbus_message_iter_get_arg_type(&args);
    
    if (argType == DBUS_TYPE_STRING)
    {
    printf("Got string argument, extracting ...\n");
    char* str = NULL;
    dbus_message_iter_get_basic(&args, &str);
    printf("Received string: \n %s \n",str);
    
    }   
    else
    printf("Arg type not implemented yet !\n");
    
    if(dbus_message_iter_has_next(&args))
    dbus_message_iter_next(&args);
    else break;
    }   
    printf("No more arguments!\n");
    }
    
    // free the message
    dbus_message_unref(msg);
    }       
    }           
    
    int main()
    {
    
    DBusConnection *connection;
    
    DBusError error;
    
    char *name = "org.share.linux";
    
    dbus_error_init(&error);
    
    connection = dbus_bus_get(DBUS_BUS_SYSTEM, &error);
    
    if ( dbus_error_is_set(&error) )
    
    {
    
    printf("Error connecting to the daemon bus: %s",error.message);
    
    dbus_error_free(&error);
    
    return 1;
    
    }
    
    // request a name on the bus
    
    ret = dbus_bus_request_name(connection, WPAS_DBUS_SERVICE, 0, &error);
    if (dbus_error_is_set(&error))
    {
    printf(stderr, "Name Error (%s)\n", error.message);
    dbus_error_free(&error);
    }
    
    /* Connect to signal */
    // Interface signal ..
    printf(signalDesc, "type='signal',interface='%s'",WPAS_DBUS_IFACE_INTERFACE);
    dbus_bus_add_match(connection, signalDesc, &error);
    dbus_connection_flush(connection);
    if (dbus_error_is_set(&error))
    {
    fprintf(stderr, "Match Error (%s)\n", error.message);
    return 1;
    }
    
    // Do main loop
    loop(connection);
    dbus_connection_close(connection);
    
    return 0;
    
    }  
    

    我的BBB上的D-bus服务列表

    enter image description here

    输出

    enter image description here

    一些指针

    1. 我想抓住wpa_supplicant的D-Bus API中显示的信号。
    2. 我想做的一些事情 - 看看无线接口何时启用wlan0,连接到接入点等。还有设置AP和内容的功能。
    3. 来自其他未添加匹配的接口的捕获信号。
    4. 我运行此程序并更改网络接口的状态,但我没有得到任何信号。另外,我不知道是否需要在公交车上请求姓名,因为我只是在听。
    5. 这里有什么可能的问题?任何指针都会非常有用。

0 个答案:

没有答案