Arduino+Bluetooth+Android Studio

Тема в разделе "Arduino & Shields", создана пользователем Naher90, 20 янв 2018.

  1. Naher90

    Naher90 Нуб

    Всем привет! Реализую один небольшой проектик на Arduino, с управлением через Bluetooth из мобильного приложения на Java. Сначала написал его как шаблон в AppInventor'е . всё работало. Сейчас пытаюсь написать через Android Studio и встала загвоздка, сначала не мог отправлять команды поочереди, например 1, 2, 3..., с одной кнопки, это сделал, теперь проблема в том что команды не передаются вообще... ЧАсть кода честно взята с интернетов. Короче, беда... Помогите чем сможете, ПОЖАЛУЙСТА!!!
    Код (Java):
    package com.example.***.myapplication;

    import android.app.Activity;
    import android.bluetooth.BluetoothAdapter;
    import android.bluetooth.BluetoothDevice;
    import android.bluetooth.BluetoothSocket;
    import android.content.Intent;
    import android.os.Bundle;
    import android.support.annotation.Nullable;
    import android.support.v7.app.AppCompatActivity;
    import android.util.Log;
    import android.view.View;
    import android.widget.Button;
    import android.widget.Toast;

    import java.io.IOException;
    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;
    import java.util.ArrayList;
    import java.util.List;

    public class MainActivity extends Activity implements View.OnClickListener{
        //Сокет, с помощью которого мы будем отправлять данные на Arduino
        BluetoothSocket clientSocket;
        //Эта функция запускается автоматически при запуске приложения
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            //Включаем bluetooth. Если он уже включен, то ничего не произойдет
            String enableBT = BluetoothAdapter.ACTION_REQUEST_ENABLE;
            startActivityForResult(new Intent(enableBT), 0);
            //Мы хотим использовать тот bluetooth-адаптер, который задается по умолчанию
            BluetoothAdapter bluetooth = BluetoothAdapter.getDefaultAdapter();
            //Пытаемся проделать эти действия
            try{
                //Устройство с данным адресом - наш Bluetooth Bee
                //Адрес опредеяется следующим образом: установите соединение
                //между ПК и модулем (пин: 1234), а затем посмотрите в настройках
                //соединения адрес модуля. Скорее всего он будет аналогичным.
                BluetoothDevice device = bluetooth.getRemoteDevice("98:D3:31:FC:50:7A");
                //Инициируем соединение с устройством
                Method m = device.getClass().getMethod(
                        "createRfcommSocket", new Class[] {int.class});

                clientSocket = (BluetoothSocket) m.invoke(device, 1);
                clientSocket.connect();

                //В случае появления любых ошибок, выводим в лог сообщение
            } catch (IOException e) {
                Log.d("BLUETOOTH", e.getMessage());
            } catch (SecurityException e) {
                Log.d("BLUETOOTH", e.getMessage());
            } catch (NoSuchMethodException e) {
                Log.d("BLUETOOTH", e.getMessage());
            } catch (IllegalArgumentException e) {
                Log.d("BLUETOOTH", e.getMessage());
            } catch (IllegalAccessException e) {
                Log.d("BLUETOOTH", e.getMessage());
            } catch (InvocationTargetException e) {
                Log.d("BLUETOOTH", e.getMessage());
            }

            //Выводим сообщение об успешном подключении
            Toast.makeText(getApplicationContext(), "CONNECTED", Toast.LENGTH_LONG).show();

        }



        public static class ExampleActivity extends AppCompatActivity {

            private Button myButton;
            private List<Command> commands = new ArrayList<>();
            private int commandPos;

            @Override
            protected void onCreate(@Nullable Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);

                myButton = (Button) findViewById(R.id.btn1);

                commands.add(() -> sendBluetoothCommand("Command 1"));
                commands.add(() -> sendBluetoothCommand("Command 2"));
                commands.add(() -> sendBluetoothCommand("Command 3"));

                myButton.setOnClickListener(v -> {
                    if (commands.size() == 0) {
                        return;
                    } else if (commandPos <= commands.size()) {
                        commandPos = 0;
                    }

                    commands.get(commandPos).execute();
                    commandPos++;
                });
            }

            private void sendBluetoothCommand(String command) {
                System.out.println(command);
            }

            private interface Command {
                void execute();
            }
        }
    }
     
  2. Naher90

    Naher90 Нуб

  3. Вот отправка по нажатия
    Код (Java):
    public void onButtonClick (View view) {
            EditText num = (EditText)findViewById(R.id.editText);
            int value = Integer.parseInt(num.getText().toString());
            OutputStream outStream = null;
            try {
                outStream = clientSocket.getOutputStream();
                Toast.makeText(getApplicationContext(), "Подключение успешно", Toast.LENGTH_LONG).show();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                if (outStream != null) {
                    outStream.write(value);
                }
                Toast.makeText(getApplicationContext(), "Данные успешно переданы", Toast.LENGTH_LONG).show();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
     
  4. Naher90

    Naher90 Нуб

    По нажатию введенного текста, а у меня нажатия на кнопки, при чём на одну несколько раз
     
  5. Первое нажатие отправило 1, второе - 2?
     
  6. Naher90

    Naher90 Нуб

    Да, а третье - 3.))
     
  7. Тоже самое)
    Только в функцию по нажатию на кнопку добавить переменную изначально number = 0;
    По нажатию number++
    И отправить number
    Неа?
     
  8. Naher90

    Naher90 Нуб

    БЛин, я всё понимаю, но можно приблизительный пример? Да и проблема то в том, что данные не уходят
     
  9. Я вот хз по поводу строки System.out.println
    Где вы такое увидели?
     
  10. Naher90

    Naher90 Нуб

    Посоветовал данный пример один хороший человек. У меня тот же вопрос был)
     
  11. Пример щас попробую. Кстати он клик листенер мне кажется не лучший способ. Удобнее привязать любую функцию к кнопке. В графическом редакторе у кнопки есть свойство он клик
     
  12. В начале где-то добавляете глобальную переменную click = 0;
    А по нажатию на кнопку оно будет отправлять
    Код (Java):
    public void onButtonClick (View view) {
            click++;
            outStream = null;
            try {
                outStream = clientSocket.getOutputStream();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                if (outStream != null) {
                    outStream.write(click);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
     
  13. Naher90

    Naher90 Нуб

    оу)) Спасибо, сейчас попробую обязательно
     
  14. Клиент сокет не уверен что совпадает с вашим :) проверьте
     
  15. Naher90

    Naher90 Нуб

    С Вашего позволения попробовал ваш код, из вашего топика, короче вот лог ошибок, которые я не могу понять
    Код (C++):
    01-20 21:41:00.426 3727-3727/com.example.shkolkins.a1111 E/AndroidRuntime: FATAL EXCEPTION: main
                                                                               Process: com.example.shkolkins.a1111, PID: 3727
                                                                               java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.shkolkins.a1111/com.example.shkolkins.a1111.MainActivity}: java.lang.IllegalArgumentException: null is not a valid Bluetooth address
                                                                                   at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3160)
                                                                                   at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3275)
                                                                                   at android.app.ActivityThread.access$1000(ActivityThread.java:218)
                                                                                   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1744)
                                                                                   at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                                   at android.os.Looper.loop(Looper.java:145)
                                                                                   at android.app.ActivityThread.main(ActivityThread.java:7007)
                                                                                   at java.lang.reflect.Method.invoke(Native Method)
                                                                                   at java.lang.reflect.Method.invoke(Method.java:372)
                                                                                   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1404)
                                                                                   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199)
                                                                                Caused by: java.lang.IllegalArgumentException: null is not a valid Bluetooth address
                                                                                   at android.bluetooth.BluetoothDevice.<init>(BluetoothDevice.java:861)
                                                                                   at android.bluetooth.BluetoothAdapter.getRemoteDevice(BluetoothAdapter.java:618)
                                                                                   at com.example.shkolkins.a1111.MainActivity.onCreate(MainActivity.java:49)
                                                                                   at android.app.Activity.performCreate(Activity.java:6609)
                                                                                   at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1134)
                                                                                   at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3113)
                                                                                   at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3275)
                                                                                   at android.app.ActivityThread.access$1000(ActivityThread.java:218)
                                                                                   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1744)
                                                                                   at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                                   at android.os.Looper.loop(Looper.java:145)
                                                                                   at android.app.ActivityThread.main(ActivityThread.java:7007)
                                                                                   at java.lang.reflect.Method.invoke(Native Method)
                                                                                   at java.lang.reflect.Method.invoke(Method.java:372)
                                                                                   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1404)
                                                                                   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199)
     
  16. Можно весь ваш код теперь с моим кусочком?
     
  17. Naher90

    Naher90 Нуб

    Код (Java):
    1-20 22:57:45.953 8010-8010/com.example.shkolkins.myapplication E/AndroidRuntime: FATAL EXCEPTION: main
                                                                                       Process: com.example.shkolkins.myapplication, PID: 8010
                                                                                       java.lang.IllegalStateException: Could not find a method onClickBut1(View) in the activity class com.example.shkolkins.myapplication.MainActivity for onClick handler on view class android.widget.Button with id 'btn1'
                                                                                           at android.view.View$1.onClick(View.java:4277)
                                                                                           at android.view.View.performClick(View.java:5246)
                                                                                           at android.widget.TextView.performClick(TextView.java:10620)
                                                                                           at android.view.View$PerformClick.run(View.java:21256)
                                                                                           at android.os.Handler.handleCallback(Handler.java:739)
                                                                                           at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                                           at android.os.Looper.loop(Looper.java:145)
                                                                                           at android.app.ActivityThread.main(ActivityThread.java:7007)
                                                                                           at java.lang.reflect.Method.invoke(Native Method)
                                                                                           at java.lang.reflect.Method.invoke(Method.java:372)
                                                                                           at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1404)
                                                                                           at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199)
                                                                                        Caused by: java.lang.NoSuchMethodException: onClickBut1 [class android.view.View]
                                                                                           at java.lang.Class.getMethod(Class.java:671)
                                                                                           at android.view.View$1.onClick(View.java:4270)
                                                                                           at android.view.View.performClick(View.java:5246)
                                                                                           at android.widget.TextView.performClick(TextView.java:10620)
                                                                                           at android.view.View$PerformClick.run(View.java:21256)
                                                                                           at android.os.Handler.handleCallback(Handler.java:739)
                                                                                           at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                                           at android.os.Looper.loop(Looper.java:145)
                                                                                           at android.app.ActivityThread.main(ActivityThread.java:7007)
                                                                                           at java.lang.reflect.Method.invoke(Native Method)
                                                                                           at java.lang.reflect.Method.invoke(Method.java:372)
                                                                                           at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1404)
                                                                                           at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199)
    01-20 22:57:46.003 752-8074/? E/android.os.Debug: ro.product_ship = true
    01-20 22:57:46.003 752-8074/? E/android.os.Debug: ro.debug_level = 0x4f4c
    01-20 22:57:46.053 172-172/? E/BufferQueueCore: [Application Error: com.example.shkolkins.myapplication] setDefaultMaxBufferCount: setting count to 3, previous is 2
    01-20 22:57:46.544 172-172/? E/BufferQueueCore: [com.sec.android.app.launcher/com.android.launcher2.Launcher] setDefaultMaxBufferCount: setting count to 3, previous is 2
    01-20 22:57:50.728 752-1082/? E/Watchdog: !@Sync 1945 [01-20 22:57:50.735]
     
    Ошибки ещё раз

    и сам код
    Код (Java):
    import android.app.Activity;
    import android.bluetooth.BluetoothAdapter;
    import android.bluetooth.BluetoothDevice;
    import android.bluetooth.BluetoothSocket;
    import android.content.Intent;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.View;
    import android.widget.Toast;

    import java.io.IOException;
    import java.io.OutputStream;
    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;

    public class MainActivity extends Activity implements View.OnClickListener {
        //Сокет, с помощью которого мы будем отправлять данные на Arduino
        BluetoothSocket clientSocket;
        private OutputStream outStream;

        //Эта функция запускается автоматически при запуске приложения
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            //Включаем bluetooth. Если он уже включен, то ничего не произойдет
            String enableBT = BluetoothAdapter.ACTION_REQUEST_ENABLE;
            startActivityForResult(new Intent(enableBT), 0);
            //Мы хотим использовать тот bluetooth-адаптер, который задается по умолчанию
            BluetoothAdapter bluetooth = BluetoothAdapter.getDefaultAdapter();
            //Пытаемся проделать эти действия
            try {
                //Устройство с данным адресом - наш Bluetooth Bee
                //Адрес опредеяется следующим образом: установите соединение
                //между ПК и модулем (пин: 1234), а затем посмотрите в настройках
                //соединения адрес модуля. Скорее всего он будет аналогичным.
                BluetoothDevice device = bluetooth.getRemoteDevice("98:D3:31:FC:50:7A");
                //Инициируем соединение с устройством
                Method m = device.getClass().getMethod(
                        "createRfcommSocket", new Class[]{int.class});

                clientSocket = (BluetoothSocket) m.invoke(device, 1);
                clientSocket.connect();

                //В случае появления любых ошибок, выводим в лог сообщение
            } catch (IOException e) {
                Log.d("BLUETOOTH", e.getMessage());
            } catch (SecurityException e) {
                Log.d("BLUETOOTH", e.getMessage());
            } catch (NoSuchMethodException e) {
                Log.d("BLUETOOTH", e.getMessage());
            } catch (IllegalArgumentException e) {
                Log.d("BLUETOOTH", e.getMessage());
            } catch (IllegalAccessException e) {
                Log.d("BLUETOOTH", e.getMessage());
            } catch (InvocationTargetException e) {
                Log.d("BLUETOOTH", e.getMessage());
            }

            //Выводим сообщение об успешном подключении
            Toast.makeText(getApplicationContext(), "CONNECTED", Toast.LENGTH_LONG).show();

        }


        @Override
        public void onClick(View view) {
            int click = 0;
            click++;
            outStream = null;
            try {
                outStream = clientSocket.getOutputStream();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                if (outStream != null) {
                    outStream.write(click);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }