IT_Programming/Android_Java

[펌] Beacon(Bluetooth 4.0 Based) 프로토타이핑 - 비콘 클라이언트 아키텍처

JJun ™ 2015. 7. 7. 11:39



 출처: http://angeliot.blogspot.kr/2014/10/beaconbluetooth-40-based_1.html




Beacon(Bluetooth 4.0 Based) 프로토타이핑 - 비콘 클라이언트 아키텍처


이 포스트의 최종 목적은 Bluetooth 4.0을 이용하여 비콘을 제작하고
안드로이드 앱을 제작하여
비콘을 프로토타이핑하는것을 통해 비콘의 가치를 파악하는것이 목적입니다.
이번에는 비콘 클라이언트 아키텍처를 알아보겠습니다.



용어


저의 포스트는 안드로이드를 가정했으나 아이폰을 타겟하더라도 고민할 필요가 없습니다.
블루투스 기술을 이해했다면 단순히 해당 플랫폼의 API 이름만 찾아도 프로토타이핑이 가능합니다.

Dual VS Single







Classic(Bluetooth 3.0이하)과 BLE(Bluetooth Low Energy)는 약간 성격이 다릅니다.
이미 Classi을 기반한 장치들과의 호환을 위해 Classic과 BLE를 동시에 지원하는 Dual과 BLE만을 지원하는 Single로 나뉩니다.
하위 디바이스 호환을 위한 방법이라도 보면됩니다. 비콘의 경우 Dual, Single 모두 작동합니다.
스마트폰과 같은 단말은 대부분 Dual을 지원하고 비콘과 같은 단순한 기기는 Single을 지원합니다.




Central, Peripheral


신호를 스켄하는 모바일이  Central이고 신호를 보내는 비콘이 Peripheral 입니다.

GATT Profile




통신을 위해서는 서버와 클라이언트가 있어야하고 통신규약이 있어야합니다.
일련의 특정형태(핸즈프리, 핼스케어)의 통신을 프로파일로 정의합니다. 

BLE는 실데이터를 GATT를 통해 문자를 주고 받습니다.

용어 부분을 정리해보면 다음과 같습니다.

대부분 모바일은 Dual, 비콘은 Single 모바일은 Central, 비콘은 Peripheral BLE를 비콘으로만 쓴다면 GATT Profile을 쓸 필요 없다.



Mobile App Architecture

Connectivity


Layer


프로토타입상 연결은 모바일과 비콘만 생각합니다.
레이어로 나누면 비콘의 신호를 잡아서 거리를 인식할수 있는 디텍터와 이를 사용자에게 보여줄 프리젠테이션이 필요합니다.
실제 제품에는 사용자가 비콘을 추가/편집/삭제를 하므로 Persistence도 필요합니다. 이 포스트에서는 Persistence를 안다룹니다.
이 Persistence는 Connectivity에서 모바일과 IoT Platform의 유스케이스 중 하나입니다. 프로토타입의 목적을 달성하기 위해서는
범위는 좁히나 고려는 필요합니다.

시연이나 리뷰에서 반드시 프로토타입 이상의 질문이 나오기 때문입니다.
이와같이 프로토타입시 실제 개발할 부분과 문서로 대체할 부분을 나누는것은 매우 중요합니다.
프로토타입은 제품의 전략이자 엔지니어링 작업 지시서, 마케팅 기획서가 됩니다.



Development Environment


Workbench



프로토타입을 하는 워크벤치는 굉장히 중요합니다.
가장 편안한 자세로 확인/참조를 할 수 있도록 구성해야합니다.
위 사진의 왼쪽 집게 스텐드에 휴대전화를 끼워서 모바일엡을 확인했습니다.
다음은 안드로이드 개발환경을 살펴보겠습니다.




Android SDK


https://developer.android.com/sdk/index.html

위 링크를 통해 안드로이드 SDK를 받을 수 있습니다.
SDK에는 실제 기기가 없어도 테스트할 수 있는 에물레이터가 있습니다.
하지만 블루투스와 같이 외부 기기를 억세스하는 유스케이스는 지원안합니다.
또한 프리젠테이션 레이어 개발시에도 에물레이터 보다는 실 기기를 사용하기를 권고합니다.
왜냐하면 그것이 더 빠르게 배포하고 모바일 관점에서 확인할 수 있기 때문입니다.






SDK 설치후 Window > Android SDK Manager를 통해 API 18 버전 이상을 설치합니다. API 18 부터 BLE를 지원합니다.
SDK Manager는 SDK와 독립된 프로세스 이므로 설치 중 문제가 생기면 이클립스를 닫고 시도해보십시오.






프로젝트 생성시에 꼭 필요한 설정은 최소 SDK를 API 18로 설정하는것입니다.
프로젝트 생성후에는 진입점에 해당하는 MainActivity.java 파일은 제너레이션 됩니다.
이 파일에 BLE 관련 코드를 넣어서 BLE API와 익숙해져야합니다.



Mobile App


MS 계열 개발시 최고의 래퍼런스는 MSDN 이듯이, 안드로이드 개발시에는 안드로이드 디벨로퍼 닷컴이 가장 적절한 수준의 래퍼런스를 제공합니다.

https://developer.android.com/guide/topics/connectivity/bluetooth-le.html

저도 해당 사이트를 참조하여 안드로이드 SDK의 템플릿을 수정해서 프로토타이핑했습니다.



권한


어플리케이션은 서비스를 제공하기 위해 권한이 필요하고 이를 사용자에게 알려줄 의무가 있습니다. 
비콘 시나리오를 만족하기 위해서는 BLUETOOTH와 BLUETOOTH_ADMIN 권한이 필요합니다. 
또한 비콘은 BLE만을 지원하므로 android.hardware.bluetooth_le 피처가 필요합니다. 
이를 통해 어플리케이션을 실행한 디바이스가 BLE를 지원하는지 알 수 있습니다. 
추가로 INTERNET은 웹앱으로 만들기 위해 필요합니다.


위 내용을 Manifest.xml파일 안에 넣어줍니다.

사용



장치가 BLE를 지원하나 사용자가 이 기능을 껐을 경우 사용을 사용자에게 요청합니다.

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를 기반한 신호를 거리로 변환하는 공식을 적용한것입니다. 하지만 오차가 큽니다.

이로써 모바일앱을 통해 비콘을 인식하고 거리 정보를 얻을 수 있습니다.
반복적으로 테스트할 경우 블루투스가 이전 프로세스에 의해 점유되는 문제가 발생할 수 있으므로
다른 블루투스 앱으로도 검색이 안될 경우는 블루투스 기능을 껐다 키고 시도해보십시오.