我正在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页面-
**编辑-
我尝试触发所有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
难道我做错了什么?
谢谢!
最佳答案
“在我的局域网上启用UPnP”是什么意思?
miniupnpd是一个IGD实现,例如,它与UPnP AV没有关系。
要发现局域网中存在的所有UPnP设备,可以使用miniupnpc随附的listdevice工具。
minissdpd监视网络上可用的UPnP设备。如果可用于获取设备列表,libminiupnpc将使用它。
可以确定,当请求的设备类型为urn:schemas-upnp-org:device:InternetGatewayDevice:1(IGD)时,它仅返回1个设备。
我想您的局域网上只有一个UPnP IGD:路由器。
您的意思是“无论实际上有多少客户端连接到UPnP网络”。 UPnP官方术语中没有“客户端”之类的东西。网络上有UPnP设备和控制点
关于c - miniupnpssdpd查询连接的设备数失败,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38245656/