ESP8266 не отвечает на M-поискAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 ESP8266 не отвечает на M-поиск

Сообщение Anonymous »

Я работаю над проектом Arduino, и я пытался использовать протокол SSDP для подключения к ESP8266 с моего телефона. Несмотря на то, что я могу установить статический IP для моего ESP и определить его IP в приложении Android, я хотел бы использовать SSDP, но я не смог сделать его надежным. Для Arduino я использую ESP8266SSDP библиотека. На стороне Android я использую DatagramSocket . Если я запускаю часть кода, которая отвечает за отправку трансляции и получение IP ESP8266 с моего ПК, я получаю ответ ESP (в большинстве случаев, вероятно, потому что код на ESP8266 работает на одном потоке). Если я запускаю тот же код, адаптирован для приложения Android, на моем телефоне ESP не отвечает. Я вижу другие устройства, но не ESP8266.

Код: Выделить всё

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();
}
the description.xml недоступен, но, поскольку меня интересуют только SSDP_ModelName и SSDP_SerialNumber, я думаю, что это не должно быть проблемой.public class SSDP {

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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»