2017-02-07 7 views
1

문제비콘 + 블루투스 통신 I 특정 ID 비컨 방출되는 주변기기했습니다

미세 [BLE]를 작동하지 않는다. 내 스마트 폰 (중심 역할을 담당)은 주변 장치의 표지를 검색합니다. 올바른 신호를 찾으면 GATT 프로파일을 통해 블루투스 통신을 시작합니다. 장치가 처음 연결될 때 데이터가 하나에서 다른 장치로 올바르게 전송되지만 두 번째 장치 (20 초마다 두 장치를 연결하려고하는 타이머가 있음)에서 연결이 실패합니다. 왜 ... 나는 앱 프로세스를 죽이고 다시 열어서 다시 작동시켜야합니다. 내가 비콘 들어

한 적이 무엇

, 내가 altbeacon을 사용하고, 그래서 중앙 장치에서 비콘 검출을위한 코드는이 :

@Override public void onBeaconServiceConnect() { beaconManager.setRangeNotifier(new RangeNotifier() { @Override public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) { Log.i(TAG, "Beacon detected!"); if (beacons.size() > 0 && Utils.getUserData(getApplicationContext(), "id").compareTo("-1") != 0) { if(region.getId1().compareTo(Identifier.parse(identifier))==0) { Beacon beacon = beacons.iterator().next(); Log.i(TAG, "The first beacon I see is about " + beacon.getDistance() + " meters away. " + region.getId1()); String mac = beacon.getBluetoothAddress(); Log.i("MAC", "MAC: "+mac); CustomBluetoothManager customBluetoothManager = CustomBluetoothManager.getInstance(getApplicationContext()); if(!customBluetoothManager.isScanning()) { customBluetoothManager.scanLeDevice(true, mac); } } } } }); try { beaconManager.startRangingBeaconsInRegion(new Region("myRangingUniqueId", Identifier.parse(identifier), null, null)); } catch (RemoteException e) { } } 

비콘이 발견

,

public void scanLeDevice(final boolean enable, String mac) { 
    target_mac = mac; 
    mHandler = new Handler(); 

    if (enable) { 
     // Stops scanning after a pre-defined scan period. 
     mHandler.postDelayed(new Runnable() { 
      @Override 
      public void run() { 
       mScanning = false; 
       mBluetoothAdapter.stopLeScan(mLeScanCallback); 
      } 
     }, SCAN_PERIOD); 

     mScanning = true; 
     mBluetoothAdapter.startLeScan(mLeScanCallback); 
    } else { 
     mScanning = false; 
     mBluetoothAdapter.stopLeScan(mLeScanCallback); 
    } 
} 

을 여기에 mLeScanCallback 코드는 다음과 같습니다 : 다음 scanLeDevice가 호출됩니다

private BluetoothAdapter.LeScanCallback mLeScanCallback = 
     new BluetoothAdapter.LeScanCallback() { 
      @Override 
      public void onLeScan(final BluetoothDevice device, int rssi, 
           byte[] scanRecord) { 
       long epoch = System.currentTimeMillis()/1000; 
       SharedPreferences prefs = context.getSharedPreferences(
         "epoch", Context.MODE_PRIVATE); 
       long epochStored = prefs.getLong("epoch", 0); 

       if (device.getAddress().compareTo(MAC) == 0 && after20Seconds) { 
        prefs.edit().putLong("epoch", epoch).apply(); 
        Log.d("epoch", Long.toString(epoch)); 
        mDeviceAddress = device.getAddress(); 
        final Intent gattServiceIntent = new Intent(context, BluetoothLeService.class); 
        context.bindService(gattServiceIntent, mServiceConnection, context.BIND_AUTO_CREATE); 
       } 
      } 
     }; 

비콘이 패킷에 포함되어있는 MAC 주소가 실제 장치 MAC과 동일하지 않기 때문에 MAC 주소를 하드 코드해야했습니다 (BLE 정의의 것이지만 정확히 어떻게 알지는 못합니다). 그것은 작동한다). 데이터가 전송 될 때

마지막으로, 나는 닫고 블루투스 채널을 분리하고 너무 서비스 바인딩을 해제하려고했지만, 아무것도 작동 :

@Override 
    public void onCharacteristicWrite(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) { 
     super.onCharacteristicWrite(gatt, characteristic, status); 
     disconnect(); 
     close(); 
     unbindService(mServiceConnection); 
    } 

을 그래서,이 코드로, 처음 장치가 연결되어 데이터가 올바르게 전송되지만 두 번째 시도에서 20 초 후에는 절대로 통신을 설정하지 않습니다.

질문

  1. 이 문제가 될 수 있는지의 어떤 생각?
  2. BLE 작동 원리? 비컨 패킷에서 MAC은 보안 상 가짜입니다. 그러나 비콘 스캔 응용 프로그램에서 응용 프로그램을 가져 와서 응용 프로그램에 하드 코딩하면 통신이 작동합니다 ... 작동하지 않아야한다고 생각합니다.
  3. 비콘 패킷에서 올바른 장치 MAC을 얻으려면 어떻게해야합니까?
  4. 블루투스 통신과 함께 비콘을 사용할 샘플을 알고 있습니까?
  5. "mBluetoothAdapter.stopLeScan (mLeScanCallback)"방법을 통해 검사를 중지하면 검사가 실제로 중지되지 않는 것처럼 보입니다 ... 정상입니까? 로그는 continuosly 보여주고있다 "startRegisteration : BluetoothLeScanner를 mLeScanClients = {5445b45 = android.bluetooth.le.BluetoothLeScanner @ org.altbeacon.beacon.service.scanner.CycledLeScannerForLollipop $ 4 ......"
+0

왜 altbeacon이 필요합니까? 당신이 요구하는 것은 gatt 중앙 및 주변 역할을 기반으로하며, 장치의 MAC ID를 중심으로 이루어집니다. (그 사이에 나는 또한 왜 그 문제가 두 번째로, 비슷한 것을 직면하는 것을 기억하는지 생각하고있다) – user2450263

+0

답장을 보내 주셔서 감사합니다! 사용자가 주변 장치 근처에있을 때를 알기 위해서는 비컨이 필요합니다. 이렇게하면 앱이 사용자 주변의 블루투스 장치를 계속해서 스캔하는 것을 피할 수 있습니다. – adri1992

+0

'scanLeDevice'와 그것의 콜백은 어쨌든 근접성에 대한 rssi 값을 계산할 필요가 있습니다 - 사용자가 장치 근처에 있는지 여부를 계산하기 위해 – user2450263

답변

1

당신에게 Android BLE API로 MAC 주소를 읽을 수 없습니다. 아시다시피, OS에 의해 실제 MAC에 매핑되는 가짜 MAC으로 스푸핑 된 것입니다.따라서이 라인은 신뢰할 수 없게됩니다 :이 두 번째 타인을 실패 할 연결을 무엇의 원인이 될 수 있습니다

device.getAddress().compareTo(MAC) == 0

. 첫 출시 때 작동한다는 사실은 놀랍습니다. 아마도 Android의 MAC 스푸핑 회전 알고리즘의 결정 론적 구현 때문일 것입니다. 두 번째 연결이 작동하지 않는다는 사실

올바른 장치를 찾을 수있는 다른 방법이 필요합니다 (예 : 비콘 식별자).

일반적인 사용 사례가 아니기 때문에 비컨 연결에 대한 샘플 코드를 찾기가 쉽지 않습니다. 일반적으로 이들은 전송 전용 장치로 설계됩니다. 이것이 Android Beacon Library이 BLE 서비스에 연결하는 도구를 제공하지 않는 이유입니다. 모든 비콘 제조업체에 표준 구현이 없습니다. 즉, 맞춤형 접근 방식은 합리적입니다.

Android Beacon Library는 비콘 탐지를 위해 자체 블루투스 스캐닝을 수행한다는 것을 알고 있습니다. 따라서 검사를 중지하더라도 로그에서 검사 결과가 계속 표시됩니다. 이것은 도서관에서 나옵니다.

전체 공개 : Android Beacon Library 오픈 소스 프로젝트의 개발자입니다.

+0

이 응답과 이전에받은 도움에 대해 감사드립니다. RadiusNetworks android ibeacon 라이브러리는 Apple 저작권/상표 단속 이후에 사용되었습니다. :) Altbeacon과 eddystone 구현은 그 이후로 먼 길을왔다. 이 특정 질문의 구현은 [BluetoothGatt] (https://developer.android.com/reference/android/bluetooth/BluetoothGatt.html) 및 관련 클래스와 관련이 있습니다. – user2450263