bluetooth — low-level Bluetooth¶
Deze module biedt een interface naar de ingebouwde Bluetooth-controller. Het ondersteunt Bluetooth Low Energy (BLE) in de rollen Central, Peripheral, Broadcaster en Observer, evenals GATT Server en Client en L2CAP-verbindingsgerichte kanalen. Een apparaat kan tegelijkertijd in meerdere rollen functioneren. Pairing en bonding worden eveneens ondersteund.
Deze API is bedoeld om aan te sluiten op het Bluetooth-protocol op laag niveau en biedt bouwstenen voor abstracties op hoger niveau, zoals specifieke apparaattypes.
Tip
Geef voor de meeste toepassingen de voorkeur aan de aioble-bibliotheek op hoger niveau, die een op asyncio gebaseerde wrapper rond deze module biedt. Zie aioble — Async BLE.
class BLE¶
- class bluetooth.BLE¶
Retourneert het singleton BLE-object.
Configuratie
- active(active: bool | None = None, /) bool¶
Wijzigt optioneel de actieve status van de BLE-radio en retourneert de huidige status.
De radio moet actief worden gemaakt voordat andere methoden van deze klasse gebruikt kunnen worden.
- config(param: str, /) Any¶
- config(*, **kwargs: Any) None
Haal configuratiewaarden van de BLE-interface op of stel ze in. Om een waarde op te halen moet de parameternaam tussen aanhalingstekens als string worden opgegeven, en er wordt slechts één parameter tegelijk opgevraagd. Om waarden in te stellen gebruikt u de keyword-syntaxis, en kunnen er één of meer parameters tegelijk worden ingesteld.
Momenteel ondersteunde waarden zijn:
'mac': Het huidige adres dat in gebruik is, afhankelijk van de huidige adresmodus. Dit retourneert een tuple van(addr_type, addr).Zie
gap_scanvoor details over het adrestype.Dit kan alleen worden opgevraagd terwijl de interface momenteel actief is.
'addr_mode': Stelt de adresmodus in. Waarden zijn:Waarde
Naam
Gedrag
0x00PUBLIC
Gebruik het publieke adres van de controller.
0x01RANDOM
Gebruik een gegenereerd statisch adres.
0x02RPA
Gebruik resolvable private addresses.
0x03NRPA
Gebruik non-resolvable private addresses.
Standaard gebruikt de interface een PUBLIC-adres indien beschikbaar, anders gebruikt het een RANDOM-adres.
'gap_name': Haal de GAP-apparaatnaam op of stel deze in, die wordt gebruikt door de Generic Access service (UUID0x1800), Device Name-karakteristiek (UUID0x2a00). Dit kan op elk moment worden ingesteld en meerdere keren worden gewijzigd.'rxbuf': Haal de grootte in bytes op of stel deze in van de interne buffer die wordt gebruikt om inkomende events op te slaan. Deze buffer is globaal voor de gehele BLE-driver en verwerkt dus inkomende data voor alle events, inclusief alle karakteristieken. Het verhogen hiervan zorgt voor betere verwerking van burst-gewijze inkomende data (bijvoorbeeld scanresultaten) en de mogelijkheid om grotere karakteristiekwaarden te ontvangen.'mtu': Haal de MTU op of stel deze in die zal worden gebruikt tijdens een ATT MTU-uitwisseling. De resulterende MTU is het minimum van deze en de MTU van het externe apparaat. ATT MTU-uitwisseling gebeurt niet automatisch (tenzij het externe apparaat deze initieert), en moet handmatig worden geïnitieerd metgattc_exchange_mtu. Gebruik het_IRQ_MTU_EXCHANGED-event om de MTU voor een bepaalde verbinding te achterhalen.'bond': Stelt in of bonding wordt ingeschakeld tijdens pairing. Wanneer ingeschakeld zullen pairingverzoeken de “bond”-vlag instellen en zullen de sleutels door beide apparaten worden opgeslagen.'mitm': Stelt in of MITM-bescherming vereist is voor pairing.'io': Stelt de I/O-mogelijkheden van dit apparaat in.Beschikbare opties zijn:
Constante
Waarde
Mogelijkheid
_IO_CAPABILITY_DISPLAY_ONLY0
Alleen weergave
_IO_CAPABILITY_DISPLAY_YESNO1
Weergave met ja/nee-invoer
_IO_CAPABILITY_KEYBOARD_ONLY2
Alleen toetsenbord
_IO_CAPABILITY_NO_INPUT_OUTPUT3
Geen invoer of uitvoer
_IO_CAPABILITY_KEYBOARD_DISPLAY4
Toetsenbord en weergave
'le_secure': Stelt in of “LE Secure”-pairing vereist is. Standaard is dit false (d.w.z. “Legacy Pairing” toestaan).
Eventafhandeling
- irq(handler: Callable[[int, Tuple], Any | None], /) None¶
Registreert een callback voor events van de BLE-stack. De handler neemt twee argumenten,
event(dat een van de onderstaande codes is) endata(dat een event-specifieke tuple van waarden is).Opmerking: Als optimalisatie om onnodige allocaties te voorkomen, zijn de items
addr,adv_data,char_data,notify_dataenuuidin de tuples alleen-lezen memoryview-instanties die wijzen naar de interne ringbuffer vanbluetooth, en zijn ze alleen geldig tijdens de uitvoering van de IRQ-handlerfunctie. Als uw programma een van deze waarden moet opslaan om er na het terugkeren van de IRQ-handler toegang toe te hebben (bijv. door het op te slaan in een klasse-instantie of globale variabele), dan moet het een kopie van de data maken, ofwel metbytes()ofbluetooth.UUID(), zoals zo:connected_addr = bytes(addr) # equivalently: adv_data, char_data, or notify_data matched_uuid = bluetooth.UUID(uuid)
De IRQ-handler voor een scanresultaat zou bijvoorbeeld de
adv_datakunnen inspecteren om te bepalen of het het juiste apparaat is, en pas dan de adresdata kopiëren om elders in het programma te gebruiken. En om data binnen de IRQ-handler af te drukken isprint(bytes(addr))nodig.Een handler dispatcht doorgaans op basis van de eventcode en pakt de event-specifieke payload-tuple uit:
def bt_irq(event, data): if event == _IRQ_CENTRAL_CONNECT: conn_handle, addr_type, addr = data ... elif event == _IRQ_SCAN_RESULT: addr_type, addr, adv_type, rssi, adv_data = data ...
Elke eventcode, de payload die deze levert en een korte beschrijving worden hieronder vermeld. Voor events waarvan het
status-veld wordt genoemd, isstatus0bij succes en een implementatiespecifieke waarde verschillend van nul bij mislukking.Constante
Waarde
Event
Payload-tuple
_IRQ_CENTRAL_CONNECT1
Een central heeft verbinding gemaakt met dit peripheral.
(conn_handle, addr_type, addr)_IRQ_CENTRAL_DISCONNECT2
Een central heeft de verbinding met dit peripheral verbroken.
(conn_handle, addr_type, addr)_IRQ_GATTS_WRITE3
Een verbonden client heeft naar een lokale karakteristiek of descriptor geschreven. Gebruik
gatts_readom de nieuwe waarde op te halen.(conn_handle, attr_handle)_IRQ_GATTS_READ_REQUEST4
Een verbonden client heeft een leesverzoek uitgevoerd. Retourneer een foutcode verschillend van nul uit de onderstaande tabel om het lezen te weigeren, of
0/Noneom het te accepteren.(conn_handle, attr_handle)_IRQ_SCAN_RESULT5
Er is een enkel advertentiepakket ontvangen tijdens een actieve scan.
(addr_type, addr, adv_type, rssi, adv_data)_IRQ_SCAN_DONE6
De huidige scan is beëindigd, ofwel omdat de geconfigureerde duur is verstreken of omdat
gap_scan(None)is aangeroepen.()_IRQ_PERIPHERAL_CONNECT7
Een eerder uitgevoerde
gap_connectis geslaagd.(conn_handle, addr_type, addr)_IRQ_PERIPHERAL_DISCONNECT8
Een verbonden peripheral heeft de verbinding verbroken.
(conn_handle, addr_type, addr)_IRQ_GATTC_SERVICE_RESULT9
Eén service is gevonden door
gattc_discover_services.(conn_handle, start_handle, end_handle, uuid)_IRQ_GATTC_SERVICE_DONE10
Het ontdekken van services is voltooid.
(conn_handle, status)_IRQ_GATTC_CHARACTERISTIC_RESULT11
Eén karakteristiek is gevonden door
gattc_discover_characteristics.(conn_handle, end_handle, value_handle, properties, uuid)_IRQ_GATTC_CHARACTERISTIC_DONE12
Het ontdekken van karakteristieken is voltooid.
(conn_handle, status)_IRQ_GATTC_DESCRIPTOR_RESULT13
Eén descriptor is gevonden door
gattc_discover_descriptors.(conn_handle, dsc_handle, uuid)_IRQ_GATTC_DESCRIPTOR_DONE14
Het ontdekken van descriptors is voltooid.
(conn_handle, status)_IRQ_GATTC_READ_RESULT15
Een eerder uitgevoerde
gattc_readheeft data geretourneerd.(conn_handle, value_handle, char_data)_IRQ_GATTC_READ_DONE16
Een eerder uitgevoerde
gattc_readis voltooid.(conn_handle, value_handle, status)_IRQ_GATTC_WRITE_DONE17
Een eerder uitgevoerde
gattc_writeis bevestigd.(conn_handle, value_handle, status)_IRQ_GATTC_NOTIFY18
Een externe server heeft een (onbevestigde) notificatie verzonden.
(conn_handle, value_handle, notify_data)_IRQ_GATTC_INDICATE19
Een externe server heeft een (bevestigde) indicatie verzonden.
(conn_handle, value_handle, notify_data)_IRQ_GATTS_INDICATE_DONE20
Een eerder verzonden indicatie is bevestigd door de client (of er is een time-out opgetreden).
(conn_handle, value_handle, status)_IRQ_MTU_EXCHANGED21
Een ATT MTU-uitwisseling is voltooid (geïnitieerd door een van beide kanten).
(conn_handle, mtu)_IRQ_L2CAP_ACCEPT22
Een extern apparaat heeft een L2CAP-verbinding aangevraagd op een PSM waarop dit apparaat luistert. Retourneer een geheel getal verschillend van nul om te weigeren, of
0/Noneom te accepteren.(conn_handle, cid, psm, our_mtu, peer_mtu)_IRQ_L2CAP_CONNECT23
Er is nu een L2CAP-kanaal tot stand gebracht, ofwel door een inkomend verzoek te accepteren of door een uitgaande
l2cap_connectte voltooien.(conn_handle, cid, psm, our_mtu, peer_mtu)_IRQ_L2CAP_DISCONNECT24
Een L2CAP-kanaal is verbroken.
statusis0bij een schone verbreking, of verschillend van nul als een uitgaande verbindingspoging is mislukt.(conn_handle, cid, psm, status)_IRQ_L2CAP_RECV25
Er is data binnengekomen op een L2CAP-kanaal. Roep
l2cap_recvintoaan om het te lezen.(conn_handle, cid)_IRQ_L2CAP_SEND_READY26
Een eerdere
l2cap_senddieFalseretourneerde is afgevoerd en het kanaal is weer gereed. Eenstatusverschillend van nul betekent dat de verzendbuffer is overgelopen en dat de applicatie de data opnieuw moet verzenden.(conn_handle, cid, status)_IRQ_CONNECTION_UPDATE27
Het externe apparaat heeft de verbindingsparameters bijgewerkt (interval, latentie, supervision-time-out).
(conn_handle, conn_interval, conn_latency, supervision_timeout, status)_IRQ_ENCRYPTION_UPDATE28
De encryptiestatus van een verbinding is gewijzigd, doorgaans nadat pairing of bonding is voltooid.
(conn_handle, encrypted, authenticated, bonded, key_size)_IRQ_GET_SECRET29
De stack vraagt om een opgeslagen bonding-secret. Als
keyNoneis, retourneer dan deindexde opgeslagen waarde vansec_type; retourneer anders de waarde die hoort bij de opgegeven(sec_type, key). RetourneerNoneals er niets is opgeslagen.(sec_type, index, key)_IRQ_SET_SECRET30
De stack vraagt de applicatie om een bonding-secret op te slaan. Retourneer
Truezodra dit is opgeslagen.(sec_type, key, value)_IRQ_PASSKEY_ACTION31
Een passkey-actie is vereist als onderdeel van de pairing. Reageer met
gap_passkey; zie de onderstaande passkey-actietabel voor de mogelijke acties.(conn_handle, action, passkey)Voor het
_IRQ_GATTS_READ_REQUEST-event zijn de beschikbare retourcodes:Constante
Waarde
Betekenis
_GATTS_NO_ERROR0x00Accepteer het leesverzoek.
_GATTS_ERROR_READ_NOT_PERMITTED0x02Lezen niet toegestaan.
_GATTS_ERROR_WRITE_NOT_PERMITTED0x03Schrijven niet toegestaan.
_GATTS_ERROR_INSUFFICIENT_AUTHENTICATION0x05Client is niet geauthenticeerd.
_GATTS_ERROR_INSUFFICIENT_AUTHORIZATION0x08Client is niet geautoriseerd.
_GATTS_ERROR_INSUFFICIENT_ENCRYPTION0x0fVerbinding is niet versleuteld.
Voor het
_IRQ_PASSKEY_ACTION-event zijn de beschikbare acties:Constante
Waarde
Betekenis
_PASSKEY_ACTION_NONE0
Geen actie vereist.
_PASSKEY_ACTION_INPUT2
Vraag de gebruiker om de passkey in te voeren die op het externe apparaat wordt weergegeven.
_PASSKEY_ACTION_DISPLAY3
Geef een passkey van 6 cijfers weer die het externe apparaat moet invoeren.
_PASSKEY_ACTION_NUMERIC_COMPARISON4
Bevestig dat de passkey overeenkomt met die op het externe apparaat wordt weergegeven.
Om ruimte te besparen in de firmware zijn deze constanten niet opgenomen in de
bluetooth-module. Voeg de constanten die u nodig hebt uit de bovenstaande lijsten toe aan uw programma.
Broadcaster-rol (Advertiser)
- gap_advertise(interval_us: int | None, adv_data: bytes | None = None, *, resp_data: bytes | None = None, connectable: bool = True) None¶
Begint met adverteren op het opgegeven interval (in microseconden). Dit interval wordt naar beneden afgerond op de dichtstbijzijnde 625us. Om te stoppen met adverteren, stelt u interval_us in op
None.adv_data en resp_data kunnen elk type zijn dat het bufferprotocol implementeert (bijv.
bytes,bytearray,str). adv_data wordt opgenomen in alle uitzendingen, en resp_data wordt verzonden als antwoord op een actieve scan.Opmerking: als adv_data (of resp_data)
Noneis, dan wordt de data die aan de vorige aanroep vangap_advertiseis doorgegeven hergebruikt. Hiermee kan een broadcaster het adverteren hervatten met enkelgap_advertise(interval_us). Om de advertentiepayload te wissen geeft u een legebytesdoor, d.w.z.b''.
Observer-rol (Scanner)
- gap_scan(duration_ms: int | None, interval_us: int = 1280000, window_us: int = 11250, active: bool = False, /) None¶
Voer een scanbewerking uit die de opgegeven duur duurt (in milliseconden).
Om onbeperkt te scannen, stelt u duration_ms in op
0.Om te stoppen met scannen, stelt u duration_ms in op
None.Gebruik interval_us en window_us om optioneel de duty cycle te configureren. De scanner zal window_us microseconden lopen elke interval_us microseconden, gedurende een totaal van duration_ms milliseconden. Het standaardinterval en -venster zijn respectievelijk 1,28 seconden en 11,25 milliseconden (achtergrondscannen).
Voor elk scanresultaat wordt het
_IRQ_SCAN_RESULT-event opgeroepen, met eventdata(addr_type, addr, adv_type, rssi, adv_data).addr_type-waarden geven publieke of willekeurige adressen aan:Waarde
Naam
Betekenis
0x00PUBLIC
Publiek apparaatadres.
0x01RANDOM
Willekeurig adres (statisch, RPA of NRPA; het type is gecodeerd in het adres zelf).
adv_type-waarden komen overeen met de Bluetooth-specificatie:Waarde
Naam
Betekenis
0x00ADV_IND
Verbindbare en scanbare niet-gerichte advertentie.
0x01ADV_DIRECT_IND
Verbindbare gerichte advertentie.
0x02ADV_SCAN_IND
Scanbare niet-gerichte advertentie.
0x03ADV_NONCONN_IND
Niet-verbindbare niet-gerichte advertentie.
0x04SCAN_RSP
Scanantwoord.
activekan opTrueworden gezet als u scanantwoorden in de resultaten wilt ontvangen.Wanneer het scannen wordt gestopt (ofwel omdat de duur is verstreken of wanneer het expliciet wordt gestopt), wordt het
_IRQ_SCAN_DONE-event opgeroepen.
Central-rol
Een central-apparaat kan verbinding maken met peripherals die het heeft ontdekt via de observer-rol (zie
gap_scan) of met een bekend adres.- gap_connect(addr_type: int | None, addr: bytes | None = None, scan_duration_ms: int = 2000, min_conn_interval_us: int | None = None, max_conn_interval_us: int | None = None, /) None¶
Maak verbinding met een peripheral.
Zie
gap_scanvoor details over adrestypes.Om een lopende verbindingspoging vroegtijdig te annuleren, roept u
gap_connect(None)aan.Bij succes wordt het
_IRQ_PERIPHERAL_CONNECT-event opgeroepen. Bij het annuleren van een verbindingspoging wordt het_IRQ_PERIPHERAL_DISCONNECT-event opgeroepen.Het apparaat wacht maximaal scan_duration_ms om een advertentiepayload van het apparaat te ontvangen.
Het verbindingsinterval kan in microseconden worden geconfigureerd met behulp van min_conn_interval_us en/of max_conn_interval_us. Anders wordt een standaardinterval gekozen, doorgaans tussen 30000 en 50000 microseconden. Een korter interval verhoogt de doorvoer, ten koste van het stroomverbruik.
Peripheral-rol
Een peripheral-apparaat wordt verondersteld verbindbare advertenties te verzenden (zie
gap_advertise). Het zal gewoonlijk fungeren als een GATT-server, nadat het eerst services en karakteristieken heeft geregistreerd metgatts_register_services.Wanneer een central verbinding maakt, wordt het
_IRQ_CENTRAL_CONNECT-event opgeroepen.Central- en Peripheral-rollen
- gap_disconnect(conn_handle: int, /) bool¶
Verbreek de opgegeven verbindingshandle. Dit kan ofwel een central zijn die verbinding heeft gemaakt met dit apparaat (als het als peripheral fungeert) of een peripheral waarmee dit apparaat eerder verbinding heeft gemaakt (als het als central fungeert).
Bij succes wordt het
_IRQ_PERIPHERAL_DISCONNECT- of_IRQ_CENTRAL_DISCONNECT-event opgeroepen.Retourneert
Falseals de verbindingshandle niet verbonden was, en andersTrue.
GATT-server
Een GATT-server heeft een set geregistreerde services. Elke service kan karakteristieken bevatten, die elk een waarde hebben. Karakteristieken kunnen ook descriptors bevatten, die zelf waarden hebben.
Deze waarden worden lokaal opgeslagen en zijn toegankelijk via hun “value handle” die wordt gegenereerd tijdens de serviceregistratie. Ze kunnen ook worden gelezen van of geschreven naar een extern client-apparaat. Daarnaast kan een server een karakteristiek “notificeren” naar een verbonden client via een verbindingshandle.
Een apparaat in de central- of peripheral-rol kan fungeren als GATT-server, hoewel het in de meeste gevallen gebruikelijker is dat een peripheral-apparaat als server fungeert.
Karakteristieken en descriptors hebben een standaard maximale grootte van 20 bytes (de standaard ATT MTU van 23 bytes minus een ATT-header van 3 bytes; een grotere onderhandelde MTU verhoogt deze limiet op zichzelf niet). Alles wat een client ernaar schrijft wordt tot deze lengte afgekapt. Elke lokale schrijfactie verhoogt echter de maximale grootte, dus als u grotere schrijfacties van een client naar een bepaalde karakteristiek wilt toestaan, gebruik dan
gatts_writena registratie, bijv.gatts_write(char_handle, bytes(100)).- gatts_register_services(services_definition: Sequence[Sequence], /) Sequence[Sequence[int]]¶
Configureert de server met de opgegeven services, waarbij eventuele bestaande services worden vervangen.
services_definition is een lijst van services, waarbij elke service een tuple van twee elementen is die een UUID en een lijst van characteristics bevat.
Elke characteristic is een tuple van twee of drie elementen die een UUID, een flags-waarde en optioneel een lijst van descriptors bevat.
Elke descriptor is een tuple van twee elementen die een UUID en een flags-waarde bevat.
De flags zijn een bitsgewijze OR-combinatie van de hieronder gedefinieerde flags. Deze stellen zowel het gedrag van de karakteristiek (of descriptor) in als de beveiligings- en privacyvereisten.
De retourwaarde is een lijst (één element per service) van tuples (elk element is een value handle). Karakteristiek- en descriptorhandles worden in dezelfde tuple afgevlakt, in de volgorde waarin ze zijn gedefinieerd.
Het volgende voorbeeld registreert twee services (Heart Rate en Nordic UART):
bt = bluetooth.BLE() bt.active(True) # Heart Rate service: one Heart Rate Measurement characteristic. HR_SERVICE = ( bluetooth.UUID(0x180D), ( (bluetooth.UUID(0x2A37), bluetooth.FLAG_READ | bluetooth.FLAG_NOTIFY), ), ) # Nordic UART service: a TX characteristic the client subscribes # to for notifications, and an RX characteristic it writes to. UART_SERVICE = ( bluetooth.UUID('6E400001-B5A3-F393-E0A9-E50E24DCCA9E'), ( (bluetooth.UUID('6E400003-B5A3-F393-E0A9-E50E24DCCA9E'), bluetooth.FLAG_READ | bluetooth.FLAG_NOTIFY), (bluetooth.UUID('6E400002-B5A3-F393-E0A9-E50E24DCCA9E'), bluetooth.FLAG_WRITE), ), ) ((hr,), (tx, rx)) = bt.gatts_register_services( (HR_SERVICE, UART_SERVICE), )
De drie value handles (
hr,tx,rx) kunnen worden gebruikt metgatts_read,gatts_write,gatts_notifyengatts_indicate.Opmerking: Het adverteren moet worden gestopt voordat services worden geregistreerd.
Beschikbare flags voor karakteristieken en descriptors zijn:
Constante
Waarde
Betekenis
_FLAG_BROADCAST0x0001Karakteristiek mag worden uitgezonden.
_FLAG_READ0x0002Client mag de waarde lezen.
_FLAG_WRITE_NO_RESPONSE0x0004Client mag schrijven zonder een antwoord te verwachten.
_FLAG_WRITE0x0008Client mag schrijven met een bevestigd antwoord.
_FLAG_NOTIFY0x0010Server mag notificaties verzenden (onbevestigd).
_FLAG_INDICATE0x0020Server mag indicaties verzenden (bevestigd).
_FLAG_AUTHENTICATED_SIGNED_WRITE0x0040Client mag ondertekende schrijfacties uitvoeren.
_FLAG_AUX_WRITE0x0100Uitgebreide eigenschappen: queued/reliable writes zijn toegestaan.
_FLAG_READ_ENCRYPTED0x0200Lezen vereist een versleutelde verbinding.
_FLAG_READ_AUTHENTICATED0x0400Lezen vereist een geauthenticeerde (MITM-beschermde) verbinding.
_FLAG_READ_AUTHORIZED0x0800Lezen vereist autorisatie op applicatieniveau.
_FLAG_WRITE_ENCRYPTED0x1000Schrijven vereist een versleutelde verbinding.
_FLAG_WRITE_AUTHENTICATED0x2000Schrijven vereist een geauthenticeerde (MITM-beschermde) verbinding.
_FLAG_WRITE_AUTHORIZED0x4000Schrijven vereist autorisatie op applicatieniveau.
Net als bij de bovenstaande eventconstanten worden deze flags niet geleverd door de
bluetooth-module; kopieer de flags die u nodig hebt naar uw programma.
- gatts_read(value_handle: int, /) bytes¶
Leest de lokale waarde voor deze handle (die ofwel is geschreven door
gatts_writeof door een externe client).
- gatts_write(value_handle: int, data: bytes, send_update: bool = False, /) None¶
Schrijft de lokale waarde voor deze handle, die door een client kan worden gelezen.
Als send_update
Trueis, dan worden alle geabonneerde clients geïnformeerd (via notificatie of indicatie, afhankelijk van waarop ze zijn geabonneerd en welke bewerkingen de karakteristiek ondersteunt) over deze schrijfactie.
- gatts_notify(conn_handle: int, value_handle: int, data: bytes | None = None, /) None¶
Verzendt een notificatieverzoek naar een verbonden client.
Als data
Noneis (de standaard), dan wordt de huidige lokale waarde (zoals ingesteld metgatts_write) verzonden.Anders, als data niet
Noneis, dan wordt die waarde naar de client verzonden als onderdeel van de notificatie. De lokale waarde wordt niet gewijzigd.Opmerking: De notificatie wordt verzonden ongeacht de abonnementsstatus van de client op deze karakteristiek.
- gatts_indicate(conn_handle: int, value_handle: int, data: bytes | None = None, /) None¶
Verzendt een indicatieverzoek naar een verbonden client.
Als data
Noneis (de standaard), dan wordt de huidige lokale waarde (zoals ingesteld metgatts_write) verzonden.Anders, als data niet
Noneis, dan wordt die waarde naar de client verzonden als onderdeel van de indicatie. De lokale waarde wordt niet gewijzigd.Bij bevestiging (of mislukking, bijv. time-out) wordt het
_IRQ_GATTS_INDICATE_DONE-event opgeroepen.Opmerking: De indicatie wordt verzonden ongeacht de abonnementsstatus van de client op deze karakteristiek.
- gatts_set_buffer(value_handle: int, len: int, append: bool = False, /) None¶
Stelt de interne buffergrootte voor een waarde in bytes in. Dit beperkt de grootst mogelijke schrijfactie die kan worden ontvangen. De standaard is 20 bytes (standaard ATT MTU van 23 minus de ATT-header van 3 bytes).
Het instellen van append op
Truezorgt ervoor dat alle externe schrijfacties aan de huidige waarde worden toegevoegd in plaats van deze te vervangen. Maximaal len bytes kunnen op deze manier worden gebufferd. Wanneer ugatts_readgebruikt, wordt de waarde na het lezen gewist. Deze functie is nuttig bij het implementeren van iets als de Nordic UART Service.
GATT-client
Een GATT-client kan karakteristieken op een externe GATT-server ontdekken en lezen/schrijven.
Het is gebruikelijker dat een apparaat in de central-rol als GATT-client fungeert, maar het is ook mogelijk dat een peripheral als client fungeert om informatie te ontdekken over de central die er verbinding mee heeft gemaakt (bijv. om de apparaatnaam te lezen uit de device information service).
- gattc_discover_services(conn_handle: int, uuid: UUID | None = None, /) None¶
Vraag een verbonden server op om zijn services.
Geef optioneel een service-uuid op om alleen die service op te vragen.
Voor elke ontdekte service wordt het
_IRQ_GATTC_SERVICE_RESULT-event opgeroepen, gevolgd door_IRQ_GATTC_SERVICE_DONEbij voltooiing.
- gattc_discover_characteristics(conn_handle: int, start_handle: int, end_handle: int, uuid: UUID | None = None, /) None¶
Vraag een verbonden server op om karakteristieken in het opgegeven bereik.
Geef optioneel een karakteristiek-uuid op om alleen die karakteristiek op te vragen.
Het doorgeven van
start_handle=1enend_handle=0xffffdekt het volledige bereik van GATT-attribuuthandles, dus deze combinatie doorzoekt in feite elke service op het externe apparaat.Voor elke ontdekte karakteristiek wordt het
_IRQ_GATTC_CHARACTERISTIC_RESULT-event opgeroepen, gevolgd door_IRQ_GATTC_CHARACTERISTIC_DONEbij voltooiing.
- gattc_discover_descriptors(conn_handle: int, start_handle: int, end_handle: int, /) None¶
Vraag een verbonden server op om descriptors in het opgegeven bereik.
Voor elke ontdekte descriptor wordt het
_IRQ_GATTC_DESCRIPTOR_RESULT-event opgeroepen, gevolgd door_IRQ_GATTC_DESCRIPTOR_DONEbij voltooiing.
- gattc_read(conn_handle: int, value_handle: int, /) None¶
Voer een extern leesverzoek uit naar een verbonden server voor de opgegeven karakteristiek- of descriptorhandle.
Wanneer een waarde beschikbaar is, wordt het
_IRQ_GATTC_READ_RESULT-event opgeroepen, gevolgd door_IRQ_GATTC_READ_DONEbij voltooiing.
- gattc_write(conn_handle: int, value_handle: int, data: bytes, mode: int = 0, /) None¶
Voer een externe schrijfactie uit naar een verbonden server voor de opgegeven karakteristiek- of descriptorhandle.
Het argument mode specificeert het schrijfgedrag, waarbij de momenteel ondersteunde waarden zijn:
mode=0(standaard) is een write-without-response: de schrijfactie wordt naar de externe server verzonden maar er wordt geen bevestiging geretourneerd, en er wordt geen event opgeroepen.mode=1is een write-with-response: de externe server wordt verzocht een antwoord/bevestiging te verzenden dat het de data heeft ontvangen.
Als er een antwoord van de externe server wordt ontvangen, wordt het
_IRQ_GATTC_WRITE_DONE-event opgeroepen.
- gattc_exchange_mtu(conn_handle: int, /) None¶
Initieer MTU-uitwisseling met een verbonden server, met behulp van de voorkeurs-MTU die is ingesteld met
BLE.config(mtu=value).Het
_IRQ_MTU_EXCHANGED-event wordt opgeroepen wanneer de MTU-uitwisseling is voltooid.MTU-uitwisseling wordt doorgaans geïnitieerd door de central; NimBLE ondersteunt beide rollen.
L2CAP-verbindingsgerichte kanalen
Deze functie maakt socket-achtige data-uitwisseling tussen twee BLE-apparaten mogelijk. Zodra de apparaten via GAP zijn verbonden, kan een van beide apparaten luisteren tot het andere verbinding maakt op een numerieke PSM (Protocol/Service Multiplexer).
Er kan slechts één L2CAP-kanaal tegelijk actief zijn (d.w.z. u kunt niet verbinden terwijl u luistert).
Actieve L2CAP-kanalen worden geïdentificeerd door de verbindingshandle waarop ze tot stand zijn gebracht en een CID (channel ID).
Verbindingsgerichte kanalen hebben ingebouwde credit-gebaseerde flow control. In tegenstelling tot ATT, waar apparaten een gedeelde MTU onderhandelen, stellen zowel het luisterende als het verbindende apparaat elk een onafhankelijke MTU in die de maximale hoeveelheid uitstaande data beperkt die het externe apparaat kan verzenden voordat deze volledig is verwerkt in
l2cap_recvinto.- l2cap_listen(psm: int, mtu: int, /) None¶
Begin met luisteren naar inkomende L2CAP-kanaalverzoeken op de opgegeven psm met de lokale MTU ingesteld op mtu.
Wanneer een extern apparaat een verbinding initieert, wordt het
_IRQ_L2CAP_ACCEPT-event opgeroepen, wat de luisterende server de kans geeft om de inkomende verbinding te weigeren (door een geheel getal verschillend van nul te retourneren).Zodra de verbinding is geaccepteerd, wordt het
_IRQ_L2CAP_CONNECT-event opgeroepen, waardoor de server de channel ID (CID) en de lokale en externe MTU kan verkrijgen.Opmerking: Het is momenteel niet mogelijk om te stoppen met luisteren.
- l2cap_connect(conn_handle: int, psm: int, mtu: int, /) None¶
Maak verbinding met een luisterende peer op de opgegeven psm met de lokale MTU ingesteld op mtu.
Bij een succesvolle verbinding wordt het
_IRQ_L2CAP_CONNECT-event opgeroepen, waardoor de client de CID en de lokale en externe (peer) MTU kan verkrijgen.Een onsuccesvolle verbinding roept het
_IRQ_L2CAP_DISCONNECT-event op met een status verschillend van nul.
- l2cap_disconnect(conn_handle: int, cid: int, /) None¶
Verbreek een actief L2CAP-kanaal met de opgegeven conn_handle en cid.
- l2cap_send(conn_handle: int, cid: int, buf: bytes, /) bool¶
Verzend de opgegeven buf (die het bufferprotocol moet ondersteunen) op het L2CAP-kanaal dat wordt geïdentificeerd door conn_handle en cid.
De buffer moet aan beide limieten voldoen: deze mag de externe (peer) MTU niet overschrijden, en deze mag niet meer dan tweemaal de lokale MTU bedragen.
Dit retourneert
Falseals het kanaal nu “stalled” is, wat betekent datl2cap_sendniet opnieuw mag worden aangeroepen totdat het_IRQ_L2CAP_SEND_READY-event is ontvangen (wat gebeurt wanneer het externe apparaat meer credits verleent, doorgaans nadat het de data heeft ontvangen en verwerkt).
- l2cap_recvinto(conn_handle: int, cid: int, buf: Any | None, /) int¶
Ontvang data van de opgegeven conn_handle en cid in de meegegeven buf (die het bufferprotocol moet ondersteunen, bijv. bytearray of memoryview).
Retourneert het aantal bytes dat van het kanaal is gelezen.
Als buf
Noneis, dan retourneert het het aantal beschikbare bytes.Opmerking: Na ontvangst van het
_IRQ_L2CAP_RECV-event moet de applicatiel2cap_recvintoblijven aanroepen totdat er geen bytes meer beschikbaar zijn in de ontvangstbuffer (doorgaans tot de grootte van de externe (peer) MTU).Totdat de ontvangstbuffer leeg is, krijgt het externe apparaat geen extra kanaalcredits toegekend en kan het geen data meer verzenden.
Pairing en bonding
Pairing maakt het mogelijk om een verbinding te versleutelen en te authenticeren via uitwisseling van secrets (met optionele MITM-bescherming via passkey-authenticatie).
Bonding is het proces van het opslaan van die secrets in niet-vluchtige opslag. Wanneer een apparaat is gebonden, kan het een resolvable private address (RPA) van een ander apparaat oplossen op basis van de opgeslagen identity resolving key (IRK). Om bonding te ondersteunen moet een applicatie de events
_IRQ_GET_SECRETen_IRQ_SET_SECRETimplementeren.- gap_pair(conn_handle: int, /) None¶
Initieer pairing met het externe apparaat.
Zorg er voordat u dit aanroept voor dat de configuratieopties
io,mitm,le_secureenbondzijn ingesteld (viaconfig).Bij een succesvolle pairing wordt het
_IRQ_ENCRYPTION_UPDATE-event opgeroepen.
- gap_passkey(conn_handle: int, action: int, passkey: int, /) None¶
Reageer op een
_IRQ_PASSKEY_ACTION-event voor de opgegeven conn_handle en action. De betekenis van passkey hangt af van action (die op zijn beurt afhangt van de geconfigureerde I/O-mogelijkheid):Actie
Vereist passkey-antwoord
_PASSKEY_ACTION_INPUTDe passkey die de gebruiker afleest van het externe apparaat.
_PASSKEY_ACTION_DISPLAYEen lokaal gegenereerde willekeurige passkey van 6 cijfers die aan de gebruiker wordt getoond.
_PASSKEY_ACTION_NUMERIC_COMPARISON1om de passkey te accepteren die wordt weergegeven in het_IRQ_PASSKEY_ACTION-event, of0om de pairing te annuleren.
class UUID¶
- class bluetooth.UUID(value: int | bytes | str, /)¶
Maakt een UUID-instantie met de opgegeven
value. Bluetooth gebruikt drie UUID-breedtes;UUIDaccepteert elk daarvan:UUID-breedte
Geaccepteerde
value-typesVoorbeeld
16-bit
intof een buffer van 2 bytes (little-endian)UUID(0x2908)ofUUID(b'\x08\x29')32-bit
buffer van 4 bytes (little-endian)
UUID(b'\x08\x29\x00\x00')128-bit
buffer van 16 bytes of een string met koppeltekens
UUID('6E400001-B5A3-F393-E0A9-E50E24DCCA9E')16- en 32-bit UUIDs zijn doorgaans door SIG toegewezen identifiers (zie de Bluetooth assigned numbers); 128-bit UUIDs zijn normaal gesproken vendor-gedefinieerd.