我正在尝试使用 UPnP 访问 WeMo 电灯开关。在谷歌搜索了许多开源 c++ 库之后,我终于找到了一个用于基本发现 UPnP 设备的示例代码http://www.rohitab.com/discuss/topic/41267-ssdpupnp-protocol-example/#
我使用的是 Windows 10,我的笔记本电脑 WiFi 和 WeMo 交换机都在同一个 WiFi 网络中,禁用了防火墙。但我没有收到任何消息。我什至尝试将“搜索目标”ST
选项更改为ssdp:all
. 另一个示例代码https://objectpartners.com/2014/03/25/a-groovy-time-with-upnp-and-wemo/建议使用ST
as 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();
}