1. BlE(Bluetooth Low Energy
- 4.3부터 지원하기 시작했다.
- 디바이스 검색, 서비스 검색 그리고 속성들의 읽기/쓰기를 지원한다.
- Generic Attribute Profile(GATT)는 송수신 가능한 일반적인 사양을 말함
- Attribute Protocol(ATT)에 의해 부여된 속성은 특성과 서비스를 결정한다.
- 하나의 특성(Characteristic)은 클래스와 유사한 타입으로 생각하면 됨
- Descriptor는 특성 값을 기술한다.
- 하나의 Service는 특성들의 집합이다. 서비스 리스트 참고 bluetooth.org
- Central의 역할은 Scan과 Looking for advertisement, Peripheral의 역할은 게시를 만든다.
- 서로 주고 받는 데이터의 출발지와 목적지에 따라 GATT Server와 GATT Client로 나뉜다.
- 폰과 BLE장치가 한번 연결이 되면 두 장치는 서로 GATT metadata를 주고 받는다.
2. 안드로이드 개발 전 확인해야 할 것들
- 블루투스 통신을 하려면 Manifast.xml에 블루투스 관련 Permission을 추가해야 한다.(BLE만 사용 가능)
- BLE 활성화 여부를 PackageManager.hasSystemFeature로 알아낼 수 있다.
- Device가 BLE를 지원하는지 확인, 지원한다면 활성화해야 한다.
- 지원한다면 사용자에게 블루투스를, 앱을 떠나지 않고 활성화하도록 유도해야한다. 이 과정은 BluetoothAdapter를 사용하여 2단계로 가능하다.
* 블루투스 업체별 제공해주는 서비스,characteristic를 먼저파악하고 명확하게 필요한 characteristic를 define 한 후 프로그램을 작성하는 접근방식도 도움이 될 듯함.
3. 안드로이드 개발 과정
1) BluetoothAdapter 얻기
- 블루투스 일부 또는 모든 관련 동작들을 필요로 한다. 전체 시스템을 위한 하나의 Adapter가 있고 앱은 이 객체를 통해 상호작용을 한다.
final BluetoothManager _bm = (BluetoothManager)getSystemService(Context.BLUETOOTH_SERVICE);
mBluetoothAdapter = _bm.getAdapter();
2) Bluetooth활성화
- isEnable()로 활성화 여부를 확인 가능하다. false면 비활성화
private BluetoothAdapter mBluetoothAdapter
...
if(mBluetoothAdapter == null || !mBluetoothAdapter.isEnable()) {
Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(intent, 0);
3) BLE 장치 찾기
- BLE 장치를 찾으려면 startLeScan()을 호출한다. LeScanCallback이 parameter로 호출된다. 이 메소드를 구현해야 하고 스캔 결과를 받을 수 있다. 배터리 소모가 심심하기 때문에 다음의 가이드라인을 잘 지켜야 한다.
* 원하는 디바이스를 찾으면 바로 스캔 중단
* 하나의 루프에서 스캔하지 말고 타임아웃 적용, 디바이스가 범위를 벗어났을 경우 배터리 소모량은 답이 없기 때문
특정 타입을 스캔하고자 한다면 startLeScan(UUID[], BluetoothAdapter.LeScanCallback)을 사용할 수 있다. UUID[]에는 앱에서 지원하고자 하는 GATT 서비스 목록이 들어간다. BLE또는 ClassBT장치를 검색할 수는 있지만 두 가지를 동시에 검색은 할 수 없다.
4) GATT 서버에 연결하기
- 첫 번째 연동을 위한 과정은 BLE디바이스에 연결하는 것인데, 이것은 GATT Server에 연결하는 것이다. connectGatt() 로 가능
- 세 개의 parameter가 있다. (context, autoConnect, BluetoothGattCallback)
- autoConnect : 검색되었을 때 자동으로 연결할지에 대한 parameter
- mBluetoothGatt = device.connectGatt(this, false, mGattCallback); //BLE device를 GATT Server 호스트로 연결한다. 그리고 BluetoothGatt 인스턴스를 반환, 이 인스턴스로 GATT Client를 운영한다.
- BluetoothGattCallback : Client의 연결 상태나 운영에 대한 결과를 전달
* 이 예제에서 BLE 앱은 하나의 Activity가 연결, 데이터를 표시하고 GATT 서비스와 특성들을 표시. 사용자 입력에 기반 하여 BluetoothLeService로 불리는 서비스와 통신을 수행하도록 Android BLE API를 통해 장치와 상호연동한다.
5) GATT 통지 수신
- 디바이스 특성 변경에 대한 통지를 앱이 알 수 있다. setCharacteristicNotification()메소드로 어떻게 통지를 설정하는 지 보여준다.
- 하나의 특성에 대해 통지가 활성화되면 onCharacteristicChanged()가 장치에서 해당 특성정보가 변경이 되면 호출된다.
6) 클라이언트 앱의 종료
- BLE 장치를 사용하는 앱이 종료되면 반드시 close()를 호출하여 시스템이 관련 리소스를 반환하도록 해야 한다.