Android java bluetooth передача

Отправка битов по Bluetooth в Android studio

я только начал изучать Java и среду разработки Android studio. Это мой первый вопрос, так что не судите строго. К делу. Я пытаюсь подружить приложение, созданное в Android studio и блютуз модуль HC-06. Код приложения activity_main.xml

package com.example.myapplication3; import androidx.appcompat.app.AppCompatActivity; import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothSocket; import android.content.Intent; import android.icu.text.RelativeDateTimeFormatter; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Toast; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; public class MainActivity extends AppCompatActivity < private InputStream mmInStream = null; //Сокет, с помощью которого мы будем отправлять данные на Arduino BluetoothSocket clientSocket; @Override protected void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); init(); >// public void On(View view) < // try < // OutputStream outStream = clientSocket.getOutputStream(); // outStream.write(1); // >catch (IOException e) < // e.printStackTrace(); // >// > // // public void Off(View view) < // try < // OutputStream outStream = clientSocket.getOutputStream(); // outStream.write(0); // >catch (IOException e) < // e.printStackTrace(); // >// > @Override protected void onStart() < super.onStart(); byte[] buffer=new byte[1024];// буферный массив int bytes;// bytes returned from read() while (true)< try < bytes=mmInStream.read(buffer); >catch (IOException e) < e.printStackTrace(); break; >> > public void run() < byte[] buffer=new byte[1024];// буферный массив int bytes;// bytes returned from read() while (true)< try < bytes=mmInStream.read(buffer); >catch (IOException e) < e.printStackTrace(); break; >> > public void init()< String enableBT = BluetoothAdapter.ACTION_REQUEST_ENABLE; startActivityForResult(new Intent(enableBT), 0); BluetoothAdapter bluetooth = BluetoothAdapter.getDefaultAdapter(); InputStream tmpIn=null; OutputStream tmpOut=null; try< //Устройство с данным адресом - наш Bluetooth Bee //Адрес опредеяется следующим образом: установите соединение //между ПК и модулем (пин: 1234), а затем посмотрите в настройках //соединения адрес модуля. Скорее всего он будет аналогичным. BluetoothDevice device = bluetooth.getRemoteDevice("98:D3:31:FB:B3:10"); //Инициируем соединение с устройством Method m = device.getClass().getMethod( "createRfcommSocket", new 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()); >try < tmpIn= clientSocket.getInputStream(); // tmpOut= clientSocket.getOutputStream(); >catch(IOException e)<> mmInStream= tmpIn; // mmOutStream= tmpOut; Toast.makeText(getApplicationContext(), "CONNECTED", Toast.LENGTH_LONG).show(); // run(); > //Выводим сообщение об успешном подключении > 

введите сюда описание изображения

Что я получаю сейчас. При запуске приложения через Debug, я вижу, что по блютузу информация до меня доходит Но при этом приложение висит на «белом экране». При закомментировании бесконечного цикла, приложение «оживает» и выводит компоненты на экран. В чем может быть проблема ? Знаю, что среди людей, которые ответят будут гуру своего дела, заодно был бы очень рад критике.

Источник

Android — Bluetooth

Among many ways, Bluetooth is a way to send or receive data between two different devices. Android platform includes support for the Bluetooth framework that allows a device to wirelessly exchange data with other Bluetooth devices.

Android provides Bluetooth API to perform these different operations.

  • Scan for other Bluetooth devices
  • Get a list of paired devices
  • Connect to other devices through service discovery

Android provides BluetoothAdapter class to communicate with Bluetooth. Create an object of this calling by calling the static method getDefaultAdapter(). Its syntax is given below.

private BluetoothAdapter BA; BA = BluetoothAdapter.getDefaultAdapter();

In order to enable the Bluetooth of your device, call the intent with the following Bluetooth constant ACTION_REQUEST_ENABLE. Its syntax is.

Intent turnOn = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); startActivityForResult(turnOn, 0);

Apart from this constant, there are other constants provided the API , that supports different tasks. They are listed below.

ACTION_REQUEST_DISCOVERABLE

This constant is used for turn on discovering of bluetooth

This constant will notify that Bluetooth state has been changed

This constant is used for receiving information about each device that is discovered

Once you enable the Bluetooth , you can get a list of paired devices by calling getBondedDevices() method. It returns a set of bluetooth devices. Its syntax is.

private SetpairedDevices; pairedDevices = BA.getBondedDevices();

Apart form the parried Devices , there are other methods in the API that gives more control over Blueetooth. They are listed below.

Читайте также:  Android scan bluetooth devices code

This method enables the adapter if not enabled

This method returns true if adapter is enabled

This method disables the adapter

This method returns the name of the Bluetooth adapter

This method changes the Bluetooth name

This method returns the current state of the Bluetooth Adapter.

This method starts the discovery process of the Bluetooth for 120 seconds.

Example

This example provides demonstration of BluetoothAdapter class to manipulate Bluetooth and show list of paired devices by the Bluetooth.

To experiment with this example , you need to run this on an actual device.

Steps Description
1 You will use Android studio to create an Android application a package com.example.sairamkrishna.myapplication.
2 Modify src/MainActivity.java file to add the code
3 Modify layout XML file res/layout/activity_main.xml add any GUI component if required.
4 Modify AndroidManifest.xml to add necessary permissions.
5 Run the application and choose a running android device and install the application on it and verify the results.

Here is the content of src/MainActivity.java

package com.example.sairamkrishna.myapplication; import android.app.Activity; import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothDevice; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.ListView; import android.widget.Toast; import java.util.ArrayList; import java.util.Set; public class MainActivity extends Activity < Button b1,b2,b3,b4; private BluetoothAdapter BA; private SetpairedDevices; ListView lv; @Override protected void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); b1 = (Button) findViewById(R.id.button); b2=(Button)findViewById(R.id.button2); b3=(Button)findViewById(R.id.button3); b4=(Button)findViewById(R.id.button4); BA = BluetoothAdapter.getDefaultAdapter(); lv = (ListView)findViewById(R.id.listView); >public void on(View v) < if (!BA.isEnabled()) < Intent turnOn = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); startActivityForResult(turnOn, 0); Toast.makeText(getApplicationContext(), "Turned on",Toast.LENGTH_LONG).show(); >else < Toast.makeText(getApplicationContext(), "Already on", Toast.LENGTH_LONG).show(); >> public void off(View v) < BA.disable(); Toast.makeText(getApplicationContext(), "Turned off" ,Toast.LENGTH_LONG).show(); >public void visible(View v) < Intent getVisible = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE); startActivityForResult(getVisible, 0); >public void list(View v) < pairedDevices = BA.getBondedDevices(); ArrayList list = new ArrayList(); for(BluetoothDevice bt : pairedDevices) list.add(bt.getName()); Toast.makeText(getApplicationContext(), "Showing Paired Devices",Toast.LENGTH_SHORT).show(); final ArrayAdapter adapter = new ArrayAdapter(this,android.R.layout.simple_list_item_1, list); lv.setAdapter(adapter); >>

Here is the content of activity_main.xml

Here is the content of Strings.xml

Here is the content of AndroidManifest.xml

Eclipse Run Icon

Let’s try to run your application. I assume you have connected your actual Android Mobile device with your computer. To run the app from Android studio, open one of your project’s activity files and click Run icon from the tool bar.If your Bluetooth will not be turned on then, it will ask your permission to enable the Bluetooth.

Anroid Bluetooth Tutorial

Now just select the Get Visible button to turn on your visibility. The following screen would appear asking your permission to turn on discovery for 120 seconds.

Anroid Bluetooth Tutorial

Now just select the List Devices option. It will list down the paired devices in the list view. In my case , I have only one paired device. It is shown below.

Anroid Bluetooth Tutorial

Now just select the Turn off button to switch off the Bluetooth. Following message would appear when you switch off the bluetooth indicating the successful switching off of Bluetooth.

Источник

How to send/receive messages via bluetooth android studio

I am trying to create an app that allows a string to be sent from one Android phone to another. The code for this is provided below. However, it isn’t working as I keep getting exceptions from the try catch piece of code under the pairDevice() section. Does anyone know why I might be getting this?

import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothSocket; import android.content.Intent; import android.os.ParcelUuid; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.EditText; import android.widget.TextView; import android.widget.Toast; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.Scanner; import java.util.Set; public class MainActivity extends AppCompatActivity < InputStream inStream; OutputStream outputStream; private static final int REQUEST_ENABLE_BT = 1; public void pairDevice() < BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); if (bluetoothAdapter != null && !bluetoothAdapter.isEnabled()) < Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);>Set pairedDevices = bluetoothAdapter.getBondedDevices(); if (pairedDevices.size() > 0) < Object[] devices = pairedDevices.toArray(); BluetoothDevice device = (BluetoothDevice) devices[0]; ParcelUuid[] uuid = device.getUuids(); try < BluetoothSocket socket = device.createInsecureRfcommSocketToServiceRecord(uuid[0].getUuid()); socket.connect(); Toast.makeText(this, "Socket connected", Toast.LENGTH_LONG).show(); outputStream = socket.getOutputStream(); inStream = socket.getInputStream(); >catch (IOException e) < Toast.makeText(this, "Exception found", Toast.LENGTH_LONG).show(); >> > public void SendMessage(View v) < EditText outMessage = (EditText) findViewById(R.id.editText); try < if (outputStream != null) outputStream.write(outMessage.toString().getBytes()); TextView displayMessage = (TextView) findViewById(R.id.textView); Scanner s = new Scanner(inStream).useDelimiter("\\A"); displayMessage.setText(s.hasNext() ? s.next() : ""); >catch (IOException e) Toast.makeText(this,"No output stream", Toast.LENGTH_LONG).show(); > @Override protected void onCreate(Bundle savedInstanceState)

3 Answers 3

I have made few changes to your app:-

Читайте также:  Передача через блютуз виндовс 10

Firstly, I shifted the code responsible for creating the Bluetooth connection to ConnectThread .

2) Added AcceptThread responsible for listening incoming connections and ConnectedThread maintaining the BTConnection, Sending the data, and receiving incoming data through input/output streams respectively. 3) Created 2 buttons to start ConnectThread and AcceptThread.

NOTE: Make sure both the devices are paired and the device that you are trying to connect to is at the top of the list(or just remove all the paired devices from both the devices and only pair the devices that you want to connect). Also, you must start the AcceptThread before ConnectThread

MAINACTIVITY.JAVA

public class MainActivity extends AppCompatActivity < private static final UUID MY_UUID_INSECURE = UUID.fromString("8ce255c0-200a-11e0-ac64-0800200c9a66"); private static final int REQUEST_ENABLE_BT = 1; BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); private BluetoothDevice mmDevice; private UUID deviceUUID; ConnectedThread mConnectedThread; private Handler handler; String TAG = "MainActivity"; EditText send_data; TextView view_data; StringBuilder messages; public void pairDevice(View v) < SetpairedDevices = bluetoothAdapter.getBondedDevices(); Log.e("MAinActivity", "" + pairedDevices.size() ); if (pairedDevices.size() > 0) < Object[] devices = pairedDevices.toArray(); BluetoothDevice device = (BluetoothDevice) devices[0]; //ParcelUuid[] uuid = device.getUuids(); Log.e("MAinActivity", "" + device ); //Log.e("MAinActivity", "" + uuid) ConnectThread connect = new ConnectThread(device,MY_UUID_INSECURE); connect.start(); >> private class ConnectThread extends Thread < private BluetoothSocket mmSocket; public ConnectThread(BluetoothDevice device, UUID uuid) < Log.d(TAG, "ConnectThread: started."); mmDevice = device; deviceUUID = uuid; >public void run() < BluetoothSocket tmp = null; Log.i(TAG, "RUN mConnectThread "); // Get a BluetoothSocket for a connection with the // given BluetoothDevice try < Log.d(TAG, "ConnectThread: Trying to create InsecureRfcommSocket using UUID: " +MY_UUID_INSECURE ); tmp = mmDevice.createRfcommSocketToServiceRecord(MY_UUID_INSECURE); >catch (IOException e) < Log.e(TAG, "ConnectThread: Could not create InsecureRfcommSocket " + e.getMessage()); >mmSocket = tmp; // Make a connection to the BluetoothSocket try < // This is a blocking call and will only return on a // successful connection or an exception mmSocket.connect(); >catch (IOException e) < // Close the socket try < mmSocket.close(); Log.d(TAG, "run: Closed Socket."); >catch (IOException e1) < Log.e(TAG, "mConnectThread: run: Unable to close connection in socket " + e1.getMessage()); >Log.d(TAG, "run: ConnectThread: Could not connect to UUID: " + MY_UUID_INSECURE ); > //will talk about this in the 3rd video connected(mmSocket); > public void cancel() < try < Log.d(TAG, "cancel: Closing Client Socket."); mmSocket.close(); >catch (IOException e) < Log.e(TAG, "cancel: close() of mmSocket in Connectthread failed. " + e.getMessage()); >> > private void connected(BluetoothSocket mmSocket) < Log.d(TAG, "connected: Starting."); // Start the thread to manage the connection and perform transmissions mConnectedThread = new ConnectedThread(mmSocket); mConnectedThread.start(); >private class ConnectedThread extends Thread < private final BluetoothSocket mmSocket; private final InputStream mmInStream; private final OutputStream mmOutStream; public ConnectedThread(BluetoothSocket socket) < Log.d(TAG, "ConnectedThread: Starting."); mmSocket = socket; InputStream tmpIn = null; OutputStream tmpOut = null; try < tmpIn = mmSocket.getInputStream(); tmpOut = mmSocket.getOutputStream(); >catch (IOException e) < e.printStackTrace(); >mmInStream = tmpIn; mmOutStream = tmpOut; > public void run() < byte[] buffer = new byte[1024]; // buffer store for the stream int bytes; // bytes returned from read() // Keep listening to the InputStream until an exception occurs while (true) < // Read from the InputStream try < bytes = mmInStream.read(buffer); final String incomingMessage = new String(buffer, 0, bytes); Log.d(TAG, "InputStream: " + incomingMessage); runOnUiThread(new Runnable() < @Override public void run() < view_data.setText(incomingMessage); >>); > catch (IOException e) < Log.e(TAG, "write: Error reading Input Stream. " + e.getMessage() ); break; >> > public void write(byte[] bytes) < String text = new String(bytes, Charset.defaultCharset()); Log.d(TAG, "write: Writing to outputstream: " + text); try < mmOutStream.write(bytes); >catch (IOException e) < Log.e(TAG, "write: Error writing to output stream. " + e.getMessage() ); >> /* Call this from the main activity to shutdown the connection */ public void cancel() < try < mmSocket.close(); >catch (IOException e) < >> > public void SendMessage(View v) < byte[] bytes = send_data.getText().toString().getBytes(Charset.defaultCharset()); mConnectedThread.write(bytes); >@Override protected void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); send_data =(EditText) findViewById(R.id.editText); view_data = (TextView) findViewById(R.id.textView); if (bluetoothAdapter != null && !bluetoothAdapter.isEnabled()) < Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT); >> public void Start_Server(View view) < AcceptThread accept = new AcceptThread(); accept.start(); >private class AcceptThread extends Thread < // The local server socket private final BluetoothServerSocket mmServerSocket; public AcceptThread()< BluetoothServerSocket tmp = null ; // Create a new listening server socket try< tmp = bluetoothAdapter.listenUsingInsecureRfcommWithServiceRecord("appname", MY_UUID_INSECURE); Log.d(TAG, "AcceptThread: Setting up Server using: " + MY_UUID_INSECURE); >catch (IOException e) < Log.e(TAG, "AcceptThread: IOException: " + e.getMessage() ); >mmServerSocket = tmp; > public void run()< Log.d(TAG, "run: AcceptThread Running."); BluetoothSocket socket = null; try< // This is a blocking call and will only return on a // successful connection or an exception Log.d(TAG, "run: RFCOM server socket start. "); socket = mmServerSocket.accept(); Log.d(TAG, "run: RFCOM server socket accepted connection."); >catch (IOException e) < Log.e(TAG, "AcceptThread: IOException: " + e.getMessage() ); >//talk about this is in the 3rd if(socket != null) < connected(socket); >Log.i(TAG, "END mAcceptThread "); > public void cancel() < Log.d(TAG, "cancel: Canceling AcceptThread."); try < mmServerSocket.close(); >catch (IOException e) < Log.e(TAG, "cancel: Close of AcceptThread ServerSocket failed. " + e.getMessage() ); >> > 

ACTIVITY_MAIN.XML

Читайте также:  Zs 040 bluetooth прошивка

Источник

Обмен данными Bluetooth

Пример обмена данными Bluetooth

Продолжаем предыдущую статью о работе с Bluetooth в Android Studio. В этой статье рассмотрим обмен данными Bluetooth, через SPP профиль.

Профиль SPP (Serial Port Profile) – предназначен для обмена данными по Bluetooth. SPP профиль дает возможность, соединить два устройства Bluetooth на транспортном уровне. При таком соединении одно из устройств станет мастером, а второе ведомым. На самом деле нам это не так важно, так как все тонкости скрыты разработчиками классов java. Единственное что нам надо запомнить, это то, что SPP профиль, основан на базовом профиле RFCOM.

SPP профиль Bluetooth

После того как мы обнаружили наше устройство и произвели сопряжение. Нам необходимо создать и открыть сокет.

Для создания сокета воспользуемся следующей командой:

device.createInsecureRfcommSocketToServiceRecord(MY_UUID);

device — это наше устройство Bluetooth.

MY_UUID – uuid SPP профиля.

Внимание!
UUID профиля «00001101-0000-1000-8000-00805f9b34fb»

После создания сокета нам необходимо создать подключение командой connect :

Внимание!
Будьте внимательны при использовании метода connect , он блокирует программу, пока не будет установлено соединение или пока не закончится таймаут. Рекомендуется использовать отдельный поток.

Обмен данными Bluetooth: InputStream

Входящим потоком данных в java является InputStream . В java есть два типа потоков, символьный и байтовый потоки. Что бы инициализировать байтовый поток Input, необходимо применить метод сокета:

Обмен данными Bluetooth: OutputStream

Исходящим потоком данных в java является OutputStream . Что бы инициализировать байтовый поток Otput, необходимо применить метод сокета:

Android studio: пример обмена по bluetooth

Создадим новый класс для обмена данными по Bluetooth. Класс наследуем от класса реализующего потоки.

private class ConnectThread extends Thread < private BluetoothSocket mmSocket = null; private boolean isUpdateDate = false; private final Activity mmActivity; private BluetoothAdapter mmAdapter = null; private OutputStream outData = null; private final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805f9b34fb"); public ConnectThread(BluetoothDevice device, BluetoothAdapter adapter, Activity activity) < BluetoothSocket tmp = null; mmAdapter = adapter; mmActivity = activity; try < if (ActivityCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.BLUETOOTH_CONNECT) != PackageManager.PERMISSION_GRANTED) < return; >//device.getUuids()[0].getUuid() tmp = device.createInsecureRfcommSocketToServiceRecord(MY_UUID); Log.e("TODO", "Сокет создан"); > catch (IOException e) < Log.e("TODO", "Ошибка созадания сокета"); >mmSocket = tmp; > public void setIsUpdate(Boolean data) < isUpdateDate = data; >public void run() < while (isUpdateDate) < if (mServiceBound) < sendData(latitudeToSend + " " + longitudeToSend); try < Thread.sleep(1000); >catch (InterruptedException e) < e.printStackTrace(); >> > > public void connectSSP() < if (ActivityCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.BLUETOOTH_SCAN) != PackageManager.PERMISSION_GRANTED) < return; >mmAdapter.cancelDiscovery(); Log.e("TODO", "Завершил поиск даже если небыл включен"); try < Log.e("TODO", "Включаю сокет"); mmSocket.connect(); outData = mmSocket.getOutputStream(); InputStream inData = mmSocket.getInputStream(); AlertDialog dialog = DialogView.getDialog(mmActivity, DialogView.IDD_INFO_CONNECT); dialog.show(); >catch (IOException connectException) < Log.e("TODO", "Не могу подключить SPP", connectException); try < mmSocket.close(); >catch (IOException closeException) < Log.e("TAG", "Не могу закрыть сокет", closeException); >> > public void sendData(String dataStr) < if (isUpdateDate) < try < outData = mmSocket.getOutputStream(); >catch (IOException e) < Log.d("Error", "SSP OUT", e); >byte[] msgBuf = dataStr.getBytes(); try < outData.write(msgBuf); >catch (IOException e) < Log.d("Error", "SSP OUT", e); >> > public void cancel() < try < if (mmSocket != null) < if (mmSocket.isConnected()) mmSocket.close(); >> catch (IOException e) < Log.e("TAG", "Не могу закрыть сокет", e); >//Закрываем поток ConnectThread.interrupted(); > >

Пояснения к коду обмена данными по Bluetooth

При инициализации класса в конструктор класса необходимо передать наше устройство Bluetooth (устройство с которым будем обмениваться данными) и наш Bluetooth adapter (физический блютуз).

Метод класса setIsUpdate , позволяет установить флаг, для старта передачи данных, если флаг не установлен, то передача не идет.

Метод connectSSP реализует соединение с устройством Bluetooth через профиль SPP. После установки соединения пользователь получит диалоговое сообщение о успешном соединении.

sendData метод класса, который принимает на вход строку для отправки другому устройству. Затем эта строка конвертируется в массив байт и отправляется на передачу.

Последний метод cancel . Данный метод необходимо применять, когда мы завершаем работу с сокетом.

Чтобы начать работу с классом, необходимо из основного активити создать объект класса и вызвать метод Start .

ConnectThread connectBLE = new ConnectThread(btConnectDevice, mAdapter, MainActivity.this); connectBLE.start();

Источник

Оцените статью
Adblock
detector