Ble de numérisation de rappel seulement appelée à plusieurs reprises, puis arrêté
J'ai 2 téléphones avec Android 5.0.2, ils ont tous les deux installé le dernier Rayon Phare de l'App: Recherchez Phare, en attendant, je me suis tourné sur 2 IBeacon de l'expéditeur, et vous pourrez voir les RSSI changer à la fois au téléphone avec l'Application.
Mais quand j'ai essayé d'écrire un exemple de code pour simuler situation ci-dessus, j'ai trouvé le ble d'analyse de rappel toujours arrêter appelée ci-après appelé 2 ou 3 fois, j'ai d'abord soupçonner la "Localiser le Phare" peuvent utiliser différentes, alors je l'ai essayé avec 2 types d'API, l'un est pour les vieux 4.4, et l'autre est la nouvelle façon introduite dans android 5, mais les deux le même comportement(mais le tout fonctionnant sur android 5).
l'4.4:
public class MainActivity extends Activity {
private BluetoothAdapter mBluetoothAdapter;
private static final String LOG_TAG = "BleCollector";
private TextView calledTimesTextView = null;
private int calledTimes = 0;
//Device scan callback.
private BluetoothAdapter.LeScanCallback mLeScanCallback = new BluetoothAdapter.LeScanCallback() {
@Override
public void onLeScan(final BluetoothDevice device, int rssi,
byte[] scanRecord) {
calledTimes++;
runOnUiThread(new Runnable() {
@Override
public void run() {
calledTimesTextView.setText(Integer.toString(calledTimes));
}
});
Log.e(LOG_TAG, "in onScanResult, " + " is coming...");
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
calledTimesTextView = (TextView) findViewById(R.id.CalledTimes);
mBluetoothAdapter = ((BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE))
.getAdapter();
mBluetoothAdapter.startLeScan(mLeScanCallback);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
//Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
//Handle action bar item clicks here. The action bar will
//automatically handle clicks on the Home/Up button, so long
//as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}}
Et la 5.0.2:
public class MainActivity extends Activity {
private BluetoothAdapter mBluetoothAdapter = null;
private BluetoothLeScanner mLescanner;
private ScanCallback mLeScanCallback;
private static final String LOG_TAG = "BleFingerprintCollector";
private TextView calledTimesTextView = null;
private int calledTimes = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
calledTimesTextView = (TextView) findViewById(R.id.CalledTimes);
this.mBluetoothAdapter = ((BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE))
.getAdapter();
this.mLescanner = this.mBluetoothAdapter.getBluetoothLeScanner();
ScanSettings bleScanSettings = new ScanSettings.Builder().setScanMode(
ScanSettings.SCAN_MODE_LOW_LATENCY).build();
this.mLeScanCallback = new ScanCallback() {
@Override
public void onScanResult(int callbackType, ScanResult result) {
calledTimes++;
runOnUiThread(new Runnable() {
@Override
public void run() {
calledTimesTextView.setText(Integer
.toString(calledTimes));
}
});
Log.e(LOG_TAG, "in onScanResult, " + " is coming...");
}
@Override
public void onBatchScanResults(List<ScanResult> results) {
}
@Override
public void onScanFailed(int errorCode) {
}
};
this.mLescanner.startScan(null, bleScanSettings, this.mLeScanCallback);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
//Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
//Handle action bar item clicks here. The action bar will
//automatically handle clicks on the Home/Up button, so long
//as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}}
Ils sont très simple et juste montrer un compteur dans l'INTERFACE utilisateur, s'est avéré finalement toujours arrêté à 2 ou 3.
J'ai joué à ce ble de la publicité de la réception avant sur un SamSung note 2 avec android 4.4 appareil, il fonctionne parfaitement, la fonction de rappel appelée à chaque seconde.
alors quelqu'un peut aider? pourquoi Rayon " Localiser le Phare fonctionne bien ici?
OriginalL'auteur Shawn | 2015-04-19
Vous devez vous connecter pour publier un commentaire.
Différents appareils Android se comportent différemment lors de la numérisation pour connectable BLE des publicités. Sur certains appareils (par exemple, le Nexus 4), la numérisation des Api obtenez seulement un rappel par analyse de l'émetteur de l'envoi d'un connectable de la publicité, alors qu'ils obtenir un scan de rappel pour toutes les annonces pour non connectable publicités. D'autres périphériques (par exemple, le Nexus 5) fournir un scan de rappel chaque seule annonce qu'elle est connectable.
La Localiser app vous mentionnez utilise open source Android Phare De La Bibliothèque pour détecter les balises. Il est construit sur la même analyse Api de vous montrer dans votre question, mais il permet de contourner ce problème en définissant une période de balayage (1.1 secondes par défaut au premier plan) et l'arrêt et le redémarrage d'un scan à cet intervalle. L'arrêt et le redémarrage de l'analyse des causes Android pour envoyer un nouveau rappel.
Quelques autres notes ici:
Cette question de l'obtention d'analyse multiples rappels pour les périphériques connectables s'applique à la fois à la 4.x et 5.x numérisation Api.
Il est difficile de savoir si la différence dans la prestation de numérisation des rappels pour les tenants des annonces sur les différents appareils est dû à Android firmware différences ou matériel bluetooth chipset différences.
Il ne semble pas être un moyen de détecter si un périphérique nécessite une analyse redémarrer pour obtenir des rappels pour les tenants de publicités, donc si vous ciblez une grande variété de périphériques, vous devez planifier pour arrêter et redémarrer la numérisation.
Utilisant Android raw numérisation Api est une excellente façon de comprendre comment BLE des balises de travail. Mais il y a beaucoup de difficultés à travailler avec des balises BLE (c'est juste un exemple) c'est pourquoi à l'aide d'un kit de développement SDK comme l'Android Phare de la Bibliothèque est un bon choix pour vous garder de tirer vos cheveux.
Divulgation complète: je suis l'auteur de la Localiser app dans le développeur en chef de la Android Phare De La Bibliothèque projet open source.
BluetoothLeScanner.stopScan();Thread.Sleep(1100);BluetoothLeScanner.startScan()
dans une boucle, c'est exact?Vous avez besoin pour démarrer le scan, pause pour 1100ms, puis s'arrêter (l'ordre inverse à ce qui est indiqué.). Aussi, Fil.sleep() n'est pas la meilleure approche pour Android programmation. À l'aide de la classe de Gestionnaire ou de l'AlarmManager de catégorie pour planifier l'avenir de l'exécution du code est l'approche privilégiée.
Un collègue et moi essayé sur le Sony Xperia Z et le Z3 Compact, à la fois avec Android 5.1.1. Sur Z3 le rappel constamment travaillé tout sur Z il ne scanné quelques fois et puis s'est arrêté. Semble que les différences sont situés sur le niveau matériel.
encore une question, besoin de vous aider si elle est assez longue puisque la question initiale posté. Dans les tests, j'ai remarqué que presque à chaque cycle de
stop and start
(mettre 4 IBeacon à proximité de Téléphone), les données numérisées est incomplète, ce qui signifie parfois 1 ou 2 IBeacon numérisés, parfois rien, rarement arrivé que 4 IBeacon numérisés en un cycle, est-ce normal pour un appareil Android ou est causée par des effets secondaires destop and start
? Je me suis souvenu de mon Android4.4 Samsung NOTE2 (le BLE scan fonctionne parfaitement sans avoir besoin d'arrêter et de démarrer), le IBeacon peut constamment analysés et publiés. thx!C'est probablement wothy d'une nouvelle question. L'arrêt et le démarrage de la numérisation peut affecter les détections, mais le problème est plus probable que la balise de la publicité ou du taux de puissance de l'émetteur ou du récepteur radio. Pouvez-vous poster une nouvelle question de dire la balise modèle (et la publicité de taux) et le modèle de téléphone de détails?
OriginalL'auteur davidgyoung
David - Êtes-vous sûr que l'analyse de rappel est appelée pour chaque non-connectable publicité. J'ai un Xiaomi Redmi 3 et un autre Nexus 5 téléphone fonctionnant sous Android 6.0. J'ai un BLE capteur à chaque 1 minute d'intervalle envoie les données. Ces téléphones apparaissent comme centrales BLE appareil doit recevoir et traiter les données provenant du capteur. Je peux voir d'un OTA (Over the Air) BLE périphérique de capture que le capteur envoie des données à des intervalles de 1 minute. Cependant, les deux téléphones semble traiter les données de quelques minutes à 1 minute d'intervalle, mais après que l'arrêt de traitement pour les 4 - 6 minutes et puis commencer le traitement d'ag
enter code here
ain.Intervalle de temps de téléphone de traitement sur ressemble à ceci
1 min, 2 min, 3 min, 8min, 9min, 10, 11 min
Donc, après le traitement de 3 paquets à 1 minute d'intervalle, le téléphone va arrêter le traitement pendant 4 à 6 minutes.
Voici le code qui effectue le traitement.
OriginalL'auteur tony waria