티스토리 뷰

회사 제품중에 블루투스 모델이 있는데 이 기기와 연결을 시도하려니


블루투스 연결 통신을 해본적 없는 나로서는 매우 어려움이 있었다.


블루투스 통신 라이브러리를 찾아보다 RxAndroidBLE라는 라이브러리가 있었는데,


요즘 핫하다는 RxAndroid를 기반으로 제작된 블루투스 라이브러리였다.


하지만 국내 자료는 보이지도 않았고, 어쩔수 없이 개발자 도큐먼트를 보고 직접 해보며 배워가야했다.


RxAndroidBLE는 GitHub에서 받을수가 있다.

https://github.com/Polidea/RxAndroidBle


일지에 적으려고 하는 라이브러리는 rxandroidble2 1.5.0이다.

 compile "com.polidea.rxandroidble:rxandroidble2:1.5.0"

이걸 Gradle에 추가해주면 된다.

우선 블루투스와 연결하려면 스캔부터 해야한다.


RxBleClient rxBleClient = RxBleClient.create(this);
rxBleClient.scanBleDevices().subscribe(
                        rxBleScanResult -> {
                            // 결과물은 여기서 나온다.
                        },
                        throwable -> {
                            // 오류부분은 여기서 나오지만 Try/Catch문을 써야 앱이 종료되는것을 방지할수 있다.
                        }
                );


코드는 이렇게 간결하게 작성이 가능하다.


필자같은 경우에는 스캔중 특정 디바이스가 보일경우 연결하도록 해야하기 때문에


코드를 아래와 같이 작성했다.

String macAddress;
Disposable connectionDisposable;
RxBleClient rxBleClient = RxBleClient.create(this);
rxBleClient.scanBleDevices().subscribe(
                        rxBleScanResult -> {
                            // 결과물은 여기서 나온다.
                            if(rxBleScanResult.getBleDevice().getName().matches("찾을 이름.*")){
                                macAddress = rxBleScanResult.getBleDevice().getMacAddress();
                                Log.e("TAG","confirm");
                                ble_run();
                            }
 
                        },
                        throwable -> {
                            // 오류부분은 여기서 나오지만 Try/Catch문을 써야 앱이 종료되는것을 방지할수 있다.
                        }
                );
 
void ble_run(){
    connectionDisposable = device.establishConnection(false)
                .flatMap(rxBleConnection -> rxBleConnection.setupNotification(UUID.fromString("여기에 원하는 디바이스의 UUID를 넣으면 된다.")))
                .doOnNext(notificationObservable -> {
                    // Notification has been set up
                    new Thread(new Runnable() {
                        @Override
                        public void run() {
                            runOnUiThread(new Runnable() {
                                @Override
                                public void run() {
                                    // TextView같은 Ui단을 건드리기 위해서는 ui쓰레드를 사용해야 하지만 사용하지 않는다면 지운다.
                                }
                            });
                        }
                    }).start();
                })
                .observeOn(AndroidSchedulers.mainThread())
                .flatMap(notificationObservable -> notificationObservable) // <-- Notification has been set up, now observe value changes.
                .subscribe(
                        bytes -> {
                            // Given characteristic has been changes, here is the value.
                            BLE값은 Bytes로 나오니 String이나 원하는걸로 변환하여 받으면 된다.
                        },
                        throwable -> {
                            Log.e("throwable", "error: " + throwable);
                        }
                );
    }
}


위에 코드를 보면 connectionDisposable이라고 있는데 Disposable이라는 변수에 넣으면 블루투스 모델과 통신을 종료를 원할경우

connectionDisposable.dispose();를 통해서 통신 종료를 할수가 있다.

이대로만 작성하면 블루투스와 통신을 할수가 없다.

권한 설정을 해주어야 블루투스 디바이스와의 통신이 가능해진다.
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
<uses-permission
    android:name="android.permission.ACCESS_COARSE_LOCATION"
    android:maxSdkVersion="22"/>

사용자 위치 권한은 안드로이드 6.0부터 블루투스 연결시 사용자 위치를 받아오도록 수정이 되었다고 한다.


일지 마침.

Comments
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday