본문 바로가기
[ Concept ]

[ Concept ] Bluetooth UUID

by 환이s 2023. 7. 12.


블루투스 UUID(Universally Unique Identifier) 란?

 

블루투스 UUID는 블루투스 장치 및 서비스를 식별하는 데 사용되는 고유한 식별자입니다. UUID는 128비트(16바이트)로 구성되며, 일반적으로 16진수 형식으로 표현됩니다.

 

블루투스 UUID는 두 가지 유형으로 구분됩니다.


 

1. 서비스 UUID(Service UUID) :

 

블루투스 장치에서 제공하는 특정 서비스를 식별하는 데 사용됩니다.

 

예를 들어, 헤드셋이나 프린터와 같은 블루투스 장치는 여러 가지 서비스를 제공할 수 있으며, 각 서비스는 고유한 UUID를 갖습니다. 서비스 UUID는 16비트 또는 128비트 형태로 나타낼 수 있습니다.

 

2. 속성 UUID(Attribute UUID) :

 

블루투스 서비스 안에 있는 특정 속성(Characteristic)을 식별하는 데 사용됩니다.

 

속성은 서비스의 기능 또는 데이터를 나타내며, 예를 들어 특정 장치의 배터리 수준이나 센서 데이터를 읽을 수 있는 속성이 있을 수 있습니다. 속성 UUID도 16비트 또는 128비트 형태로 표현됩니다.

 


블루투스 UUID는 고유성을 보장하기 위해 여러 가지 방법으로 생성될 수 있습니다.

 

예를 들어, 16비트 UUID의 경우에는 Bluetooth SIG(Bluetooth Special Interest Group)에서 사전에 정의된 일련번호를 사용하여 생성되며, 128비트 UUID의 경우에는 더 복잡한 알고리즘을 사용하여 생성됩니다.


블루투스 UUID 단점

 

블루투스 UUID의 단점은 다음과 같습니다

 


 

1. 충돌 가능성:

 

UUID는 고유성을 보장하기 위해 매우 큰 범위의 값을 사용하지만, 충돌이 발생할 수 있는 가능성은 항상 존재합니다.

 

이는 매우 드물지만, UUID가 충돌하여 동일한 식별자를 가진 다른 장치 또는 서비스가 존재할 수 있습니다. 충돌이 발생하면 식별의 일관성과 정확성에 문제가 발생할 수 있습니다.

 


2. 가독성과 인식의 어려움:

 

UUID는 일련의 16진수로 표현되어 가독성이 낮고 기억하기 어려울 수 있습니다.

 

긴 UUID 값을 기억하고 식별하기 위해서는 상당한 노력이 필요할 수 있습니다. 이는 개발자 및 사용자가 블루투스 장치나 서비스를 인식하고 구분하는 데 어려움을 줄 수 있습니다.

 


3. 불필요한 복잡성:

 

일부 경우에는 블루투스 UUID를 사용하는 것이 필요 이상으로 복잡할 수 있습니다.

 

특정 애플리케이션이나 시나리오에서는 더 간단한 식별 방법이나 다른 식별자 체계가 더 적합할 수 있습니다. 블루투스 UUID는 고유성을 위한 목적으로 디자인되었으며, 해당 목적 이외의 경우에는 불필요한 복잡성을 초래할 수 있습니다.

 


4. 네트워크 제약:

 

블루투스 UUID는 블루투스 통신에 사용되는 식별자이기 때문에, 블루투스 네트워크에서만 유효합니다.

 

다른 네트워크나 프로토콜을 통해 블루투스 장치를 식별하고 통신할 때는 다른 식별 방법이 필요합니다. 이는 다른 통신 방식과 블루투스 간의 통합이나 상호 운용성에 일부 제약을 가질 수 있음을 의미합니다.

 


블루투스 UUID의 이러한 단점은 주로 UUID의 복잡성과 식별의 어려움에 초점을 맞추고 있습니다. 그러나 UUID는 여전히 블루투스 장치 및 서비스를 유일하게 식별하는 데 널리 사용되는 표준 방법 중 하나입니다.


단점 대응하기 위한 대처 방안?

 

이러한 단점을 대응하기 위해 몇 가지 대처 방안에 대해 알아봤습니다.

 


 

1. 충돌 감지와 대처:

 

UUID 충돌은 매우 드문 경우이지만, 충돌이 발생할 수 있는 가능성을 고려하여 충돌 감지와 대처 메커니즘을 구현하는 것이 좋다.

 

이를 위해 UUID 생성 시 충돌 여부를 확인하고, 충돌이 감지되면 대체 UUID를 생성하거나 충돌을 해결할 수 있는 다른 방법을 고려해야 합니다.

 



2.사용자 친화적인 식별자:

 

블루투스 UUID는 가독성이 낮고 인식하기 어려운 특성이 있습니다.

 

사용자와 상호작용하는 애플리케이션에서는 UUID 대신 더 사용자 친화적인 식별 방식을 제공하는 것이 좋습니다.

예를 들어, 장치의 이름이나 사용자가 익숙한 알리아스 등을 활용하여 블루투스 장치를 식별할 수 있습니다.

 



3.다른 식별 방법 고려:

 

블루투스 UUID는 블루투스 통신을 위한 특정 식별자이므로, 다른 네트워크나 프로토콜을 사용하는 경우에는 다른 식별 방법을 고려해야 합니다.

 

예를 들어, Wi-Fi 기반의 서비스 탐색이나 NFC(Near Field Communication)를 사용하여 블루투스 장치를 식별하는 방법을 고려할 수 있습니다.

 



4.문서화와 사용자 가이드:

 

개발자나 사용자를 위한 문서화와 사용자 가이드를 제공하여 UUID의 사용 방법과 의미를 명확하게 전달할 수 있습니다.

 

장치 또는 서비스의 UUID를 설명하고, 어떻게 사용되는지에 대한 정보를 제공하여 개발자와 사용자가 식별에 대한 이해를 돕습니다.

 



5.표준화와 상호 운용성 고려:

 

블루투스 UUID는 Bluetooth SIG에서 정의된 표준이지만, 다른 통신 방식과의 통합이나 상호 운용성을 고려할 때는 다른 식별 방법이 필요할 수 있습니다.

 

적절한 표준화와 상호 운용성을 고려하여 다른 통신 방식과의 호환성을 보장할 수 있는 식별 방법을 선택해야 합니다.

 


이러한 대처 방안을 고려하면 블루투스 UUID의 단점을 극복하고 블루투스 장치 및 서비스의 식별에 대한 사용성과 효과성을 향상할 수 있을 거 같습니다.


예제 코드

 

아래는 Android 앱에서 블루투스 장치를 검색하고 UUID를 사용하여 서비스에 연결하는 코드입니다.

 

import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothGatt;
import android.bluetooth.BluetoothGattCallback;
import android.bluetooth.BluetoothGattCharacteristic;
import android.bluetooth.BluetoothGattService;
import android.bluetooth.BluetoothManager;
import android.content.Context;
import android.os.Handler;
import android.util.Log;

import java.util.UUID;

public class BluetoothExample {
    private static final String TAG = "BluetoothExample";
    private static final UUID SERVICE_UUID = UUID.fromString("0000180D-0000-1000-8000-00805F9B34FB");
    private static final UUID CHARACTERISTIC_UUID = UUID.fromString("00002A37-0000-1000-8000-00805F9B34FB");

    private BluetoothAdapter bluetoothAdapter;
    private BluetoothGatt bluetoothGatt;

    public void connectToDevice(Context context, String deviceAddress) {
        BluetoothManager bluetoothManager = (BluetoothManager) context.getSystemService(Context.BLUETOOTH_SERVICE);
        if (bluetoothManager == null) {
            Log.e(TAG, "BluetoothManager initialization failed.");
            return;
        }

        bluetoothAdapter = bluetoothManager.getAdapter();
        if (bluetoothAdapter == null) {
            Log.e(TAG, "BluetoothAdapter initialization failed.");
            return;
        }

        BluetoothDevice device = bluetoothAdapter.getRemoteDevice(deviceAddress);
        if (device == null) {
            Log.e(TAG, "Device not found.");
            return;
        }

        bluetoothGatt = device.connectGatt(context, false, gattCallback);
    }

    private BluetoothGattCallback gattCallback = new BluetoothGattCallback() {
        @Override
        public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
            if (newState == BluetoothGatt.STATE_CONNECTED) {
                Log.i(TAG, "Connected to GATT server.");
                bluetoothGatt.discoverServices();
            } else if (newState == BluetoothGatt.STATE_DISCONNECTED) {
                Log.i(TAG, "Disconnected from GATT server.");
            }
        }

        @Override
        public void onServicesDiscovered(BluetoothGatt gatt, int status) {
            if (status == BluetoothGatt.GATT_SUCCESS) {
                BluetoothGattService service = gatt.getService(SERVICE_UUID);
                if (service != null) {
                    BluetoothGattCharacteristic characteristic = service.getCharacteristic(CHARACTERISTIC_UUID);
                    if (characteristic != null) {
                        // 원하는 동작 수행
                    }
                }
            }
        }
    };

    public void disconnectDevice() {
        if (bluetoothGatt != null) {
            bluetoothGatt.disconnect();
            bluetoothGatt.close();
        }
    }
}

 

위 코드는 Android 앱에서 블루수트 장치에 연결하고 지정된 UUID의 서비스와 특성을 검색하는 기능을 제공합니다.

 

'connectToDevice()' 메서드는 BluetoothManager와 BluetoothAdapter를 초기화하고 지정된 장치에 연결합니다.

 

그 후 'BluetoothGattCallback'을 사용하여 연결 상태 변경 및 서비스 검색 결과를 처리합니다. 검색된 서비스와 특성을 사용하여 원하는 동작을 수행할 수 있습니다.

 

'disconnectDevice()' 메서드는 장치와의 연결을 해제합니다.


마치며

 

오늘은 블루투스 UUID에 대해서 알아봤습니다.

다음 포스팅에서 뵙겠습니다.

728x90