【问题标题】:miniupnpssdpd query for number of connected devices failedminiupnpssdpd 查询连接设备数失败
【发布时间】:2016-07-07 12:37:06
【问题描述】:

我在 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;


}

我的问题是,无论有多少设备实际连接到 UPnP 网络,我总是从 minissdpd 收到值“1”。

取自 minissdpd 页面 -

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

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

**编辑 -

我已经尝试触发所有 3 种支持的请求类型,这些是响应,注意空回读 =“”表示没有数据被回读:

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

我是不是做错了什么?

谢谢!

【问题讨论】:

    标签: c linux networking openwrt upnp


    【解决方案1】:

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

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

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

    minissdpd 监控网络上可用的 UPnP 设备。如果可用,它会被 libminiupnpc 用于获取设备列表。

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

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

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

    【讨论】:

    • 感谢您的回答。我将术语“客户端”固定为“设备”。 “使用 miniupnpc 提供的 listdevice 工具”是什么意思?我在 miniupnpc 代码库(版本 1.6.20120509)中搜索了它,但没有运气。您能否提供更多相关信息?
    • 版本 1.6.20120509 非常旧。请更新。最新版本是 2.0。 github.com/miniupnp/miniupnp/blob/master/miniupnpc/…
    猜你喜欢
    • 1970-01-01
    • 2014-10-15
    • 1970-01-01
    • 2016-04-30
    • 2016-10-06
    • 2011-09-12
    • 2015-04-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多