Код: Выделить всё
void setup {
// Connecting to WiFi
// OTA setup
SSDP.setSchemaURL("description.xml");
SSDP.setDeviceType("upnp:rootdevice");
SSDP.setHTTPPort(SSDP_HTTPPORT);
SSDP.setName(SSDP_NAME);
SSDP.setSerialNumber(SSDP_SERIALNUMBER);
SSDP.setURL(SSDP_URL);
SSDP.setModelName(SSDP_MODELNAME);
SSDP.setModelNumber(SSDP_MODELNUMBER);
SSDP.setModelURL(SSDP_MODELURL);
SSDP.setManufacturer(SSDP_MANUFACTURER);
SSDP.setManufacturerURL(SSDP_MANUFACTURERURL);
SSDP.begin();
}
private final WifiManager wifiManager;
private final Executor executor;
private final Handler handler;
public SSDP(WifiManager wifiManager, Executor executor, Handler handler) {
this.wifiManager = wifiManager;
this.executor = executor;
this.handler = handler;
}
public void scan(SSDPListener ssdpListener) {
executor.execute(new Runnable() {
@Override
public void run() {
try {
sk(ssdpListener);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
});
}
private InetAddress getBroadcast() {
DhcpInfo dhcp = wifiManager.getDhcpInfo();
int broadcast = (dhcp.ipAddress & dhcp.netmask) | ~dhcp.netmask;
byte[] quads = new byte[4];
for (int k = 0; k < 4; k++)
quads[k] = (byte) (broadcast >> (k * 8));
try {
Log.d("SSDP", "broadcast: " + InetAddress.getByAddress(quads));
return InetAddress.getByAddress(quads);
} catch (UnknownHostException e) {
throw new RuntimeException(e);
}
}
private void sk(SSDPListener ssdpListener) throws IOException {
String broadcast = "192.168.2.255";
if (wifiManager != null) {
WifiManager.MulticastLock lock = wifiManager.createMulticastLock("SSDP");
broadcast = String.valueOf(getBroadcast()).replace("/", "");
lock.acquire();
}
byte[] sendData = new byte[1024];
byte[] receiveData = new byte[1024];
String MSEARCH = "M-SEARCH * HTTP/1.1\n" +
"HOST: " + broadcast + ":1900\n" +
"MAN: \"ssdp:discover\"\n" +
"MX: 3\n" +
"ST: ssdp:all\n" +
"\n";
sendData = MSEARCH.getBytes();
DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, InetAddress.getByName(broadcast), 1900);
DatagramSocket clientSocket = new DatagramSocket();
clientSocket.send(sendPacket);
long time = System.currentTimeMillis();
long curTime = System.currentTimeMillis();
while (curTime - time < 1000) {
DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
clientSocket.receive(receivePacket);
String response = new String(receivePacket.getData());
String stringData = new String(receivePacket.getData(), 0, receivePacket.getLength());
int stringStart = response.indexOf("SERVER:");
if (stringStart != -1) {
int stringStop = response.indexOf("\r\n", stringStart);
Log.d("SSDP", stringData.substring(stringStart, stringStop));
if (stringData.substring(stringStart, stringStop).equals("SERVER: Arduino/1.0 UPNP/1.1 ESP8266 2025/555444333222")) {
String ip = receivePacket.getAddress().getHostAddress();
handler.post(new Runnable() {
@Override
public void run() {
ssdpListener.razultat(ip);
}
});
}
}
curTime = System.currentTimeMillis();
}
clientSocket.close();
}
}
< /code>
Я попытался продлить время, которое код ждет ответа, но это не помогло. Является ли мой подход внедрять SSDP, что будет лучшим способом реализации SSDP в моей ситуации? Любая помощь будет очень оценена.
Подробнее здесь: https://stackoverflow.com/questions/797 ... o-m-search
Мобильная версия