bluetooth — düşük seviyeli Bluetooth¶
Bu modül, yerleşik Bluetooth denetleyicisine bir arayüz sağlar. Central, Peripheral, Broadcaster ve Observer rollerinde Bluetooth Low Energy (BLE) ile birlikte GATT Sunucusu ve İstemcisini ve L2CAP bağlantı yönelimli kanalları destekler. Bir cihaz aynı anda birden fazla rolde çalışabilir. Eşleştirme (pairing) ve bağlama (bonding) da desteklenir.
Bu API, düşük seviyeli Bluetooth protokolüyle eşleşecek ve belirli cihaz türleri gibi daha üst seviye soyutlamalar için yapı taşları sağlayacak şekilde tasarlanmıştır.
Tüyo
Çoğu uygulama için, bu modülün etrafında asyncio tabanlı bir sarmalayıcı sağlayan daha üst seviyeli aioble kütüphanesini tercih edin. Bkz. aioble — Asenkron BLE.
class BLE¶
- class bluetooth.BLE¶
Tekil (singleton) BLE nesnesini döndürür.
Yapılandırma
- active(active: bool | None = None, /) bool¶
İsteğe bağlı olarak BLE radyosunun etkin durumunu değiştirir ve mevcut durumu döndürür.
Bu sınıftaki diğer herhangi bir metodu kullanmadan önce radyo etkin hale getirilmelidir.
- config(param: str, /) Any¶
- config(*, **kwargs: Any) None
BLE arayüzünün yapılandırma değerlerini alır veya ayarlar. Bir değeri almak için parametre adı bir dize olarak tırnak içine alınmalıdır ve bir seferde yalnızca tek bir parametre sorgulanır. Değerleri ayarlamak için anahtar sözcük söz dizimini kullanın; bir seferde bir veya daha fazla parametre ayarlanabilir.
Şu anda desteklenen değerler şunlardır:
'mac': Mevcut adres moduna bağlı olarak, kullanımda olan geçerli adres. Bu,(addr_type, addr)biçiminde bir demet döndürür.Adres türü hakkında ayrıntılar için bkz.
gap_scan.Bu, yalnızca arayüz şu anda etkinken sorgulanabilir.
'addr_mode': Adres modunu ayarlar. Değerler şunlardır:Değer
Ad
Davranış
0x00PUBLIC
Denetleyicinin genel (public) adresini kullan.
0x01RANDOM
Oluşturulmuş statik bir adres kullan.
0x02RPA
Çözümlenebilir özel adresler kullan.
0x03NRPA
Çözümlenemeyen özel adresler kullan.
Varsayılan olarak arayüz, mevcutsa bir PUBLIC adres kullanır; aksi takdirde bir RANDOM adres kullanır.
'gap_name': Generic Access hizmeti (UUID0x1800), Device Name özelliği (UUID0x2a00) tarafından kullanılan GAP cihaz adını alır/ayarlar. Bu, herhangi bir zamanda ayarlanabilir ve birden çok kez değiştirilebilir.'rxbuf': Gelen olayları depolamak için kullanılan dahili arabelleğin boyutunu bayt cinsinden alır/ayarlar. Bu arabellek tüm BLE sürücüsü için geneldir ve bu nedenle tüm özellikler dahil olmak üzere tüm olaylar için gelen verileri işler. Bunu artırmak, ani (bursty) gelen verilerin (örneğin tarama sonuçları) daha iyi işlenmesine ve daha büyük özellik değerlerinin alınabilmesine olanak tanır.'mtu': Bir ATT MTU değişimi sırasında kullanılacak MTU’yu alır/ayarlar. Sonuçta elde edilen MTU, bunun ve uzak cihazın MTU’sunun en küçüğü olacaktır. ATT MTU değişimi otomatik olarak gerçekleşmez (uzak cihaz bunu başlatmadıkça) vegattc_exchange_mtuile manuel olarak başlatılmalıdır. Belirli bir bağlantı için MTU’yu öğrenmek üzere_IRQ_MTU_EXCHANGEDolayını kullanın.'bond': Eşleştirme sırasında bağlamanın etkinleştirilip etkinleştirilmeyeceğini ayarlar. Etkinleştirildiğinde, eşleştirme istekleri “bond” bayrağını ayarlar ve anahtarlar her iki cihaz tarafından da depolanır.'mitm': Eşleştirme için MITM koruması gerekip gerekmediğini ayarlar.'io': Bu cihazın G/Ç yeteneklerini ayarlar.Kullanılabilir seçenekler şunlardır:
Sabit
Değer
Yetenek
_IO_CAPABILITY_DISPLAY_ONLY0
Yalnızca ekran
_IO_CAPABILITY_DISPLAY_YESNO1
Evet/hayır girişiyle ekran
_IO_CAPABILITY_KEYBOARD_ONLY2
Yalnızca klavye
_IO_CAPABILITY_NO_INPUT_OUTPUT3
Giriş veya çıkış yok
_IO_CAPABILITY_KEYBOARD_DISPLAY4
Klavye ve ekran
'le_secure': “LE Secure” eşleştirmesinin gerekip gerekmediğini ayarlar. Varsayılan değer false’tur (yani “Legacy Pairing”e izin verir).
Olay İşleme
- irq(handler: Callable[[int, Tuple], Any | None], /) None¶
BLE yığınından gelen olaylar için bir geri çağırma kaydeder. handler iki argüman alır:
event(aşağıdaki kodlardan biri olacaktır) vedata(olaya özgü bir değer demetidir).Not: Gereksiz ayırmaları önlemek için bir optimizasyon olarak, demetlerdeki
addr,adv_data,char_data,notify_dataveuuidgirdileri,bluetoothmodülünün dahili halka arabelleğine işaret eden salt okunur memoryview örnekleridir ve yalnızca IRQ işleyici işlevinin çağrılması sırasında geçerlidir. Programınızın bu değerlerden birini IRQ işleyici döndükten sonra erişmek üzere kaydetmesi gerekiyorsa (örneğin bir sınıf örneğine veya genel değişkene kaydederek), o zaman verinin bir kopyasını alması gerekir; bunubytes()veyabluetooth.UUID()kullanarak şu şekilde yapabilir:connected_addr = bytes(addr) # equivalently: adv_data, char_data, or notify_data matched_uuid = bluetooth.UUID(uuid)
Örneğin, bir tarama sonucu için IRQ işleyici, doğru cihaz olup olmadığına karar vermek için
adv_dataöğesini inceleyebilir ve yalnızca o zaman adres verisini programın başka bir yerinde kullanılmak üzere kopyalayabilir. IRQ işleyicinin içinden veri yazdırmak içinprint(bytes(addr))gerekecektir.Bir işleyici tipik olarak olay kodu üzerinden yönlendirme yapar ve olaya özgü yük demetini açar:
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 ...
Her olay kodu, ilettiği yük ve kısa bir açıklama aşağıda listelenmiştir.
statusalanından bahsedilen olaylarda,statusbaşarıda0olur ve başarısızlıkta uygulamaya özgü sıfır olmayan bir değer olur.Sabit
Değer
Olay
Yük demeti
_IRQ_CENTRAL_CONNECT1
Bir central, bu peripheral’a bağlandı.
(conn_handle, addr_type, addr)_IRQ_CENTRAL_DISCONNECT2
Bir central, bu peripheral’dan bağlantısını kesti.
(conn_handle, addr_type, addr)_IRQ_GATTS_WRITE3
Bağlı bir istemci, yerel bir özelliğe veya tanımlayıcıya yazdı. Yeni değeri almak için
gatts_readkullanın.(conn_handle, attr_handle)_IRQ_GATTS_READ_REQUEST4
Bağlı bir istemci bir okuma gerçekleştirdi. Okumayı reddetmek için aşağıdaki tablodan sıfır olmayan bir hata kodu döndürün veya kabul etmek için
0/Nonedöndürün.(conn_handle, attr_handle)_IRQ_SCAN_RESULT5
Etkin bir tarama sırasında tek bir reklam (advertising) paketi alındı.
(addr_type, addr, adv_type, rssi, adv_data)_IRQ_SCAN_DONE6
Mevcut tarama, ya yapılandırılan süre dolduğu için ya da
gap_scan(None)çağrıldığı için sona erdi.()_IRQ_PERIPHERAL_CONNECT7
Daha önce verilen bir
gap_connectbaşarılı oldu.(conn_handle, addr_type, addr)_IRQ_PERIPHERAL_DISCONNECT8
Bağlı bir peripheral bağlantısını kesti.
(conn_handle, addr_type, addr)_IRQ_GATTC_SERVICE_RESULT9
gattc_discover_servicestarafından bir hizmet bulundu.(conn_handle, start_handle, end_handle, uuid)_IRQ_GATTC_SERVICE_DONE10
Hizmet keşfi tamamlandı.
(conn_handle, status)_IRQ_GATTC_CHARACTERISTIC_RESULT11
gattc_discover_characteristicstarafından bir özellik bulundu.(conn_handle, end_handle, value_handle, properties, uuid)_IRQ_GATTC_CHARACTERISTIC_DONE12
Özellik keşfi tamamlandı.
(conn_handle, status)_IRQ_GATTC_DESCRIPTOR_RESULT13
gattc_discover_descriptorstarafından bir tanımlayıcı bulundu.(conn_handle, dsc_handle, uuid)_IRQ_GATTC_DESCRIPTOR_DONE14
Tanımlayıcı keşfi tamamlandı.
(conn_handle, status)_IRQ_GATTC_READ_RESULT15
Daha önce verilen bir
gattc_readveri döndürdü.(conn_handle, value_handle, char_data)_IRQ_GATTC_READ_DONE16
Daha önce verilen bir
gattc_readtamamlandı.(conn_handle, value_handle, status)_IRQ_GATTC_WRITE_DONE17
Daha önce verilen bir
gattc_writeonaylandı.(conn_handle, value_handle, status)_IRQ_GATTC_NOTIFY18
Uzak bir sunucu bir (onaysız) bildirim gönderdi.
(conn_handle, value_handle, notify_data)_IRQ_GATTC_INDICATE19
Uzak bir sunucu bir (onaylı) gösterge (indication) gönderdi.
(conn_handle, value_handle, notify_data)_IRQ_GATTS_INDICATE_DONE20
Daha önce gönderilen bir gösterge, istemci tarafından onaylandı (veya zaman aşımına uğradı).
(conn_handle, value_handle, status)_IRQ_MTU_EXCHANGED21
Bir ATT MTU değişimi tamamlandı (her iki taraftan biri tarafından başlatılmış olabilir).
(conn_handle, mtu)_IRQ_L2CAP_ACCEPT22
Uzak bir cihaz, bu cihazın dinlediği bir PSM üzerinde bir L2CAP bağlantısı istedi. Reddetmek için sıfır olmayan bir tamsayı döndürün veya kabul etmek için
0/Nonedöndürün.(conn_handle, cid, psm, our_mtu, peer_mtu)_IRQ_L2CAP_CONNECT23
Bir L2CAP kanalı artık kuruldu; bu, ya gelen bir isteğin kabul edilmesiyle ya da giden bir
l2cap_connectişleminin tamamlanmasıyla gerçekleşti.(conn_handle, cid, psm, our_mtu, peer_mtu)_IRQ_L2CAP_DISCONNECT24
Bir L2CAP kanalının bağlantısı kesildi. Temiz bir bağlantı kesintisi için
status0olur veya giden bir bağlantı girişimi başarısız olduysa sıfır olmayan bir değer olur.(conn_handle, cid, psm, status)_IRQ_L2CAP_RECV25
Bir L2CAP kanalına veri geldi. Bunu okumak için
l2cap_recvintoçağırın.(conn_handle, cid)_IRQ_L2CAP_SEND_READY26
Falsedöndüren önceki birl2cap_sendboşaldı ve kanal yeniden hazır. Sıfır olmayan birstatus, iletim arabelleğinin taştığı ve uygulamanın veriyi yeniden göndermesi gerektiği anlamına gelir.(conn_handle, cid, status)_IRQ_CONNECTION_UPDATE27
Uzak cihaz, bağlantı parametrelerini (aralık, gecikme, denetim zaman aşımı) güncelledi.
(conn_handle, conn_interval, conn_latency, supervision_timeout, status)_IRQ_ENCRYPTION_UPDATE28
Bir bağlantının şifreleme durumu değişti; bu tipik olarak eşleştirme veya bağlama tamamlandıktan sonra gerçekleşir.
(conn_handle, encrypted, authenticated, bonded, key_size)_IRQ_GET_SECRET29
Yığın, depolanmış bir bağlama gizli değerini (secret) istiyor.
keyNoneise,sec_typetürününindex. depolanmış değerini döndürün; aksi takdirde verilen(sec_type, key)ile ilişkili değeri döndürün. Hiçbir şey depolanmamışsaNonedöndürün.(sec_type, index, key)_IRQ_SET_SECRET30
Yığın, uygulamadan bir bağlama gizli değerini kalıcı olarak saklamasını istiyor. Depolandığında
Truedöndürün.(sec_type, key, value)_IRQ_PASSKEY_ACTION31
Eşleştirmenin bir parçası olarak bir parola anahtarı (passkey) eylemi gerekiyor.
gap_passkeykullanarak yanıt verin; olası eylemler için aşağıdaki parola anahtarı eylem tablosuna bakın.(conn_handle, action, passkey)_IRQ_GATTS_READ_REQUESTolayı için kullanılabilir dönüş kodları şunlardır:Sabit
Değer
Anlam
_GATTS_NO_ERROR0x00Okumayı kabul et.
_GATTS_ERROR_READ_NOT_PERMITTED0x02Okumaya izin verilmiyor.
_GATTS_ERROR_WRITE_NOT_PERMITTED0x03Yazmaya izin verilmiyor.
_GATTS_ERROR_INSUFFICIENT_AUTHENTICATION0x05İstemci kimliği doğrulanmamış.
_GATTS_ERROR_INSUFFICIENT_AUTHORIZATION0x08İstemci yetkilendirilmemiş.
_GATTS_ERROR_INSUFFICIENT_ENCRYPTION0x0fBağlantı şifrelenmemiş.
_IRQ_PASSKEY_ACTIONolayı için kullanılabilir eylemler şunlardır:Sabit
Değer
Anlam
_PASSKEY_ACTION_NONE0
Eylem gerekmiyor.
_PASSKEY_ACTION_INPUT2
Kullanıcıdan uzak cihazda gösterilen parola anahtarını girmesini iste.
_PASSKEY_ACTION_DISPLAY3
Uzak cihazın girmesi için 6 haneli bir parola anahtarı göster.
_PASSKEY_ACTION_NUMERIC_COMPARISON4
Parola anahtarının uzak cihazda gösterilenle eşleştiğini doğrula.
Aygıt yazılımında yer kazanmak için, bu sabitler
bluetoothmodülüne dahil edilmemiştir. İhtiyaç duyduklarınızı yukarıdaki listelerden programınıza ekleyin.
Broadcaster Rolü (Reklam Veren)
- gap_advertise(interval_us: int | None, adv_data: bytes | None = None, *, resp_data: bytes | None = None, connectable: bool = True) None¶
Belirtilen aralıkta (mikrosaniye cinsinden) reklam vermeye başlar. Bu aralık en yakın 625 us değerine aşağı yuvarlanır. Reklam vermeyi durdurmak için interval_us değerini
Noneolarak ayarlayın.adv_data ve resp_data, arabellek protokolünü uygulayan herhangi bir tür olabilir (örneğin
bytes,bytearray,str). adv_data tüm yayınlara dahil edilir ve resp_data, etkin bir taramaya yanıt olarak gönderilir.Not: adv_data (veya resp_data)
Noneise,gap_advertiseöğesine yapılan önceki çağrıya iletilen veriler yeniden kullanılır. Bu, bir yayıncının yalnızcagap_advertise(interval_us)ile reklam vermeye devam etmesine olanak tanır. Reklam yükünü temizlemek için boş birbytesgeçirin, yanib''.
Observer Rolü (Tarayıcı)
- gap_scan(duration_ms: int | None, interval_us: int = 1280000, window_us: int = 11250, active: bool = False, /) None¶
Belirtilen süre boyunca (milisaniye cinsinden) süren bir tarama işlemi çalıştırır.
Süresiz tarama yapmak için duration_ms değerini
0olarak ayarlayın.Taramayı durdurmak için duration_ms değerini
Noneolarak ayarlayın.Görev döngüsünü (duty cycle) isteğe bağlı olarak yapılandırmak için interval_us ve window_us değerlerini kullanın. Tarayıcı, toplam duration_ms milisaniye boyunca her interval_us mikrosaniyede bir window_us mikrosaniye çalışır. Varsayılan aralık ve pencere sırasıyla 1,28 saniye ve 11,25 milisaniyedir (arka planda tarama).
Her tarama sonucu için,
(addr_type, addr, adv_type, rssi, adv_data)olay verisiyle_IRQ_SCAN_RESULTolayı tetiklenir.addr_typedeğerleri genel veya rastgele adresleri belirtir:Değer
Ad
Anlam
0x00PUBLIC
Genel (public) cihaz adresi.
0x01RANDOM
Rastgele adres (statik, RPA veya NRPA; tür, adresin kendisinde kodlanmıştır).
adv_typedeğerleri Bluetooth Spesifikasyonuna karşılık gelir:Değer
Ad
Anlam
0x00ADV_IND
Bağlanabilir ve taranabilir yönsüz reklam.
0x01ADV_DIRECT_IND
Bağlanabilir yönlendirilmiş reklam.
0x02ADV_SCAN_IND
Taranabilir yönsüz reklam.
0x03ADV_NONCONN_IND
Bağlanamayan yönsüz reklam.
0x04SCAN_RSP
Tarama yanıtı.
Sonuçlarda tarama yanıtlarını almak istiyorsanız
activedeğeriTrueolarak ayarlanabilir.Tarama durdurulduğunda (ya sürenin bitmesi nedeniyle ya da açıkça durdurulduğunda),
_IRQ_SCAN_DONEolayı tetiklenir.
Central Rolü
Bir central cihaz, observer rolünü kullanarak keşfettiği (bkz.
gap_scan) veya bilinen bir adrese sahip peripheral’lara bağlanabilir.- 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¶
Bir peripheral’a bağlanın.
Adres türleri hakkında ayrıntılar için bkz.
gap_scan.Bekleyen bir bağlantı girişimini erkenden iptal etmek için
gap_connect(None)çağırın.Başarı durumunda,
_IRQ_PERIPHERAL_CONNECTolayı tetiklenir. Bir bağlantı girişimi iptal ediliyorsa,_IRQ_PERIPHERAL_DISCONNECTolayı tetiklenir.Cihaz, cihazdan bir reklam yükü almak için scan_duration_ms kadar bekler.
Bağlantı aralığı, min_conn_interval_us ve max_conn_interval_us değerlerinden biri veya her ikisi kullanılarak mikrosaniye cinsinden yapılandırılabilir. Aksi takdirde, tipik olarak 30000 ile 50000 mikrosaniye arasında varsayılan bir aralık seçilir. Daha kısa bir aralık, güç tüketimi pahasına iş hacmini artırır.
Peripheral Rolü
Bir peripheral cihazın bağlanabilir reklamlar göndermesi beklenir (bkz.
gap_advertise). Genellikle, öncegatts_register_serviceskullanarak hizmetleri ve özellikleri kaydederek bir GATT sunucusu olarak görev yapar.Bir central bağlandığında,
_IRQ_CENTRAL_CONNECTolayı tetiklenir.Central ve Peripheral Rolleri
- gap_disconnect(conn_handle: int, /) bool¶
Belirtilen bağlantı tanıtıcısının (handle) bağlantısını keser. Bu, ya bu cihaza bağlanmış bir central (peripheral olarak görev yapıyorsa) ya da bu cihazın daha önce bağlandığı bir peripheral (central olarak görev yapıyorsa) olabilir.
Başarı durumunda,
_IRQ_PERIPHERAL_DISCONNECTveya_IRQ_CENTRAL_DISCONNECTolayı tetiklenir.Bağlantı tanıtıcısı bağlı değilse
False, aksi takdirdeTruedöndürür.
GATT Sunucusu
Bir GATT sunucusunun bir dizi kayıtlı hizmeti vardır. Her hizmet, her birinin bir değeri olan özellikler içerebilir. Özellikler ayrıca, kendileri de değerlere sahip olan tanımlayıcılar içerebilir.
Bu değerler yerel olarak depolanır ve hizmet kaydı sırasında oluşturulan “değer tanıtıcıları” (value handle) aracılığıyla erişilir. Ayrıca uzak bir istemci cihaz tarafından okunabilir veya yazılabilirler. Buna ek olarak, bir sunucu bir bağlantı tanıtıcısı aracılığıyla bağlı bir istemciye bir özelliği “bildirebilir” (notify).
Central veya peripheral rolündeki bir cihaz GATT sunucusu olarak işlev görebilir, ancak çoğu durumda bir peripheral cihazın sunucu olarak görev yapması daha yaygındır.
Özelliklerin ve tanımlayıcıların varsayılan maksimum boyutu 20 bayttır (23 baytlık varsayılan ATT MTU eksi 3 baytlık bir ATT başlığı; daha büyük bir müzakere edilmiş MTU tek başına bu sınırı yükseltmez). Bir istemci tarafından bunlara yazılan her şey bu uzunluğa kısaltılır. Ancak, herhangi bir yerel yazma maksimum boyutu artırır; bu nedenle, bir istemcinin belirli bir özelliğe daha büyük yazmalar yapmasına izin vermek istiyorsanız, kayıttan sonra
gatts_writekullanın. Örneğingatts_write(char_handle, bytes(100)).- gatts_register_services(services_definition: Sequence[Sequence], /) Sequence[Sequence[int]]¶
Sunucuyu belirtilen hizmetlerle yapılandırır ve mevcut tüm hizmetleri değiştirir.
services_definition, services öğelerinden oluşan bir listedir; burada her service, bir UUID ve bir characteristics listesi içeren iki öğeli bir demettir.
Her characteristic, bir UUID, bir flags değeri ve isteğe bağlı olarak bir descriptors listesi içeren iki veya üç öğeli bir demettir.
Her descriptor, bir UUID ve bir flags değeri içeren iki öğeli bir demettir.
flags, aşağıda tanımlanan bayrakların bit düzeyinde VEYA (bitwise-OR) birleşimidir. Bunlar hem özelliğin (veya tanımlayıcının) davranışını hem de güvenlik ve gizlilik gereksinimlerini ayarlar.
Dönüş değeri, demetlerden oluşan bir listedir (hizmet başına bir öğe) (her öğe bir değer tanıtıcısıdır). Özellik ve tanımlayıcı tanıtıcıları, tanımlandıkları sırayla aynı demet içinde düzleştirilir.
Aşağıdaki örnek iki hizmeti kaydeder (Heart Rate ve 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ğer tanıtıcısı (
hr,tx,rx),gatts_read,gatts_write,gatts_notifyvegatts_indicateile kullanılabilir.Not: Hizmetler kaydedilmeden önce reklam verme durdurulmalıdır.
Özellikler ve tanımlayıcılar için kullanılabilir bayraklar şunlardır:
Sabit
Değer
Anlam
_FLAG_BROADCAST0x0001Özellik yayınlanabilir.
_FLAG_READ0x0002İstemci değeri okuyabilir.
_FLAG_WRITE_NO_RESPONSE0x0004İstemci bir yanıt beklemeden yazabilir.
_FLAG_WRITE0x0008İstemci onaylı bir yanıtla yazabilir.
_FLAG_NOTIFY0x0010Sunucu bildirim gönderebilir (onaysız).
_FLAG_INDICATE0x0020Sunucu gösterge gönderebilir (onaylı).
_FLAG_AUTHENTICATED_SIGNED_WRITE0x0040İstemci imzalı yazmalar gerçekleştirebilir.
_FLAG_AUX_WRITE0x0100Genişletilmiş özellikler: kuyruğa alınmış/güvenilir yazmalara izin verilir.
_FLAG_READ_ENCRYPTED0x0200Okuma şifreli bir bağlantı gerektirir.
_FLAG_READ_AUTHENTICATED0x0400Okuma, kimliği doğrulanmış (MITM korumalı) bir bağlantı gerektirir.
_FLAG_READ_AUTHORIZED0x0800Okuma uygulama düzeyinde yetkilendirme gerektirir.
_FLAG_WRITE_ENCRYPTED0x1000Yazma şifreli bir bağlantı gerektirir.
_FLAG_WRITE_AUTHENTICATED0x2000Yazma, kimliği doğrulanmış (MITM korumalı) bir bağlantı gerektirir.
_FLAG_WRITE_AUTHORIZED0x4000Yazma uygulama düzeyinde yetkilendirme gerektirir.
Yukarıdaki olay sabitlerinde olduğu gibi, bu bayraklar
bluetoothmodülü tarafından sağlanmaz; ihtiyaç duyduklarınızı programınıza kopyalayın.
- gatts_read(value_handle: int, /) bytes¶
Bu tanıtıcı için yerel değeri okur (bu değer ya
gatts_writeile ya da uzak bir istemci tarafından yazılmıştır).
- gatts_write(value_handle: int, data: bytes, send_update: bool = False, /) None¶
Bu tanıtıcı için yerel değeri yazar; bu değer bir istemci tarafından okunabilir.
send_update
Trueise, abone olan tüm istemciler bu yazma hakkında bilgilendirilir (neye abone olduklarına ve özelliğin hangi işlemleri desteklediğine bağlı olarak ya bildirim ya da gösterge yoluyla).
- gatts_notify(conn_handle: int, value_handle: int, data: bytes | None = None, /) None¶
Bağlı bir istemciye bir bildirim isteği gönderir.
data
Noneise (varsayılan), mevcut yerel değer (gatts_writeile ayarlanan) gönderilir.Aksi takdirde, data
Nonedeğilse, bu değer bildirimin bir parçası olarak istemciye gönderilir. Yerel değer değiştirilmez.Not: Bildirim, istemcinin bu özelliğe abonelik durumuna bakılmaksızın gönderilir.
- gatts_indicate(conn_handle: int, value_handle: int, data: bytes | None = None, /) None¶
Bağlı bir istemciye bir gösterge isteği gönderir.
data
Noneise (varsayılan), mevcut yerel değer (gatts_writeile ayarlanan) gönderilir.Aksi takdirde, data
Nonedeğilse, bu değer göstergenin bir parçası olarak istemciye gönderilir. Yerel değer değiştirilmez.Onay (veya başarısızlık, örneğin zaman aşımı) durumunda,
_IRQ_GATTS_INDICATE_DONEolayı tetiklenir.Not: Gösterge, istemcinin bu özelliğe abonelik durumuna bakılmaksızın gönderilir.
- gatts_set_buffer(value_handle: int, len: int, append: bool = False, /) None¶
Bir değer için dahili arabellek boyutunu bayt cinsinden ayarlar. Bu, alınabilecek en büyük yazmayı sınırlar. Varsayılan değer 20 bayttır (23 baytlık varsayılan ATT MTU eksi 3 baytlık ATT başlığı).
append değerini
Trueolarak ayarlamak, tüm uzak yazmaların mevcut değeri değiştirmek yerine sonuna eklenmesini sağlar. Bu şekilde en fazla len bayt arabelleğe alınabilir.gatts_readkullandığınızda, değer okunduktan sonra temizlenir. Bu özellik, Nordic UART Service gibi bir şey uygularken kullanışlıdır.
GATT İstemcisi
Bir GATT istemcisi, uzak bir GATT sunucusundaki özellikleri keşfedebilir ve okuyabilir/yazabilir.
Bir central rolündeki cihazın GATT istemcisi olarak görev yapması daha yaygındır, ancak bir peripheral’ın da kendisine bağlanan central hakkında bilgi keşfetmek için (örneğin cihaz bilgisi hizmetinden cihaz adını okumak için) istemci olarak görev yapması mümkündür.
- gattc_discover_services(conn_handle: int, uuid: UUID | None = None, /) None¶
Bağlı bir sunucuyu hizmetleri için sorgular.
Yalnızca o hizmeti sorgulamak için isteğe bağlı olarak bir hizmet uuid belirtin.
Keşfedilen her hizmet için
_IRQ_GATTC_SERVICE_RESULTolayı tetiklenir ve tamamlandığında_IRQ_GATTC_SERVICE_DONEolayı bunu izler.
- gattc_discover_characteristics(conn_handle: int, start_handle: int, end_handle: int, uuid: UUID | None = None, /) None¶
Bağlı bir sunucuyu belirtilen aralıktaki özellikler için sorgular.
Yalnızca o özelliği sorgulamak için isteğe bağlı olarak bir özellik uuid belirtin.
start_handle=1veend_handle=0xffffgeçirmek, tam GATT öznitelik tanıtıcı aralığını kapsar; bu nedenle bu birleşim, uzak cihazdaki her hizmeti etkili bir şekilde arar.Keşfedilen her özellik için
_IRQ_GATTC_CHARACTERISTIC_RESULTolayı tetiklenir ve tamamlandığında_IRQ_GATTC_CHARACTERISTIC_DONEolayı bunu izler.
- gattc_discover_descriptors(conn_handle: int, start_handle: int, end_handle: int, /) None¶
Bağlı bir sunucuyu belirtilen aralıktaki tanımlayıcılar için sorgular.
Keşfedilen her tanımlayıcı için
_IRQ_GATTC_DESCRIPTOR_RESULTolayı tetiklenir ve tamamlandığında_IRQ_GATTC_DESCRIPTOR_DONEolayı bunu izler.
- gattc_read(conn_handle: int, value_handle: int, /) None¶
Belirtilen özellik veya tanımlayıcı tanıtıcısı için bağlı bir sunucuya uzak bir okuma gerçekleştirir.
Bir değer kullanılabilir olduğunda
_IRQ_GATTC_READ_RESULTolayı tetiklenir ve tamamlandığında_IRQ_GATTC_READ_DONEolayı bunu izler.
- gattc_write(conn_handle: int, value_handle: int, data: bytes, mode: int = 0, /) None¶
Belirtilen özellik veya tanımlayıcı tanıtıcısı için bağlı bir sunucuya uzak bir yazma gerçekleştirir.
mode argümanı, şu anda desteklenen değerlerle birlikte yazma davranışını belirtir:
mode=0(varsayılan) yanıtsız bir yazmadır: yazma uzak sunucuya gönderilir, ancak hiçbir onay döndürülmez ve hiçbir olay tetiklenmez.mode=1yanıtlı bir yazmadır: uzak sunucudan, veriyi aldığına dair bir yanıt/onay göndermesi istenir.
Uzak sunucudan bir yanıt alınırsa
_IRQ_GATTC_WRITE_DONEolayı tetiklenir.
- gattc_exchange_mtu(conn_handle: int, /) None¶
BLE.config(mtu=value)kullanılarak ayarlanan tercih edilen MTU’yu kullanarak bağlı bir sunucuyla MTU değişimini başlatır.MTU değişimi tamamlandığında
_IRQ_MTU_EXCHANGEDolayı tetiklenir.MTU değişimi tipik olarak central tarafından başlatılır; NimBLE her iki rolü de destekler.
L2CAP Bağlantı Yönelimli Kanallar
Bu özellik, iki BLE cihazı arasında soket benzeri veri alışverişine olanak tanır. Cihazlar GAP aracılığıyla bağlandıktan sonra, her iki cihaz da diğerinin sayısal bir PSM (Protocol/Service Multiplexer) üzerinde bağlanmasını dinleyebilir.
Belirli bir zamanda yalnızca bir L2CAP kanalı etkin olabilir (yani dinlerken bağlanamazsınız).
Etkin L2CAP kanalları, kuruldukları bağlantı tanıtıcısı ve bir CID (kanal kimliği) ile tanımlanır.
Bağlantı yönelimli kanalların yerleşik kredi tabanlı akış denetimi vardır. Cihazların ortak bir MTU müzakere ettiği ATT’nin aksine, hem dinleyen hem de bağlanan cihazlar, uzak cihazın
l2cap_recvintoiçinde tamamen tüketilmeden önce gönderebileceği maksimum bekleyen veri miktarını sınırlayan bağımsız birer MTU ayarlar.- l2cap_listen(psm: int, mtu: int, /) None¶
Yerel MTU mtu olarak ayarlanmış halde, belirtilen psm üzerinde gelen L2CAP kanal isteklerini dinlemeye başlar.
Uzak bir cihaz bir bağlantı başlattığında, dinleyen sunucuya gelen bağlantıyı reddetme şansı veren (sıfır olmayan bir tamsayı döndürerek)
_IRQ_L2CAP_ACCEPTolayı tetiklenir.Bağlantı kabul edildiğinde, sunucunun kanal kimliğini (CID) ve yerel ve uzak MTU’yu almasına olanak tanıyan
_IRQ_L2CAP_CONNECTolayı tetiklenir.Not: Dinlemeyi durdurmak şu anda mümkün değildir.
- l2cap_connect(conn_handle: int, psm: int, mtu: int, /) None¶
Yerel MTU mtu olarak ayarlanmış halde, belirtilen psm üzerinde dinleyen bir eşe (peer) bağlanın.
Başarılı bağlantı durumunda, istemcinin CID’yi ve yerel ve uzak (peer) MTU’yu almasına olanak tanıyan
_IRQ_L2CAP_CONNECTolayı tetiklenir.Başarısız bir bağlantı, sıfır olmayan bir durumla
_IRQ_L2CAP_DISCONNECTolayını tetikler.
- l2cap_disconnect(conn_handle: int, cid: int, /) None¶
Belirtilen conn_handle ve cid ile etkin bir L2CAP kanalının bağlantısını keser.
- l2cap_send(conn_handle: int, cid: int, buf: bytes, /) bool¶
conn_handle ve cid ile tanımlanan L2CAP kanalında belirtilen buf öğesini (arabellek protokolünü desteklemelidir) gönderir.
Arabellek her iki sınırı da karşılamalıdır: uzak (peer) MTU’yu aşmamalı ve yerel MTU’nun iki katını aşmamalıdır.
Kanal artık “durmuş” (stalled) ise bu
Falsedöndürür; bu,_IRQ_L2CAP_SEND_READYolayı alınana kadarl2cap_sendöğesinin tekrar çağrılmaması gerektiği anlamına gelir (bu olay, uzak cihaz daha fazla kredi verdiğinde, tipik olarak veriyi alıp işledikten sonra gerçekleşir).
- l2cap_recvinto(conn_handle: int, cid: int, buf: Any | None, /) int¶
Belirtilen conn_handle ve cid öğesinden, sağlanan buf öğesine (arabellek protokolünü desteklemelidir, örneğin bytearray veya memoryview) veri alır.
Kanaldan okunan bayt sayısını döndürür.
buf
Noneise, kullanılabilir bayt sayısını döndürür.Not:
_IRQ_L2CAP_RECVolayı alındıktan sonra, uygulama, alma arabelleğinde daha fazla bayt kalmayana kadar (tipik olarak uzak (peer) MTU boyutuna kadar)l2cap_recvintoçağırmaya devam etmelidir.Alma arabelleği boşalana kadar, uzak cihaza daha fazla kanal kredisi verilmez ve daha fazla veri gönderemez.
Eşleştirme ve Bağlama
Eşleştirme, bir bağlantının gizli değerlerin değişimi yoluyla şifrelenmesine ve kimliğinin doğrulanmasına olanak tanır (parola anahtarı kimlik doğrulaması yoluyla isteğe bağlı MITM koruması ile).
Bağlama, bu gizli değerlerin kalıcı belleğe (non-volatile storage) depolanması işlemidir. Bağlandığında, bir cihaz, depolanan kimlik çözümleme anahtarına (IRK) dayanarak başka bir cihazdan gelen çözümlenebilir özel adresi (RPA) çözümleyebilir. Bağlamayı desteklemek için, bir uygulamanın
_IRQ_GET_SECRETve_IRQ_SET_SECRETolaylarını uygulaması gerekir.- gap_pair(conn_handle: int, /) None¶
Uzak cihazla eşleştirmeyi başlatır.
Bunu çağırmadan önce,
io,mitm,le_securevebondyapılandırma seçeneklerinin (configaracılığıyla) ayarlandığından emin olun.Başarılı eşleştirme durumunda,
_IRQ_ENCRYPTION_UPDATEolayı tetiklenir.
- gap_passkey(conn_handle: int, action: int, passkey: int, /) None¶
Belirtilen conn_handle ve action için bir
_IRQ_PASSKEY_ACTIONolayına yanıt verir. passkey anlamı action öğesine bağlıdır (bu da yapılandırılmış G/Ç yeteneğine bağlıdır):Eylem
Gerekli passkey yanıtı
_PASSKEY_ACTION_INPUTKullanıcının uzak cihazdan okuduğu parola anahtarı.
_PASSKEY_ACTION_DISPLAYKullanıcıya gösterilen, yerel olarak oluşturulmuş rastgele 6 haneli bir parola anahtarı.
_PASSKEY_ACTION_NUMERIC_COMPARISON_IRQ_PASSKEY_ACTIONolayında gösterilen parola anahtarını kabul etmek için1veya eşleştirmeyi iptal etmek için0.
class UUID¶
- class bluetooth.UUID(value: int | bytes | str, /)¶
Belirtilen
valueile bir UUID örneği oluşturur. Bluetooth üç UUID genişliği kullanır;UUIDbunların herhangi birini kabul eder:UUID genişliği
Kabul edilen
valuetürleriÖrnek
16 bit
intveya 2 baytlık bir arabellek (little-endian)UUID(0x2908)veyaUUID(b'\x08\x29')32 bit
4 baytlık arabellek (little-endian)
UUID(b'\x08\x29\x00\x00')128 bit
16 baytlık arabellek veya kısa çizgili bir dize
UUID('6E400001-B5A3-F393-E0A9-E50E24DCCA9E')16 ve 32 bitlik UUID’ler tipik olarak SIG tarafından ayrılmış tanımlayıcılardır (bkz. Bluetooth atanmış numaralar); 128 bitlik UUID’ler normalde satıcı tarafından tanımlanır.