miniupnpssdpd查询已连接设备的数量失败

时间:2016-07-07 12:37:06

标签: c linux networking openwrt upnp

我在openWRT linux环境中工作,尝试在我的LAN网络上启用UPnP,同时在任何给定点监控连接的设备。

为此,我在系统中启用了miniupnpd,以及minissdpd。

我编写了以下函数,用于调查minissdpd以尝试了解当前连接的设备(基于minissdpd代码所有者示例):

static int query_connectedDevices(void)
{
    struct sockaddr_un addr;
    int s, nRet = 0;
    const char * minissdpdsocketpath = "/var/run/minissdpd.sock";
    unsigned char buffer[2048];
    unsigned char * p;
    const char * device = "urn:schemas-upnp-org:device:InternetGatewayDevice:1";
    int device_len = (int)strlen(device);

    /*Open communication socket with minissdpd process*/
    s = socket(AF_UNIX, SOCK_STREAM, 0);
    if(s < 0) {
        return -1;
    }
    addr.sun_family = AF_UNIX;
    strncpy(addr.sun_path, minissdpdsocketpath, sizeof(addr.sun_path));
    if(connect(s, (struct sockaddr *)&addr, sizeof(struct sockaddr_un)) < 0) {
        return -1;
    }

    buffer[0] = 1; /* request type 1 : request devices/services by type */
    p = buffer + 1;
    CODELENGTH(device_len, p);
    memcpy(p, device, device_len);
    p += device_len;
    nRet = write(s, buffer, p - buffer);
    if (nRet < 0) {
        goto query_exit;
    }
    memset(buffer, 0x0, sizeof(buffer));
    nRet = read(s, buffer, sizeof(buffer));
    if (nRet < 0) {
        goto query_exit;
    }

    nRet = 0;

query_exit:
    close (s);
    return nRet;


}

我的问题是我总是收到价值&#39; 1&#39;来自minissdpd,无论有多少设备实际连接到UPnP网络。

取自minissdpd页面 -

  

对于这三种请求类型,响应如下:

     

第一个字节(n)是响应中的设备/服务数   对于每个服务/设备,三个字符串:位置(url),服务类型   (ST:在M-SEARCH回复中)和USN(唯一身份证)。

**编辑 -

我试图触发所有3种支持的请求类型,这些是响应,请注意空读回=&#34;&#34;表示没有回读数据:

Buffer value = 3urn:schemas-upnp-org:device:InternetGatewayDevice:1
Buffer value read back =  return value = 1
Buffer value = 3urn:schemas-upnp-org:device:InternetGatewayDevice:1
Buffer value read back =  return value = 1
Buffer value = 3urn:schemas-upnp-org:device:InternetGatewayDevice:1
Buffer value read back = $http://192.168.1.1:5000/rootDesc.xml/urn:schemas-   upnp-org:service:Layer3Forwarding:1Zuuid:27f10a12-a448-434f-9b33-    966bcf662cc3::urn:schemas-upnp-    org:service:Layer3Forwarding:1$http://192.168.1.1:5000/rootDesc.xml.urn:schemas-    upnp-org:service:WANIPConnection:1Yuuid:27f10a12-a448-434f-9b33-    966bcf662cc3::urn:schemas-upnp-    org:service:WANIPConnection:1$http://192.168.1.1:5000/rootDesc.xmlupnp:rootdevic    e:uuid:27f10a12-a448-434f-9b33-966bcf662cc3::upnp:rootdevice return value =    463

我做错了吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

“在我的LAN上启用UPnP”是什么意思?

miniupnpd 是一个IGD实现,例如它与UPnP AV无关。

要发现LAN上的所有UPnP设备,您可以使用 miniupnpc 提供的 listdevice 工具。

minissdpd 监控网络上可用的UPnP设备。 libminiupnpc使用它来获取设备列表。

当请求的设备类型为urn时,它只返回1个设备:schemas-upnp-org:device:InternetGatewayDevice:1(IGD)。

我猜你的局域网上只有一个UPnP IGD:路由器。

“无论有多少客户端实际连接到UPnP网络,”是什么意思。“。在UPnP官方术语中没有“客户”这样的东西。网络上有UPnP设备和控制点