Finding the devices in your LAN is easy – but undocumented. Your android app will just send out a broadcast UDP packet to port 20560, which will be answered by every edimax device that receives it. Anyway, the following program can be used to enumerate your devices:
#include <sys/socket.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <strings.h> #include <signal.h> #pragma pack(1) struct reply { unsigned char macaddr[6]; char manufacturer[12]; int unknown; // 0x 01 a1 fe 5e char model[14]; char version[8]; char displayname[128]; short port; // 0x10 27 == 10000 little endian unsigned char ipaddr[4]; long unknown2; unsigned char dstaddr[4]; }; int alarmed=0; void gotalarm(int signo) { exit(0); } int main(int argc, char**argv) { int sockfd, n, len; int enable=1; struct sockaddr_in servaddr; struct reply reply; sockfd=socket(AF_INET,SOCK_DGRAM,0); setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &enable, sizeof enable); bzero(&servaddr,sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr=inet_addr("255.255.255.255"); servaddr.sin_port=htons(20560); sendto(sockfd, "\xff\xff\xff\xff\xff\xff" // 6 "EDIMAX" // 6 "\x00\x00\x00\x00\x00\x00" // 6 "\x00\xA1\xFF\x5E", // 4 22, 0, (struct sockaddr *)&servaddr, sizeof(servaddr)); signal(SIGALRM, gotalarm); alarm(2); while (!alarmed) { len=sizeof servaddr; n=recvfrom(sockfd, &reply, 1000, 0, (struct sockaddr *)&servaddr, &len); if (n>=186) { char ipbuf[16]; char macbuf[20]; snprintf(ipbuf, sizeof ipbuf, "%d.%d.%d.%d", reply.ipaddr[0], reply.ipaddr[1], reply.ipaddr[2], reply.ipaddr[3]); snprintf(macbuf, sizeof macbuf, "%02X:%02X:%02X:%02X:%02X:%02X", reply.macaddr[0], reply.macaddr[1], reply.macaddr[2], reply.macaddr[3], reply.macaddr[4], reply.macaddr[5]); printf("%-15s %5d %-20s %-12.12s %-14.14s %-8.8s %s\n", ipbuf, reply.port, macbuf, reply.manufacturer, reply.model, reply.version, reply.displayname); } } }
The alarm(2) allows for 2 seconds until the response is received, adjust as needed.
Thank you very much for this post. Based on your C-code snippet I have created a Node.JS implementation for device discovery – https://github.com/mwittig/edimax-smartplug