2016-10-25 13 views
0

私は完全なeddystoneビーコンエミュレータを作成しようとしています。 URL、UIDフレームに問題はありません。 しかし、TLMの余分なデータを出そうとすると、何の作業もしません。ビーコン送信Eddystone TLMフレームAltBeaconいいえ

広告開始時にBeaconParserエクストラパーサーが含まれますか?

これは私のコードです:

//create BeaconParse Like UID and add extraparser for TLM 
    BeaconParser beaconParser = new BeaconParser(); 
       beaconParser.addExtraDataParser(new BeaconParser().setBeaconLayout(BeaconParser.EDDYSTONE_TLM_LAYOUT)); 
       beaconParser.setBeaconLayout(BeaconParser.EDDYSTONE_UID_LAYOUT); 

       BeaconTransmitter mBeaconTransmitter = new BeaconTransmitter(this, beaconParser); 
//this is the beacon with info for UID and ExtraData with 5 values of TLM 
Beacon beacon = new Beacon.Builder() 
         .setId1("0x2F234454F4911BA9FFA6")//UID 
         .setId2("0x0BDB87539B67") //UID 
         .setManufacturer(0xfeaa) //0x00​E0 eddystone 
         .setBeaconTypeCode(0x00) //0X00 withTLM 
         .setMultiFrameBeacon(true) //TLM 
         .setServiceUuid(0xfeaa) //TLM 
         .setTxPower(-65) //UID 
         .setDataFields(Arrays.asList(new Long[]{0l}))//? 
         .setExtraDataFields(Arrays.asList(new Long[]{0L, 3580L,5776L, 289780991L, 28978000L}))//TLM extradata 
         .build(); 

//then create the Transmitter and start it 
    BeaconTransmitter bt = new BeaconTransmitter(this, beaconParser); 
bt.startAdvertising(beacon); 

私はビーコンを検出したときに問題がある、それはMExtraDataFields = nullを付属しています。

私はTLM情報がBeaconTransmitterによって放出されるadvertisingDataに含まれていないと思います。

TLMはサポートされていますか? BeaconTransmitterの制限はありますか、問題は私が気にするビーコンですか?

おそらく、この種の情報を送信するために識別子を使用する必要があります。

私はサムスンS5とサムスンs7Edge、としてみてください、と申し訳ありませんが、それは動作しませんAltBeacon

答えて

0

の2.9.1バージョンを使用。 BeaconTransmitterクラスは、余分なデータフィールドに基づいてEddystone-TLMを自動的に発行しません。私はそれを明示的にテストしたことはありませんが、データフレームだけを持つBeaconオブジェクトインスタンスを構築することは不可能であるため、このフレームを送信するために使用することはできません。既存のBeaconTransmitterクラス。

これは合理的な機能要求だと言いますが、サポートを追加したい場合は、プルリクエストを歓迎します。

完全公開:私はAndroid Beacon Libraryのオープンソースプロジェクトの主導的な開発者です。

0

おかげさまで、ありがとうございました。

昨日、BEaconEmmitterがExtraDataをアドバタイズしないという問題が発生した場合に、マスターとEddystone Eidからコードをドローロードしてください。ウェブでいくつかのドキュメントを読んだ後

、私は、TLM情報は、法により他のEddyStone/Ibeaconと一致する別の広告のパッケージであることを理解:

private String getBeaconKey(Beacon beacon) { 
    if (matchBeaconsByServiceUUID) { 
     return beacon.getBluetoothAddress() + beacon.getServiceUuid(); 
    } else { 
     return beacon.getBluetoothAddress(); 
    } 
} 

と一致した場合には、ビーコンにextraDataを追加します。

私はBeaconTransmitter startAdvertising方法を変更し、ため(必要性がUIDビーコンにし、TLMビーコンで同じbTMacを持っているので)同じbeaconTransmitterで、TLMのadvertisingdataを送信しようと、このようなものだよそのために

if (mBeacon.isMultiFrameBeacon()) { 
      byte[] advertisingExtraDataBytes = mBeaconParser.getBeaconAdvertisementDataFromTLM(mBeacon); 
      //segun https://github.com/google/eddystone/blob/master/eddystone-tlm/tlm-plain.md 14 bytes 
      //solo con esa info cmo matchea? typebeacon 0x20 
      try { 
       AdvertiseData.Builder dataBuilder = new AdvertiseData.Builder(); 
       //always bigger than 0 
       if (serviceUuid > 0) { 
        byte[] serviceUuidBytes = new byte[]{ 
          (byte) (serviceUuid & 0xff), 
          (byte) ((serviceUuid >> 8) & 0xff)}; 
        ParcelUuid parcelUuid = parseUuidFrom(serviceUuidBytes); 
        dataBuilder.addServiceData(parcelUuid, advertisingExtraDataBytes); 
        dataBuilder.addServiceUuid(parcelUuid); 
        // dataBuilder.setIncludeTxPowerLevel(false); //no in tlm 
       // dataBuilder.setIncludeDeviceName(false);//no in tlm 

       } else { 
        dataBuilder.addManufacturerData(manufacturerCode, advertisingExtraDataBytes);// in tlm? 
       } 

       AdvertiseSettings.Builder settingsBuilder = new AdvertiseSettings.Builder(); 

       settingsBuilder.setAdvertiseMode(mAdvertiseMode); //need? 
       settingsBuilder.setTxPowerLevel(mAdvertiseTxPowerLevel);//need? 
       settingsBuilder.setConnectable(false); 

       mBluetoothLeAdvertiser.startAdvertising(settingsBuilder.build(), dataBuilder.build(), getAdvertiseCallback()); 
       LogManager.d(TAG, "Started advertisement with callback: %s", getAdvertiseCallback()); 
      } catch (Exception e) { 
       LogManager.e(e, TAG, "Cannot start advertising due to exception"); 
      } 

     } 

AltBeaconがすでにこれをサポートしているかどうかは分かりませんが、まだ時間がかかりません。

私はバイト配列の正しい形式を得るために、このコードで作業します。あなたのコメントはすべて歓迎します。それがうまくいけば、BeaconTransmitterの中にコードを置くことがこの種のextraDataフレームを実装する最良の方法であるかどうかわからないので、プルリクエストについて話してください。

私はAltBeaconを改善するための別のアイデアを持っています。バッテリー消費とバックグラウンドスキャナーについては、そのことについても話します。

もう一度おねがいします。Davidと、あなたとあなたの協力者は、Altbeaconですばらしい仕事をしています。この機能を手伝うことができれば、それがあります。

+0

hey! @davidgyoung私はそれを開発するための時間がまだありませんが、私はTLMのための広告データの情報に関する情報を検索することができます: eddystoneプリアンブルデータ広告パッケージ 0x02,0x01,0x06,0x03,0x03,0xAA、0xFE、0x11、 0x16,0xAA、0xFE プラスTlmサービスデータ –

+0

0x32,0x00(バージョン)... 重要なことは、TLMframeのインターリーブがビーコンリーダーの責任であることです。これは、TLMフレームをURL/UIDと、Bluetoothアドレス。 BeaconTransmitterまたはbluetoohスキャナLEは、毎回異なるbtAddressを要求します。 –

0

@Davidgyoung、約束は借金です^ _ ^申し訳ありませんが、待って、最後に、私はTLMフレームを送信する問題を取り戻す時間を見つけました。

これはTLMフレーム(AltBeaconなし)を送信するための完全なコードですが、チェック用にはUIDまたはURLエッジストーンフレームの作成にBeaconTransmitterが必要です。

@TargetApi(Build.VERSION_CODES.LOLLIPOP) 
    private void createEddyStone_TLM2() { 

    final int len = 12; 
    final byte TLM_FRAME = 0x20; 
    byte[] ServiceData = new byte[2 + len]; 

    ServiceData[0] = TLM_FRAME; 
    ServiceData[1] = 0; 
    ParcelUuid parcelUuid = parcelUuidFromShortUUID(0xFEAA); 
    final int pos = 0;//4 TLM 
    byte[] frameData = generateTLMFrameData(); 
    System.arraycopy(frameData, pos, ServiceData, 2, len); 

    AdvertiseData advertiseData = new AdvertiseData.Builder().setIncludeDeviceName(false) 
     .setIncludeTxPowerLevel(false) 
     .addServiceData(parcelUuid, ServiceData) 
     .addServiceUuid(parcelUuid) 
     .build(); 

    AdvertiseSettings advertiseSettings = new AdvertiseSettings.Builder().setAdvertiseMode(1) 
     .setTxPowerLevel(2) 
     .setConnectable(false) 
     .build(); 

    try { 

     BluetoothManager bluetoothManager = 
      (BluetoothManager) this.getSystemService(Context.BLUETOOTH_SERVICE); 
     if (bluetoothManager != null) { 
     BluetoothAdapter bluetoothAdapter = bluetoothManager.getAdapter(); 

     BluetoothLeAdvertiser bleAdvertiser = bluetoothAdapter.getBluetoothLeAdvertiser(); 
     bleAdvertiser.stopAdvertising(getAdvertiseCallback()); 
     bleAdvertiser.startAdvertising(advertiseSettings, advertiseData, null, 
      getAdvertiseCallback()); 
     } 
    } catch (IllegalStateException e) { 
     Log.e("", "error", e); 
    } 
    } 

    @TargetApi(Build.VERSION_CODES.LOLLIPOP) private AdvertiseCallback getAdvertiseCallback() { 
    AdvertiseCallback advertiseCallback = new AdvertiseCallback() { 
     @Override public void onStartFailure(int errorCode) { 
     Log.e("","Something wrong with Advertising"); 
     } 
     @Override public void onStartSuccess(AdvertiseSettings settingsInEffect) { 
     Log.i("","Advertising start succesfully"); 
     } 
    }; 
    return advertiseCallback; 
    } 
    public static ParcelUuid parcelUuidFromShortUUID(long serviceId) { 
    long leastSigBits = 0x800000805f9b34fbL; 
    return new ParcelUuid(new UUID(0x1000 | (serviceId << 32),leastSigBits)); 
    } 

    private byte[] generateTLMFrameData() { 
    byte[] data = new byte[12]; 

    ByteBuffer buffer = ByteBuffer.wrap(data); 
    buffer.putShort((short) getTLMBattery()); 
    int temperature = getTLMTemperature(); 
    buffer.putShort((short) (temperature << 8)); 
    buffer.putInt((int) getTLMPduCount()); 
    buffer.putInt((int) getTLMPowerOnTime()/100); 

    return data; 
    } 

    private int getTLMTemperature() { 
    //todo make random, now 10º 
    return 266; 
    } 

    private int getTLMBattery() { 
    //todo make random 
    return 1234; 
    } 

    private int getTLMPduCount() { 
    //todo make random 
    return 0; 
    } 

    private long getTLMPowerOnTime() { 
    //todo - createtime, but don't care 
    return SystemClock.elapsedRealtime(); 
    } 

私はこの方法で自分のアプリを作っています。私はこれをAltBeaconに追加できます。

について、アルベルト

関連する問題