bluetooth — lågnivå-Bluetooth¶
Den här modulen tillhandahåller ett gränssnitt till den inbyggda Bluetooth-styrenheten. Den stöder Bluetooth Low Energy (BLE) i rollerna Central, Peripheral, Broadcaster och Observer, samt GATT Server och Client och anslutningsorienterade L2CAP-kanaler. En enhet kan fungera i flera roller samtidigt. Parkoppling (pairing) och bindning (bonding) stöds också.
Detta API är avsett att matcha lågnivåprotokollet för Bluetooth och tillhandahålla byggstenar för abstraktioner på högre nivå, såsom specifika enhetstyper.
Tips
För de flesta tillämpningar bör du föredra biblioteket aioble på högre nivå, som tillhandahåller en asyncio-baserad omslutning runt den här modulen. Se aioble — Asynkron BLE.
class BLE¶
- class bluetooth.BLE¶
Returnerar singleton-objektet BLE.
Konfiguration
- active(active: bool | None = None, /) bool¶
Ändrar valfritt det aktiva tillståndet för BLE-radion och returnerar det aktuella tillståndet.
Radion måste göras aktiv innan du använder några andra metoder i den här klassen.
- config(param: str, /) Any¶
- config(*, **kwargs: Any) None
Hämta eller ange konfigurationsvärden för BLE-gränssnittet. För att hämta ett värde ska parameternamnet anges som en sträng med citattecken, och endast en parameter efterfrågas åt gången. För att ange värden används nyckelordssyntaxen, och en eller flera parametrar kan anges åt gången.
För närvarande stöds följande värden:
'mac': Den aktuella adressen som används, beroende på det aktuella adressläget. Detta returnerar en tupel av(addr_type, addr).Se
gap_scanför detaljer om adresstyp.Detta kan endast efterfrågas medan gränssnittet för närvarande är aktivt.
'addr_mode': Anger adressläget. Värdena är:Värde
Namn
Beteende
0x00PUBLIC
Använd styrenhetens publika adress.
0x01RANDOM
Använd en genererad statisk adress.
0x02RPA
Använd lösbara privata adresser (resolvable private addresses).
0x03NRPA
Använd icke-lösbara privata adresser (non-resolvable private addresses).
Som standard kommer gränssnittet att använda en PUBLIC-adress om en sådan finns tillgänglig, annars används en RANDOM-adress.
'gap_name': Hämta/ange det GAP-enhetsnamn som används av tjänsten Generic Access (UUID0x1800), karakteristiken Device Name (UUID0x2a00). Detta kan anges när som helst och ändras flera gånger.'rxbuf': Hämta/ange storleken i byte för den interna buffert som används för att lagra inkommande händelser. Denna buffert är global för hela BLE-drivrutinen och hanterar därför inkommande data för alla händelser, inklusive alla karakteristiker. Att öka den möjliggör bättre hantering av stötvis inkommande data (till exempel skanningsresultat) samt möjligheten att ta emot större karakteristikvärden.'mtu': Hämta/ange den MTU som ska användas under ett ATT-MTU-utbyte. Den resulterande MTU:n blir minimum av denna och fjärrenhetens MTU. ATT-MTU-utbyte sker inte automatiskt (om inte fjärrenheten initierar det) och måste initieras manuellt medgattc_exchange_mtu. Använd händelsen_IRQ_MTU_EXCHANGEDför att ta reda på MTU:n för en given anslutning.'bond': Anger huruvida bindning ska aktiveras under parkoppling. När det är aktiverat sätter parkopplingsbegäranden flaggan ”bond” och nycklarna lagras av båda enheterna.'mitm': Anger huruvida MITM-skydd krävs för parkoppling.'io': Anger I/O-kapabiliteterna för den här enheten.Tillgängliga alternativ är:
Konstant
Värde
Kapabilitet
_IO_CAPABILITY_DISPLAY_ONLY0
Endast visning
_IO_CAPABILITY_DISPLAY_YESNO1
Visning med ja/nej-inmatning
_IO_CAPABILITY_KEYBOARD_ONLY2
Endast tangentbord
_IO_CAPABILITY_NO_INPUT_OUTPUT3
Ingen inmatning eller utmatning
_IO_CAPABILITY_KEYBOARD_DISPLAY4
Tangentbord och visning
'le_secure': Anger huruvida ”LE Secure”-parkoppling krävs. Standardvärdet är false (dvs. tillåt ”Legacy Pairing”).
Händelsehantering
- irq(handler: Callable[[int, Tuple], Any | None], /) None¶
Registrerar ett återanrop för händelser från BLE-stacken. handler tar två argument,
event(som är en av koderna nedan) ochdata(som är en händelsespecifik tupel av värden).Obs: Som en optimering för att förhindra onödiga allokeringar är posterna
addr,adv_data,char_data,notify_dataochuuidi tuplerna skrivskyddade memoryview-instanser som pekar påbluetooth-modulens interna ringbuffert, och är endast giltiga under anropet av IRQ-hanterarfunktionen. Om ditt program behöver spara ett av dessa värden för åtkomst efter att IRQ-hanteraren har återvänt (t.ex. genom att spara det i en klassinstans eller global variabel), måste det ta en kopia av datan, antingen medbytes()ellerbluetooth.UUID(), så här:connected_addr = bytes(addr) # equivalently: adv_data, char_data, or notify_data matched_uuid = bluetooth.UUID(uuid)
Till exempel kan IRQ-hanteraren för ett skanningsresultat inspektera
adv_dataför att avgöra om det är rätt enhet, och först därefter kopiera adressdatan för att användas på annat ställe i programmet. Och för att skriva ut data inifrån IRQ-hanteraren behövsprint(bytes(addr)).En hanterare avgör vanligtvis utifrån händelsekoden och packar upp den händelsespecifika nyttolasttupeln:
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 ...
Varje händelsekod, den nyttolast den levererar och en kort beskrivning listas nedan. För händelser där fältet
statusnämns ärstatus0vid framgång och ett implementationsspecifikt värde skilt från noll vid misslyckande.Konstant
Värde
Händelse
Nyttolasttupel
_IRQ_CENTRAL_CONNECT1
En central har anslutit till denna peripheral.
(conn_handle, addr_type, addr)_IRQ_CENTRAL_DISCONNECT2
En central har kopplat från denna peripheral.
(conn_handle, addr_type, addr)_IRQ_GATTS_WRITE3
En ansluten klient har skrivit till en lokal karakteristik eller deskriptor. Använd
gatts_readför att hämta det nya värdet.(conn_handle, attr_handle)_IRQ_GATTS_READ_REQUEST4
En ansluten klient har utfört en läsning. Returnera en felkod skild från noll från tabellen nedan för att neka läsningen, eller
0/Noneför att acceptera den.(conn_handle, attr_handle)_IRQ_SCAN_RESULT5
Ett enstaka annonseringspaket togs emot under en aktiv skanning.
(addr_type, addr, adv_type, rssi, adv_data)_IRQ_SCAN_DONE6
Den aktuella skanningen har avslutats, antingen för att den konfigurerade varaktigheten löpt ut eller för att
gap_scan(None)anropades.()_IRQ_PERIPHERAL_CONNECT7
En tidigare utfärdad
gap_connecthar lyckats.(conn_handle, addr_type, addr)_IRQ_PERIPHERAL_DISCONNECT8
En ansluten peripheral har kopplat från.
(conn_handle, addr_type, addr)_IRQ_GATTC_SERVICE_RESULT9
En tjänst hittades av
gattc_discover_services.(conn_handle, start_handle, end_handle, uuid)_IRQ_GATTC_SERVICE_DONE10
Tjänsteupptäckt har slutförts.
(conn_handle, status)_IRQ_GATTC_CHARACTERISTIC_RESULT11
En karakteristik hittades av
gattc_discover_characteristics.(conn_handle, end_handle, value_handle, properties, uuid)_IRQ_GATTC_CHARACTERISTIC_DONE12
Karakteristikupptäckt har slutförts.
(conn_handle, status)_IRQ_GATTC_DESCRIPTOR_RESULT13
En deskriptor hittades av
gattc_discover_descriptors.(conn_handle, dsc_handle, uuid)_IRQ_GATTC_DESCRIPTOR_DONE14
Deskriptorupptäckt har slutförts.
(conn_handle, status)_IRQ_GATTC_READ_RESULT15
En tidigare utfärdad
gattc_readhar returnerat data.(conn_handle, value_handle, char_data)_IRQ_GATTC_READ_DONE16
En tidigare utfärdad
gattc_readhar slutförts.(conn_handle, value_handle, status)_IRQ_GATTC_WRITE_DONE17
En tidigare utfärdad
gattc_writehar bekräftats.(conn_handle, value_handle, status)_IRQ_GATTC_NOTIFY18
En fjärrserver har skickat en (obekräftad) notifiering.
(conn_handle, value_handle, notify_data)_IRQ_GATTC_INDICATE19
En fjärrserver har skickat en (bekräftad) indikering.
(conn_handle, value_handle, notify_data)_IRQ_GATTS_INDICATE_DONE20
En tidigare skickad indikering har bekräftats av klienten (eller har gått ut i tid).
(conn_handle, value_handle, status)_IRQ_MTU_EXCHANGED21
Ett ATT-MTU-utbyte har slutförts (initierat av endera sidan).
(conn_handle, mtu)_IRQ_L2CAP_ACCEPT22
En fjärrenhet har begärt en L2CAP-anslutning på en PSM som den här enheten lyssnar på. Returnera ett heltal skilt från noll för att avvisa, eller
0/Noneför att acceptera.(conn_handle, cid, psm, our_mtu, peer_mtu)_IRQ_L2CAP_CONNECT23
En L2CAP-kanal är nu etablerad, antingen genom att acceptera en inkommande begäran eller genom att slutföra en utgående
l2cap_connect.(conn_handle, cid, psm, our_mtu, peer_mtu)_IRQ_L2CAP_DISCONNECT24
En L2CAP-kanal har kopplats från.
statusär0vid en ren frånkoppling, eller skilt från noll om ett utgående anslutningsförsök misslyckades.(conn_handle, cid, psm, status)_IRQ_L2CAP_RECV25
Data har anlänt på en L2CAP-kanal. Anropa
l2cap_recvintoför att läsa den.(conn_handle, cid)_IRQ_L2CAP_SEND_READY26
En tidigare
l2cap_sendsom returneradeFalsehar tömts och kanalen är redo igen. Enstatusskild från noll innebär att sändningsbufferten svämmade över och att applikationen måste skicka om datan.(conn_handle, cid, status)_IRQ_CONNECTION_UPDATE27
Fjärrenheten har uppdaterat anslutningsparametrarna (intervall, latens, övervakningstidsgräns).
(conn_handle, conn_interval, conn_latency, supervision_timeout, status)_IRQ_ENCRYPTION_UPDATE28
Krypteringstillståndet för en anslutning har ändrats, vanligtvis efter att parkoppling eller bindning slutförts.
(conn_handle, encrypted, authenticated, bonded, key_size)_IRQ_GET_SECRET29
Stacken begär en lagrad bindningshemlighet. Om
keyärNone, returnera detindex:e lagrade värdet avsec_type; annars returnera värdet som är kopplat till den givna(sec_type, key). ReturneraNoneom inget är lagrat.(sec_type, index, key)_IRQ_SET_SECRET30
Stacken ber applikationen att spara en bindningshemlighet beständigt. Returnera
Truenär den har lagrats.(sec_type, key, value)_IRQ_PASSKEY_ACTION31
En lösenkodsåtgärd krävs som en del av parkopplingen. Svara med
gap_passkey; se tabellen över lösenkodsåtgärder nedan för de möjliga åtgärderna.(conn_handle, action, passkey)För händelsen
_IRQ_GATTS_READ_REQUESTär de tillgängliga returkoderna:Konstant
Värde
Betydelse
_GATTS_NO_ERROR0x00Acceptera läsningen.
_GATTS_ERROR_READ_NOT_PERMITTED0x02Läsning ej tillåten.
_GATTS_ERROR_WRITE_NOT_PERMITTED0x03Skrivning ej tillåten.
_GATTS_ERROR_INSUFFICIENT_AUTHENTICATION0x05Klienten är inte autentiserad.
_GATTS_ERROR_INSUFFICIENT_AUTHORIZATION0x08Klienten är inte auktoriserad.
_GATTS_ERROR_INSUFFICIENT_ENCRYPTION0x0fLänken är inte krypterad.
För händelsen
_IRQ_PASSKEY_ACTIONär de tillgängliga åtgärderna:Konstant
Värde
Betydelse
_PASSKEY_ACTION_NONE0
Ingen åtgärd krävs.
_PASSKEY_ACTION_INPUT2
Uppmana användaren att ange den lösenkod som visas på fjärrenheten.
_PASSKEY_ACTION_DISPLAY3
Visa en sexsiffrig lösenkod som fjärrenheten ska ange.
_PASSKEY_ACTION_NUMERIC_COMPARISON4
Bekräfta att lösenkoden matchar den som visas på fjärrenheten.
För att spara utrymme i den fasta programvaran ingår dessa konstanter inte i
bluetooth-modulen. Lägg till de du behöver från listorna ovan i ditt program.
Broadcaster-roll (annonserare)
- gap_advertise(interval_us: int | None, adv_data: bytes | None = None, *, resp_data: bytes | None = None, connectable: bool = True) None¶
Startar annonsering med det angivna intervallet (i mikrosekunder). Detta intervall avrundas nedåt till närmaste 625 us. För att stoppa annonseringen, sätt interval_us till
None.adv_data och resp_data kan vara vilken typ som helst som implementerar buffertprotokollet (t.ex.
bytes,bytearray,str). adv_data inkluderas i alla utsändningar, och resp_data skickas som svar på en aktiv skanning.Obs: om adv_data (eller resp_data) är
None, återanvänds datan som skickades till det föregående anropet avgap_advertise. Detta gör att en broadcaster kan återuppta annonsering med enbartgap_advertise(interval_us). För att rensa annonseringsnyttolasten, skicka en tombytes, dvs.b''.
Observer-roll (skanner)
- gap_scan(duration_ms: int | None, interval_us: int = 1280000, window_us: int = 11250, active: bool = False, /) None¶
Kör en skanningsoperation som varar den angivna varaktigheten (i millisekunder).
För att skanna obegränsat, sätt duration_ms till
0.För att stoppa skanningen, sätt duration_ms till
None.Använd interval_us och window_us för att valfritt konfigurera arbetscykeln. Skannern körs i window_us mikrosekunder var interval_us mikrosekund under totalt duration_ms millisekunder. Standardintervallet och -fönstret är 1,28 sekunder respektive 11,25 millisekunder (bakgrundsskanning).
För varje skanningsresultat utlöses händelsen
_IRQ_SCAN_RESULT, med händelsedatan(addr_type, addr, adv_type, rssi, adv_data).addr_type-värden anger publika eller slumpmässiga adresser:Värde
Namn
Betydelse
0x00PUBLIC
Publik enhetsadress.
0x01RANDOM
Slumpmässig adress (antingen statisk, RPA eller NRPA; typen är kodad i själva adressen).
adv_type-värden motsvarar Bluetooth-specifikationen:Värde
Namn
Betydelse
0x00ADV_IND
Anslutningsbar och skanningsbar oriktad annonsering.
0x01ADV_DIRECT_IND
Anslutningsbar riktad annonsering.
0x02ADV_SCAN_IND
Skanningsbar oriktad annonsering.
0x03ADV_NONCONN_IND
Icke anslutningsbar oriktad annonsering.
0x04SCAN_RSP
Skanningssvar.
activekan sättas tillTrueom du vill ta emot skanningssvar i resultaten.När skanningen stoppas (antingen för att varaktigheten löpt ut eller när den stoppas explicit) utlöses händelsen
_IRQ_SCAN_DONE.
Central-roll
En central enhet kan ansluta till peripheraler som den har upptäckt med observer-rollen (se
gap_scan) eller med en känd adress.- 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¶
Anslut till en peripheral.
Se
gap_scanför detaljer om adresstyper.För att avbryta ett utestående anslutningsförsök i förtid, anropa
gap_connect(None).Vid framgång utlöses händelsen
_IRQ_PERIPHERAL_CONNECT. Om ett anslutningsförsök avbryts utlöses händelsen_IRQ_PERIPHERAL_DISCONNECT.Enheten väntar upp till scan_duration_ms på att ta emot en annonseringsnyttolast från enheten.
Anslutningsintervallet kan konfigureras i mikrosekunder med antingen eller båda av min_conn_interval_us och max_conn_interval_us. Annars väljs ett standardintervall, vanligtvis mellan 30000 och 50000 mikrosekunder. Ett kortare intervall ökar genomströmningen, på bekostnad av strömförbrukningen.
Peripheral-roll
En peripheral enhet förväntas skicka anslutningsbara annonseringar (se
gap_advertise). Den fungerar vanligtvis som en GATT-server, efter att först ha registrerat tjänster och karakteristiker medgatts_register_services.När en central ansluter utlöses händelsen
_IRQ_CENTRAL_CONNECT.Central- och peripheral-roller
- gap_disconnect(conn_handle: int, /) bool¶
Koppla från det angivna anslutningshandtaget. Detta kan antingen vara en central som har anslutit till den här enheten (om den fungerar som peripheral) eller en peripheral som den här enheten tidigare anslutit till (om den fungerar som central).
Vid framgång utlöses händelsen
_IRQ_PERIPHERAL_DISCONNECTeller_IRQ_CENTRAL_DISCONNECT.Returnerar
Falseom anslutningshandtaget inte var anslutet, ochTrueannars.
GATT Server
En GATT-server har en uppsättning registrerade tjänster. Varje tjänst kan innehålla karakteristiker, som var och en har ett värde. Karakteristiker kan också innehålla deskriptorer, som själva har värden.
Dessa värden lagras lokalt och nås via sitt ”värdehandtag” som genereras under tjänsteregistreringen. De kan också läsas från eller skrivas till av en fjärrklientenhet. Dessutom kan en server ”notifiera” en karakteristik till en ansluten klient via ett anslutningshandtag.
En enhet i antingen central- eller peripheral-rollen kan fungera som GATT-server, men i de flesta fall är det vanligare att en peripheral enhet fungerar som server.
Karakteristiker och deskriptorer har en standardmaxstorlek på 20 byte (standard-ATT-MTU på 23 byte minus en 3-byte ATT-header; en större förhandlad MTU höjer inte i sig denna gräns). Allt som skrivs till dem av en klient trunkeras till denna längd. Däremot ökar varje lokal skrivning maxstorleken, så om du vill tillåta större skrivningar från en klient till en given karakteristik, använd
gatts_writeefter registreringen, t.ex.gatts_write(char_handle, bytes(100)).- gatts_register_services(services_definition: Sequence[Sequence], /) Sequence[Sequence[int]]¶
Konfigurerar servern med de angivna tjänsterna och ersätter eventuella befintliga tjänster.
services_definition är en lista över services, där varje service är en tupel med två element som innehåller en UUID och en lista över characteristics.
Varje characteristic är en tupel med två eller tre element som innehåller en UUID, ett flags-värde och valfritt en lista över descriptors.
Varje descriptor är en tupel med två element som innehåller en UUID och ett flags-värde.
flags är en bitvis OR-kombination av flaggorna som definieras nedan. Dessa anger både beteendet hos karakteristiken (eller deskriptorn) samt säkerhets- och integritetskraven.
Returvärdet är en lista (ett element per tjänst) av tupler (varje element är ett värdehandtag). Karakteristik- och deskriptorhandtag plattas ut i samma tupel, i den ordning de definieras.
Följande exempel registrerar två tjänster (Heart Rate och 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 tre värdehandtagen (
hr,tx,rx) kan användas medgatts_read,gatts_write,gatts_notifyochgatts_indicate.Obs: Annonsering måste stoppas innan tjänster registreras.
Tillgängliga flaggor för karakteristiker och deskriptorer är:
Konstant
Värde
Betydelse
_FLAG_BROADCAST0x0001Karakteristiken får sändas ut (broadcast).
_FLAG_READ0x0002Klienten får läsa värdet.
_FLAG_WRITE_NO_RESPONSE0x0004Klienten får skriva utan att förvänta sig ett svar.
_FLAG_WRITE0x0008Klienten får skriva med ett bekräftat svar.
_FLAG_NOTIFY0x0010Servern får skicka notifieringar (obekräftade).
_FLAG_INDICATE0x0020Servern får skicka indikeringar (bekräftade).
_FLAG_AUTHENTICATED_SIGNED_WRITE0x0040Klienten får utfärda signerade skrivningar.
_FLAG_AUX_WRITE0x0100Utökade egenskaper: köade/tillförlitliga skrivningar är tillåtna.
_FLAG_READ_ENCRYPTED0x0200Läsning kräver en krypterad länk.
_FLAG_READ_AUTHENTICATED0x0400Läsning kräver en autentiserad (MITM-skyddad) länk.
_FLAG_READ_AUTHORIZED0x0800Läsning kräver auktorisering på applikationsnivå.
_FLAG_WRITE_ENCRYPTED0x1000Skrivning kräver en krypterad länk.
_FLAG_WRITE_AUTHENTICATED0x2000Skrivning kräver en autentiserad (MITM-skyddad) länk.
_FLAG_WRITE_AUTHORIZED0x4000Skrivning kräver auktorisering på applikationsnivå.
Liksom med händelsekonstanterna ovan tillhandahålls dessa flaggor inte av
bluetooth-modulen; kopiera de du behöver in i ditt program.
- gatts_read(value_handle: int, /) bytes¶
Läser det lokala värdet för detta handtag (som antingen har skrivits av
gatts_writeeller av en fjärrklient).
- gatts_write(value_handle: int, data: bytes, send_update: bool = False, /) None¶
Skriver det lokala värdet för detta handtag, vilket kan läsas av en klient.
Om send_update är
Truekommer alla prenumererande klienter att notifieras (eller indikeras, beroende på vad de prenumererar på och vilka operationer karakteristiken stöder) om denna skrivning.
- gatts_notify(conn_handle: int, value_handle: int, data: bytes | None = None, /) None¶
Skickar en notifieringsbegäran till en ansluten klient.
Om data är
None(standard) skickas det aktuella lokala värdet (som angetts medgatts_write).Annars, om data inte är
None, skickas det värdet till klienten som en del av notifieringen. Det lokala värdet ändras inte.Obs: Notifieringen skickas oavsett klientens prenumerationsstatus för denna karakteristik.
- gatts_indicate(conn_handle: int, value_handle: int, data: bytes | None = None, /) None¶
Skickar en indikeringsbegäran till en ansluten klient.
Om data är
None(standard) skickas det aktuella lokala värdet (som angetts medgatts_write).Annars, om data inte är
None, skickas det värdet till klienten som en del av indikeringen. Det lokala värdet ändras inte.Vid bekräftelse (eller misslyckande, t.ex. timeout) utlöses händelsen
_IRQ_GATTS_INDICATE_DONE.Obs: Indikeringen skickas oavsett klientens prenumerationsstatus för denna karakteristik.
- gatts_set_buffer(value_handle: int, len: int, append: bool = False, /) None¶
Anger den interna buffertstorleken för ett värde i byte. Detta begränsar den största möjliga skrivning som kan tas emot. Standardvärdet är 20 byte (standard-ATT-MTU på 23 minus den 3-byte ATT-headern).
Att sätta append till
Truegör att alla fjärrskrivningar läggs till i, snarare än ersätter, det aktuella värdet. Som mest len byte kan buffras på detta sätt. När du användergatts_readrensas värdet efter läsning. Denna funktion är användbar vid implementering av något som Nordic UART Service.
GATT Client
En GATT-klient kan upptäcka och läsa/skriva karakteristiker på en fjärr-GATT-server.
Det är vanligare att en enhet i central-rollen fungerar som GATT-klient, men det är också möjligt för en peripheral att fungera som klient för att upptäcka information om den central som har anslutit till den (t.ex. att läsa enhetsnamnet från enhetsinformationstjänsten).
- gattc_discover_services(conn_handle: int, uuid: UUID | None = None, /) None¶
Efterfrågar en ansluten servers tjänster.
Ange valfritt en tjänst-uuid för att endast efterfråga den tjänsten.
För varje upptäckt tjänst utlöses händelsen
_IRQ_GATTC_SERVICE_RESULT, följt av_IRQ_GATTC_SERVICE_DONEvid slutförande.
- gattc_discover_characteristics(conn_handle: int, start_handle: int, end_handle: int, uuid: UUID | None = None, /) None¶
Efterfrågar en ansluten server om karakteristiker i det angivna intervallet.
Ange valfritt en karakteristik-uuid för att endast efterfråga den karakteristiken.
Att skicka
start_handle=1ochend_handle=0xfffftäcker hela GATT-attributhandtagsintervallet, så denna kombination söker i praktiken igenom alla tjänster på fjärrenheten.För varje upptäckt karakteristik utlöses händelsen
_IRQ_GATTC_CHARACTERISTIC_RESULT, följt av_IRQ_GATTC_CHARACTERISTIC_DONEvid slutförande.
- gattc_discover_descriptors(conn_handle: int, start_handle: int, end_handle: int, /) None¶
Efterfrågar en ansluten server om deskriptorer i det angivna intervallet.
För varje upptäckt deskriptor utlöses händelsen
_IRQ_GATTC_DESCRIPTOR_RESULT, följt av_IRQ_GATTC_DESCRIPTOR_DONEvid slutförande.
- gattc_read(conn_handle: int, value_handle: int, /) None¶
Utfärdar en fjärrläsning till en ansluten server för det angivna karakteristik- eller deskriptorhandtaget.
När ett värde är tillgängligt utlöses händelsen
_IRQ_GATTC_READ_RESULT, följt av_IRQ_GATTC_READ_DONEvid slutförande.
- gattc_write(conn_handle: int, value_handle: int, data: bytes, mode: int = 0, /) None¶
Utfärdar en fjärrskrivning till en ansluten server för det angivna karakteristik- eller deskriptorhandtaget.
Argumentet mode anger skrivbeteendet, där de värden som för närvarande stöds är:
mode=0(standard) är en skrivning utan svar: skrivningen skickas till fjärrservern men ingen bekräftelse returneras, och ingen händelse utlöses.mode=1är en skrivning med svar: fjärrservern ombeds att skicka ett svar/en bekräftelse på att den tog emot datan.
Om ett svar tas emot från fjärrservern utlöses händelsen
_IRQ_GATTC_WRITE_DONE.
- gattc_exchange_mtu(conn_handle: int, /) None¶
Initierar MTU-utbyte med en ansluten server, med den föredragna MTU:n som angetts med
BLE.config(mtu=value).Händelsen
_IRQ_MTU_EXCHANGEDutlöses när MTU-utbytet slutförs.MTU-utbyte initieras vanligtvis av den centrala enheten; NimBLE stöder båda rollerna.
L2CAP anslutningsorienterade kanaler
Denna funktion möjliggör socketliknande datautbyte mellan två BLE-enheter. När enheterna är anslutna via GAP kan endera enheten lyssna efter att den andra ska ansluta på en numerisk PSM (Protocol/Service Multiplexer).
Endast en L2CAP-kanal kan vara aktiv åt gången (dvs. du kan inte ansluta medan du lyssnar).
Aktiva L2CAP-kanaler identifieras av anslutningshandtaget som de etablerades på och en CID (channel ID).
Anslutningsorienterade kanaler har inbyggd kreditbaserad flödeskontroll. Till skillnad från ATT, där enheter förhandlar om en gemensam MTU, anger både den lyssnande och den anslutande enheten var sin oberoende MTU som begränsar den maximala mängd utestående data som fjärrenheten kan skicka innan den är fullständigt konsumerad i
l2cap_recvinto.- l2cap_listen(psm: int, mtu: int, /) None¶
Börjar lyssna efter inkommande L2CAP-kanalbegäranden på den angivna psm med den lokala MTU:n satt till mtu.
När en fjärrenhet initierar en anslutning utlöses händelsen
_IRQ_L2CAP_ACCEPT, vilket ger den lyssnande servern en chans att avvisa den inkommande anslutningen (genom att returnera ett heltal skilt från noll).När anslutningen accepteras utlöses händelsen
_IRQ_L2CAP_CONNECT, vilket gör att servern kan erhålla kanal-ID:t (CID) samt den lokala och fjärrens MTU.Obs: Det är för närvarande inte möjligt att sluta lyssna.
- l2cap_connect(conn_handle: int, psm: int, mtu: int, /) None¶
Ansluter till en lyssnande motpart på den angivna psm med den lokala MTU:n satt till mtu.
Vid lyckad anslutning utlöses händelsen
_IRQ_L2CAP_CONNECT, vilket gör att klienten kan erhålla CID:t samt den lokala och fjärrens (motpartens) MTU.En misslyckad anslutning utlöser händelsen
_IRQ_L2CAP_DISCONNECTmed en status skild från noll.
- l2cap_disconnect(conn_handle: int, cid: int, /) None¶
Kopplar från en aktiv L2CAP-kanal med den angivna conn_handle och cid.
- l2cap_send(conn_handle: int, cid: int, buf: bytes, /) bool¶
Skickar den angivna buf (som måste stödja buffertprotokollet) på L2CAP-kanalen som identifieras av conn_handle och cid.
Bufferten måste uppfylla båda gränserna: den får inte överskrida fjärrens (motpartens) MTU, och den får inte överskrida två gånger den lokala MTU:n.
Detta returnerar
Falseom kanalen nu är ”stoppad” (stalled), vilket innebär attl2cap_sendinte får anropas igen förrän händelsen_IRQ_L2CAP_SEND_READYtas emot (vilket sker när fjärrenheten beviljar fler krediter, vanligtvis efter att den har tagit emot och bearbetat datan).
- l2cap_recvinto(conn_handle: int, cid: int, buf: Any | None, /) int¶
Tar emot data från den angivna conn_handle och cid in i den tillhandahållna buf (som måste stödja buffertprotokollet, t.ex. bytearray eller memoryview).
Returnerar antalet byte som lästs från kanalen.
Om buf är
Nonereturneras antalet tillgängliga byte.Obs: Efter att ha tagit emot händelsen
_IRQ_L2CAP_RECVbör applikationen fortsätta anropal2cap_recvintotills inga fler byte är tillgängliga i mottagningsbufferten (vanligtvis upp till storleken på fjärrens (motpartens) MTU).Tills mottagningsbufferten är tom beviljas fjärrenheten inga fler kanalkrediter och kan inte skicka mer data.
Parkoppling och bindning
Parkoppling gör att en anslutning kan krypteras och autentiseras via utbyte av hemligheter (med valfritt MITM-skydd via lösenkodsautentisering).
Bindning är processen att lagra dessa hemligheter i beständig lagring. När en enhet är bunden kan den lösa en lösbar privat adress (RPA) från en annan enhet baserat på den lagrade identitetslösningsnyckeln (IRK). För att stödja bindning måste en applikation implementera händelserna
_IRQ_GET_SECREToch_IRQ_SET_SECRET.- gap_pair(conn_handle: int, /) None¶
Initierar parkoppling med fjärrenheten.
Innan du anropar detta, säkerställ att konfigurationsalternativen
io,mitm,le_secureochbondär inställda (viaconfig).Vid lyckad parkoppling utlöses händelsen
_IRQ_ENCRYPTION_UPDATE.
- gap_passkey(conn_handle: int, action: int, passkey: int, /) None¶
Svarar på en
_IRQ_PASSKEY_ACTION-händelse för den angivna conn_handle och action. Betydelsen av passkey beror på action (som i sin tur beror på den konfigurerade I/O-kapabiliteten):Åtgärd
Krävt passkey-svar
_PASSKEY_ACTION_INPUTLösenkoden som användaren läser från fjärrenheten.
_PASSKEY_ACTION_DISPLAYEn lokalt genererad slumpmässig sexsiffrig lösenkod som visas för användaren.
_PASSKEY_ACTION_NUMERIC_COMPARISON1för att acceptera lösenkoden som visas i händelsen_IRQ_PASSKEY_ACTION, eller0för att avbryta parkopplingen.
class UUID¶
- class bluetooth.UUID(value: int | bytes | str, /)¶
Skapar en UUID-instans med det angivna
value. Bluetooth använder tre UUID-bredder;UUIDaccepterar vilken som helst av dem:UUID-bredd
Accepterade
value-typerExempel
16-bitars
inteller en 2-byte buffert (little-endian)UUID(0x2908)ellerUUID(b'\x08\x29')32-bitars
4-byte buffert (little-endian)
UUID(b'\x08\x29\x00\x00')128-bitars
16-byte buffert eller en strängavgränsad med bindestreck
UUID('6E400001-B5A3-F393-E0A9-E50E24DCCA9E')16- och 32-bitars UUID:er är vanligtvis SIG-allokerade identifierare (se Bluetooth assigned numbers); 128-bitars UUID:er är normalt leverantörsdefinierade.