Я пытаюсь получить доступ к выключателю света WeMo, используя UPnP. Погуглив множество библиотек c ++ с открытым исходным кодом, я наконец-то разобрался с примером кода для базового обнаружения устройств UPnP. http://www.rohitab.com/discuss/topic/41267-ssdpupnp-protocol-example/#
Я использую Windows 10, и мой ноутбук WiFi и коммутатор WeMo находятся в одной и той же сети Wi-Fi, отключенный брандмауэр. Но я не получаю никакого сообщения. Я даже пытался изменить «цель поиска» ST
возможность ssdp:all
, Другой пример кода https://objectpartners.com/2014/03/25/a-groovy-time-with-upnp-and-wemo/ предлагает использовать ST
как urn:Belkin:device:controllee:1
, но нет ответа от любого устройства.
Мой код:
#include <stdio.h>
#include <string>
#include <winsock2.h>
#include <ws2tcpip.h>
#pragma comment(lib, "Ws2_32.lib")
#include <windows.h>
#include <stdio.h>
#include <conio.h>
#define SERVERPORT 1900
char buff[] = "M-SEARCH * HTTP/1.1\r\nHOST: 239.255.255.250:1900\r\nMAN: \"ssdp:discover\"\r\nMX: 3\r\nST: upnp:rootdevice\r\n";
int main()
{
char rcvdbuff[1000];
int len, Ret = 2;
WSADATA wsaData;
struct sockaddr_in their_addr;
SOCKET sock;
WSAStartup(MAKEWORD(2, 2), &wsaData);
sock = socket(AF_INET, SOCK_DGRAM, 0);
their_addr.sin_family = AF_INET;
their_addr.sin_addr.s_addr = inet_addr("239.255.255.250");
their_addr.sin_port = htons(SERVERPORT);
len = sizeof(struct sockaddr_in);
while (1)
{
printf("buff:\n%s\n", buff);
Ret = sendto(sock, buff, strlen(buff), 0, (struct sockaddr*)&their_addr, len);
if (Ret < 0)
{
printf("error in SENDTO() function");
closesocket(sock);
return 0;
}
//Receiving Text from server
printf("\n\nwaiting to recv:\n");
memset(rcvdbuff, 0, sizeof(rcvdbuff));
Ret = recvfrom(sock, rcvdbuff, sizeof(rcvdbuff), 0, (struct sockaddr *)&their_addr, &len);
if (Ret < 0)
{
printf("Error in Receiving");
return 0;
}
rcvdbuff[Ret - 1] = '\0';
printf("RECEIVED MESSAGE FROM SERVER\t: %s\n", rcvdbuff);
//Delay for testing purpose
Sleep(3 * 1000);
}
closesocket(sock);
WSACleanup();
}
Задача ещё не решена.
Других решений пока нет …