В настоящее время я работаю над приложением для Android, которое будет связано с существующим продуктом для моего работодателя. Система - это устройство, поддерживающее прошивку, которое управляется через последовательный порт, ethernet или wi-fi с помощью программы .NET Windows, прямой последовательной связи или веб-страницы управления. Приложение Android предназначено для автоматического подключения веб-страницы управления, чтобы устройство контролировалось с телефона без необходимости вручную находить IP-адреса. Для этого мне нужно найти IP-адреса и определить, соответствует ли адрес одному из этих прошивок.Связь сокета TCP/IP Android не позволяет вернуть данные
По существу, что я хочу сделать, это запустить все IP-адреса, которые Android видит и отправляет каждому из них выше. Эта вещь должна пинговать адрес с помощью прошивки и видеть, что отправлено обратно, чтобы определить, соответствует ли адрес устройству прошивки. Я делаю это в настоящий момент, отправляя команду типа «HOME» или «GETINFO» (правильно отформатированную для прошивки, конечно) и сравнивая, что, если что-то отправлено с ожидаемым ответом. Команды, подобные домашним, также могут вызвать физический ответ, поэтому мы знаем, что без отладчика микрочипов, если команда была получена, по крайней мере, была получена.
Поскольку он имеет место, у меня есть правильный адрес, жестко запрограммированный и отправленный этому методу. Я знаю, что приложение может успешно загрузить элементы управления веб-страницы, используя тот же адрес, что и URL, поэтому он должен быть правильным и соединение должно быть хорошим, но прямая связь с устройством не работает. Никакой физической реакции не наблюдается, и никакая информация не возвращается обратно - поток ввода просто отключается и возвращает -1. То, что сильно мешает мне в этом, заключается в том, что, насколько я могу судить, я отправляю информацию точно так же, как и элементы управления .NET Windows, и все же она не работает.
Еще одно примечание: я знаю, что отправка строки IP-адреса в конструктор сокета в качестве имени хоста, вероятно, не должна работать, но поскольку ни одно из них не было выбрано, я знаю, что сокет может разрешить его для IP-адреса. Верный?
Мой код выглядит следующим образом:
private class NetworkTask extends AsyncTask<String, Boolean, Boolean> {
protected Boolean doInBackground(String... addr){
try {
String message = "<FHGETHUBINFO>";
byte[] input = new byte[8];
//addr is an array of string parameters containing a single IP address string. E.g. addr[0]=”192.168.199.108”
Socket s = new Socket(addr[0],80);
//outgoing stream redirect to socket
OutputStream out = s.getOutputStream();
out.write(message.getBytes());
Log.v(TAG, "output sent. Waiting for input.");
InputStream in = s.getInputStream();
//Skip the exclamation mark and newline. Verified that nothing is received even without a skip.
in.skip(2);
int numBytes = in.read(input,0,8);
Log.v(TAG, "Input received: "+numBytes);
String st = input.toString();
//Close connection
s.close();
if(st != "HUB INFO"){
return true;
}
else{
return false;
}
}
catch (UnknownHostException e) {
Log.v(TAG,"UnknownHostException: "+e.getMessage());
e.printStackTrace();
}
catch (IOException e) {
Log.v(TAG,"IOException: "+e.getMessage());
e.printStackTrace();
}
return false;
Спасибо за любую помощь вы можете дать, я действительно ценю это!
Вы передаете одиночную строку символов в socket(). – starbolin
Вероятно, вы должны вызвать isReachable() в своем сокете после его создания. Неиспользуется, если адрес не маршрутизируется. – starbolin