Передача битовой информации по Bluetooth

149
14 апреля 2022, 23:00

я - новичок, так что не судите строго. Я разрабатываю приложение на Java под Android. Я связываюсь с Arduino через блютуз модуль HC-06.Код - рабочий, сторонний поток создан, информацию с Arduino я получаю, Но, каждый раз, когда приходит бит, он уникален (отображается на экране уникально) в виде [B@xxxxxxx где xxxxxxx- рандомные числа/ буквы пример : [B@a102825, [B@9592827 итд. Но Ардуино все время посылает одно и то же число - 0.

Мой код Android приложения

MainActivity.java

public class MainActivity extends AppCompatActivity {
    //Сокет, с помощью которого мы будем отправлять данные на 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);
        BluetoothAdapter bluetooth = BluetoothAdapter.getDefaultAdapter();
        try{
            //Устройство с данным адресом - наш Bluetooth Bee
            //Адрес опредеяется следующим образом: установите соединение
            //между ПК и модулем (пин: 1234), а затем посмотрите в настройках
            //соединения адрес модуля. Скорее всего он будет аналогичным.
            BluetoothDevice device = bluetooth.getRemoteDevice("98:D3:31:FB:B3:10");
            //Инициируем соединение с устройством
            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
    protected void onStart() {
        super.onStart();
        MYAsync myAsync=new MYAsync();
            myAsync.execute();

    }
    class MYAsync extends AsyncTask<Void, String, Void> {
        @Override
        protected Void doInBackground(Void... voids) {
                final InputStream mmInStream;
                InputStream tmpIn = null;
                try {
                    tmpIn = clientSocket.getInputStream();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                mmInStream = tmpIn;
                byte[] buffer = new byte[1024];
                int bytes ;// bytes returned from read()
            while (true){
                buffer= new byte[1];
                try {
                    bytes= mmInStream.read(buffer);
                } catch (IOException e) {
                    e.printStackTrace();
                }
               String str = buffer.toString();
                publishProgress(str);
            }
        }
        @Override
        protected void onProgressUpdate(String... values) {
            super.onProgressUpdate(values);
            TextView text = (TextView) findViewById(R.id.textView1);
            text.setText(values[0]);
        }
    }
}

Код Ардуино

int BUPin=7;
void setup() {
    //Устанавливаем скорость UART
    Serial.begin(9600); 
 
    
    pinMode(BUPin, INPUT);   
}
 
void loop() {
    //Если кнопка не нажата
    if (digitalRead(BUPin)==0) {
      Serial.print(0);
    }
    else{
      Serial.print(1);
      }
    delay(1000);
    
}

P.S Я начинающий, и могу не до конца понимать, как передается битовая информация и что с ней происходит и как ее прочитать, так что я думаю, что вся загвоздка кроется в методике прочтения и вывода на экран. Что я получаю на сериал порт с ПК (что посылается Ардуинкой по блютуз).

Answer 1

Решил проблему так.

byte[] buffer = new byte[1024];
            int bytes = 0;// bytes returned from read()
        StringBuilder sb = new StringBuilder();
        while (true){
            buffer= new byte[5];
            try {
                bytes= mmInStream.read(buffer);
            } catch (IOException e) {
                e.printStackTrace();
            }
            if(bytes==5){
                String strIncom = new String(buffer, 0, bytes);
                sb.append(strIncom);
                publishProgress(strIncom );
                sb.delete(0,5);
            }
        }
READ ALSO
Работа с Predicate

Работа с Predicate

У меня есть задача, нужно сделать фильтры для стримов с разными типами объектов

255
Не выполняется запрос к API в потоках (Threads)

Не выполняется запрос к API в потоках (Threads)

Пытаюсь сделать тест, имитация работы 2х пользователей над док-мИспользую библиотеки RestAssured и JerseyTest

97
Взаимодействие между контроллерами в JavaFX

Взаимодействие между контроллерами в JavaFX

Подскажите, пожалуйста, как правильно написать взаимодействие между двумя контроллерами

241
Как делается фронтенд для Java-приложений?

Как делается фронтенд для Java-приложений?

Я столкнулся с тем, что не понимаю, как обычно реализуется фронт для Java-приложенияУ меня есть несколько предположений о том, как это может...

275