{"id":84024,"date":"2020-06-04T19:42:32","date_gmt":"2020-06-04T17:42:32","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/ble-pod-mikroskopom-atty-gatty"},"modified":"2020-06-04T19:42:32","modified_gmt":"2020-06-04T17:42:32","slug":"ble-pod-mikroskopom-atty-gatty","status":"publish","type":"post","link":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/ble-pod-mikroskopom-atty-gatty","title":{"rendered":"BLE sous le microscope (ATT, GATT\u2026)","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"BLE sous microscope (ATT et GATT...)\" src=\"\/wp-content\/uploads\/2020\/06\/d8587bf897b27457b354549b99399bcc.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h2>BLE sous le microscope (ATT, GATT\u2026)<\/h2>\n<p> <b>Partie 1, aper\u00e7u<\/b><\/p>\n<p>Il s'est d\u00e9j\u00e0 \u00e9coul\u00e9 un certain temps depuis la publication de la premi\u00e8re sp\u00e9cification Bluetooth 4.0. Et bien que le sujet BLE soit tr\u00e8s int\u00e9ressant, il continue de repousser de nombreux d\u00e9veloppeurs en raison de sa complexit\u00e9. Dans mes articles pr\u00e9c\u00e9dents, j'ai principalement examin\u00e9 le niveau le plus bas, le Link Layer et le Physical Layer. Cela a permis d'\u00e9viter d'aborder des concepts compliqu\u00e9s et d\u00e9routants tels que le protocole d'attributs (ATT) et le profil g\u00e9n\u00e9rique d'attributs (GATT). Cependant, il n'y a pas moyen d'\u00e9chapper \u00e0 cela : sans comprendre ces concepts, il est impossible de d\u00e9velopper des appareils compatibles. Aujourd'hui, je voudrais partager ces connaissances avec vous. Dans mon article, je vais m'appuyer sur <noindex><a rel=\"nofollow\" href=\"https:\/\/devzone.nordicsemi.com\/nordic\/short-range-guides\/b\/bluetooth-low-energy\/posts\/ble-characteristics-a-beginners-tutorial\">tutoriel<\/a><\/noindex> un guide pour d\u00e9butants du site Nordic. Alors, commen\u00e7ons.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3>Pourquoi tout est-il si compliqu\u00e9 ?<\/h3>\n<p>\n\u00c0 mon avis, il \u00e9tait \u00e9vident d\u00e8s le d\u00e9part que le contr\u00f4le des appareils via des smartphones est un sujet tr\u00e8s prometteur et durable. C'est pourquoi il a \u00e9t\u00e9 d\u00e9cid\u00e9 de le structurer d\u00e8s le d\u00e9part et au maximum, afin que les fabricants de diff\u00e9rents gadgets ne cr\u00e9ent pas leurs propres protocoles qui seraient ensuite incompatibles. D'o\u00f9 vient la complexit\u00e9. D\u00e8s le premier stade, le protocole BLE a essay\u00e9 d'incorporer tout ce qui \u00e9tait possible, peu importe si cela serait utile par la suite ou non. De plus, la possibilit\u00e9 d'\u00e9largir la liste des appareils pour l'avenir a \u00e9t\u00e9 pr\u00e9vue.<\/p>\n<p>Jetons un \u0153il \u00e0 l'image qui montre le sch\u00e9ma du protocole BLE. Il est compos\u00e9 de plusieurs couches. La couche la plus inf\u00e9rieure, la couche physique (PHY), est responsable du canal radio de l'appareil. Le Link Layer (LL) contient toute la s\u00e9quence de bytes dans le message transmis. Dans les articles pr\u00e9c\u00e9dents, nous avons \u00e9tudi\u00e9 sp\u00e9cifiquement cette couche. L'interface de contr\u00f4le d'h\u00f4te (HCI) est le protocole d'\u00e9change entre les couches ou les puces BLE, si le contr\u00f4leur et l'h\u00f4te sont impl\u00e9ment\u00e9s sur diff\u00e9rentes puces. La formation des paquets, le d\u00e9coupage en trames, le contr\u00f4le des erreurs et l'assemblage des paquets sont pris en charge par le protocole de contr\u00f4le logique de lien et d'adaptation (L2CAP). Le protocole de gestion de la s\u00e9curit\u00e9 (SMP) est responsable du chiffrement des paquets. Le profil d'acc\u00e8s g\u00e9n\u00e9rique (GAP) g\u00e8re l'\u00e9change initial de donn\u00e9es entre les appareils pour d\u00e9terminer \u00ab Qui est qui \u00bb. Il couvre \u00e9galement le scanning et la publicit\u00e9. Dans cet article, je vais m'attarder sur les deux autres parties restantes du protocole - GATT et ATT. GATT est une couche sur ATT, donc ils sont \u00e9troitement entrelac\u00e9s.<\/p>\n<p><img decoding=\"async\" alt=\"BLE sous microscope (ATT et GATT...)\" src=\"\/wp-content\/uploads\/2020\/06\/8060076152cfe3ae648eca362889e571.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPour simplifier le discours, je voudrais faire appel \u00e0 une analogie. Je l'ai entendue quelque part et je souhaite l'appuyer. Imaginez un appareil BLE comme une biblioth\u00e8que avec plusieurs \u00e9tag\u00e8res. Chaque \u00e9tag\u00e8re repr\u00e9sente un sujet distinct. Par exemple, nous avons des \u00e9tag\u00e8res de science-fiction, de math\u00e9matiques, d'encyclop\u00e9dies. Sur chaque \u00e9tag\u00e8re se trouvent des livres sur le sujet indiqu\u00e9. Et dans certains livres, il y a m\u00eame des signets avec des notes. De plus, nous avons un petit catalogue papier de tous les livres. Si vous vous souvenez des biblioth\u00e8ques scolaires \u2014 c'est un tiroir \u00e9troit avec des fiches en papier. Dans cette analogie, la biblioth\u00e8que repr\u00e9sente le profil de notre appareil. Les \u00e9tag\u00e8res repr\u00e9sentent les services, les livres repr\u00e9sentent les caract\u00e9ristiques, et le catalogue repr\u00e9sente le tableau des attributs. Les signets dans les livres sont des descripteurs, que je d\u00e9crirai \u00e9galement plus en d\u00e9tail plus tard.<\/p>\n<p>Tous ceux qui d\u00e9veloppent des appareils savent que dans de nombreux projets, il existe des morceaux de code similaires. En effet, de nombreux appareils ont des fonctionnalit\u00e9s similaires. Par exemple, si des appareils fonctionnent sur batterie, le probl\u00e8me de la recharge et du contr\u00f4le de leur niveau sera le m\u00eame. Il en va de m\u00eame pour les capteurs. En fait, l'approche orient\u00e9e objet en programmation <i>\u00ab permet de cr\u00e9er des objets qui combinent propri\u00e9t\u00e9s et comportements en une seule entit\u00e9 autonome, qui peut ensuite \u00eatre r\u00e9utilis\u00e9e plusieurs fois \u00bb<\/i>. \u00c0 mon avis, une tentative d'approche similaire a \u00e9t\u00e9 faite dans BLE. Un groupe d'int\u00e9r\u00eat sp\u00e9cial Bluetooth (SIG) a d\u00e9velopp\u00e9 des profils. Les appareils de diff\u00e9rents fabricants ayant les m\u00eames profils devraient fonctionner sans difficult\u00e9 ensemble. Les profils sont compos\u00e9s de services, et les services de caract\u00e9ristiques compl\u00e9t\u00e9es par des descripteurs. En g\u00e9n\u00e9ral, cela peut ressembler \u00e0 ceci :<\/p>\n<p><img decoding=\"async\" alt=\"BLE sous microscope (ATT et GATT...)\" src=\"\/wp-content\/uploads\/2020\/06\/34cbbeee142d40e56dff7626ef752d42.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPrenons, par exemple, le sch\u00e9ma du profil moniteur de fr\u00e9quence cardiaque (bracelet de fitness). Il se compose de deux services et de plusieurs caract\u00e9ristiques. Cela permet de comprendre imm\u00e9diatement la hi\u00e9rarchie du profil. La caract\u00e9ristique de point de contr\u00f4le remet \u00e0 z\u00e9ro le total des calories br\u00fbl\u00e9es. <\/p>\n<p>1. Le service de fr\u00e9quence cardiaque comprend trois caract\u00e9ristiques (0x180D) :<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;a) Caract\u00e9ristique obligatoire de la fr\u00e9quence cardiaque (0\u04452A37)<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;b) Caract\u00e9ristique optionnelle de la position du capteur corporel (0x2A38)<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;c) Caract\u00e9ristique conditionnelle de point de contr\u00f4le de fr\u00e9quence cardiaque (0x2A39)<br \/>\n2. Service de gestion de batterie (0x180F) :<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;a) Caract\u00e9ristique obligatoire du niveau de charge de la batterie (0x2A19)<\/p>\n<h3>UUID<\/h3>\n<p>\nPour que nous puissions faire r\u00e9f\u00e9rence de mani\u00e8re unique aux \u00e9l\u00e9ments de profil (services, caract\u00e9ristiques et descripteurs), il est n\u00e9cessaire de les num\u00e9roter d'une certaine mani\u00e8re. \u00c0 cet effet, le concept d'Universally Unique ID (UUID) ou Identifiant unique universel a \u00e9t\u00e9 introduit. Entre parenth\u00e8ses, chaque ligne indique en effet l'UUID. Et ici, il y a une particularit\u00e9. Pour les UUID, il a \u00e9t\u00e9 d\u00e9cid\u00e9 d'utiliser un code de 16 et 128 bits. Pourquoi, vous demandez-vous ? Dans le protocole BLE, tout est soumis \u00e0 la conservation de l'\u00e9nergie. Ainsi, une dimension de 16 bits est tout \u00e0 fait raisonnable. Il est peu probable qu'il y ait plus de 65 000 services et caract\u00e9ristiques uniques \u00e0 cr\u00e9er dans un avenir proche. Pour l'instant, tout ce que nous pouvions, nous l'avons d\u00e9j\u00e0 compt\u00e9 (rappelez-vous d'o\u00f9 cela vient - \u00ab il vous a compt\u00e9 aussi \u00bb :-)) \u00c9l\u00e9ments num\u00e9rot\u00e9s <noindex><a rel=\"nofollow\" href=\"https:\/\/www.bluetooth.com\/specifications\/gatt\/\">profils<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/www.bluetooth.com\/specifications\/gatt\/services\/\">services<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/www.bluetooth.com\/specifications\/gatt\/characteristics\/\">caract\u00e9ristiques<\/a><\/noindex> et <noindex><a rel=\"nofollow\" href=\"https:\/\/www.bluetooth.com\/specifications\/gatt\/descriptors\/\">descripteurs<\/a><\/noindex> vous pouvez consulter via les liens.<\/p>\n<p>Cependant, je pense que tout le monde se souvient de l'histoire des 4 octets d'adresse IP sur Internet. Au d\u00e9part, on pensait que c'\u00e9tait suffisant, mais nous n'avons toujours pas r\u00e9ussi \u00e0 passer \u00e0 une adresse \u00e0 6 octets. Pour \u00e9viter de r\u00e9p\u00e9ter cette erreur et donner aux bricoleurs un champ d'action, la SIG a imm\u00e9diatement d\u00e9cid\u00e9 d'introduire \u00e9galement des UUID de 128 bits. Cela me rappelle personnellement la bande non licenci\u00e9e de 433 MHz, qui a \u00e9t\u00e9 laiss\u00e9e aux diff\u00e9rents inventeurs du canal radio. Dans notre cas, un identifiant de 128 bits pour les services et caract\u00e9ristiques a \u00e9t\u00e9 attribu\u00e9. Cela signifie que nous pouvons utiliser pratiquement n'importe quelle valeur de 128 bits pour nos services et appareils. De toute fa\u00e7on, la probabilit\u00e9 de cr\u00e9er un UUID identique tend vers z\u00e9ro.<\/p>\n<p>En r\u00e9alit\u00e9, les UUID courts de 16 bits ont leur extension jusqu'\u00e0 une valeur de 128 bits. Dans la sp\u00e9cification, cette extension est appel\u00e9e Bluetooth Base UUID et a la valeur 00000000-0000-1000-8000-00805F9B34FB. Par exemple, si un UUID d'attribut de 16 bits a la valeur 0x1234, alors l'UUID \u00e9quivalent de 128 bits aura la valeur 00001234-0000-1000-8000-00805F9B34FB. De plus, la formule correspondante est fournie :<\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;128_bit_value = 16_bit_value * 2^96 + Bluetooth_Base_UUID<\/p>\n<p>D'o\u00f9 vient ce nombre magique, je ne le sais pas. Si l'un des lecteurs sait, qu'il l'\u00e9crive dans les commentaires (L'utilisateur avec le pseudo Sinopteek l'a d\u00e9j\u00e0 fait. Voir les commentaires). En ce qui concerne la cr\u00e9ation d'UUID de 128 bits, il est en principe possible d'utiliser un <noindex><a rel=\"nofollow\" href=\"https:\/\/www.famkruithof.net\/uuid\/uuidgen\">g\u00e9n\u00e9rateur<\/a><\/noindex>, qui le fera pour vous.<\/p>\n<h3>ATT\u044b GATT\u044b\u2026<\/h3>\n<p>\n C'est ici que commence la partie la plus int\u00e9ressante. Je rappelle que ATT est bas\u00e9 sur la relation client-serveur. Nous examinons maintenant le dispositif du serveur. Il contient des informations telles que les valeurs des capteurs, l'\u00e9tat de l'interrupteur, les donn\u00e9es de localisation, etc. Maintenant que tous les \u00ab participants \u00e0 notre parade \u00bb sont num\u00e9rot\u00e9s, il faut les organiser d'une mani\u00e8re ou d'une autre dans la m\u00e9moire de l'appareil. Pour cela, nous les pla\u00e7ons dans un tableau appel\u00e9 tableau d'attributs. Gardez cela en t\u00eate. C'est le c\u0153ur m\u00eame du BLE. C'est ce que nous allons approfondir par la suite. Maintenant, chaque ligne sera appel\u00e9e un attribut. Ce tableau se trouve au c\u0153ur de la pile et, g\u00e9n\u00e9ralement, nous n'avons pas d'acc\u00e8s direct \u00e0 lui. Nous l'initialisons et y acc\u00e9dons, mais ce qui se passe \u00e0 l'int\u00e9rieur reste cach\u00e9 derri\u00e8re sept sceaux. <\/p>\n<p>Regardons l'image de la sp\u00e9cification, mais avant cela, je tiens \u00e0 souligner la confusion fr\u00e9quente concernant les termes, notamment les descripteurs. Le r\u00f4le du descripteur est de compl\u00e9ter la description d'une caract\u00e9ristique. Lorsqu'il est n\u00e9cessaire d'\u00e9largir ses capacit\u00e9s, on utilise alors des descripteurs. Ils sont \u00e9galement des attributs et, comme les services et les caract\u00e9ristiques, sont plac\u00e9s dans le tableau d'attributs. Nous les examinerons en d\u00e9tail dans la deuxi\u00e8me partie de l'article. Cependant, parfois, le terme descripteur d\u00e9signe le num\u00e9ro de ligne dans le tableau d'attributs. Il est bon d'en tenir compte. Pour \u00e9viter toute confusion, nous utiliserons le terme \u00ab pointeur d'attribut \u00bb \u00e0 ces fins.<br \/>\n<img decoding=\"async\" alt=\"BLE sous microscope (ATT et GATT...)\" src=\"\/wp-content\/uploads\/2020\/06\/6df836477b153c396bdba9068129bb6f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAinsi, un attribut est une valeur discr\u00e8te qui poss\u00e8de les propri\u00e9t\u00e9s suivantes :<br \/>\n1. Pointeur d'attribut (Attribute Handle) \u2014 c'est l'indice du tableau correspondant \u00e0 l'attribut <br \/>\n2. Type d'attribut (Attribute Type) \u2014 c'est l'UUID qui d\u00e9crit son type <br \/>\n3. Valeur d'attribut (Attribute Value) \u2014 ce sont les donn\u00e9es index\u00e9es par le pointeur d'attribut <br \/>\n4. Permissions des attributs (Attribute Permissions) \u2014 ce sont des parties de l'attribut, permissions qui ne peuvent pas \u00eatre lues ou \u00e9crites en utilisant le protocole des attributs.<\/p>\n<p>Comment comprendre tout cela ? Un pointeur d'attribut est, en quelque sorte, son num\u00e9ro dans notre tableau.<br \/>\nIl permet au client de faire r\u00e9f\u00e9rence \u00e0 un attribut dans les demandes de lecture ou d'\u00e9criture. Nous pouvons num\u00e9roter nos lignes (attributs) de 0x0001 \u00e0 0xFFFF. Dans notre association avec une biblioth\u00e8que, c'est le num\u00e9ro de la fiche dans le catalogue papier. De la m\u00eame mani\u00e8re, comme dans le catalogue d'une biblioth\u00e8que, les fiches sont class\u00e9es par num\u00e9ro croissant. Chaque ligne suivante doit avoir un num\u00e9ro sup\u00e9rieur \u00e0 celui de la pr\u00e9c\u00e9dente. Tout comme dans une biblioth\u00e8que, certaines fiches peuvent parfois \u00eatre perdues ; il en va de m\u00eame pour nous : il peut y avoir des lacunes dans le num\u00e9rotage des lignes. Cela est acceptable. L'essentiel est qu'elles soient en ordre croissant.<\/p>\n<p>Le type d'attribut d\u00e9termine ce que repr\u00e9sente cet attribut. Par analogie avec le langage C,<br \/>\no\u00f9 il existe des variables bool\u00e9ennes, num\u00e9riques et des cha\u00eenes, ici aussi. Par le type d'attribut, nous savons <br \/>\navec quoi nous avons \u00e0 faire et comment nous devons travailler avec cet attribut par la suite. Ci-dessous, nous examinerons certains types d'attributs sp\u00e9cifiques. Par exemple, \u00abd\u00e9claration de service\u00bb (0x2800), \u00abd\u00e9claration de caract\u00e9ristiques\u00bb (0x2803), \u00abd\u00e9claration de descripteur\u00bb (0x2902).<\/p>\n<p>La valeur de l'attribut est en fait sa valeur, excusez la tautologie. Si le type d'attribut est une cha\u00eene, alors la valeur de l'attribut peut \u00eatre, par exemple, le slogan \u00abHello World !!!\u00bb. Si le type d'attribut est une \u00abd\u00e9claration de service\u00bb, alors sa valeur est le service lui-m\u00eame. Parfois, il s'agit d'informations sur o\u00f9 trouver d'autres attributs et leurs propri\u00e9t\u00e9s.<\/p>\n<p>Les autorisations d'attributs permettent au serveur de comprendre si l'acc\u00e8s en lecture ou en \u00e9criture est autoris\u00e9. <br \/>\nNotez que ces autorisations s'appliquent uniquement \u00e0 la valeur de l'attribut, et non au pointeur, au type et au champ d'autorisation lui-m\u00eame. C'est-\u00e0-dire que si l'\u00e9criture de l'attribut est autoris\u00e9e, nous pouvons remplacer, par exemple, la ligne \u00abHello World !!!\u00bb par la ligne \u00abGood morning\u00bb. Mais nous ne pouvons pas interdire l'\u00e9criture d'une nouvelle ligne ou changer le type d'attribut et d\u00e9signer la ligne comme une \u00abd\u00e9claration de service\u00bb. Lorsqu'un client se connecte au serveur, il demande ses attributs. Cela permet au client de savoir ce que le serveur peut offrir. Cependant, il n'est pas n\u00e9cessaire de lire et d'\u00e9crire les valeurs.<\/p>\n<h3>\u00c0 quoi cela ressemble<\/h3>\n<p>\nLe concept de GATT consiste \u00e0 regrouper les attributs dans la table des attributs dans un ordre tr\u00e8s sp\u00e9cifique et logique. Examinons de plus pr\u00e8s le profil de fr\u00e9quence cardiaque ci-dessous. La colonne la plus \u00e0 gauche de cette table est facultative. Elle nous d\u00e9crit simplement ce qu'est cette ligne (attribut). Toutes les autres colonnes nous sont d\u00e9j\u00e0 famili\u00e8res.<\/p>\n<p><img decoding=\"async\" alt=\"BLE sous microscope (ATT et GATT...)\" src=\"\/wp-content\/uploads\/2020\/06\/110813482dacb0f19cb49e735f4a9e34.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEn haut de chaque groupe, nous avons toujours un attribut d'annonce de service. Son type est toujours \u00e9gal \u00e0 0x2800, et le pointeur d\u00e9pend du nombre d'attributs d\u00e9j\u00e0 pr\u00e9sents dans la table. Ses autorisations sont toujours en lecture seule, sans aucune v\u00e9rification d'authenticit\u00e9 ou d'autorisation. Nous parlerons de ces concepts un peu plus tard. La valeur est un autre UUID qui d\u00e9finit de quel service il s'agit. Dans la table, la valeur est \u00e9gale \u00e0 0x180D, qui est d\u00e9finie par Bluetooth SIG comme le service de fr\u00e9quence cardiaque. <\/p>\n<p>Suite \u00e0 l'annonce du service, il y a l'annonce de la caract\u00e9ristique. Sa forme ressemble \u00e0 celle de l'annonce du service. Son UUID a toujours la valeur 0x2803, et les autorisations sont \u00e9galement toujours en lecture seule, sans v\u00e9rification d'authenticit\u00e9 ou d'autorisation. Regardons le champ de la valeur de l'attribut, qui inclut certaines donn\u00e9es. Il contient toujours un pointeur, un UUID et un ensemble de propri\u00e9t\u00e9s. Ces trois \u00e9l\u00e9ments d\u00e9crivent l'annonce suivante de la valeur caract\u00e9ristique. Le pointeur indique naturellement o\u00f9 se trouve l'annonce de la valeur caract\u00e9ristique dans la table des attributs. L'UUID d\u00e9crit quel type d'information ou de valeur nous pouvons attendre. Par exemple, la valeur de temp\u00e9rature, l'\u00e9tat d'un interrupteur ou toute autre valeur arbitraire. Enfin, les propri\u00e9t\u00e9s d\u00e9crivent comment interagir avec la valeur caract\u00e9ristique. <\/p>\n<p>Ici, nous sommes confront\u00e9s \u00e0 un autre pi\u00e8ge. Il est li\u00e9 aux autorisations des attributs et aux propri\u00e9t\u00e9s des caract\u00e9ristiques. Regardons l'image des propri\u00e9t\u00e9s du champ binaire dans la sp\u00e9cification.<\/p>\n<p><img decoding=\"async\" alt=\"BLE sous microscope (ATT et GATT...)\" src=\"\/wp-content\/uploads\/2020\/06\/7397f7f69e573ae3084cbacdcd318829.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nComme vous pouvez le voir, il y a \u00e9galement des champs permettant la lecture et l'\u00e9criture. Vous vous demandez peut-\u00eatre pourquoi nous avons des autorisations en lecture\/\u00e9criture pour l'attribut et la propri\u00e9t\u00e9. <br \/>\nQuelles sont les permissions de lecture\/\u00e9criture pour la valeur d'une caract\u00e9ristique ? Ne devraient-elles pas toujours \u00eatre identiques ? En r\u00e9alit\u00e9, les propri\u00e9t\u00e9s de la valeur d'une caract\u00e9ristique ne sont que des recommandations pour le client, utilis\u00e9es dans le GATT et les couches applicatives. Ce sont simplement des indications sur ce que le client peut attendre de l'attribut de d\u00e9claration de la caract\u00e9ristique. Examinons cela de plus pr\u00e8s. Quels types de permissions existent pour l'attribut ? <\/p>\n<p>1. Permissions d'acc\u00e8s :<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp; \u2014 lecture<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp; \u2014 \u00e9criture<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp; \u2014 lecture et \u00e9criture<br \/>\n2. Permission d'authentification :<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp; \u2014 authentification requise<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp; \u2014 authentification non requise<br \/>\n3. Permission d'autorisation :<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp; \u2014 autorisation requise<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp; \u2014 autorisation non requise<\/p>\n<p>La principale diff\u00e9rence entre les permissions des attributs et les propri\u00e9t\u00e9s des caract\u00e9ristiques est que les premi\u00e8res s'appliquent aux serveurs, tandis que les secondes s'appliquent aux clients. Un serveur peut avoir la permission de lire la valeur d'une caract\u00e9ristique, mais il peut y avoir une exigence d'authentification ou d'autorisation. Ainsi, lors de la demande des propri\u00e9t\u00e9s d'une caract\u00e9ristique par le client, nous constaterons que la lecture est autoris\u00e9e. Mais lors de la tentative de lecture, nous obtiendrons une erreur. Il est donc juste de dire que les permissions pr\u00e9valent sur les propri\u00e9t\u00e9s. En tant que client, nous ne pouvons pas obtenir d'informations sur les permissions de l'attribut.<\/p>\n<h3>Descripteur<\/h3>\n<p>\nRevenons \u00e0 notre tableau. Apr\u00e8s la d\u00e9claration de la valeur d'une caract\u00e9ristique, les d\u00e9clarations d'attributs suivantes peuvent \u00eatre possibles : <br \/>\n1. Nouvelle d\u00e9claration de caract\u00e9ristique (il peut y avoir plusieurs caract\u00e9ristiques dans le service)<br \/>\n2. Nouvelle d\u00e9claration de service (il peut y en avoir plusieurs dans le tableau)<br \/>\n3. D\u00e9claration de descripteur <\/p>\n<p>En ce qui concerne la caract\u00e9ristique de mesure de la fr\u00e9quence cardiaque, dans notre tableau, l'annonce de la valeur de la caract\u00e9ristique est accompagn\u00e9e de l'annonce du descripteur. Un descripteur est un attribut contenant des informations suppl\u00e9mentaires sur la caract\u00e9ristique. Il existe plusieurs types de descripteurs. Nous les examinerons en d\u00e9tail dans la deuxi\u00e8me partie de cet article. Pour l'instant, nous ne toucherons qu'au descripteur de configuration des caract\u00e9ristiques client (Client Characteristic Configuration Descriptor \u2014 CCCD). Son UUID est \u00e9gal \u00e0 0x2902. Gr\u00e2ce \u00e0 ce descripteur, le client a la possibilit\u00e9 d\u2019activer l\u2019indication ou la notification sur le serveur. La diff\u00e9rence entre les deux est l\u00e9g\u00e8re, mais elle existe. La notification ne n\u00e9cessite pas de confirmation de r\u00e9ception de la part du client. L\u2019indication, en revanche, l'exige, m\u00eame si elle se produit au niveau GATT, sans atteindre le niveau de l'application. Pourquoi cela, me demanderez-vous ? H\u00e9las, je ne le sais pas. Je dirai seulement que les sp\u00e9cialistes de Nordic recommandent d'utiliser la notification. D'autant plus que la v\u00e9rification de l'int\u00e9grit\u00e9 du paquet (\u00e0 l'aide de CRC) se produit dans les deux cas.<\/p>\n<h3>Conclusion<\/h3>\n<p>\n\u00c0 la fin de l'article, je voudrais dire ceci. Le dernier tableau est quelque peu d\u00e9routant. Cependant, je me suis arr\u00eat\u00e9 sur celui-ci parce qu'il est pr\u00e9sent\u00e9 dans <noindex><a rel=\"nofollow\" href=\"https:\/\/devzone.nordicsemi.com\/nordic\/short-range-guides\/b\/bluetooth-low-energy\/posts\/ble-characteristics-a-beginners-tutorial\">article<\/a><\/noindex>, sur lequel je m'appuie. Dans la deuxi\u00e8me partie de mon article, je pr\u00e9vois d'approfondir la sp\u00e9cification BlueTooth 4.0. L\u00e0, nous trouverons des sch\u00e9mas et des illustrations plus corrects. Dans la troisi\u00e8me partie, je souhaite examiner le journal obtenu gr\u00e2ce au programme Wireshark \u00e0 partir de l'un des gadgets et voir \u00ab en direct \u00bb toute la th\u00e9orie que nous \u00e9tudions.<\/p>\n<p>Employ\u00e9 du Groupe de Soci\u00e9t\u00e9s <noindex><a rel=\"nofollow\" href=\"https:\/\/www.csat.ru\/\">\u00ab C\u00e9sar Satellite \u00bb<\/a><\/noindex><br \/>\nVladimir Pecherskiy<br \/>\n<br \/>Source : <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/505078\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>BLE \u043f\u043e\u0434 \u043c\u0438\u043a\u0440\u043e\u0441\u043a\u043e\u043f\u043e\u043c (ATT\u044b GATT\u044b&#8230;) \u0427\u0430\u0441\u0442\u044c 1, \u043e\u0431\u0437\u043e\u0440\u043d\u0430\u044f \u0423\u0436\u0435 \u043f\u0440\u043e\u0448\u043b\u043e \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u0432\u0440\u0435\u043c\u044f, \u0441 \u0442\u0435\u0445 \u043f\u043e\u0440, \u043a\u043e\u0433\u0434\u0430 \u0432\u044b\u0448\u043b\u0430 \u043f\u0435\u0440\u0432\u0430\u044f \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u043d\u0430 Bluetooth 4.0. \u0418, \u0445\u043e\u0442\u044f \u0442\u0435\u043c\u0430 BLE \u043e\u0447\u0435\u043d\u044c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0430, \u043e\u043d\u0430 \u0434\u043e \u0441\u0438\u0445 \u043f\u043e\u0440 \u043e\u0442\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u0435\u0442 \u043c\u043d\u043e\u0433\u0438\u0445 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432, \u0438\u0437-\u0437\u0430 \u0441\u0432\u043e\u0435\u0439 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438. \u0412 \u0441\u0432\u043e\u0438\u0445 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u0441\u0442\u0430\u0442\u044c\u044f\u0445 \u044f \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u043b \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u0441\u0430\u043c\u044b\u0439 \u043d\u0438\u0436\u043d\u0438\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c Link Layer \u0438 Physical Layer. [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":84025,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-84024","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2 - aioseo.com -->\n\t<meta name=\"description\" content=\"BLE \u043f\u043e\u0434 \u043c\u0438\u043a\u0440\u043e\u0441\u043a\u043e\u043f\u043e\u043c (ATT\u044b GATT\u044b...) \u0427\u0430\u0441\u0442\u044c 1.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/ble-pod-mikroskopom-atty-gatty\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"fr_FR\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47BLE \u043f\u043e\u0434 \u043c\u0438\u043a\u0440\u043e\u0441\u043a\u043e\u043f\u043e\u043c (ATT\u044b GATT\u044b\u2026) | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"BLE \u043f\u043e\u0434 \u043c\u0438\u043a\u0440\u043e\u0441\u043a\u043e\u043f\u043e\u043c (ATT\u044b GATT\u044b...) \u0427\u0430\u0441\u0442\u044c 1.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/ble-pod-mikroskopom-atty-gatty\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-06-04T17:42:32+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-06-04T17:42:32+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47BLE sous microscope (ATT et GATT\u2026) | ProHoster","description":"BLE sous microscope (ATT et GATT...) Partie 1.","canonical_url":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/ble-pod-mikroskopom-atty-gatty","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"fr_FR","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47BLE \u043f\u043e\u0434 \u043c\u0438\u043a\u0440\u043e\u0441\u043a\u043e\u043f\u043e\u043c (ATT\u044b GATT\u044b\u2026) | ProHoster","og:description":"BLE \u043f\u043e\u0434 \u043c\u0438\u043a\u0440\u043e\u0441\u043a\u043e\u043f\u043e\u043c (ATT\u044b GATT\u044b...) \u0427\u0430\u0441\u0442\u044c 1.","og:url":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/ble-pod-mikroskopom-atty-gatty","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-06-04T17:42:32+00:00","article:modified_time":"2020-06-04T17:42:32+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"84024","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 15:06:38","updated":"2022-09-28 11:11:59","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/84024","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/comments?post=84024"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/84024\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media\/84025"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media?parent=84024"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/categories?post=84024"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/tags?post=84024"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}