NEWS
[beantwortet] mehrfach Reaktion bei externen Subscription
-
Ich hoffe die Überschrift passt irgendwie und auch die Beschreibung
Für bessere Ideen… gerne
Ich wollte mir mit einem Pi 3 (BLE Bluetooth schon integriert) und dem node Modul noble einen Bluetooth Scanner mit Javascript erstellen, um diesen dann für weitere Aktionen nutzen zu können.
noble.on('discover', function(peripheral){ // Bluetooth Device gefunden, dann.. }
Nun ist es so, dass diese "noble.on" bei jedem Beenden des Scripts irgendwie noch im Hintergrund weiterläuft.
Wenn ich das Script dann wieder starte, wird jedes Bluetooth-Device zweimal gefunden. Beim 3. Start dreimal, usw.
Um dieses Node Modul geht es:
https://github.com/sandeepmistry/noble
Im Script wird der Scan gestartet und auch nach einer Zeit beendet (soll später weiterlaufen). Das noble.on ist aber immer noch aktiv.
function main() { noble.startScanning(); log("start scanning"); } setTimeout(main, 1000); function stopScan() { noble.stopScanning(); logs("Stop scanning. Anzahl Bluetooth Devices gefunden: " + anzahlBluetoothDevices,"debug1"); } setTimeout(stopScan, 30000);
-
Ich hoffe die Überschrift passt irgendwie und auch die Beschreibung
Für bessere Ideen… gerne
Ich wollte mir mit einem Pi 3 (BLE Bluetooth schon integriert) und dem node Modul noble einen Bluetooth Scanner mit Javascript erstellen, um diesen dann für weitere Aktionen nutzen zu können.
noble.on('discover', function(peripheral){ // Bluetooth Device gefunden, dann.. }
Nun ist es so, dass diese "noble.on" bei jedem Beenden des Scripts irgendwie noch im Hintergrund weiterläuft.
Wenn ich das Script dann wieder starte, wird jedes Bluetooth-Device zweimal gefunden. Beim 3. Start dreimal, usw.
Um dieses Node Modul geht es:
https://github.com/sandeepmistry/noble
Im Script wird der Scan gestartet und auch nach einer Zeit beendet (soll später weiterlaufen). Das noble.on ist aber immer noch aktiv.
function main() { noble.startScanning(); log("start scanning"); } setTimeout(main, 1000); function stopScan() { noble.stopScanning(); logs("Stop scanning. Anzahl Bluetooth Devices gefunden: " + anzahlBluetoothDevices,"debug1"); } setTimeout(stopScan, 30000); ```` `
Probiere mal statt on: once
-
Probiere mal statt on: once `
Hi Bluefox,
danke für die Anregung!
Ich habe das von on( in once( geändert. Dann wird beim Scan nur noch das erste Bluetooth Device gefunden. Vorher waren es acht, bzw. 2x acht, usw.
Ich kämpfe mal weiter. Jeder mühsame Schritt hilft auch (hoffentlich) beim Verständnis
VG,
Michael
-
Probiere mal statt on: once `
Hi Bluefox,
danke für die Anregung!
Ich habe das von on( in once( geändert. Dann wird beim Scan nur noch das erste Bluetooth Device gefunden. Vorher waren es acht, bzw. 2x acht, usw.
Ich kämpfe mal weiter. Jeder mühsame Schritt hilft auch (hoffentlich) beim Verständnis
VG,
Michael `
Vielleicht so probieren:function onDiscover (peripheral){ // Bluetooth Device gefunden, dann.. } function main() { noble.on('discover', onDiscover); noble.startScanning(); log("start scanning"); } setTimeout(main, 1000); function stopScan() { noble.removeListener('discover', onDiscover); noble.stopScanning(); logs("Stop scanning. Anzahl Bluetooth Devices gefunden: " + anzahlBluetoothDevices,"debug1"); } setTimeout(stopScan, 30000);
-
Vielleicht so probieren:
function onDiscover (peripheral){ // Bluetooth Device gefunden, dann.. } function main() { noble.on('discover', onDiscover); noble.startScanning(); log("start scanning"); } setTimeout(main, 1000); function stopScan() { noble.removeListener('discover', onDiscover); noble.stopScanning(); logs("Stop scanning. Anzahl Bluetooth Devices gefunden: " + anzahlBluetoothDevices,"debug1"); } setTimeout(stopScan, 30000); ```` `
Danke!!
Bluefox ich bewundere Deine Hilfsbereitschaft und Geduld! Danke noch einmal!
Von der Funktion her war das schon einmal ein Riesen Schritt.
Vom Verständnis bin ich noch Meilen entfernt… :shock: :?:
So Verhält ich das Script schon einmal wesentlich besser
(auch wenn ich das noch nicht verstanden habe)
(+)
Es läuft immer einmal komplett durch, auch wenn man Restart im Editor drückt
(-)
Wenn man das laufende Script per stop/start neu startet, bevor der Timer noble.removeListener('discover', onDiscover); und noble.stopScanning(); ausgeführt hat, habe ich das gleiche Phänomen wie vorher.
Die Frage ist, wie man ein Script beimStart "aufräumen" kann) (.removeListner)
Dann habe ich mal versucht, das letzte Timeout mit noble.removeListener('discover', onDiscover); und noble.stopScanning(); wegzulassen:
- dann wird nach einem Scan nie weitergescannt, auch wenn man das Script neu gestartet, da der Scan ja einmal durch ist und ich doppelte Einträge beim Start ausgeschlossen habe.
ergo, darauf kann ich wohl nicht verzichten.
Das Endziel soll sein, dass der Raspberry dauerhaft scannt. da wären wir wieder bei meinen Meilen
(001) Ich denke mal, dass ich mit dem setTimeout() den ersten Durchgang stoppen muss und dann den nächsten Durchgang direkt wieder starten muss, inkl. dem SetTimeOut für den Stop.
Ich experimentiere mal weiter…
[EDIT]
Die Endlosschleife klappt ganz gut, wenn ich, wie oben unter (001) beschrieben nach dem Stop im Stop die StopFunktion selbst wieder aufrufe mit Start und Timer.
Das Problem, was ich nicht lösen kann ist, dass das setTimeOut() bei einem Restart des Scripts im Hintergrund noch weiterläuft und dann das Discover sauber beendet, aber bei Script Stop/Start anscheinend nicht.
-
Vielleicht so probieren: `
Danke noch einmal!
Dank Deiner Hilfe bin ich schon einen Riesenschritt weiter
-
zwei Datenpunkte
-
einer wenn der Scan aktiv ist, der nach dem Timeout prüft, ob der Scan weiter gehen soll
-
der andere um den Scan ein- und auszuschalten
-
Start ruft verzögert Stop auf
-
stop prüft ob wieder gestartet werden soll
-
start prüft ob eventuell noch ein Scan aktiv ist und wartet, wenn das der Fall ist
-
…
Klappt soweit.
Das Problem, dass der Scan immer noch aktiv ist, wenn man im Scripteditor über Stop/Start das Script beendet und startet, bekomme ich leider nicht im Griff :?
Kann man irgendwie vom Script aus das Modul noble stoppen und wieder starten?
Oder eine andere Lösung?
-
-
Vielleicht so probieren: `
Danke noch einmal!
Dank Deiner Hilfe bin ich schon einen Riesenschritt weiter
-
zwei Datenpunkte
-
einer wenn der Scan aktiv ist, der nach dem Timeout prüft, ob der Scan weiter gehen soll
-
der andere um den Scan ein- und auszuschalten
-
Start ruft verzögert Stop auf
-
stop prüft ob wieder gestartet werden soll
-
start prüft ob eventuell noch ein Scan aktiv ist und wartet, wenn das der Fall ist
-
…
Klappt soweit.
Das Problem, dass der Scan immer noch aktiv ist, wenn man im Scripteditor über Stop/Start das Script beendet und startet, bekomme ich leider nicht im Griff :?
Kann man irgendwie vom Script aus das Modul noble stoppen und wieder starten?
Oder eine andere Lösung? `
removeAllListeners wird dein Problem lösen.function onDiscover (peripheral){ // Bluetooth Device gefunden, dann.. } function main() { noble.removeAllListeners('discover'); noble.on('discover', onDiscover); noble.startScanning(); log("start scanning"); } setTimeout(main, 1000); function stopScan() { noble.removeListener('discover', onDiscover); noble.stopScanning(); logs("Stop scanning. Anzahl Bluetooth Devices gefunden: " + anzahlBluetoothDevices,"debug1"); } setTimeout(stopScan, 30000);
-
-
removeAllListeners wird dein Problem lösen. `
Danke!
Versuche ich gleich. Ansonsten schaut es schon ganz gut aus