Utilitaire de téléchargement de données d'un tensiomètre BP A200

Introduction

Ce projet concerne un logiciel de téléchargement des données d'un tensiomètre BP A200 de Microlife sous Linux afin de les exploiter et les transmettre aux personnes concernées sans avoir besoin de s'équiper d'un OS alternatif.

Notez qu'un logiciel existe pour Windows et OSX. Ne pas fournir de logiciel pour Linux peut donc apparaitre comme de la mauvaise volonté commerciale. Et ce projet essaie d'y remédier.

Présentation de l'appareil

Cet appareil est destiné à mesurer la tension artérielle chez soi, donc, en principe, dans des conditions meilleures qu'une fois de temps en temps chez le medecin. Cependant ces mesures sont à transmettre à son médecin traitant pour analyse et prise de décision. L'appareil mesure donc la tension et peut stocker jusqu'à 200 résultats dans sa mémoire interne.

L'appareil peut communiquer avec un PC par l'intermédiaire d'une connexion USB. Sous Linux, l'appareil est détecté comme une liaison série /dev/ttyUSB0 établie par le driver cypress_m8 qui est un module chargé automatiquement, lors du branchement du cable usb. Ce module fait partie du paquet kernel de votre distribution (au moins, sous Fedora. Mais à vérifier sur les autres). Le listing dmesg suivant montre comment l'appareil est détecté. Le programme aura donc à ouvrir cette liaison, envoyer des commandes, recevoir les résultats et les stocker dans un fichier au format CSV par exemple.

[  815.412318] usb 6-1: new low-speed USB device number 3 using uhci_hcd
[  815.586297] usb 6-1: New USB device found, idVendor=04b4, idProduct=5500
[  815.586302] usb 6-1: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[  815.586305] usb 6-1: Product: USB to Serial
[  815.586309] usb 6-1: Manufacturer: Cypress Semiconductor
[  815.598354] cypress_m8 6-1:1.0: HID->COM RS232 Adapter converter detected
[  815.602459] usb 6-1: HID->COM RS232 Adapter converter now attached to ttyUSB0
photo du tensiomètre

Format des données sur la liaison

L'observation de la liaison montre que les transferts se font par paquets de 8 octets sans doute imposé par la taille du buffer de l'USB endpoint avec un premier octet indiquant la longueur utile dans le paquet. Le transfert peut être composé de plusieurs paquets consécutifs. La longueur est préfixée par 0 dans le sens PC-appareil et par f dans l'autre sens. Et voici un exemple de commande réponse:

04 12 16 18 24 00 00 00
f7 06 33 31 33 30 33 30 
f7 33 31 30 30 30 30 30 
f7 30 30 30 30 30 30 30 
f7 30 30 2c 30 35 2e 30 
f5 30 0d 0a 36 34 2e 30

Un exemple de commande avec envoi de données vers l'appareil.

04 12 16 18 23 00 00 00
f1 06 34 39 30 37 37 31
07 30 30 30 30 30 30 30
07 31 30 30 30 30 30 30
07 30 30 30 30 30 30 30
07 30 30 30 30 30 30 30
06 30 30 30 30 31 36 00
f1 06 34 39 30 37 37 31

Une commande est acquittée par le code ACK 0x06, c'est le premier octet après la longueur. Une somme de controle termine le bloc de donnée.

Il faut noter que le découpage observé sur la ligne est effectué par le driver cypress_m8. Le programme se contente d'envoyer une commande sans le découpage et reçoit un paquet de données assemblées de longueur dépendant de la commande. Les longueurs sont du niveau du driver. Les codes ACK et checksum sont du niveau de l'application.

Les commandes et résulats

Voici la liste des commandes que l'application peut envoyer vers l'appareil:

Le code, envoyé au niveau de l'application, pour une commande est donc celui-ci en remplaçant xx par une des valeurs ci dessus:

12 16 18 xx

Réponse à la commande 0x22 lecture des données de mesures

La réponse à la commande lecture des données de mesures est de longueur variable dépendant du nombre d'enregistrement.

00 02                                        # number of record, here 2
00 01 31 30 30 31 00 00 00 00 00 00 00 00    # userid
                                             # record 1
15 09 23 20 53                               # date 23/09/2015 20:53
                20 00 00                     # params here 20 looks to
                                             #  indicated mam
                         052                 # pulse 82
                         13C                 # 4 * dia
                         70                  # sys 112
                         052                 # Repeated values
                         13C
                         70
...                                          # repeated records
02                                           # checksum

Commande 0x23 effacement des données de mesures

Après l'envoi de la commande, les données suivantes sont envoyées sous 2 formats, l'un avec un userid, l'autre sans. Les enregistrements sont effacés dans l'appareil.

0000                                              # code without userid
      0001                                        # ??
           00 00 00 00 00 00 00 00 00 00 00 00    # data
16                                                # checksum
0001                                              # code with userid
     0001                                         # ??
          31 30 30 31 00 00 00 00 00 00 00 00     # userid
          00 00 00 00                             # data
          00 00 00 00 00 00 00 00 00 00 00 00     # data
18                                                # checksum

Réponse à la commande lecture ID de l'utilisateur

La réponse à la commande 0x24 indique le userid enregistré dans l'appareil.

31 30 30 31 00 00 00 00 00 00 00                  # userid
                                 ,05              # len of userid
                                 .00\r\n
64                                                # checksum

Réponse à la commande 0x26 lecture des paramètres

La réponse à la commande 0x26 indique les paramètres enregistrés dans l'appareil.

09 24 15 20 11 08 12                              # date in monitor
       00 0'
                                                  # ident string
       011803010007000000000000FF3296F01496FA0A0101010101000400000000
       0000
9B                                                # checksum

commande 0x27 envoi des paramètres

Après l'envoi de la commande, les données suivantes sont envoyées à l'appareil. L'heure et la date sont changés dans l'appareil.

09 24 15 20 11 09 01                              # date to monitor
      0000
                                                  # ident string
      011803010007000000000000FF3296F01496FA0A0101010101000400000000
F7                                                # checksum

Réponse à la commande 0x3e lecture code série

La réponse à la commande 0x3e indique un code de série ou version de l'appareil.

3035304331                                        # serial code
F9                                                # checksum

Compilation

Le driver cypress_m8 gère l'interface USB. En conséquence, le programme ne nécessite aucune dépendance particulière.

Après le téléchargement du paquet bpddl , exécutez les commandes suivantes. Le binaire bpddl est installé dans /usr/local/bin

tar zxvf bpddl-yyyymmdd.tar.gz
cd bpddl-yyyymmdd
make
make install

Lorsqu'on utilise une liaison série, on a coutume de locker le tty correspondant, pour éviter que 2 process utilisent en même temps le tty. Certaines distributions créent automatiquement le répertoire /run/lock/lockdev. Pour d'autres, il faut le créer au démarrage par exemple dans un fichier rc.local. Ne pas oubler de se mettre dans le groupe lock.

mkdir -m 0770 /run/lock/lockdev ; chown root.lock  /run/lock/lockdev
sudo usermod -aG lock 

Utilisation du programme

Afin d'éviter de longues lignes de commande, le programme commence par lire un fichier de configuration bpddl.conf. Ce fichier peut être dans le répertoire courant, peut être défini par la variable d'environnement BPDDL_CONF_FILE ou tout simplement le fichier /etc/bpddl.conf. Un modèle de ce fichier est présent dans le paquet, il peut être nécessaire de l'ajuster à vos convenances.

Le programme bpddl fournit 4 commandes à l'utilisateur:

Quelques exemples de commande:

$ bpddl                          # lecture des données enregistrées

$ bpddl -id 1001                 # changement ID

$ bpddl -time                    # mise à jour de l'horloge

$ bpddl -del                     # effacement des données enregistrées

Limitations

Les informations données précédemment sont issues uniquement de l'observation, elles peuvent donc comporter des erreurs. En conséquence il est préférable de les utiliser avec précaution et éviter de les prendre comme référence.

Le programme est testé uniquement sous Fedora, mais il devrait bien se comporter sur les autres distributions Linux et les unix-like.

Toute information complémentaire ou modification pour améliorer le fonctionnement est, bien sur, bienvenue.

Références

License

The bpddl software is licensed under the terms of the GNU General Public License as published by the Free Software Foundation. See file COPYING in the package.

Download