我在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
我做错了吗?
谢谢!
答案 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设备和控制点