API jembatan JavaScript
Sensor kebugaran BLE
Detak jantung, kecepatan, kadensi, daya, dan baterai dari profil Bluetooth Low Energy standar.
AppMint.beacons helper#
AppMint.beacons.startScan(options) / stopScan() / isScanning()
Contoh
Menemukan beacon Bluetooth di sekitar - iBeacon dan Eddystone (UID, URL dan TLM) - dan memberi tahu halaman tentang masing-masing sekitar sekali per detik melalui event appmint:beacon, dengan kekuatan sinyal dan perkiraan jarak.
Mengembalikan: startScan() → Promise berisi {ok: true} atau {ok: false, code} (not_enabled, permission_denied, bluetooth_off, bluetooth_unavailable, scan_failed, blocked). stopScan() → {ok: true}. isScanning() → true/false. Membutuhkan: tidak ada yang perlu dicentang - build yang kodenya memanggil beacons.startScan mendeklarasikan izin pemindaian Bluetooth dan lokasi presisi (hasil beacon adalah data lokasi bagi Android, jadi pengguna diminta keduanya, dan Play mencantumkan aplikasi sebagai pengguna lokasi).
Lakukan ranging beacon pada satu lokasi:
window.addEventListener('appmint:beacon', function (e) {
var b = e.detail;
if (b.type === 'ibeacon') {
showNearest(b.uuid, b.major, b.minor, b.distance); // metres, a rough estimate
} else if (b.type === 'eddystone-url') {
offerLink(b.url);
} else if (b.type === 'state') {
console.log('beacon scan ' + b.state); // 'scanning' | 'stopped'
} else if (b.type === 'error') {
console.warn('beacon scan error', b.error);
}
});
async function startRanging() {
if (!(window.AppMint && AppMint.beacons)) return;
var r = await AppMint.beacons.startScan({ uuids: ['e2c56db5-dffb-48d2-b060-d0f5a71096e0'] });
if (!r.ok) alert(r.code === 'bluetooth_off' ? 'Turn on Bluetooth' : 'Cannot scan: ' + r.code);
}Hanya Eddystone, dengan telemetri baterai:
AppMint.beacons.startScan({ ibeacon: false });
window.addEventListener('appmint:beacon', function (e) {
var b = e.detail;
if (b.type === 'eddystone-uid') console.log(b.namespace, b.instance, b.rssi, b.distance);
if (b.type === 'eddystone-tlm') console.log(b.address, b.batteryMilliVolts + ' mV', b.temperatureC + ' °C');
});Berhenti saat layar ditinggalkan:
document.addEventListener('visibilitychange', async function () {
if (document.visibilityState === 'hidden' && await AppMint.beacons.isScanning()) AppMint.beacons.stopScan();
});Kolom event: setiap beacon memiliki type, rssi, address, timestamp; iBeacon menambahkan uuid, major, minor, txPower, distance; Eddystone UID menambahkan namespace, instance, txPower, distance; URL menambahkan url; TLM menambahkan batteryMilliVolts, temperatureC, advertCount, uptimeSeconds. uuids menyaring UUID iBeacon dan namespace Eddystone (hex huruf kecil).
Catatan: Jarak dihitung dari kekuatan sinyal dan hanya baik untuk dekat / jauh - dinding dan tubuh mengubahnya hingga beberapa meter. Pemindaian berjalan sampai stopScan() atau aplikasi ditutup.
beaconIsScanning jembatan#
window.WebToApk.beaconIsScanning(): Boolean
Apakah pemindaian beacon sedang berjalan.
Contoh
Didokumentasikan bersama AppMint.beacons - contoh di sana menunjukkan yang ini juga.
Menemukan beacon Bluetooth di sekitar - iBeacon dan Eddystone (UID, URL dan TLM) - dan memberi tahu halaman tentang masing-masing sekitar sekali per detik melalui event appmint:beacon, dengan kekuatan sinyal dan perkiraan jarak.
Mengembalikan: startScan() → Promise berisi {ok: true} atau {ok: false, code} (not_enabled, permission_denied, bluetooth_off, bluetooth_unavailable, scan_failed, blocked). stopScan() → {ok: true}. isScanning() → true/false. Membutuhkan: tidak ada yang perlu dicentang - build yang kodenya memanggil beacons.startScan mendeklarasikan izin pemindaian Bluetooth dan lokasi presisi (hasil beacon adalah data lokasi bagi Android, jadi pengguna diminta keduanya, dan Play mencantumkan aplikasi sebagai pengguna lokasi).
Lakukan ranging beacon pada satu lokasi:
window.addEventListener('appmint:beacon', function (e) {
var b = e.detail;
if (b.type === 'ibeacon') {
showNearest(b.uuid, b.major, b.minor, b.distance); // metres, a rough estimate
} else if (b.type === 'eddystone-url') {
offerLink(b.url);
} else if (b.type === 'state') {
console.log('beacon scan ' + b.state); // 'scanning' | 'stopped'
} else if (b.type === 'error') {
console.warn('beacon scan error', b.error);
}
});
async function startRanging() {
if (!(window.AppMint && AppMint.beacons)) return;
var r = await AppMint.beacons.startScan({ uuids: ['e2c56db5-dffb-48d2-b060-d0f5a71096e0'] });
if (!r.ok) alert(r.code === 'bluetooth_off' ? 'Turn on Bluetooth' : 'Cannot scan: ' + r.code);
}Hanya Eddystone, dengan telemetri baterai:
AppMint.beacons.startScan({ ibeacon: false });
window.addEventListener('appmint:beacon', function (e) {
var b = e.detail;
if (b.type === 'eddystone-uid') console.log(b.namespace, b.instance, b.rssi, b.distance);
if (b.type === 'eddystone-tlm') console.log(b.address, b.batteryMilliVolts + ' mV', b.temperatureC + ' °C');
});Berhenti saat layar ditinggalkan:
document.addEventListener('visibilitychange', async function () {
if (document.visibilityState === 'hidden' && await AppMint.beacons.isScanning()) AppMint.beacons.stopScan();
});Kolom event: setiap beacon memiliki type, rssi, address, timestamp; iBeacon menambahkan uuid, major, minor, txPower, distance; Eddystone UID menambahkan namespace, instance, txPower, distance; URL menambahkan url; TLM menambahkan batteryMilliVolts, temperatureC, advertCount, uptimeSeconds. uuids menyaring UUID iBeacon dan namespace Eddystone (hex huruf kecil).
Catatan: Jarak dihitung dari kekuatan sinyal dan hanya baik untuk dekat / jauh - dinding dan tubuh mengubahnya hingga beberapa meter. Pemindaian berjalan sampai stopScan() atau aplikasi ditutup.
beaconStartScan jembatan#
window.WebToApk.beaconStartScan(optionsJson: String, callbackId: String)
Memulai ranging beacon dengan [optionsJson] `{uuids?, ibeacon?, eddystone?}`; menyelesaikan [callbackId] dengan `{ok}` atau `{ok:false, code}`.
Contoh
Didokumentasikan bersama AppMint.beacons - contoh di sana menunjukkan yang ini juga.
Menemukan beacon Bluetooth di sekitar - iBeacon dan Eddystone (UID, URL dan TLM) - dan memberi tahu halaman tentang masing-masing sekitar sekali per detik melalui event appmint:beacon, dengan kekuatan sinyal dan perkiraan jarak.
Mengembalikan: startScan() → Promise berisi {ok: true} atau {ok: false, code} (not_enabled, permission_denied, bluetooth_off, bluetooth_unavailable, scan_failed, blocked). stopScan() → {ok: true}. isScanning() → true/false. Membutuhkan: tidak ada yang perlu dicentang - build yang kodenya memanggil beacons.startScan mendeklarasikan izin pemindaian Bluetooth dan lokasi presisi (hasil beacon adalah data lokasi bagi Android, jadi pengguna diminta keduanya, dan Play mencantumkan aplikasi sebagai pengguna lokasi).
Lakukan ranging beacon pada satu lokasi:
window.addEventListener('appmint:beacon', function (e) {
var b = e.detail;
if (b.type === 'ibeacon') {
showNearest(b.uuid, b.major, b.minor, b.distance); // metres, a rough estimate
} else if (b.type === 'eddystone-url') {
offerLink(b.url);
} else if (b.type === 'state') {
console.log('beacon scan ' + b.state); // 'scanning' | 'stopped'
} else if (b.type === 'error') {
console.warn('beacon scan error', b.error);
}
});
async function startRanging() {
if (!(window.AppMint && AppMint.beacons)) return;
var r = await AppMint.beacons.startScan({ uuids: ['e2c56db5-dffb-48d2-b060-d0f5a71096e0'] });
if (!r.ok) alert(r.code === 'bluetooth_off' ? 'Turn on Bluetooth' : 'Cannot scan: ' + r.code);
}Hanya Eddystone, dengan telemetri baterai:
AppMint.beacons.startScan({ ibeacon: false });
window.addEventListener('appmint:beacon', function (e) {
var b = e.detail;
if (b.type === 'eddystone-uid') console.log(b.namespace, b.instance, b.rssi, b.distance);
if (b.type === 'eddystone-tlm') console.log(b.address, b.batteryMilliVolts + ' mV', b.temperatureC + ' °C');
});Berhenti saat layar ditinggalkan:
document.addEventListener('visibilitychange', async function () {
if (document.visibilityState === 'hidden' && await AppMint.beacons.isScanning()) AppMint.beacons.stopScan();
});Kolom event: setiap beacon memiliki type, rssi, address, timestamp; iBeacon menambahkan uuid, major, minor, txPower, distance; Eddystone UID menambahkan namespace, instance, txPower, distance; URL menambahkan url; TLM menambahkan batteryMilliVolts, temperatureC, advertCount, uptimeSeconds. uuids menyaring UUID iBeacon dan namespace Eddystone (hex huruf kecil).
Catatan: Jarak dihitung dari kekuatan sinyal dan hanya baik untuk dekat / jauh - dinding dan tubuh mengubahnya hingga beberapa meter. Pemindaian berjalan sampai stopScan() atau aplikasi ditutup.
beaconStopScan jembatan#
window.WebToApk.beaconStopScan(callbackId: String)
Menghentikan ranging beacon; menyelesaikan [callbackId] dengan `{ok:true}`.
Contoh
Didokumentasikan bersama AppMint.beacons - contoh di sana menunjukkan yang ini juga.
Menemukan beacon Bluetooth di sekitar - iBeacon dan Eddystone (UID, URL dan TLM) - dan memberi tahu halaman tentang masing-masing sekitar sekali per detik melalui event appmint:beacon, dengan kekuatan sinyal dan perkiraan jarak.
Mengembalikan: startScan() → Promise berisi {ok: true} atau {ok: false, code} (not_enabled, permission_denied, bluetooth_off, bluetooth_unavailable, scan_failed, blocked). stopScan() → {ok: true}. isScanning() → true/false. Membutuhkan: tidak ada yang perlu dicentang - build yang kodenya memanggil beacons.startScan mendeklarasikan izin pemindaian Bluetooth dan lokasi presisi (hasil beacon adalah data lokasi bagi Android, jadi pengguna diminta keduanya, dan Play mencantumkan aplikasi sebagai pengguna lokasi).
Lakukan ranging beacon pada satu lokasi:
window.addEventListener('appmint:beacon', function (e) {
var b = e.detail;
if (b.type === 'ibeacon') {
showNearest(b.uuid, b.major, b.minor, b.distance); // metres, a rough estimate
} else if (b.type === 'eddystone-url') {
offerLink(b.url);
} else if (b.type === 'state') {
console.log('beacon scan ' + b.state); // 'scanning' | 'stopped'
} else if (b.type === 'error') {
console.warn('beacon scan error', b.error);
}
});
async function startRanging() {
if (!(window.AppMint && AppMint.beacons)) return;
var r = await AppMint.beacons.startScan({ uuids: ['e2c56db5-dffb-48d2-b060-d0f5a71096e0'] });
if (!r.ok) alert(r.code === 'bluetooth_off' ? 'Turn on Bluetooth' : 'Cannot scan: ' + r.code);
}Hanya Eddystone, dengan telemetri baterai:
AppMint.beacons.startScan({ ibeacon: false });
window.addEventListener('appmint:beacon', function (e) {
var b = e.detail;
if (b.type === 'eddystone-uid') console.log(b.namespace, b.instance, b.rssi, b.distance);
if (b.type === 'eddystone-tlm') console.log(b.address, b.batteryMilliVolts + ' mV', b.temperatureC + ' °C');
});Berhenti saat layar ditinggalkan:
document.addEventListener('visibilitychange', async function () {
if (document.visibilityState === 'hidden' && await AppMint.beacons.isScanning()) AppMint.beacons.stopScan();
});Kolom event: setiap beacon memiliki type, rssi, address, timestamp; iBeacon menambahkan uuid, major, minor, txPower, distance; Eddystone UID menambahkan namespace, instance, txPower, distance; URL menambahkan url; TLM menambahkan batteryMilliVolts, temperatureC, advertCount, uptimeSeconds. uuids menyaring UUID iBeacon dan namespace Eddystone (hex huruf kecil).
Catatan: Jarak dihitung dari kekuatan sinyal dan hanya baik untuk dekat / jauh - dinding dan tubuh mengubahnya hingga beberapa meter. Pemindaian berjalan sampai stopScan() atau aplikasi ditutup.
bleConnect jembatan#
window.WebToApk.bleConnect(address: String)
Runtime untuk permBluetooth. Tidak ada sakelar wizard yang mengaturnya: build mengaktifkannya saat kode halaman sendiri memanggil metode ini (atau Web Bluetooth). Sebelum runtime ini, izin dideklarasikan sementara tidak ada yang di runtime menyentuh sensor, pola persis deklarasi-tapi-mati yang didokumentasikan SmsBridge. Hasil dialirkan sebagai event `appmint:ble` / window.onAppMintBle({kind, ...}).
Dijelaskan oleh kelompoknya, Sensor kebugaran BLE (detak jantung / kecepatan / kadensi / daya / baterai), bukan sendiri.
Contoh
Terhubung ke satu sensor kebugaran yang ditemukan oleh bleStartScan() dan mulai mengalirkan pembacaannya.
Mengembalikan: tidak ada. Kemajuan dan data datang sebagai event appmint:ble (dan window.onAppMintBle): {kind:'state', state:'connecting', address}, {kind:'state', state:'connected', address}, {kind:'state', state:'ready', services:[...]}, lalu {kind:'data', type, data} untuk setiap pembacaan. Membutuhkan: Bluetooth (diaktifkan oleh build ZIP atau HTML saat kode Anda memakai jembatan sensor) dan izin Perangkat sekitar, diminta saat pertama dipakai.
Berikan address dari event device, dari ketukan pengguna:
function connectSensor(address) {
if (!window.WebToApk || typeof window.WebToApk.bleConnect !== 'function') return;
window.WebToApk.bleConnect(address);
}
window.onAppMintBle = function (d) {
if (d.kind === 'state') {
// 'connecting' | 'connected' | 'ready' | 'disconnected' (also 'scanning' / 'scan_stopped')
showStatus(d.state);
} else if (d.kind === 'data') {
if (d.type === 'heart_rate') show('bpm', d.data.bpm);
if (d.type === 'speed_cadence') { // either key can be missing in one packet
if (d.data.speedKmh !== undefined) show('speed', d.data.speedKmh.toFixed(1) + ' km/h');
if (d.data.cadenceRpm !== undefined) show('cadence', Math.round(d.data.cadenceRpm) + ' rpm');
}
if (d.type === 'power') show('power', d.data.watts + ' W');
if (d.type === 'running') show('pace', d.data.speedKmh.toFixed(1) + ' km/h, ' + d.data.cadenceSpm + ' spm');
if (d.type === 'battery') show('battery', d.data.percent + '%');
} else if (d.kind === 'error') {
showStatus('Could not connect: ' + d.error);
}
};Ingat sensor yang terhubung dan sambungkan lagi lain kali tanpa pemindaian:
var SAVED_KEY = 'hrStrapAddress';
window.addEventListener('appmint:ble', function (e) {
var d = e.detail;
if (d.kind === 'state' && d.state === 'connected') localStorage.setItem(SAVED_KEY, d.address);
if (d.kind === 'error' && d.error === 'invalid_address') localStorage.removeItem(SAVED_KEY);
});
document.getElementById('start-workout').addEventListener('click', function () {
if (!window.WebToApk || typeof window.WebToApk.bleConnect !== 'function') return;
var address = localStorage.getItem(SAVED_KEY);
if (address) window.WebToApk.bleConnect(address);
else window.WebToApk.bleStartScan(); // first time: let the user pick a sensor
});Lacak sesi detak jantung (rata-rata, maksimum, kontak tali) dari pembacaan:
var beats = 0, sum = 0, max = 0;
window.addEventListener('appmint:ble', function (e) {
var d = e.detail;
if (d.kind === 'state' && d.state === 'ready' && d.services.length === 0) {
showStatus('This sensor has no heart rate, speed, power or battery service.');
}
if (d.kind !== 'data' || d.type !== 'heart_rate') return;
if (d.data.contact === false) { // only sent by straps that report skin contact
showStatus('Wet the strap: no skin contact');
return;
}
beats++; sum += d.data.bpm; max = Math.max(max, d.data.bpm);
show('bpm', d.data.bpm);
show('avg', Math.round(sum / beats));
show('max', max);
});Catatan: Satu sensor sekali waktu: terhubung menghentikan pemindaian apa pun dan memutus sensor sebelumnya lebih dulu (Anda mendapat disconnected-nya). ready.services mencantumkan UUID lengkap layanan yang didukung yang dimiliki sensor ini. Paket kecepatan/kadensi pertama setelah terhubung tidak mengirim apa pun - kecepatan dan kadensi membutuhkan dua paket untuk dihitung. heart_rate juga membawa rrIntervalsMs (interval antar-detak dalam ms, saat tali mengirimnya), energyKj dan contact saat tali melaporkannya; power membawa cadenceRpm mulai paket keduanya saat meter mengirim data engkol. Kesalahan: not_enabled, permission_denied, bluetooth_unavailable, invalid_address. Jika sensor keluar dari jangkauan Anda mendapat {kind:'state', state:'disconnected', address}.
bleDisconnect jembatan#
window.WebToApk.bleDisconnect()
Runtime untuk permBluetooth. Tidak ada sakelar wizard yang mengaturnya: build mengaktifkannya saat kode halaman sendiri memanggil metode ini (atau Web Bluetooth). Sebelum runtime ini, izin dideklarasikan sementara tidak ada yang di runtime menyentuh sensor, pola persis deklarasi-tapi-mati yang didokumentasikan SmsBridge. Hasil dialirkan sebagai event `appmint:ble` / window.onAppMintBle({kind, ...}).
Dijelaskan oleh kelompoknya, Sensor kebugaran BLE (detak jantung / kecepatan / kadensi / daya / baterai), bukan sendiri.
Contoh
Memutus sensor kebugaran yang terhubung dengan bleConnect().
Mengembalikan: tidak ada. Jika sebuah sensor terhubung, event appmint:ble {kind:'state', state:'disconnected'} menyusul. Membutuhkan: Bluetooth (diaktifkan oleh build ZIP atau HTML saat kode Anda memakai jembatan sensor); tanpanya panggilan tidak melakukan apa pun.
document.getElementById('end-workout').addEventListener('click', function () {
if (window.WebToApk && typeof window.WebToApk.bleDisconnect === 'function') {
window.WebToApk.bleDisconnect();
}
});
window.addEventListener('appmint:ble', function (e) {
if (e.detail.kind === 'state' && e.detail.state === 'disconnected') {
showStatus('Sensor disconnected');
}
});Sambungkan ulang sendiri saat sensor terputus, tetapi tidak saat pengguna mengakhiri latihan:
var lastAddress = null, userEnded = false, retries = 0;
window.addEventListener('appmint:ble', function (e) {
var d = e.detail;
if (d.kind !== 'state') return;
if (d.state === 'connected') { lastAddress = d.address; userEnded = false; retries = 0; }
// Only a drop caused by the sensor carries an address.
if (d.state === 'disconnected' && d.address && !userEnded && lastAddress && retries < 3) {
retries++;
showStatus('Sensor lost, reconnecting (' + retries + '/3)...');
setTimeout(function () { window.WebToApk.bleConnect(lastAddress); }, 3000);
}
});
function endWorkout() {
userEnded = true;
if (window.WebToApk && typeof window.WebToApk.bleDisconnect === 'function') {
window.WebToApk.bleDisconnect();
}
}Putuskan koneksi dan lupakan sensor yang tersimpan dari layar pengaturan:
document.getElementById('forget-sensor').addEventListener('click', function () {
localStorage.removeItem('hrStrapAddress'); // wherever your app saved the address
if (window.WebToApk && typeof window.WebToApk.bleDisconnect === 'function') {
window.WebToApk.bleDisconnect();
}
showStatus('Sensor forgotten. Tap Scan to pair a new one.');
});Catatan: Event disconnected yang Anda sebabkan sendiri tidak memiliki address; yang disebabkan oleh sensor (di luar jangkauan, dimatikan) memilikinya. Aplikasi juga memutus koneksi saat ditutup.
bleSetWheelCircumference jembatan#
window.WebToApk.bleSetWheelCircumference(mm: Int)
Runtime untuk permBluetooth. Tidak ada sakelar wizard yang mengaturnya: build mengaktifkannya saat kode halaman sendiri memanggil metode ini (atau Web Bluetooth). Sebelum runtime ini, izin dideklarasikan sementara tidak ada yang di runtime menyentuh sensor, pola persis deklarasi-tapi-mati yang didokumentasikan SmsBridge. Hasil dialirkan sebagai event `appmint:ble` / window.onAppMintBle({kind, ...}).
Dijelaskan oleh kelompoknya, Sensor kebugaran BLE (detak jantung / kecepatan / kadensi / daya / baterai), bukan sendiri.
Contoh
Mengatur ukuran roda sepeda (keliling dalam milimeter) yang dipakai untuk mengubah putaran roda sensor kecepatan menjadi km/jam.
Mengembalikan: tidak ada. Membutuhkan: tidak ada untuk memanggilnya; pembacaan kecepatan itu sendiri membutuhkan sensor kecepatan bersepeda yang terhubung (lihat bleConnect).
// 2096 mm = 700x23c (the default). 2105 = 700x25c, 2136 = 700x28c, 2070 = 26x2.0 MTB.
function setWheel(mm) {
if (window.WebToApk && typeof window.WebToApk.bleSetWheelCircumference === 'function') {
window.WebToApk.bleSetWheelCircumference(mm);
}
}
document.getElementById('wheel').addEventListener('change', function (e) {
setWheel(parseInt(e.target.value, 10));
});Terapkan ukuran roda tersimpan pengendara setiap kali Anda terhubung, karena pengaturan tidak bertahan setelah restart:
function connectBike(address) {
if (!window.WebToApk || typeof window.WebToApk.bleConnect !== 'function') return;
var mm = parseInt(localStorage.getItem('wheelMm'), 10) || 2096;
window.WebToApk.bleSetWheelCircumference(mm);
window.WebToApk.bleConnect(address);
}Kalibrasi dari pengukuran gulir (satu putaran roda penuh, dalam cm) dan periksa rentangnya sendiri, karena nilai di luar rentang diabaikan tanpa kesalahan:
document.getElementById('save-rollout').addEventListener('click', function () {
var mm = Math.round(parseFloat(document.getElementById('rollout-cm').value) * 10);
if (!(mm >= 500 && mm <= 4000)) {
showStatus('Enter a roll-out between 50 and 400 cm.');
return;
}
localStorage.setItem('wheelMm', String(mm));
if (window.WebToApk && typeof window.WebToApk.bleSetWheelCircumference === 'function') {
window.WebToApk.bleSetWheelCircumference(mm); // applies to the next speed reading
}
showStatus('Wheel set to ' + mm + ' mm');
});Catatan: Nilai di luar 500-4000 mm diabaikan diam-diam (nilai lama tetap). Pengaturan ini bertahan sampai aplikasi ditutup, jadi atur lagi setiap peluncuran, misalnya tepat sebelum bleConnect(). Pengaturan ini mengubah speedKmh dalam data speed_cadence dari appmint:ble; kadensi tidak terpengaruh.
bleStartScan jembatan#
window.WebToApk.bleStartScan()
Runtime untuk permBluetooth. Tidak ada sakelar wizard yang mengaturnya: build mengaktifkannya saat kode halaman sendiri memanggil metode ini (atau Web Bluetooth). Sebelum runtime ini, izin dideklarasikan sementara tidak ada yang di runtime menyentuh sensor, pola persis deklarasi-tapi-mati yang didokumentasikan SmsBridge. Hasil dialirkan sebagai event `appmint:ble` / window.onAppMintBle({kind, ...}).
Dijelaskan oleh kelompoknya, Sensor kebugaran BLE (detak jantung / kecepatan / kadensi / daya / baterai), bukan sendiri.
Contoh
Memindai sensor kebugaran Bluetooth di sekitar (detak jantung, kecepatan/kadensi bersepeda, daya, footpod lari) selama 15 detik.
Mengembalikan: tidak ada. Hasil datang sebagai event appmint:ble (dan window.onAppMintBle(detail)): satu {kind:'device', address, name, sensors, rssi} per sensor yang ditemukan, ditambah {kind:'state', state:'scanning'} di awal dan {kind:'state', state:'scan_stopped'} di akhir. Membutuhkan: Bluetooth. Tidak ada sakelar untuknya: saat Anda membangun dari ZIP atau halaman HTML, build mengaktifkan Bluetooth sendiri jika kode Anda memanggil bleStartScan / bleConnect atau memakai navigator.bluetooth. Build situs web (URL) tidak bisa mengaktifkannya. Pemindaian pertama meminta izin Perangkat sekitar kepada pengguna (Lokasi di Android 11 ke bawah).
Dengarkan dulu, lalu pindai dari ketukan tombol:
var found = {};
window.addEventListener('appmint:ble', function (e) {
var d = e.detail;
if (d.kind === 'device') {
found[d.address] = d;
// d.sensors: any of 'heart_rate', 'speed_cadence', 'power', 'running'
addRow(d.address, (d.name || 'Unnamed sensor') + ' ' + d.sensors.join(', ') + ' (' + d.rssi + ' dBm)');
} else if (d.kind === 'state' && d.state === 'scanning') {
showStatus('Looking for sensors...');
} else if (d.kind === 'state' && d.state === 'scan_stopped') {
showStatus(Object.keys(found).length ? 'Pick a sensor' : 'No sensors found. Wake the sensor and try again.');
} else if (d.kind === 'error') {
showStatus('Bluetooth error: ' + d.error);
}
});
document.getElementById('scan').addEventListener('click', function () {
if (window.WebToApk && typeof window.WebToApk.bleStartScan === 'function') {
found = {};
window.WebToApk.bleStartScan();
} else {
showStatus('Sensors work in the installed app only.');
}
});Pasangkan tali detak jantung terkuat secara otomatis saat pemindaian berakhir:
var best = null, pairing = false;
window.addEventListener('appmint:ble', function (e) {
var d = e.detail;
if (!pairing) return;
if (d.kind === 'device' && d.sensors.indexOf('heart_rate') !== -1) {
if (!best || d.rssi > best.rssi) best = d; // closer strap = higher (less negative) rssi
} else if (d.kind === 'state' && d.state === 'scan_stopped') {
pairing = false;
if (best) window.WebToApk.bleConnect(best.address);
else showStatus('No heart-rate strap found. Put it on and try again.');
}
});
document.getElementById('pair-hr').addEventListener('click', function () {
if (!window.WebToApk || typeof window.WebToApk.bleStartScan !== 'function') return;
best = null;
pairing = true;
window.WebToApk.bleStartScan();
});Ubah setiap kesalahan pemindaian menjadi pesan yang bisa ditindaklanjuti pengguna:
var SCAN_HELP = {
not_enabled: 'This app was built without Bluetooth.',
permission_denied: 'Allow Nearby devices for this app in Settings to find sensors.',
bluetooth_unavailable: 'This phone has no Bluetooth.',
bluetooth_off: 'Turn Bluetooth on, then tap Scan again.',
scan_failed: 'The scan could not start. Wait a moment and try again.'
};
window.addEventListener('appmint:ble', function (e) {
var d = e.detail;
if (d.kind !== 'error') return;
var text = SCAN_HELP[d.error] || ('Bluetooth error: ' + d.error);
if (d.code !== undefined) text += ' (code ' + d.code + ')';
showStatus(text);
document.getElementById('scan').disabled = false;
});Catatan: Kode kesalahan di {kind:'error', error}: not_enabled (build tidak memiliki Bluetooth), permission_denied, bluetooth_unavailable (tidak ada adaptor), bluetooth_off, scan_failed (mungkin membawa code Android). Pemindaian hanya melaporkan perangkat yang mengiklankan salah satu dari empat layanan kebugaran, dan setiap perangkat hanya sekali per pemindaian. Memulai pemindaian baru menghentikan yang lama. Gunakan listener appmint:ble atau window.onAppMintBle, jangan keduanya - keduanya dipanggil untuk setiap pesan.
bleStopScan jembatan#
window.WebToApk.bleStopScan()
Runtime untuk permBluetooth. Tidak ada sakelar wizard yang mengaturnya: build mengaktifkannya saat kode halaman sendiri memanggil metode ini (atau Web Bluetooth). Sebelum runtime ini, izin dideklarasikan sementara tidak ada yang di runtime menyentuh sensor, pola persis deklarasi-tapi-mati yang didokumentasikan SmsBridge. Hasil dialirkan sebagai event `appmint:ble` / window.onAppMintBle({kind, ...}).
Dijelaskan oleh kelompoknya, Sensor kebugaran BLE (detak jantung / kecepatan / kadensi / daya / baterai), bukan sendiri.
Contoh
Menghentikan pemindaian sensor yang dimulai dengan bleStartScan() sebelum 15 detiknya habis.
Mengembalikan: tidak ada. Jika pemindaian sedang berjalan, event appmint:ble {kind:'state', state:'scan_stopped'} menyusul. Membutuhkan: Bluetooth (diaktifkan oleh build ZIP atau HTML saat kode Anda memakai jembatan sensor); tanpanya panggilan tidak melakukan apa pun.
window.addEventListener('appmint:ble', function (e) {
if (e.detail.kind === 'state' && e.detail.state === 'scan_stopped') {
document.getElementById('scan').disabled = false;
}
});
document.getElementById('stop-scan').addEventListener('click', function () {
if (window.WebToApk && typeof window.WebToApk.bleStopScan === 'function') {
window.WebToApk.bleStopScan();
}
});Berhenti lebih awal begitu jenis sensor yang Anda butuhkan muncul:
window.addEventListener('appmint:ble', function (e) {
var d = e.detail;
if (d.kind === 'device' && d.sensors.indexOf('power') !== -1) {
if (window.WebToApk && typeof window.WebToApk.bleStopScan === 'function') {
window.WebToApk.bleStopScan(); // no need to wait the full 15 seconds
}
showPowerMeter(d.address, d.name || 'Power meter');
}
});Berhenti memindai saat pengguna menutup lembar pemasangan atau meninggalkan aplikasi:
function stopLooking() {
if (window.WebToApk && typeof window.WebToApk.bleStopScan === 'function') {
window.WebToApk.bleStopScan(); // safe even if the scan already ended
}
}
document.getElementById('close-pairing').addEventListener('click', function () {
stopLooking();
document.getElementById('pairing-sheet').hidden = true;
});
document.addEventListener('visibilitychange', function () {
if (document.hidden) stopLooking();
});Catatan: Anda jarang membutuhkan ini: pemindaian berhenti sendiri setelah 15 detik, dan bleConnect() juga menghentikannya. Memanggilnya saat tidak ada pemindaian berjalan aman dan tidak mengirim event.