BLE Button Controller
Status: Disconnected
(function() {
const SERVICE_UUID = ‘4fafc201-1fb5-459e-8fcc-c5c9c331914b’;
const CHARACTERISTIC_UUID = ‘beb5483e-36e1-4688-b7f5-ea07361b26a8’;
let bleDevice = null;
let bleCharacteristic = null;
window.addEventListener(‘DOMContentLoaded’, () => {
const connectBtn = document.getElementById(‘connectBle’);
const statusText = document.getElementById(‘status’);
const controlsDiv = document.getElementById(‘controls’);
const btnUp = document.getElementById(‘btnUp’);
const btnDown = document.getElementById(‘btnDown’);
if (!connectBtn) return;
connectBtn.addEventListener(‘click’, async () => {
if (bleDevice && bleDevice.gatt.connected) {
bleDevice.gatt.disconnect();
return;
}
try {
statusText.innerText = “Status: Requesting Bluetooth device…”;
bleDevice = await navigator.bluetooth.requestDevice({
filters: [{ services: [SERVICE_UUID] }]
});
statusText.innerText = “Status: Connecting to GATT Server…”;
const server = await bleDevice.gatt.connect();
statusText.innerText = “Status: Getting Service…”;
const service = await server.getPrimaryService(SERVICE_UUID);
statusText.innerText = “Status: Getting Characteristic…”;
bleCharacteristic = await service.getCharacteristic(CHARACTERISTIC_UUID);
statusText.innerText = “Status: Connected!”;
connectBtn.style.backgroundColor = ‘#dc3545’;
connectBtn.innerText = ‘Disconnect’;
controlsDiv.style.display = ‘block’;
bleDevice.addEventListener(‘gattserverdisconnected’, onDisconnected);
} catch (error) {
console.error(‘Connection failed:’, error);
statusText.innerText = `Status: Error – ${error.message}`;
}
});
async function sendBleData(dataString) {
if (!bleCharacteristic) return;
try {
const encoder = new TextEncoder();
const dataBuffer = encoder.encode(dataString);
await bleCharacteristic.writeValue(dataBuffer);
console.log(‘Sent: ‘ + dataString);
} catch (error) {
console.error(‘Transmission failed:’, error);
}
}
btnUp.addEventListener(‘click’, () => sendBleData(‘A’));
btnDown.addEventListener(‘click’, () => sendBleData(‘B’));
function onDisconnected() {
statusText.innerText = “Status: Disconnected”;
connectBtn.style.backgroundColor = ‘#28a745’;
connectBtn.innerText = ‘Connect to BLE Device’;
controlsDiv.style.display = ‘none’;
bleCharacteristic = null;
}
});
})();