Android в Arduino через Wi-Fi данные не отправляются в любом случае - PullRequest
0 голосов
/ 30 апреля 2019

Я новичок в разработке для 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.

...