2016-07-07 165 views
2

我正在openWRT linux環境中工作,並嘗試在我的LAN網絡上啓用UPnP,同時在任何給定點監視連接的設備。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; 


} 

我的問題是,我總是收到回值不管有多少設備實際連接到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 

我做錯了什麼?

謝謝!

回答

1

你是什麼意思「啓用UPnP在我的局域網」?

miniupnpd是一個IGD的實現,它與UPnP AV沒有任何關係。

要發現存在於您的局域網上的所有UPnP設備,您可以使用提供miniupnpclistdevice工具。

minissdpd監視網絡上可用的UPnP設備。它被libminiupnpc用來獲取設備列表。

當請求的設備的類型爲urn:schemas-upnp-org:device:InternetGatewayDevice:1(IGD)時,它只返回1個設備即可。

我想你的LAN上只有一個UPnP IGD:路由器。

無論有多少客戶端實際連接到UPnP網絡,「」是什麼意思「。 UPnP官方術語中沒有「客戶端」這樣的東西。網絡上有UPnP設備,控制點

+0

感謝您的回答。我將術語「客戶」固定爲「設備」。 「使用miniupnpc提供的listdevice工具」是什麼意思?我在miniupnpc代碼庫(版本1.6.20120509)中搜索它,但沒有運氣。你能否提供更多關於它的信息? –

+0

版本1.6.20120509非常舊。請更新。最新版本是2.0。 https://github.com/miniupnp/miniupnp/blob/master/miniupnpc/listdevices.c – miniupnp