mirror of
https://github.com/meshcore-dev/meshcore.js.git
synced 2026-04-20 22:13:49 +00:00
implement ble connection and tidy up classes
This commit is contained in:
parent
6a3e522106
commit
8f53e9b849
5 changed files with 301 additions and 175 deletions
95
src/connection/ble_connection.js
Normal file
95
src/connection/ble_connection.js
Normal file
|
|
@ -0,0 +1,95 @@
|
|||
import Constants from "../constants.js";
|
||||
import Connection from "./connection.js";
|
||||
|
||||
class BleConnection extends Connection {
|
||||
|
||||
constructor(bleDevice) {
|
||||
super();
|
||||
this.bleDevice = bleDevice;
|
||||
this.gattServer = null;
|
||||
this.rxCharacteristic = null;
|
||||
this.txCharacteristic = null;
|
||||
this.init();
|
||||
}
|
||||
|
||||
static async open() {
|
||||
|
||||
// ensure browser supports web bluetooth
|
||||
if(!navigator.bluetooth){
|
||||
alert("Web Bluetooth is not supported in this browser");
|
||||
return;
|
||||
}
|
||||
|
||||
// ask user to select device
|
||||
const device = await navigator.bluetooth.requestDevice({
|
||||
filters: [
|
||||
{
|
||||
services: [
|
||||
Constants.Ble.ServiceUuid.toLowerCase(),
|
||||
],
|
||||
},
|
||||
],
|
||||
});
|
||||
|
||||
// make sure user selected a device
|
||||
if(!device){
|
||||
return null;
|
||||
}
|
||||
|
||||
return new BleConnection(device);
|
||||
|
||||
}
|
||||
|
||||
async init() {
|
||||
|
||||
// connect to gatt server
|
||||
this.gattServer = await this.bleDevice.gatt.connect();
|
||||
|
||||
// find service
|
||||
const service = await this.gattServer.getPrimaryService(Constants.Ble.ServiceUuid.toLowerCase());
|
||||
const characteristics = await service.getCharacteristics();
|
||||
|
||||
// find rx characteristic (we write to this one, it's where the radio reads from)
|
||||
this.rxCharacteristic = characteristics.find((characteristic) => {
|
||||
return characteristic.uuid.toLowerCase() === Constants.Ble.CharacteristicUuidRx.toLowerCase();
|
||||
});
|
||||
|
||||
// find tx characteristic (we read this one, it's where the radio writes to)
|
||||
this.txCharacteristic = characteristics.find((characteristic) => {
|
||||
return characteristic.uuid.toLowerCase() === Constants.Ble.CharacteristicUuidTx.toLowerCase();
|
||||
});
|
||||
|
||||
// listen for frames from transmitted to us from the ble device
|
||||
await this.txCharacteristic.startNotifications();
|
||||
this.txCharacteristic.addEventListener('characteristicvaluechanged', (event) => {
|
||||
const frame = new Uint8Array(event.target.value.buffer);
|
||||
this.onFrameReceived(frame);
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
async close() {
|
||||
try {
|
||||
this.gattServer?.disconnect();
|
||||
this.gattServer = null;
|
||||
} catch(e) {
|
||||
// ignore error when disconnecting
|
||||
}
|
||||
}
|
||||
|
||||
async write(bytes) {
|
||||
try {
|
||||
// we write to the rx characteristic, as that's where the radio reads from
|
||||
await this.rxCharacteristic.writeValue(bytes);
|
||||
} catch(e) {
|
||||
console.log("failed to write to ble device", e);
|
||||
}
|
||||
}
|
||||
|
||||
async sendToRadioFrame(data) {
|
||||
await this.write(data);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
export default BleConnection;
|
||||
Loading…
Add table
Add a link
Reference in a new issue