std.hardware.bluetooth

Nativer Bluetooth-Stack für Linux: von rohen AF_BLUETOOTH-Sockets über BlueZ-D-Bus-Steuerung bis zu vollständigen GATT-Client-/Server-Implementierungen für Bluetooth Low Energy (BLE) und Classic Bluetooth (RFCOMM). Alle neun Units implementieren das Protokoll direkt in Lyx — keine externen Bluetooth-Bibliotheken. Verbindungen werden als Dateideskriptoren (int64) verwaltet; jede Funktion nimmt einen fd entgegen.

Standard Library · std.android


Architektur

Übersicht der internen Schichten und Abhängigkeiten:

┌─────────────────────────────────────────────────────┐
│  AI / Profile-Typen                                  │
│  bluetooth_ai                                        │
├─────────────────────────────────────────────────────┤
│  BLE: GATT-Schicht                                   │
│  bluetooth_gattc · bluetooth_gatts                   │
├──────────────────────────┬──────────────────────────┤
│  BLE: L2CAP / ATT        │  Classic: RFCOMM          │
│  bluetooth_l2cap         │  bluetooth_rfcomm         │
├──────────────────────────┴──────────────────────────┤
│  Erweiterungen (BLE Scanner, Advertising, Mesh)      │
│  bluetooth_ext                                       │
├─────────────────────────────────────────────────────┤
│  Steuerungsebene (BlueZ D-Bus)                       │
│  bluetooth_dbus                                      │
├─────────────────────────────────────────────────────┤
│  Typen & Low-Level Syscalls                          │
│  bluetooth_types · bluetooth                         │
└─────────────────────────────────────────────────────┘


Units

Unit Beschreibung
std.hardware.bluetooth Low-Level Bluetooth-Socket-Syscalls (AF_BLUETOOTH): BTSocket, BTConnect, BTSend, BTRecv, BTIoctl
std.hardware.bluetooth_types Adress-Typen und -Hilfsfunktionen: BTAddrFromBytes, BTAddrToStr, BTSockAddrRcCreate, BTSockAddrL2Create
std.hardware.bluetooth_dbus BlueZ D-Bus Steuerungsebene: BlueZOpenConnection, BlueZDiscoverDevices, BlueZConnectDevice
std.hardware.bluetooth_rfcomm RFCOMM (Classic Bluetooth Serial): RFCommConnect, RFCommListen, RFCommSend, RFCommRecv
std.hardware.bluetooth_l2cap L2CAP + ATT-Protokollschicht: L2CapConnect, AttReadChar, AttWriteChar, AttRecvNotification
std.hardware.bluetooth_gattc GATT-Client: GattDiscoverServices, GattDiscoverChars, GattReadChar, GattWriteChar, GattEnableNotification
std.hardware.bluetooth_gatts GATT-Server: GattServerRegister, GattServerHandleNext, GattServerSendNotification
std.hardware.bluetooth_ext BLE Scanner, Advertising und Mesh: BleScannerStart, BleAdvertisementRegister, MeshNetworkJoin
std.hardware.bluetooth_ai KI-native, typsichere Bluetooth-Profile als Compiler-Typen

std.hardware.bluetooth

Unterste Schicht: direkte AF_BLUETOOTH-Socket-Syscalls. Wird in der Regel nicht direkt verwendet — bluetooth_rfcomm und bluetooth_l2cap bauen darauf auf.

Protokoll-Konstanten

Konstante Wert Beschreibung
AF_BLUETOOTH 31 Socket-Family für Bluetooth
BTPROTO_L2CAP 0 L2CAP-Protokoll (BLE und Classic)
BTPROTO_HCI 1 Host Controller Interface (raw)
BTPROTO_RFCOMM 3 RFCOMM: serielle Emulation (Classic)
BTPROTO_BNEP 4 Bluetooth Network Encapsulation
BTPROTO_SCO 6 Synchronous Connection-Oriented (Audio)
BT_PSM_ATT 31 ATT-Protokoll-PSM (0x001F)
SOCK_SEQPACKET 5 Paket-orientierter Socket (L2CAP BLE)

Security-Flags (BT_LM_*)

Konstante Beschreibung
BT_LM_AUTH Authentifizierung erforderlich
BT_LM_ENCRYPT Verschlüsselung erforderlich
BT_LM_SECURE Secure Simple Pairing erzwingen

Funktionen

Signatur Beschreibung
BTSocket(socktype: int64, protocol: int64): int64 Erzeugt AF_BLUETOOTH-Socket; gibt fd zurück
BTBind(fd: int64, addrPtr: int64, addrLen: int64): int64 Bindet Socket an lokale Adresse
BTConnect(fd: int64, addrPtr: int64, addrLen: int64): int64 Verbindet zum Remote-Gerät
BTListen(fd: int64, backlog: int64): int64 Öffnet Socket als Server
BTAccept(fd: int64, addrPtr: int64, addrLenPtr: int64): int64 Nimmt eingehende Verbindung an
BTSend(fd: int64, buf: int64, len: int64, flags: int64): int64 Sendet Daten
BTRecv(fd: int64, buf: int64, len: int64, flags: int64): int64 Empfängt Daten
BTGetSockOpt(fd: int64, level: int64, optname: int64, optval: int64, optlen: int64): int64 Liest Socket-Option
BTSetSockOpt(fd: int64, level: int64, optname: int64, optval: int64, optlen: int64): int64 Setzt Socket-Option
BTSocketPoll(fdsPtr: int64, nfds: int64, timeoutMs: int64): int64 poll() über mehrere BT-Sockets
BTIoctl(fd: int64, request: int64, argPtr: int64): int64 HCI-ioctl (HCIDEVUP, HCIGETDEVINFO …)
BTClose(fd: int64): int64 Schließt Socket
BTPollFdSet(ptr: int64, fd: int64, events: int64) Befüllt pollfd-Eintrag in einem Array
BTPollFdRevents(ptr: int64): int64 Liest revents aus einem pollfd-Eintrag

std.hardware.bluetooth_types

Adress-Typen und Hilfsfunktionen. Alle Bluetooth-Adressen sind heap-allozierte 6-Byte-Puffer (int64 als Zeiger).

Größen-Konstanten

Konstante Wert Beschreibung
BT_BDADDR_SIZE 6 Größe einer Bluetooth-MAC-Adresse in Bytes
BT_SOCKADDR_RC_SIZE 10 Größe von struct sockaddr_rc (RFCOMM)
BT_SOCKADDR_L2_SIZE 14 Größe von struct sockaddr_l2 (L2CAP)
BDADDR_BREDR 0 Klassisches Bluetooth (BR/EDR)
BDADDR_LE_PUBLIC 1 BLE — öffentliche Adresse
BDADDR_LE_RANDOM 2 BLE — zufällige Adresse

Funktionen

Signatur Beschreibung
BTAddrFromBytes(b0..b5: int64): int64 Erzeugt Adress-Puffer aus 6 einzelnen Bytes; gibt Zeiger zurück
BTAddrGetByte(addr: int64, byteIdx: int64): int64 Liest ein Adress-Byte (Index 0–5)
BTAddrToUInt64(addr: int64): int64 Gibt Adresse als uint64 zurück
BTAddrToStr(addr: int64, outBuf: int64) Schreibt AA:BB:CC:DD:EE:FF-String nach outBuf (min. 18 Bytes)
BTStrToAddr(s: int64): int64 Parst AA:BB:CC:DD:EE:FF-String; gibt Adress-Zeiger zurück
BTSockAddrRcCreate(buf: int64, bdaddr: int64, channel: int64) Füllt struct sockaddr_rc für RFCOMM
BTSockAddrL2Create(buf: int64, psm: int64, bdaddr: int64, addrType: int64) Füllt struct sockaddr_l2 für L2CAP
BTSockAddrRcReadAddr(buf: int64): int64 Liest bdaddr aus sockaddr_rc
BTSockAddrRcReadChannel(buf: int64): int64 Liest channel aus sockaddr_rc

import std.hardware.bluetooth_types;
import std.alloc;

var addr := BTStrToAddr("AA:BB:CC:DD:EE:FF");
var outBuf: int64 := alloc(18);
BTAddrToStr(addr, outBuf);  // → "AA:BB:CC:DD:EE:FF"


std.hardware.bluetooth_dbus

Steuerungsebene über das BlueZ-D-Bus-Interface. Ermöglicht Gerätesuche, Pairing und Verbindungsaufbau ohne direkten HCI-Zugriff. Erfordert einen laufenden BlueZ-Daemon (bluetoothd).

Wichtige Konstanten

Konstante Beschreibung
DBUS_TYPE_METHOD_CALL Nachrichtentyp: Methodenaufruf
DBUS_HDR_PATH Header-Feld: Objekt-Pfad
DBUS_HDR_INTERFACE Header-Feld: Interface-Name
DBUS_HDR_MEMBER Header-Feld: Methoden-/Signal-Name
DBUS_HDR_DESTINATION Header-Feld: Ziel-Bus-Name

Funktionen

Signatur Beschreibung
BlueZOpenConnection(): int64 Öffnet Unix-Domain-Socket zum BlueZ-Daemon; gibt fd zurück
BlueZClose(fd: int64) Schließt D-Bus-Verbindung
BlueZStartDiscovery(fd: int64, adapterPath: int64, pathLen: int64): int64 Startet Gerätescan auf dem Adapter (z. B. /org/bluez/hci0)
BlueZStopDiscovery(fd: int64, adapterPath: int64, pathLen: int64): int64 Stoppt den Scan
BlueZGetManagedObjects(fd: int64, outBuf: int64, maxLen: int64): int64 Liest alle bekannten Geräte und deren Properties
BlueZFindDeviceAddress(data: int64, dataLen: int64, addrBuf: int64): int64 Sucht Geräteadresse in GetManagedObjects-Antwort
BlueZDiscoverDevices(fd: int64, adapterPath: int64, pathLen: int64, …): int64 Kombinierter Scan-Helfer: startet, wartet, liest Geräteliste
BlueZPairDevice(fd: int64, devicePath: int64, pathLen: int64): int64 Startet Pairing-Prozess mit einem Gerät
BlueZConnectDevice(fd: int64, devicePath: int64, pathLen: int64): int64 Verbindet mit einem bekannten Gerät
BlueZDisconnectDevice(fd: int64, devicePath: int64, pathLen: int64): int64 Trennt Verbindung

import std.hardware.bluetooth_dbus;
import std.hardware.bluetooth_types;
import std.alloc;
import std.io;

fn ScanDevices(): void {
    var fd := BlueZOpenConnection();
    var adapterPath: pchar := "/org/bluez/hci0";
    var pathLen: int64 := 16;

    BlueZStartDiscovery(fd, adapterPath, pathLen);
    Sleep(5000);
    BlueZStopDiscovery(fd, adapterPath, pathLen);

    var buf: int64 := alloc(4096);
    BlueZGetManagedObjects(fd, buf, 4096);

    var addrBuf: int64 := alloc(18);
    BlueZFindDeviceAddress(buf, 4096, addrBuf);
    Print(addrBuf);

    BlueZClose(fd);
    free(buf, 4096);
    free(addrBuf, 18);
}


std.hardware.bluetooth_rfcomm

RFCOMM emuliert einen seriellen Port über Bluetooth Classic (BR/EDR). Typische Anwendungen: Verbindung zu Mikrocontrollern (HC-05, HC-06), Barcode-Scannern und Legacy-Geräten.

Funktionen

Signatur Beschreibung
RFCommConnect(bdaddr: int64, channel: int64): int64 Verbindet als Client; gibt fd zurück
RFCommListen(channel: int64, backlog: int64): int64 Öffnet Server-Socket
RFCommAccept(listenFd: int64, remoteAddrOut: int64): int64 Nimmt Verbindung an; füllt remoteAddrOut
RFCommSend(fd: int64, buf: int64, len: int64): int64 Sendet Daten
RFCommSendAll(fd: int64, buf: int64, len: int64): int64 Sendet alle Daten (loop bis len Bytes gesendet)
RFCommRecv(fd: int64, buf: int64, len: int64): int64 Empfängt Daten
RFCommSetSecurity(fd: int64, flags: int64): int64 Setzt Sicherheitsstufe (BT_LM_AUTH, BT_LM_ENCRYPT …)
RFCommPoll(fd: int64, timeoutMs: int64): int64 Wartet auf eingehende Daten (> 0 = Daten verfügbar)
RFCommClose(fd: int64): int64 Schließt Verbindung

import std.hardware.bluetooth_rfcomm;
import std.hardware.bluetooth_types;
import std.alloc;
import std.io;

fn ConnectArduino(): void {
    var addr := BTStrToAddr("98:D3:31:F5:AB:CD");
    var fd := RFCommConnect(addr, 1);

    var msg: pchar := "LED:ON\n";
    RFCommSendAll(fd, msg, 7);

    var buf: int64 := alloc(64);
    var n := RFCommRecv(fd, buf, 63);
    Print(buf);

    RFCommClose(fd);
    free(buf, 64);
}


std.hardware.bluetooth_l2cap

L2CAP ist die Transportschicht für BLE-Verbindungen. Diese Unit enthält zusätzlich eine vollständige ATT-Implementierung (Attribute Protocol) — die Grundlage für GATT.

L2CAP-Funktionen

Signatur Beschreibung
L2CapConnect(bdaddr: int64, psm: int64, addrType: int64): int64 Verbindet L2CAP-Socket; addrType: BDADDR_LE_PUBLIC / BDADDR_LE_RANDOM
L2CapListen(psm: int64, backlog: int64): int64 Öffnet Server-Socket
L2CapSetMtu(fd: int64, imtu: int64): int64 Setzt Input-MTU
L2CapClose(fd: int64): int64 Schließt Verbindung
L2CapPoll(fd: int64, timeoutMs: int64): int64 Wartet auf eingehende Daten

ATT-Funktionen

Signatur Beschreibung
AttExchangeMtu(fd: int64, clientMtu: int64): int64 MTU-Verhandlung; gibt Server-MTU zurück
AttSend(fd: int64, opcode: int64, payload: int64, payloadLen: int64): int64 Sendet rohe ATT-PDU
AttRecv(fd: int64, opcodeOut: int64, dataBuf: int64, bufLen: int64): int64 Empfängt ATT-PDU; schreibt Opcode nach opcodeOut
AttReadChar(fd: int64, handle: int64, dataBuf: int64, bufLen: int64): int64 Liest Attribut per Handle (ATT_OP_READ_REQ)
AttWriteChar(fd: int64, handle: int64, data: int64, dataLen: int64): int64 Schreibt Attribut mit Antwort (ATT_OP_WRITE_REQ)
AttWriteCmd(fd: int64, handle: int64, data: int64, dataLen: int64): int64 Schreibt ohne Antwort (ATT_OP_WRITE_CMD, 0x52)
AttRecvNotification(fd: int64, handleOut: int64, dataBuf: int64, bufLen: int64): int64 Empfängt ATT_OP_HANDLE_VALUE_NTF

ATT-Konstanten (Auswahl)

Konstante Wert Beschreibung
ATT_DEFAULT_MTU 23 Standard BLE ATT MTU
ATT_MAX_MTU 517 Maximal verhandelbare MTU
ATT_OP_READ_REQ 10 Lese-Request
ATT_OP_WRITE_REQ 18 Schreib-Request (mit ACK)
ATT_OP_WRITE_CMD 82 Schreib-Command (ohne ACK)
ATT_OP_HANDLE_VALUE_NTF 27 Notification (kein ACK)
ATT_OP_HANDLE_VALUE_IND 29 Indication (ACK erforderlich)

std.hardware.bluetooth_gattc

GATT-Client baut auf einem L2CAP/ATT-fd auf. Der fd wird vorher via L2CapConnect erzeugt. Servicelisten und Characteristic-Listen werden in heap-allokierten Puffern gehalten; Accessor-Funktionen lesen einzelne Felder heraus.

Service-Konstanten

Konstante UUID Beschreibung
GATT_SVC_GENERIC_ACCESS 0x1800 Generic Access Service
GATT_SVC_GENERIC_ATTRIBUTE 0x1801 Generic Attribute Service
GATT_SVC_HEART_RATE 0x180D Heart Rate Service
GATT_SVC_BATTERY 0x180F Battery Service
GATT_SVC_DEVICE_INFO 0x180A Device Information Service
GATT_SVC_CURRENT_TIME 0x1805 Current Time Service

Characteristic-UUID-Konstanten

Konstante UUID Beschreibung
GATT_UUID_DEVICE_NAME 0x2A00 Gerätename
GATT_UUID_HR_MEASUREMENT 0x2A37 Heart Rate Measurement
GATT_UUID_HR_BODY_LOCATION 0x2A38 Body Sensor Location
GATT_UUID_BATTERY_LEVEL 0x2A19 Akkustand (0–100 %)
GATT_UUID_FIRMWARE_REV 0x2A26 Firmware-Revision
GATT_UUID_MODEL_NUMBER 0x2A24 Modellnummer
GATT_UUID_CCCD 0x2902 Client Characteristic Configuration (Notification-Enable)

Properties-Bits

Konstante Beschreibung
GATT_PROP_READ Characteristic ist lesbar
GATT_PROP_WRITE_NO_RSP Schreiben ohne Antwort (Write Command)
GATT_PROP_WRITE Schreiben mit Antwort (Write Request)
GATT_PROP_NOTIFY Server kann Notifications senden
GATT_PROP_INDICATE Server kann Indications senden (mit ACK)

Discovery-Funktionen

Signatur Beschreibung
GattDiscoverServices(fd: int64, outBuf: int64, maxServices: int64): int64 Entdeckt alle Primary Services; gibt Anzahl zurück
GattDiscoverChars(fd: int64, startHandle: int64, endHandle: int64, outBuf: int64, maxChars: int64): int64 Entdeckt Characteristics in einem Service-Handle-Bereich
GattFindServiceByUUID(svcBuf: int64, svcCount: int64, uuid: int64): int64 Sucht Service-Index nach UUID; −1 wenn nicht gefunden
GattFindCharByUUID(charBuf: int64, charCount: int64, uuid: int64): int64 Sucht Characteristic-Index nach UUID; −1 wenn nicht gefunden

Puffer-Accessoren

Direktzugriff auf den internen Puffer:

Signatur Beschreibung
GattSvcStart(buf: int64, idx: int64): int64 Start-Handle des Services
GattSvcEnd(buf: int64, idx: int64): int64 End-Handle des Services
GattSvcUUID(buf: int64, idx: int64): int64 UUID des Services (16-Bit)
GattCharDecl(buf: int64, idx: int64): int64 Declaration-Handle der Characteristic
GattCharValue(buf: int64, idx: int64): int64 Value-Handle der Characteristic
GattCharUUID(buf: int64, idx: int64): int64 UUID der Characteristic (16-Bit)
GattCharProps(buf: int64, idx: int64): int64 Properties-Bitmask der Characteristic

Read/Write/Notify

Signatur Beschreibung
GattReadChar(fd: int64, valueHandle: int64, dataBuf: int64, bufLen: int64): int64 Liest Characteristic-Wert
GattWriteChar(fd: int64, valueHandle: int64, data: int64, dataLen: int64): int64 Schreibt Wert mit Antwort
GattWriteCmd(fd: int64, valueHandle: int64, data: int64, dataLen: int64): int64 Schreibt ohne Antwort
GattEnableNotification(fd: int64, cccdHandle: int64): int64 Aktiviert Notifications (schreibt 0x0001 in CCCD)
GattDisableNotification(fd: int64, cccdHandle: int64): int64 Deaktiviert Notifications
GattEnableIndication(fd: int64, cccdHandle: int64): int64 Aktiviert Indications (schreibt 0x0002 in CCCD)
GattRecvNotification(fd: int64, handleOut: int64, dataBuf: int64, bufLen: int64): int64 Empfängt nächste Notification; schreibt Handle nach handleOut
GattPoll(fd: int64, timeoutMs: int64): int64 Wartet auf Notification/Indication
ReadHeartRate(fd: int64, hrHandle: int64, …): int64 High-Level-Helfer: liest Herzrate als BPM
ReadBatteryLevel(fd: int64, battHandle: int64): int64 High-Level-Helfer: liest Akkustand (0–100)

import std.hardware.bluetooth_l2cap;
import std.hardware.bluetooth_gattc;
import std.hardware.bluetooth_types;
import std.alloc;
import std.io;

fn ReadBattery(addrStr: pchar): int64 {
    var addr := BTStrToAddr(addrStr);
    var fd   := L2CapConnect(addr, BT_PSM_ATT, BDADDR_LE_PUBLIC);

    AttExchangeMtu(fd, 512);

    var svcBuf: int64 := alloc(GATT_SVC_RECORD_SIZE * 16);
    var svcCount := GattDiscoverServices(fd, svcBuf, 16);

    var idx := GattFindServiceByUUID(svcBuf, svcCount, GATT_SVC_BATTERY);
    var charBuf: int64 := alloc(GATT_CHAR_RECORD_SIZE * 8);
    GattDiscoverChars(fd, GattSvcStart(svcBuf, idx), GattSvcEnd(svcBuf, idx),
                      charBuf, 8);

    var cidx := GattFindCharByUUID(charBuf, 8, GATT_UUID_BATTERY_LEVEL);
    var valBuf: int64 := alloc(4);
    GattReadChar(fd, GattCharValue(charBuf, cidx), valBuf, 4);
    var level: int64 := peek8(valBuf);

    L2CapClose(fd);
    free(svcBuf, GATT_SVC_RECORD_SIZE * 16);
    free(charBuf, GATT_CHAR_RECORD_SIZE * 8);
    free(valBuf, 4);
    return level;
}

fn MonitorHeartRate(addrStr: pchar): void {
    var addr := BTStrToAddr(addrStr);
    var fd   := L2CapConnect(addr, BT_PSM_ATT, BDADDR_LE_PUBLIC);
    AttExchangeMtu(fd, 512);

    var svcBuf: int64 := alloc(GATT_SVC_RECORD_SIZE * 16);
    var svcCount := GattDiscoverServices(fd, svcBuf, 16);
    var idx := GattFindServiceByUUID(svcBuf, svcCount, GATT_SVC_HEART_RATE);

    var charBuf: int64 := alloc(GATT_CHAR_RECORD_SIZE * 8);
    GattDiscoverChars(fd, GattSvcStart(svcBuf, idx), GattSvcEnd(svcBuf, idx), charBuf, 8);
    var cidx := GattFindCharByUUID(charBuf, 8, GATT_UUID_HR_MEASUREMENT);

    GattEnableNotification(fd, GattCharValue(charBuf, cidx) + 1);  // CCCD handle

    var ntfBuf: int64 := alloc(32);
    var handleOut: int64 := alloc(8);
    var i: int64 := 0;
    while (i < 10) {
        GattPoll(fd, 5000);
        GattRecvNotification(fd, handleOut, ntfBuf, 32);
        Print("BPM: ");
        PrintLn(IntToStr(peek8(ntfBuf + 1)));  // Byte 0 = Flags, Byte 1 = BPM
        i := i + 1;
    }

    L2CapClose(fd);
}


std.hardware.bluetooth_gatts

GATT-Server registriert Services über D-Bus und macht das Gerät zum BLE-Peripheral. Erfordert eine aktive BlueZOpenConnection.

Puffer-Accessoren

Direktzugriff auf den internen Puffer:

Signatur Beschreibung
GattsCharDefUUID(buf: int64, idx: int64): int64 UUID der Characteristic-Definition
GattsCharDefProps(buf: int64, idx: int64): int64 Properties-Bits
GattsCharDefValuePtr(buf: int64, idx: int64): int64 Zeiger auf aktuellen Wert
GattsCharDefValueLen(buf: int64, idx: int64): int64 Länge des aktuellen Werts
GattsCharDefSetValue(buf: int64, idx: int64, ptr: int64, len: int64) Setzt neuen Wert

Server-Funktionen

Signatur Beschreibung
GattServerRegister(dbusFd: int64, …): int64 Registriert Service-Struktur via D-Bus bei BlueZ
GattServerHandleNext(fd: int64, svcUUID: int64, …): int64 Verarbeitet nächste eingehende Read/Write-Anfrage
GattServerSendNotification(fd: int64, …): int64 Sendet Notification an verbundene Centrals

std.hardware.bluetooth_ext

Ergänzungen für aktives BLE-Scanning, Advertising-Pakete und Bluetooth-Mesh.

Scan-Puffer-Konstanten

Konstante Wert Beschreibung
BLE_SCAN_RESULT_SIZE 128 Größe eines einzelnen Scan-Ergebnis-Eintrags

Scan-Ergebnis-Accessoren

Signatur Beschreibung
BleScanResultAddr(buf: int64, idx: int64): int64 Zeiger auf Geräteadresse (6 Bytes)
BleScanResultRSSI(buf: int64, idx: int64): int64 Signalstärke in dBm
BleScanResultIsConnectable(buf: int64, idx: int64): int64 1 wenn Gerät verbindbar
BleScanResultNameLen(buf: int64, idx: int64): int64 Länge des Gerätenamens
BleScanResultName(buf: int64, idx: int64): int64 Zeiger auf Gerätenamen
BleScanResultAdvLen(buf: int64, idx: int64): int64 Länge der Advertising-Daten
BleScanResultAdvData(buf: int64, idx: int64): int64 Zeiger auf rohe Advertising-Daten

Scanner-Funktionen

Signatur Beschreibung
BleScannerStart(fd: int64, adapterPath: int64, pathLen: int64): int64 Startet BLE-Scan via BlueZ
BleScannerStop(fd: int64, adapterPath: int64, pathLen: int64): int64 Stoppt Scan
BleScannerReadNext(fd: int64, result: int64): int64 Liest nächstes Scan-Ergebnis in result-Puffer
BleScan(fd: int64, adapterPath: int64, pathLen: int64, …): int64 Kombiniert Start, Collect und Stop

Advertising-Konstanten

Konstante Beschreibung
BLE_ADV_TYPE_PERIPHERAL Verbindbares Advertising (Peripheral-Rolle)
BLE_ADV_TYPE_BROADCAST Nicht-verbindbares Advertising (Beacon)
BLE_ADV_CONFIG_SIZE Größe des Advertising-Konfigurations-Puffers

Advertising-Funktionen

Signatur Beschreibung
BleAdvertisementRegister(fd: int64, advConfig: int64, serial: int64): int64 Registriert Advertising-Konfiguration bei BlueZ
BleAdvertisementHandleGetAll(fd: int64, advConfig: int64, serial: int64): int64 Verarbeitet eingehende D-Bus-Nachrichten für Advertising
BleAdvertisementUnregister(fd: int64, …): int64 Stoppt Advertising

Mesh-Funktionen

Signatur Beschreibung
MeshNetworkJoin(fd: int64, uuid: int64): int64 Tritt einem Bluetooth-Mesh-Netzwerk bei
MeshSend(fd: int64, dst: int64, data: int64, dataLen: int64): int64 Sendet Mesh-Nachricht an Adresse
MeshRecv(fd: int64, srcOut: int64, dataBuf: int64, bufLen: int64): int64 Empfängt Mesh-Nachricht; schreibt Quelladresse nach srcOut

import std.hardware.bluetooth_ext;
import std.hardware.bluetooth_dbus;
import std.hardware.bluetooth_types;
import std.alloc;
import std.io;

fn ScanAndPrint(): void {
    var fd := BlueZOpenConnection();
    var path: pchar := "/org/bluez/hci0";

    var resultBuf: int64 := alloc(BLE_SCAN_RESULT_SIZE * 32);
    var count := BleScan(fd, path, 16, resultBuf, 32);

    var i: int64 := 0;
    while (i < count) {
        if (BleScanResultIsConnectable(resultBuf, i) != 0) {
            var nameBuf: int64 := alloc(64);
            var nameLen := BleScanResultNameLen(resultBuf, i);
            // Name-Bytes kopieren …
            PrintLn("RSSI: " + IntToStr(BleScanResultRSSI(resultBuf, i)) + " dBm");
            free(nameBuf, 64);
        }
        i := i + 1;
    }

    BlueZClose(fd);
    free(resultBuf, BLE_SCAN_RESULT_SIZE * 32);
}


std.hardware.bluetooth_ai

KI-native Bluetooth-Profile: Definiert Standard-BLE-Profile als typsichere Compiler-Typen, sodass manuelle UUID-Verwaltung und Buffer-Arithmetik entfallen. Wrapper-Schicht über bluetooth_gattc.

import std.hardware.bluetooth_ai;
import std.hardware.bluetooth_types;

var addr := BTStrToAddr("AA:BB:CC:DD:EE:FF");

// Typsichere Profile — Compiler kennt die Semantik
var sensor: BleSensor<HeartRate>;
sensor.Connect(addr);
var bpm: HeartRateValue := sensor.Read();
PrintLn(IntToStr(bpm.value) + " bpm");

var batt: BleSensor<Battery>;
batt.Connect(addr);
PrintLn(IntToStr(batt.Read().percent) + " %");

Unterstützte Profile

Profil-Typ Service-UUID Beschreibung
BleSensor<HeartRate> 0x180D Herzrate und Körperkontakt-Erkennung
BleSensor<Battery> 0x180F Akkustand (0–100 %)
BleSensor<Temperature> 0x1809 Körper- oder Umgebungstemperatur
BleSensor<Glucose> 0x1808 Blutzuckermessung
BleSensor<BloodPressure> 0x1810 Blutdruck (systolisch/diastolisch)
BleSensor<StepCounter> 0x1814 Schrittanzahl und Distanz
BleActuator<LED> benutzerdefiniert Generischer LED-Aktor
BleActuator<Relay> benutzerdefiniert Generischer Relais-Aktor

Verwandte Units

Letzte Aktualisierung: 2026-06-05