Estimation de la balise de proximité/distance basée sur RSSI - Bluetooth LE

J'ai une simple application iOS qui affiche la proximité de la Bluetooth LE les balises qu'il détecte à l'aide des expressions telles que "immédiate", "près de", etc. et j'ai besoin d'écrire quelque chose de similaire sur Android.

J'ai suivi le tutoriel à Développeur Android et je suis capable de la liste des appareils détectés et souhaitez maintenant l'estimation de la distance/proximité - c'est là que c'est devenu un problème. Selon ce fil c'est juste une poignée de calculs mathématiques. Cependant, ils m'obligent à fournir un txPower valeur.

Selon ce tutoriel par Dave Smith (et en les croisant avec cette Bluetooth SIG déclaration), il doit être diffusée par la balise périphériques comme une "structure AD" de type 0x0A. Donc ce que je fais est d'analyser l'ANNONCE de structures et de regarder pour la charge de celui qui correspond au type.

Problème: j'ai 4 balises - 2 estimotes et 2 appflares. Le estimotes à ne pas diffuser le txPower à tous et la appflares diffuser la leur en tant que 0.

Est-ce que je suis en manque ici? L'application iOS semble être la manipulation de tout sans aucun problème, mais en utilisant le SDK iOS il n'derrière les scènes, donc je ne suis pas sûr de la façon de produire exactement le même ou un comportement similaire. Est-il un autre moyen je pourrais résoudre mon problème?

Dans le cas où vous souhaitez prendre un coup d'oeil au code que j'utilise pour analyser l'ANNONCE de structures, il est pris de la même Dave Smith github et peut être trouvé ici. Le seul changement que j'ai fait pour cette classe était ajoutez la méthode suivante:

public byte[] getData() {

    return mData;
}

Et c'est comment je gère le rappel de l'scans:

//Prepare the callback for BLE device scan
this.leScanCallback = new BluetoothAdapter.LeScanCallback() {

    @Override
    public void onLeScan(final BluetoothDevice device, int rssi, byte[] scanRecord) {

        if (!deviceList.contains(device)) {

            MyService.this.deviceList.add(device);
            Log.e("Test", "Device: " + device.getName());

            List<AdRecord> adRecords = AdRecord.parseScanRecord(scanRecord);

            for (AdRecord adRecord : adRecords) {

                if (adRecord.getType() == AdRecord.TYPE_TRANSMITPOWER) {

                    Log.e("Test", "size of payload: " + adRecord.getData().length);
                    Log.e("Test", "payload: " + Byte.toString(adRecord.getData()[0]));
                }
            }
        }
    }
};

Et ce que je vois dans la console:

04-01 11:33:35.864: E/Test(15061): Device: estimote
04-01 11:33:36.304: E/Test(15061): Device: estimote
04-01 11:33:36.475: E/Test(15061): Device: n86
04-01 11:33:36.475: E/Test(15061): size of payload: 1
04-01 11:33:36.475: E/Test(15061): payload: 0
04-01 11:33:36.525: E/Test(15061): Device: f79
04-01 11:33:36.525: E/Test(15061): size of payload: 1
04-01 11:33:36.525: E/Test(15061): payload: 0
InformationsquelleAutor JakeP | 2014-04-01