ubluepy — périphérique et central Bluetooth LE¶
Le module ubluepy est l’ancienne API Bluetooth LE livrée avec le portage nRF de MicroPython. Il est vaguement calqué sur la bibliothèque Python Linux bluepy et repose directement sur le SoftDevice de Nordic — il n’y a pas de back-end portable, ce module n’est donc disponible que sur les cibles Nordic (l’Arduino Nano 33 BLE Sense dans la gamme OpenMV). Les API plus récentes bluetooth / aioble ne sont pas activées dans cette version, ubluepy est donc le seul moyen de piloter la radio intégrée à la puce.
L’ensemble de fonctionnalités disponibles dépend du SoftDevice flashé par le micrologiciel :
s140 (Nano 33 BLE Sense) — à la fois les rôles périphérique et central (scanner). C’est ce que livre le micrologiciel OpenMV.
s132 — à la fois périphérique et central.
s110 — périphérique uniquement ; les méthodes de scan / connexion sont exclues à la compilation.
Exemple de périphérique¶
Diffuse en tant que périphérique Bluetooth LE avec un seul service de détection environnementale et notifie une caractéristique de température à chaque écriture dans son Client Characteristic Configuration Descriptor (CCCD)
from ubluepy import Service, Characteristic, UUID, Peripheral, constants
from machine import LED
notif_enabled = False
def event_handler(event_id, handle, data):
global notif_enabled
if event_id == constants.EVT_GAP_CONNECTED:
LED("LED_GREEN").on()
elif event_id == constants.EVT_GAP_DISCONNECTED:
LED("LED_GREEN").off()
periph.advertise(device_name="Nano 33", services=[svc])
elif event_id == constants.EVT_GATTS_WRITE:
notif_enabled = bool(data[0])
svc = Service(UUID("181A")) # Environmental Sensing
char = Characteristic(UUID("2A6E"),
props=Characteristic.PROP_NOTIFY | Characteristic.PROP_READ,
attrs=Characteristic.ATTR_CCCD)
svc.addCharacteristic(char)
periph = Peripheral()
periph.addService(svc)
periph.setConnectionHandler(event_handler)
periph.advertise(device_name="Nano 33", services=[svc])
Exemple de central¶
Recherche les appareils diffusant à proximité pendant 100 ms et décode les données d’annonce de chaque ScanEntry
from ubluepy import Scanner, constants
s = Scanner()
for entry in s.scan(100):
print(entry.addr(), entry.rssi(), "dBm")
for ad_type, name, value in entry.getScanData():
print(" ", ad_type, name, bytes(value))
Contenu du module¶
Classes¶
- class ubluepy.UUID(value)¶
Construit un UUID Bluetooth 16 ou 128 bits.
valueParmi :
int— un UUID numérique 16 bits (UUID(0x180A)).une chaîne
"0xXXXX"de 6 caractères — un UUID 16 bits, par exempleUUID("0x181A").une chaîne
"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"de 36 caractères — un UUID 128 bits complet. La partie spécifique au fournisseur est enregistrée auprès du SoftDevice lors de la construction.une autre instance de
UUID— effectue une copie.
Toute autre longueur déclenche
ValueError("Invalid UUID string length").
- class ubluepy.Service(uuid: UUID, type: int = Service.PRIMARY)¶
Définit un service GATT qui sera enregistré auprès du SoftDevice lorsqu’il est ajouté à un
Peripheral.uuidUne instance de
UUID. Passer un objet qui n’est pas un UUID déclencheValueError.typeSoit
Service.PRIMARY(par défaut), soitService.SECONDARY. Les autres valeurs déclenchentValueError.
- addCharacteristic(characteristic: Characteristic) None¶
Enregistre une
Characteristicauprès du service. Le handle GATT de la caractéristique est attribué pendant cet appel.
- getCharacteristic(uuid: UUID) Characteristic | None¶
Recherche une
Characteristicprécédemment ajoutée par son UUID. Renvoie l’instance de la caractéristique, ouNonesi aucune correspondance n’est trouvée.
- class ubluepy.Characteristic(uuid: UUID, *, props: int = PROP_READ | PROP_WRITE, attrs: int = 0)¶
Définit une caractéristique GATT. Ajoutez-la à un
ServiceavecService.addCharacteristic()avant que lePeripheralparent ne commence à diffuser.uuidUne instance de
UUID.props(nommé uniquement)Masque de bits d’une ou plusieurs valeurs
Characteristic.PROP_*décrivant les opérations prises en charge par la caractéristique.attrs(nommé uniquement)Masque de bits d’attributs GATT supplémentaires. Utilisez
Characteristic.ATTR_CCCDpour attacher un Client Characteristic Configuration Descriptor — requis pour faire fonctionner les caractéristiquesPROP_NOTIFY/PROP_INDICATE.
- read() bytearray¶
Rôle central uniquement. Lit la valeur de la caractéristique depuis le pair connecté. Renvoie un
bytearraycontenant la dernière valeur. Sur un périphérique, c’est une opération sans effet qui renvoieNone.
- write(data, *, with_response: bool = False) None¶
Écrit dans la caractéristique.
Sur un périphérique, si
PROP_NOTIFYest défini dans les propriétés de la caractéristique, la valeur est envoyée sous forme de notification GATT au central connecté ; sinon, la valeur de l’attribut local est mise à jour.Sur un central, la valeur est écrite vers le pair distant. Définissez
with_response=Truepour émettre une requête d’écriture et attendre l’accusé de réception du pair au lieu d’une commande d’écriture.
dataest n’importe quel objet conforme au protocole tampon (bytes,bytearray,memoryview).
- PROP_INDICATE: int¶
La caractéristique peut envoyer des indications (notifications avec accusé de réception) à un central abonné (
0x20).
- class ubluepy.Descriptor(uuid: UUID)¶
Classe stub représentant les descripteurs GATT. L’implémentation actuelle ne stocke que l’UUID et n’expose aucune méthode — elle est fournie pour assurer la compatibilité ascendante avec de futures révisions du module.
- class ubluepy.Peripheral¶
Le périphérique Bluetooth LE local. La même classe est utilisée pour les rôles périphérique et central ; le rôle est sélectionné selon les méthodes que vous appelez (
advertise()sélectionne le rôle périphérique,connect()sélectionne le rôle central).- addService(service: Service) None¶
Enregistre un
Service(et toutes les caractéristiques ajoutées précédemment) auprès du serveur GATT local.
- getServices() list¶
Renvoie la liste des services actuellement enregistrés auprès de ce
Peripheral.
- advertise(*, device_name: str | None = None, services: list | None = None, data: bytes | None = None, connectable: bool = True) None¶
Démarre la diffusion en rôle périphérique.
device_nameNom local complet diffusé dans la charge utile GAP.
servicesListe d’instances de
Serviceà diffuser. L’UUID de chaque service est inclus dans l’annonce.dataCharge utile d’annonce brute optionnelle (
bytes/bytearray) ajoutée à l’en-tête généré automatiquement. Utilisez ceci pour des charges utiles spécifiques au fournisseur ou de balise telles qu’Eddystone.connectableLorsque
True(par défaut), diffuse en tant qu’appareil connectable et enregistre les gestionnaires d’événements GAP / GATTS afin que la fonction de rappelsetConnectionHandler()configurée se déclenche lors de la connexion, de la déconnexion et des écritures CCCD. LorsqueFalse, diffuse en tant que balise — aucun gestionnaire n’est attaché et l’appareil ne peut pas être connecté.
- setConnectionHandler(func) None¶
Enregistre une fonction de rappel invoquée lors des événements GAP et GATTS. La fonction de rappel est appelée sous la forme
func(event_id, conn_handle, data)oùevent_idest l’une des valeursconstants.EVT_GAP_CONNECTED,constants.EVT_GAP_DISCONNECTEDouconstants.EVT_GATTS_WRITE,conn_handleest le handle de connexion du SoftDevice (ou le handle d’attribut pour les écritures GATTS), etdataest la charge utile brute de l’événement sous forme debytearray(ouNonepour les connexions / déconnexions).
- setNotificationHandler(func) None¶
Enregistre une fonction de rappel pour les événements de notification reçus en rôle central.
- withDelegate(delegate: DefaultDelegate) None¶
Attache une instance de
DefaultDelegatepour recevoir les événements GATT décodés.
- connect(addr, *, addr_type: int = constants.ADDR_TYPE_PUBLIC) None¶
Rôle central uniquement. Se connecte au pair à l’adresse donnée et découvre de manière synchrone ses services et caractéristiques primaires. Bloque jusqu’à ce que la connexion soit établie et que la découverte soit terminée ; les services découverts sont ensuite disponibles via
getServices().addrAdresse du pair sous forme de chaîne
"xx:xx:xx:xx:xx:xx"de 17 caractères (par exemple, issue deScanEntry.addr()).addr_type(nommé uniquement)Soit
constants.ADDR_TYPE_PUBLIC(par défaut), soitconstants.ADDR_TYPE_RANDOM_STATIC.
- class ubluepy.Scanner¶
Observateur GAP pour découvrir les appareils diffusant à proximité. Disponible uniquement lorsque le micrologiciel est compilé avec un SoftDevice prenant en charge le rôle central (s132 / s140).
- class ubluepy.ScanEntry¶
Un seul rapport d’annonce capturé par
Scanner.scan(). Les instances sont renvoyées par le scanner — il n’y a pas de constructeur public.- addr_type() int¶
Renvoie le type d’adresse du pair (
constants.ADDR_TYPE_PUBLICouconstants.ADDR_TYPE_RANDOM_STATIC).
- getScanData() list¶
Décode la charge utile d’annonce en une liste de tuples
(ad_type, description, value).ad_typeest l’octet numérique du type AD (voirconstants.ad_types),descriptionest le nom de la constante correspondante sous forme de chaîne (ouNonesi le type est inconnu), etvalueest le corps de l’enregistrement AD sous forme debytearray.
- class ubluepy.DefaultDelegate¶
Classe de base pour les objets passés à
Peripheral.withDelegate(). Sous-classez-la et redéfinissezhandleConnection()/handleNotification()pour réagir aux événements GATT.
Constantes¶
L’attribut constants du module est un espace de noms contenant les identifiants d’événements GAP/GATT, les valeurs de type d’adresse et l’espace de noms imbriqué ad_types.
- constants.EVT_GAP_CONNECTED: int¶
Valeur
event_iddu gestionnaire de connexionPeripheralpour la connexion GAP (16).
- constants.EVT_GAP_DISCONNECTED: int¶
Valeur
event_iddu gestionnaire de connexionPeripheralpour la déconnexion GAP (17).
- constants.EVT_GATTS_WRITE: int¶
Valeur
event_iddu gestionnaire de connexionPeripheralpour une écriture dans un attribut GATT local, y compris les écritures dans un CCCD qui activent/désactivent les notifications (80).
- constants.UUID_CCCD: int¶
UUID Bluetooth standard pour le Client Characteristic Configuration Descriptor (
0x2902).
- constants.ad_types: type¶
Espace de noms des constantes de type AD de données d’annonce issues du Bluetooth Core Specification Supplement. Chaque nom correspond au type AD 1 octet associé :
Nom
Valeur
AD_TYPE_FLAGS0x01AD_TYPE_16BIT_SERVICE_UUID_MORE_AVAILABLE0x02AD_TYPE_16BIT_SERVICE_UUID_COMPLETE0x03AD_TYPE_32BIT_SERVICE_UUID_MORE_AVAILABLE0x04AD_TYPE_32BIT_SERVICE_UUID_COMPLETE0x05AD_TYPE_128BIT_SERVICE_UUID_MORE_AVAILABLE0x06AD_TYPE_128BIT_SERVICE_UUID_COMPLETE0x07AD_TYPE_SHORT_LOCAL_NAME0x08AD_TYPE_COMPLETE_LOCAL_NAME0x09AD_TYPE_TX_POWER_LEVEL0x0AAD_TYPE_CLASS_OF_DEVICE0x0DAD_TYPE_SIMPLE_PAIRING_HASH_C0x0EAD_TYPE_SIMPLE_PAIRING_RANDOMIZER_R0x0FAD_TYPE_SECURITY_MANAGER_TK_VALUE0x10AD_TYPE_SECURITY_MANAGER_OOB_FLAGS0x11AD_TYPE_SLAVE_CONNECTION_INTERVAL_RANGE0x12AD_TYPE_SOLICITED_SERVICE_UUIDS_16BIT0x14AD_TYPE_SOLICITED_SERVICE_UUIDS_128BIT0x15AD_TYPE_SERVICE_DATA0x16AD_TYPE_PUBLIC_TARGET_ADDRESS0x17AD_TYPE_RANDOM_TARGET_ADDRESS0x18AD_TYPE_APPEARANCE0x19AD_TYPE_ADVERTISING_INTERVAL0x1AAD_TYPE_LE_BLUETOOTH_DEVICE_ADDRESS0x1BAD_TYPE_LE_ROLE0x1CAD_TYPE_SIMPLE_PAIRING_HASH_C2560x1DAD_TYPE_SIMPLE_PAIRING_RANDOMIZER_R2560x1EAD_TYPE_SERVICE_DATA_32BIT_UUID0x20AD_TYPE_SERVICE_DATA_128BIT_UUID0x21AD_TYPE_URI0x24AD_TYPE_3D_INFORMATION_DATA0x3DAD_TYPE_MANUFACTURER_SPECIFIC_DATA0xFF