이 포스트의 최종 목적은 Bluetooth 4.0을 이용하여 비콘을 제작하고
안드로이드 앱을 제작하여 비콘을 프로토타이핑하는것을 통해 비콘의 가치를 파악하는것이 목적입니다.
이번에는 비콘 클라이언트 아키텍처를 알아보겠습니다.
용어
저의 포스트는 안드로이드를 가정했으나 아이폰을 타겟하더라도 고민할 필요가 없습니다.
블루투스 기술을 이해했다면 단순히 해당 플랫폼의 API 이름만 찾아도 프로토타이핑이 가능합니다.
출처: http://angeliot.blogspot.kr/2014/10/beaconbluetooth-40-based_1.html
이 포스트의 최종 목적은 Bluetooth 4.0을 이용하여 비콘을 제작하고
안드로이드 앱을 제작하여 비콘을 프로토타이핑하는것을 통해 비콘의 가치를 파악하는것이 목적입니다.
이번에는 비콘 클라이언트 아키텍처를 알아보겠습니다.
Classic(Bluetooth 3.0이하)과 BLE(Bluetooth Low Energy)는 약간 성격이 다릅니다.
이미 Classi을 기반한 장치들과의 호환을 위해 Classic과 BLE를 동시에 지원하는 Dual과 BLE만을 지원하는 Single로 나뉩니다.
하위 디바이스 호환을 위한 방법이라도 보면됩니다. 비콘의 경우 Dual, Single 모두 작동합니다.
스마트폰과 같은 단말은 대부분 Dual을 지원하고 비콘과 같은 단순한 기기는 Single을 지원합니다.
통신을 위해서는 서버와 클라이언트가 있어야하고 통신규약이 있어야합니다.
일련의 특정형태(핸즈프리, 핼스케어)의 통신을 프로파일로 정의합니다.
BLE는 실데이터를 GATT를 통해 문자를 주고 받습니다.
용어 부분을 정리해보면 다음과 같습니다.
대부분 모바일은 Dual, 비콘은 Single 모바일은 Central, 비콘은 Peripheral BLE를 비콘으로만 쓴다면 GATT Profile을 쓸 필요 없다.
프로토타입을 하는 워크벤치는 굉장히 중요합니다.
가장 편안한 자세로 확인/참조를 할 수 있도록 구성해야합니다.
위 사진의 왼쪽 집게 스텐드에 휴대전화를 끼워서 모바일엡을 확인했습니다.
다음은 안드로이드 개발환경을 살펴보겠습니다.
MS 계열 개발시 최고의 래퍼런스는 MSDN 이듯이, 안드로이드 개발시에는 안드로이드 디벨로퍼 닷컴이 가장 적절한 수준의 래퍼런스를 제공합니다.
https://developer.android.com/guide/topics/connectivity/bluetooth-le.html
저도 해당 사이트를 참조하여 안드로이드 SDK의 템플릿을 수정해서 프로토타이핑했습니다.
public void initBluetoothLe() { if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)) { Toast.makeText(this, "블루투스 지원안한다", Toast.LENGTH_SHORT).show(); finish(); } else { final BluetoothManager bluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE); mBluetoothAdapter = bluetoothManager.getAdapter(); // Ensures Bluetooth is available on the device and it is enabled. // If not, displays a dialog requesting user permission to enable Bluetooth. if (mBluetoothAdapter == null || !mBluetoothAdapter.isEnabled()) { Intent enableBtIntent = new Intent( BluetoothAdapter.ACTION_REQUEST_ENABLE); // startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT); startActivityForResult(enableBtIntent, 0); } else { mBluetoothAdapter.startLeScan(mLeScanCallback); } } } |
private BluetoothAdapter.LeScanCallback mLeScanCallback = new BluetoothAdapter.LeScanCallback() { @Override public void onLeScan(final BluetoothDevice device, final int rssi, final byte[] scanRecord) { runOnUiThread(new Runnable() { @Override public void run() { double distance = Math.pow(10, rssi / 40 * -1); Log.i("AngelBeacon", device.getName() + " " + device.getAddress() + " " + distance); beaconMap.put(device.getAddress(), device.getName() + " " + rssi); } }); } }; |
BLE 스캔 중에 비콘이 인식되면 위 콜백메소드로 진입하게 됩니다.
비콘에 관한 일반적인 정보(주소, 이름, RSSI)는 이 콜백 메소드를 통해 얻을 수 있습니다.
위 소스코드의 distance는 rssi를 기반한 신호를 거리로 변환하는 공식을 적용한것입니다. 하지만 오차가 큽니다.
이로써 모바일앱을 통해 비콘을 인식하고 거리 정보를 얻을 수 있습니다.
반복적으로 테스트할 경우 블루투스가 이전 프로세스에 의해 점유되는 문제가 발생할 수 있으므로
다른 블루투스 앱으로도 검색이 안될 경우는 블루투스 기능을 껐다 키고 시도해보십시오.
[android] get sender number in SMS, MMS broadcast receiver (0) | 2015.07.08 |
---|---|
Parcelable vs Serializable (0) | 2015.07.08 |
[안드로이드 UI최적화] 나인패치의 모든것 / DPI, DIP(DP) 개념 (0) | 2015.07.01 |
Android Support Library (0) | 2015.07.01 |
View Alpha VS ARGB Color Alpha 성능 (0) | 2015.07.01 |