12/08/2018, 14:58

Bluetooth

1 . Cài đặt Tạo 1 project và đặt tên là AndroidConnection acitivity_main.xml định nghĩa như dưới đây: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" ...

1. Cài đặt

  • Tạo 1 project và đặt tên là AndroidConnection
  • acitivity_main.xml định nghĩa như dưới đây:
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_awidth="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.maidaidien.androidconnection.MainActivity">

    <Button
        android:layout_awidth="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/bluetooth"
        android:id="@+id/btnBluetooth"
        android:onClick="getBluetoothActivity"
        android:layout_alignParentTop="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true" />
</RelativeLayout>
  • Với Bluetooth api các thiết bị android có thể trao đổi dữ liệu với nhau thông qua các bước sau: + Scan để tìm các thiết bị khác đang bật bluetooth + Query để kết nối hai thiết bị + Thiết lập kết nối hai thiết bị bluetooth + Trao đổi dữ liệu

2. Tạo màn hình xử lí bluetooth

  • Tạo Activity BluetoothActivity.java với layout là RelativeLayout chứa ToggleButtonListView
  • Layout activity_bluetooth.xml như bên dưới
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_awidth="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.maidaidien.androidconnection.BluetoothActivity">

    <ToggleButton
        android:id="@+id/toggleButton"
        android:layout_awidth="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_alignParentTop="true"
        android:onClick="onToggleClicked"
        android:textOff="Bluetooth Off"
        android:textOn="Bluetooth On"/>

    <ListView
        android:id="@+id/listView"
        android:layout_awidth="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/toggleButton"
        android:layout_centerHorizontal="true"/>
</RelativeLayout>

3. Kiểm tra Bluetooth có được hỗ trợ trong thiết bị hay không

  • Trước khi sử dụng các chức năng của bluetooth ta cần kiểm tra xem thiết bị có hỗ trợ bluetooth không
  • Để kiểm tra xem thiết bị có hỗ trợ Bluetooth hay không ta dùng BluetoothAdapter
BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
if (bluetoothAdapter == null) {
    // Thiết bị không hỗ trợ Bluetooth
} else {
    // Thiết bị có hỗ trợ Bluetooth
}

4. Bật Bluetooth

  • Khi thiết bị có hỗ trợ bluetooth ta cần đảm bảo bluetooth đang được bật. Để kiểm tra bluetooth có đang được bật hay không ta sử dụng phương thức "isEnable()" của lớp BluetoothAdapter. Nếu phương thức này trả về false ta cần bật bluetooth sử dụng request sau: gọi phương thức startActivityForResult() với intent ACTION_REQUEST_ENABLE
if (!bluetoothAdapter.isEnabled()) {
    Intent enableBluetoothIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
    startActivityForResult(enableBluetoothIntent, ENABLE_BT_REQUEST_CODE);
}

Lưu ý: ENABLE_BT_REQUEST_CODE được định nghĩa local trong activity và phải lớn hơn 0 để kết qủa sẽ được hệ thống trả về trong phương thức onActivityResult()

public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == ENABLE_BT_REQUEST_CODE) {
        if (resultCode == Activity.RESULT_OK) {
            Toast.makeText(getApplicationContext(), "Ha! Bluetooth has been enabled.",
                   Toast.LENGTH_SHORT).show();
        } else { // RESULT_CANCELED as user refuse or failed
            Toast.makeText(getApplicationContext(), "Bluetooth is not enabled.",
                    Toast.LENGTH_SHORT).show();
        }
    }
}

5. public thiết bị với các thiết bị bluetooth khác (các thiết bị khác có thể scan thấy device của mình)

  • Cũng tương tự như enable ta sẽ gọi phương thức startActivityForResult() với intent ACTION_REQUEST_DISCOVERABLE
protected void makeDiscoverable(){
    // Make local device discoverable
    Intent discoverableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
    discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, DISCOVERABLE_DURATION);
    startActivityForResult(discoverableIntent, DISCOVERABLE_BT_REQUEST_CODE);
}
  • DISCOVERABLE_BT_REQUEST_CODE được định nghĩa local tương tự ENABLE_BT_REQUEST_CODE. Thông thường thời gian discoverable là 120s, ta có thể thay đổi như sau discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, DISCOVERABLE_DURATION);, DISCOVERABLE_DURATION là gía trị integer mà ta muốn.
  • kết qủa sẽ được trả về phương thức onActivityResult()
public void onActivityResult(int requestCode, int resultCode, Intent data) {

    if (requestCode == ENABLE_BT_REQUEST_CODE) {
        // other code     
    } else if (requestCode == DISCOVERABLE_BT_REQUEST_CODE){

        if (resultCode == DISCOVERABLE_DURATION){
            Toast.makeText(getApplicationContext(), "Your device is now discoverable by other devices for " +
                                DISCOVERABLE_DURATION + " seconds",
                        Toast.LENGTH_SHORT).show();
        } else {
            Toast.makeText(getApplicationContext(), "Fail to enable discoverability on your device.",
                        Toast.LENGTH_SHORT).show();
        }
     }
}

Lưu ý: Bật khả năng phát hiện thiết bị sẽ tự động kích hoạt Bluetooth nếu nó chưa được bật trên thiết bị. 6. Discovery bluetooth

  • Gọi phương thức startDiscovery() của lớp BluetoothAdapter
protected void discoverDevices(){
    // To scan for remote Bluetooth devices
    if (bluetoothAdapter.startDiscovery()) {
        Toast.makeText(getApplicationContext(), "Discovering other bluetooth devices...",
                Toast.LENGTH_SHORT).show();
    } else {
        Toast.makeText(getApplicationContext(), "Discovery failed to start.",
                Toast.LENGTH_SHORT).show();
    }
}

phương thức sẽ thực hiện discovery các thiết bị bluetooth khác và sẽ trả về gía trị boolean.

  • Với mỗi thiết bị được discovery hệ thống sẽ thông báo với action ACTION_FOUND, intent này luôn gồm 2 dữ liệu + EXTRA_DEVICE: chứa BluetoothDevice là thiết bị remote + EXTRA_CLASS: chứa BluetoothClass miêu tả về đặc điểm của thiết bị đã found

  • Để bắt được thông báo trên ta làm như sau:

private final BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        // Whenever a remote Bluetooth device is found
        if (BluetoothDevice.ACTION_FOUND.equals(action)) {
            // Get the BluetoothDevice object from the Intent
            BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
            // Add the name and address to an array adapter to show in a ListView
            adapter.add(device.getName() + "
" + device.getAddress());
        }
    }
};

với intentfilter như sau:

// Register the BroadcastReceiver for ACTION_FOUND
IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
this.registerReceiver(broadcastReceiver, filter);

7. Tắt Bluetooth

bluetoothAdapter.disable();

8. Kết nối thiết bị Cài đặt Listening server

  • Phần server sẽ sử dụng "BluetoothServerSocket" để lắng nghe request kết nối đến. Khi có kết nối đến và được accept thì server socket sẽ trả về "BluetoothSocket"" để quản lí kết nối
    • gọi phương thức "listenUsingRfcommWithServiceRecord()" của lớp BluetoothAdapter
BluetoothServerSocket  bluetoothServerSocket = bluetoothAdapter.listenUsingRfcommWithServiceRecord(getString(R.string.app_name), uuid);

tham số thứ 2 uuid được sử dụng để định danh cho bluetooth của app

private final static UUID uuid = UUID.fromString("fc5ffc49-00e3-4c8b-9cf1-6b72aad1001a");
  • gọi phương thức "accept()" để bắt đầu lắng nghe request kết nối

Cài đặt kết nối client

  • Sử dụng object "BluetoothDevice" để đại diện cho thiết bị bluetooth ta muốn kết nối đến. App sẽ gọi phương thức "createRfcommSocketToServiceRecord(UUID)" để tạo "BluetoothSocket"
BluetoothSocket bluetoothSocket = bluetoothDevice.createRfcommSocketToServiceRecord(uuid);
  • gọi phương thức "connect()" của "BluetoothSocket" để yêu câu kết nối
bluetoothSocket.connect();

Lưu ý: cần sử dụng permission trong manifest

<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>

source code source: Peter Leow article

0