Я новичок в разработке для Android, поэтому знаю, что, может быть, мне не хватает чего-то очевидного. Я играл с развитием Wi-Fi и продолжаю сталкиваться с той же проблемой, мое устройство Android не обнаруживает свою группу сверстников, даже если оно успешно подключается к Интернету. (Чтобы быть справедливым во время одного упражнения, он обнаружил принтер по соседству)
В данном конкретном случае я пытаюсь отправлять и получать строки с / на WiFi с поддержкой Arduino, но безуспешно. Я не вижу данных (через последовательный монитор Arduino IDE), поступающих с устройства Android, и наоборот, я не вижу данных из Arduino, отображаемых через TextView в моем приложении.
Arduino без проблем подключается к WiFi и быстро отображает свой IP-адрес, который затем можно ввести в приложение Android. Android-устройство знает о локальном WiFi, так как я могу без проблем путешествовать по сети.
На стороне Android:
MainActivity.java
package qdivision.org.android_2_arduino_wifi;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.Socket;
import java.net.URL;
public class MainActivity extends AppCompatActivity {
Button offLED, onLED, connect;
EditText ipServer;
TextView state;
TextView arduinoMsg;
boolean socketStatus = false;
Socket socket;
MyClientTask myClientTask;
String address;
int port = 80;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
offLED = (Button)findViewById(R.id.off_led);
offLED.setEnabled(false);
onLED = (Button)findViewById(R.id.on_led);
onLED.setEnabled(false);
connect = (Button)findViewById(R.id.connect);
ipServer = (EditText)findViewById(R.id.ip_server);
state = (TextView)findViewById(R.id.state);
arduinoMsg = (TextView)findViewById(R.id.arduino_msg);
connect.setOnClickListener(connectOnClickListener);
offLED.setOnClickListener(OnOffLedClickListener);
onLED.setOnClickListener(OnOffLedClickListener);
}
OnClickListener connectOnClickListener = new OnClickListener() {
@Override
public void onClick(View arg0) {
if(socketStatus)
Toast.makeText(MainActivity.this,"Already talking to a Socket!! Disconnect and try again!", Toast.LENGTH_LONG).show();
else {
socket = null;
address = ipServer.getText().toString();
if (address == null)
Toast.makeText(MainActivity.this, "Please enter valid address", Toast.LENGTH_LONG).show();
else {
myClientTask = new MyClientTask(address);
ipServer.setEnabled(false);
connect.setEnabled(false);
myClientTask.execute("onLED");
offLED.setEnabled(true);
state.setText("IP ");
}
}
}
};
OnClickListener OnOffLedClickListener = new OnClickListener(){
@Override
public void onClick(View v) {
String onoff = "";
if(v== offLED){
onoff="offLED";
offLED.setEnabled(false);
onLED.setEnabled(true);
}else if (v== onLED){
onoff="onLED";
onLED.setEnabled(false);
offLED.setEnabled(true);
}
MyClientTask taskEsp = new MyClientTask(address);
taskEsp.execute(onoff);
}
};
public class MyClientTask extends AsyncTask<String,Void,String>{
String server;
MyClientTask(String server){
this.server = server;
}
@Override
protected String doInBackground(String... params) {
StringBuffer chain = new StringBuffer("");
final String val = params[0];
final String p = "http://" + server + "/" + val;
runOnUiThread(new Runnable(){
@Override
public void run() {
state.setText(p);
}
});
String serverResponse = "";
try {
URL url = new URL(p);
HttpURLConnection connection = (HttpURLConnection)url.openConnection();
connection.setRequestMethod("GET");
connection.connect();
InputStream inputStream = connection.getInputStream();
BufferedReader rd = new BufferedReader(new InputStreamReader(inputStream));
String line = "";
while ((line = rd.readLine()) != null) {
chain.append(line);
}
inputStream.close();
arduinoMsg.setText(chain.toString());
System.out.println("chain: " + chain.toString());
connection.disconnect();
} catch (IOException e) {
e.printStackTrace();
serverResponse = e.getMessage();
}
return serverResponse;
}
@Override
protected void onPostExecute(String s) {
}
}
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_centerHorizontal="false"
android:layout_centerInParent="false"
android:layout_centerVertical="false"
android:orientation="vertical"
tools:context="udea.edu.co.blink_wemos.MainActivity"
android:gravity="center">
<EditText
android:id="@+id/ip_server"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ems="10"
android:inputType="textPersonName"
android:hint="IP"
android:text="192.168.1.66"/>
<Button
android:id="@+id/connect"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="52dp"
android:text="CONNECT" />
<TextView
android:id="@+id/state"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="ACTION"
android:textSize="30sp" />
<Button
android:id="@+id/off_led"
style="@style/Widget.AppCompat.Button.Colored"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="OFF" />
<Button
android:id="@+id/on_led"
style="@style/Widget.AppCompat.Button.Colored"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="ON " />
<TextView
android:id="@+id/arduino_msg"
android:layout_width="284dp"
android:layout_height="108dp"
android:text="@string/arduino_msg_title" />
</LinearLayout>
Разрешения добавлены в AndroidManifest.xml
<uses-permission
android:name="android.permission.INTERNET" />
<uses-permission
android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission
android:required="true"
android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission
android:required="true"
android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission
android:required="true"
android:name="android.permission.CHANGE_WIFI_STATE"/>
На стороне Arduino:
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
const char* ssid = "SKYNET";
const char* password = "asifidbesostupid";
ESP8266WebServer server(80);
void offLED(){
String message = "Off LED";
server.send(200, "text/plain", message);
digitalWrite(BUILTIN_LED, LOW); // turn on LED with voltage HIGH
Serial.print("off\n");
}
void onLED(){
String message = {"On LED"};
server.send(200, "text/plain", message);
digitalWrite(BUILTIN_LED, HIGH); // turn on LED with voltage HIGH
Serial.print("on\n");
}
void connection(){
String message = {"On LED"};
server.send(200, "text/plain", message);
digitalWrite(BUILTIN_LED, HIGH); // turn on LED with voltage HIGH
}
void setup(void){
Serial.begin(115200);
WiFi.begin(ssid, password);
Serial.println("");
// Wait for connection
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.print("Connected to ");
Serial.println(ssid);
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
pinMode(BUILTIN_LED, OUTPUT); // Onboard LED
server.on("/offLED", offLED);
server.on("/onLED", onLED);
server.on("/", connection);
server.begin();
Serial.println("HTTP server started");
}
void loop(void){
server.handleClient();
}
РЕДАКТИРОВАТЬ # 1: Согласно комментарию ниже следующие исключения, собранные с панели logcat
05-01 11: 09: 57.827 7174-7578 / qdivision.org.android_2_arduino_wifi
W / System.err: java.net.ConnectException: не удалось подключиться к
/192.168.1.84 (порт 80): сбой подключения: EHOSTUNREACH (нет маршрута к
хозяин) 05-01 11: 09: 57.829
7174-7578 / qdivision.org.android_2_arduino_wifi W / System.err: at
libcore.io.IoBridge.connect (IoBridge.java:124) 05-01 11: 09: 57.830
7174-7578 / qdivision.org.android_2_arduino_wifi W / System.err: at
java.net.PlainSocketImpl.connect (PlainSocketImpl.java:183) 05-01
11: 09: 57.830 7174-7578 / qdivision.org.android_2_arduino_wifi
W / System.err: at
java.net.PlainSocketImpl.connect (PlainSocketImpl.java:452) 05-01
11: 09: 57.831 7174-7578 / qdivision.org.android_2_arduino_wifi
W / System.err: на java.net.Socket.connect (Socket.java:884) 05-01
11: 09: 57.832 7174-7578 / qdivision.org.android_2_arduino_wifi
W / System.err: at
com.android.okhttp.internal.Platform.connectSocket (Platform.java:117)
05-01 11: 09: 57.833 7174-7578 / qdivision.org.android_2_arduino_wifi
W / System.err: at
com.android.okhttp.internal.http.SocketConnector.connectRawSocket (SocketConnector.java:160)
05-01 11: 09: 57.833 7174-7578 / qdivision.org.android_2_arduino_wifi
W / System.err: at
com.android.okhttp.internal.http.SocketConnector.connectCleartext (SocketConnector.java:67)
05-01 11: 09: 57.833 7174-7578 / qdivision.org.android_2_arduino_wifi
W / System.err: at
com.android.okhttp.Connection.connect (Connection.java:152) 05-01
11: 09: 57.833 7174-7578 / qdivision.org.android_2_arduino_wifi
W / System.err: at
com.android.okhttp.Connection.connectAndSetOwner (Connection.java:185)
05-01 11: 09: 57.833 7174-7578 / qdivision.org.android_2_arduino_wifi
W / System.err: at
com.android.okhttp.OkHttpClient $ 1.connectAndSetOwner (OkHttpClient.java:128)
05-01 11: 09: 57.833 7174-7578 / qdivision.org.android_2_arduino_wifi
W / System.err: at
com.android.okhttp.internal.http.HttpEngine.nextConnection (HttpEngine.java:342)
05-01 11: 09: 57.833 7174-7578 / qdivision.org.android_2_arduino_wifi
W / System.err: at
com.android.okhttp.internal.http.HttpEngine.connect (HttpEngine.java:331)
05-01 11: 09: 57.833 7174-7578 / qdivision.org.android_2_arduino_wifi
W / System.err: at
com.android.okhttp.internal.http.HttpEngine.sendRequest (HttpEngine.java:249)
05-01 11: 09: 57.833 7174-7578 / qdivision.org.android_2_arduino_wifi
W / System.err: at
com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute (HttpURLConnectionImpl.java:437)
05-01 11: 09: 57.833 7174-7578 / qdivision.org.android_2_arduino_wifi
W / System.err: at
com.android.okhttp.internal.huc.HttpURLConnectionImpl.connect (HttpURLConnectionImpl.java:114)05-01 11: 09: 57.833 7174-7578 / qdivision.org.android_2_arduino_wifi W / System.err: at qdivision.org.android_2_arduino_wifi.MainActivity $ MyClientTask.doInBackground (MainActivity.java:123) 05-01 11: 09: 57.87174-7578 / qdivision.org.android_2_arduino_wifi W / System.err: at qdivision.org.android_2_arduino_wifi.MainActivity $ MyClientTask.doInBackground (MainActivity.java:95) 05-01 11: 09: 57.833 7174-7578 / qdivandroid_2_arduino_wifi W / System.err: на android.os.AsyncTask $ 2.call (AsyncTask.java:295) 05-01 11: 09: 57.833 7174-7578 / qdivision.org.android_2_arduino_wifi W / System.err: на java.util.concurrent.FutureTask.run (FutureTask.java:237) 05-01 11: 09: 57.833 7174-7578 / qdivision.org.android_2_arduino_wifi W / System.err: at android.os.AsyncTask $ SerialExecutor $ 1.run (AsyncTask.Java: 234) 05-01 11: 09: 57.833 7174-7578 / qdivision.org.android_2_arduino_wifi W / System.err: at java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1113) 05-01 11:09: 57.834 7174-7578 / qdivision.org.android_2_arduino_wifi W / System.err: at java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:588) 05-01 11: 09: 57.834 7174-7578 / qdivision.org.android_2_arduino_wifi W / System.err: atjava.lang.Thread.run (Thread.java:818) 05-01 11: 09: 57.834 7174-7578 / qdivision.org.android_2_arduino_wifi W / System.err: вызвано: android.system.ErrnoException: сбой подключения: EHOSTUNREACH(Нет маршрута к хосту) 05-01 11: 09: 57.834 7174-7578 / qdivision.org.android_2_arduino_wifi W / System.err: at libcore.io.Posix.connect (собственный метод) 05-01 11: 09: 57.834 7174-7578 / qdivision.org.android_2_arduino_wifi W / System.err: at libcore.io.BlockGuardOs.connect (BlockGuardOs.java:111) 05-01 11: 09: 57.834 7174-7578 / qdivision.org.android_2_arduino_wifi W / System.ошибка: в libcore.io.IoBridge.connectErrno (IoBridge.java:137) 05-01 11: 09: 57.834 7174-7578 / qdivision.org.android_2_arduino_wifi W / System.err: в libcore.io.IoBridge.connect (IoBridge.java: 122) 05-01 11: 09: 57.834 7174-7578 / qdivision.org.android_2_arduino_wifi W / System.err: ... еще 22 * 1030 *
РЕДАКТИРОВАТЬ # 2: Я установил Termux на устройство Android и проверял Arduino на 0% потери пакетаболее 250 посылок.Таким образом, Android может достигать Arduino через сеть, но по какой-то причине приложение не может.
РЕДАКТИРОВАТЬ # 3 Я не могу пинговать Arduino в конце концов (оказывается, я пинговал Raspberry Pi).Но в дальнейшем я могу пропинговать устройство Android от Raspberry Pi и с ПК.Взамен я могу пропинговать Raspberry Pi, но НЕ ПК с устройства Android.