Я работаю в среде linux openWRT и пытаюсь включить UPnP в свою сеть LAN, контролируя подключенные устройства в любой заданной точке.Не удалось выполнить запрос miniupnpssdpd для количества подключенных устройств
Для этого я включил 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;
}
Моя проблема заключается в том, что я всегда получаю обратно значение '1' от minissdpd, независимо от того, сколько устройств действительно подключено к сети UPnP.
Взятые из minissdpd страницы -
Для этих трех типов запросов, ответов выглядит следующим образом:
первый байт (п) число устройств/услуг в ответ Для каждого сервис/устройство, три строки: местоположение (URL), тип услуги (ST: в ответах M-ПОТ) и USN (уникальный идентификатор).
** Edit -
Я попытался запустить все 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
Я делаю что-то неправильно?
Спасибо!
Спасибо за ответ. Я установил терминологию «клиенты» на «устройства». Что вы подразумеваете под «использованием инструмента listdevice, поставляемого с miniupnpc»? Я искал его в базе кода miniupnpc (версия 1.6.20120509), но не повезло. Не могли бы вы предоставить дополнительную информацию об этом? –
версия 1.6.20120509 очень СТАРЫЙ. Пожалуйста обновите. Последняя версия 2.0. https://github.com/miniupnp/miniupnp/blob/master/miniupnpc/listdevices.c – miniupnp