0

Android で近くのビーコンを検索/検索しようとしており、Altbeacon Android ライブラリを使用しています。

ビーコンはカスタムで、メーカー固有のものは次のとおりです。

//---------------flags data type------------------------------------------------
// FLAGS data type
typedef PACKED_STRUCT
{
  uint8_t       len;              // # bytes for data type (but not including len field)
  uint8_t       type;              // 0x01
  uint8_t       attrib;           // 0x06
} flags_data_t;


//---------------manufacturer specific data ------------------------------------

#define BLE_MFG_SPECIFIC_DATA_TYPE 0xff

// company identifiers of interest
#define BLE_COMPANY_ID_SOMECOMPANY 0x0312

// Manufacturer specific data (msd) header


typedef PACKED_STRUCT
{ 
  uint8_t       len;            // # bytes for data type (but not including len field)

  uint8_t       type;           // 0xff for manufacturer specific     

  uint16_t      company_id;  // Bluetooth org registered company id, use Enlighted

} msd_data_header_t;

この特定のメーカーの近くの場所のすべてのビーコンを取得する必要があります.

Android コードは次のとおりです。

beaconManager.getBeaconParsers().add(新しい BeaconParser() .setBeaconLayout("m:2-3=0312,i:4-19,i:20-21,i:22-23,p:24-24,d: 25-25"));

@Override
public void onBeaconServiceConnect() {
    final Region region = new Region("myBeaons", Identifier.parse(UUID), null, null);

    beaconManager.setMonitorNotifier(new MonitorNotifier() {
        @Override
        public void didEnterRegion(Region region) {
            try {
                Log.d(TAG, "didEnterRegion");
                beaconManager.startRangingBeaconsInRegion(region);
            } catch (RemoteException e) {
                e.printStackTrace();
            }
}

        @Override
        public void didExitRegion(Region region) {
            try{
            Log.d(TAG, "didExitRegion");
            beaconManager.stopRangingBeaconsInRegion(region);
        } catch (RemoteException e) {
        }}

        @Override
        public void didDetermineStateForRegion(int i, Region region)
        {
            Log.d(TAG, "didDetermineStateForRegion");

        }
    });

    beaconManager.setRangeNotifier(new RangeNotifier() {
        @Override
        public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) {
            for (Beacon oneBeacon : beacons) {
                Log.d(TAG, "distance: " + oneBeacon.getDistance() + " id:" + oneBeacon.getId1() + "/" + oneBeacon.getId2() + "/" + oneBeacon.getId3());
            }
        }
    });

    try {
        beaconManager.startMonitoringBeaconsInRegion(region);
    } catch (RemoteException e) {
        e.printStackTrace();
    }

}

しかし、ビーコンを見つけることができません。どうすればこれを行うことができるか、または他のライブラリを提案してください

4

1 に答える 1

1

質問のビーコン形式の仕様では、十分な情報が得られません。ビーコンは、会社コード 0x0312 を使用するメーカーの広告であると言っているだけです。最初はこれで問題ありませんが、広告と共に送信されるその他の情報は指定されていません。

この形式に一致する送信された BLE アドバタイズメントを本当に一致させたい場合は、次を使用できます。

beaconManager.getBeaconParsers().add(new BeaconParser() .setBeaconLayout("m:0-1=0312,i:0-1,p:1-1"));

ただし、これは常に最初の (そして唯一の) ビーコン識別子として 0x0312 を返します。また、0x12 RSSI の「ダミー」測定電力定格を指定すると、正確な距離推定値を取得できなくなります。ビーコンから一意の識別子を読み取り、ビーコンまでの距離を推定できるようにする場合は、ビーコンが一意の識別子を送信する方法と、で説明されているシーケンスに従うバイト ストリームで測定された電力を知る必要があります。質問。

于 2016-07-27T18:38:19.053 に答える