2016-07-07 5 views
2

Я работаю в среде 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 

Я делаю что-то неправильно?

Спасибо!

ответ

1

Что вы подразумеваете под "enable UPnP on my LAN"?

miniupnpd - это реализация IGD, она не имеет никакого отношения к UPnP AV, например.

Чтобы открыть все UPnP устройств, присутствующих в вашей локальной сети, вы можете использовать listdevice инструмент, снабженный miniupnpc.

minissdpd Мониторы доступны UPnP-устройства в сети. Он используется libminiupnpc, если доступен для получения списка устройств.

Это нормально, что при запрошенных устройствах возвращается только 1 устройство с типом urn: schemas-upnp-org: device: InternetGatewayDevice: 1 (IGD).

Я предполагаю, что в вашей локальной сети есть только один UPnP IGD: маршрутизатор.

Что вы подразумеваете под «независимо от того, сколько клиентов фактически подключено к сети UPnP.». В официальной терминологии UPnP нет такой вещи, как «клиент». В сети есть UPnP-устройства, а контрольные точки

+0

Спасибо за ответ. Я установил терминологию «клиенты» на «устройства». Что вы подразумеваете под «использованием инструмента listdevice, поставляемого с miniupnpc»? Я искал его в базе кода miniupnpc (версия 1.6.20120509), но не повезло. Не могли бы вы предоставить дополнительную информацию об этом? –

+0

версия 1.6.20120509 очень СТАРЫЙ. Пожалуйста обновите. Последняя версия 2.0. https://github.com/miniupnp/miniupnp/blob/master/miniupnpc/listdevices.c – miniupnp