[PYTHON] Remarques sur la connexion Bluetooth d'un smartphone / PC à Raspeye 4

J'ai essayé de résumer la procédure générale lors de la connexion Bluetooth d'un smartphone / PC à Raspai et de l'exécution du contrôle en utilisant python du côté Raspai. (Puisque je faisais référence à un site extérieur et que je suis resté coincé à certains endroits ...)

Environnement d'exploitation

Installation de l'environnement

référence: https://qiita.com/shippokun/items/0953160607833077163f

#Installer les packages dépendants pour pyBluez
$ sudo apt-get install -y python-dev libbluetooth3-dev

#Installez pyBluez
$ sudo pip3 install pybluez

# sudo apt-get install bluetooth blueman -y # bluez-tool

$ sudo apt install libusb-dev
$ sudo apt install libdbus-1-dev
$ sudo apt install libglib2.0-dev
$ sudo apt install libudev-dev -y
$ sudo apt install libical-dev -y
$ sudo apt install libreadline-dev -y
$ sudo apt install libdbus-glib-1-dev -y
$ sudo apt install libbluetooth-dev

Vérifiez l'adresse mac Bluetooth de Raspeye (si nécessaire)

$ hciconfig
hci0:   Type: Primary  Bus: UART
        BD Address: DC:A6:32:37:3D:60  ACL MTU: 1021:8  SCO MTU: 64:1
        UP RUNNING PSCAN
        RX bytes:3163 acl:22 sco:0 events:92 errors:0
        TX bytes:3627 acl:21 sco:0 commands:64 errors:0

Examiner les canaux inutilisés (si nécessaire)

$ sudo sdptool browse local | grep Channel
    Channel: 17
    Channel: 16
    Channel: 15
    Channel: 14
    Channel: 10
    Channel: 9
    Channel: 24
    Channel: 12
    Channel: 3

Exécutez simplement sudo sdptool Browse local et vous verrez quel canal est utilisé pour quoi.

$ sudo sdptool browse local
...
Service Name: Headset Voice gateway
Service RecHandle: 0x10005
Service Class ID List:
  "Headset Audio Gateway" (0x1112)
  "Generic Audio" (0x1203)
Protocol Descriptor List:
  "L2CAP" (0x0100)
  "RFCOMM" (0x0003)
    Channel: 12
Profile Descriptor List:
  "Headset" (0x1108)
    Version: 0x0102

...

Ajoutez un service de port série en spécifiant un canal inutilisé. (Bien sûr, si vous spécifiez un canal utilisé, il échouera à l'étape suivante. Je ne l'ai pas remarqué et je l'ai eu le premier ...)

sudo sdptool add --channel=22 SP

Si vous souhaitez ajouter un service de port série sans spécifier de canal, procédez comme suit au lieu de ce qui précède:

sudo sdptool add SP

Vérifiez si le service de port série peut être ajouté.

sudo sdptool browse local

Lorsque ce qui précède est exécuté, cela ressemble à ce qui suit Service Name: Serial Port Vous devriez obtenir la sortie. ici Channel: 1 Le numéro de canal est affiché comme indiqué, alors vérifiez-le.

Service Name: Serial Port
Service Description: COM Port
Service Provider: BlueZ
Service RecHandle: 0x10001
Service Class ID List:
  "Serial Port" (0x1101)
Protocol Descriptor List:
  "L2CAP" (0x0100)
  "RFCOMM" (0x0003)
    Channel: 1
Language Base Attr List:
  code_ISO639: 0x656e
  encoding:    0x6a
  base_offset: 0x100
Profile Descriptor List:
  "Serial Port" (0x1101)
    Version: 0x0100

Modifiez le fichier de paramètres pour activer la communication série via Bluetooth immédiatement après le démarrage.

sudo nano /etc/systemd/system/dbus-org.bluez.service

Ajoutez --compat à la ligne ExecStart ... (faites-le fonctionner en mode compatible). Aussi,

ExecStartPost=/usr/bin/sdptool add SP
#Lorsque vous spécifiez un canal, décrivez ce qui suit au lieu de ce qui précède.
#Faites attention de ne pas spécifier de canal utilisé.
# ExecStartPost=/usr/bin/sdptool add --channel=22 SP

Est ajouté pour que le protocole de communication série (SPP) soit ajouté au démarrage. La spécification du numéro de canal est facultative.

[Unit]
Description=Bluetooth service
Documentation=man:bluetoothd(8)
ConditionPathIsDirectory=/sys/class/bluetooth

[Service]
Type=dbus
BusName=org.bluez
ExecStart=/usr/lib/bluetooth/bluetoothd --compat
ExecStartPost=/usr/bin/sdptool add SP
#Lorsque vous spécifiez un canal, décrivez ce qui suit au lieu de ce qui précède.
#Faites attention de ne pas spécifier de canal utilisé.
# ExecStartPost=/usr/bin/sdptool add --channel=22 SP

NotifyAccess=main
#WatchdogSec=10
#Restart=on-failure
CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_BIND_SERVICE
LimitNPROC=1
ProtectHome=true
ProtectSystem=full


Redémarrez Razzpie.

$ sudo reboot -h

Paire

Activez le Bluetooth de Raspeye et autorisez le serveur à rechercher Bluetooth.

sudo bluetoothctl
[bluetooth] power on
[bluetooth] discoverable on
[bluetooth] agent on
[bluetooth] default-agent

Si vous essayez de vous connecter dans cet état, il vous sera demandé de confirmer le mot de passe et l'authentification du service comme indiqué ci-dessous, alors entrez oui / non.

référence: https://qiita.com/oko1977/items/9f53f3b11a1b033219ea

[CHG] Device 80:19:34:31:CD:1E Connected: yes
Request confirmation
[agent] Confirm passkey 291086 (yes/no): yes
Authorize service
[agent] Authorize service 0000110e-0000-1000-8000-00805f9b34fb (yes/no): yes
Authorize service
[agent] Authorize service 0000110d-0000-1000-8000-00805f9b34fb (yes/no): yes
[CHG] Device 80:19:34:31:CD:1E UUIDs: 00001000-0000-1000-8000-00805f9b34fb
...
[CHG] Device 80:19:34:31:CD:1E UUIDs: c7f94713-891e-496a-a0e7-983a0946126e
[CHG] Device 80:19:34:31:CD:1E Connected: no
[CHG] Device 80:19:34:31:CD:1E Connected: yes
[CHG] Device 80:19:34:31:CD:1E Connected: no
[bluetooth]#

ici,

image.png

S'il est reconnu comme un périphérique audio, comme indiqué dans l'image ci-dessus, sélectionnez raspberrypi sur le périphérique et l'imprimante et sélectionnez

--Serialport (SPP) 'SerialPort'

Décochez les éléments autres que. (Si vous ne le supprimez pas, il sera traité comme un périphérique audio. Dans mon environnement, le périphérique audio que j'utilisais à l'origine était inactivé et aucun son n'était produit ...)

image.png

image.png

Au fait, si «Serial Port (SPP) 'SerialPort'» n'apparaît pas, suivez la procédure du début. sdptool add SP Pour vérifier à nouveau si le service de communication série est activé.

Essayez de recevoir

Procédez comme suit:

sudo rfcomm listen /dev/rfcomm0

Pour spécifier le numéro de canal, procédez comme suit (dans le cas du numéro de canal 22).

sudo rfcomm listen /dev/rfcomm0 22

Lancez une autre console et cat / dev / rfcomm0 pour vérifier le message côté Raspberry Pi.

$ sudo cat /dev/rfcomm0

Aussi, lancez une autre console Essayez de faire écho au message sur le périphérique / dev / rfcomm0 sur le Raspberry Pi.

$ sudo echo abcd > /dev/rfcomm0

Essayez de recevoir avec python et bluez

  1 # -*- coding: utf-8 -*-
  2 # Author: Shinsuke Ogata
  3
  4 import sys
  5 import traceback
  6 import time
  7 import bluetooth
  8 import threading
  9
 10 class SocketThread(threading.Thread):
 11     '''
 12     @param client_Le socket client est retourné suite à l'acceptation du socket.
 13     @param notify_recevoir Fonctions / méthodes qui traitent les données reçues par communication série.
 14     @param notify_error Fonctions / méthodes qui exécutent le traitement lorsqu'une erreur se produit
 15     '''
 16     def __init__(self, server_socket, client_socket, notify_receive, notify_error, debug):
 17         super(SocketThread, self).__init__()
 18         self._server_socket = server_socket
 19         self._client_socket = client_socket
 20         self._receive = notify_receive
 21         self._error = notify_error
 22         self._debug = debug
 23
 24     def run(self):
 25         while True:
 26             try:
 27                 data = self._client_socket.recv(1024)
 28                 if self._receive != None:
 29                     self._receive(data)
 30             except KeyboardInterrupt:
 31                 self._client_socket.close()
 32                 self._server_socket.close()
 33                 break
 34             except bluetooth.btcommon.BluetoothError:
 35                 self._client_socket.close()
 36                 self._server_socket.close()
 37                 if self._debug:
 38                     print('>>>> bluetooth.btcommon.BluetoothError >>>>')
 39                     traceback.print_exc()
 40                     print('<<<< bluetooth.btcommon.BluetoothError <<<<')
 41                 break
 42             except:
 43                 self._client_socket.close()
 44                 self._server_socket.close()
 45                 if self._debug:
 46                     print('>>>> Unknown Error >>>>')
 47                     traceback.print_exc()
 48                     print('<<<< Unknown Error <<<<')
 49                 break
 50
 51 class BluetoothServer(threading.Thread):
 52
 53     '''
 54     @param notify_recevoir Fonctions / méthodes qui traitent les données reçues par communication série.
 55     @param notify_error Fonctions / méthodes qui exécutent le traitement lorsqu'une erreur se produit
 56     @param debug Défini sur True lors de l'émission d'un message de débogage
 57     '''
 58     def __init__(self, notify_receive, notify_error=None, debug=False):
 59         super(BluetoothServer, self).__init__()
 60         self._port =1
 61         self._receive = notify_receive
 62         self._error = notify_error
 63         self._server_socket = None
 64         self._debug = debug
 65
 66     def run(self):
 67         try:
 68             self._server_socket=bluetooth.BluetoothSocket( bluetooth.RFCOMM )
 69
 70             if self._debug:
 71                 print("BluetoothServer: binding...")
 72
 73             self._server_socket.bind( ("",self._port ))
 74
 75             if self._debug:
 76                 print("BluetoothServer: listening...")
 77
 78             self._server_socket.listen(1)
 79
 80             client_socket,address = self._server_socket.accept()
 81
 82             if self._debug:
 83                 print("BluetoothServer: accept!!")
 84             task = SocketThread(self._server_socket, client_socket, self._receive, self._error, self._debug)
 85             task.start()
 86         except KeyboardInterrupt:
 87             if self._debug:
 88                 print("BluetoothServer: KeyboardInterrupt")
 89         except:
 90             if self._debug:
 91                 print('>>>> Unknown Error >>>>')
 92                 traceback.print_exc()
 93                 print('<<<< Unknown Error <<<<')
 94
 95
 96 def receive(data):
 97     print("receive [%s]" % data)
 98
 99 def error(data):
100     print("error")
101
102 if __name__ == '__main__':
103     task = BluetoothServer(receive, error, True)
104     task.start()

Recommended Posts

Remarques sur la connexion Bluetooth d'un smartphone / PC à Raspeye 4
Contrôlez la lecture de musique sur un smartphone connecté à Raspberry Pi 3 et Bluetooth avec AVRCP
Sortie du Raspberry Pi vers la ligne
À propos de l'erreur que j'ai rencontrée en essayant d'utiliser Adafruit_DHT à partir de Python sur Raspberry Pi
Un mémo pour utiliser simplement le capteur d'éclairement TSL2561 avec Raspberry Pi 2
Connectez votre Raspberry Pi à votre smartphone en utilisant Blynk
Mémo de la migration de la base de données de Django de SQLite3 vers MySQL sur Docker sur Raspberry Pi 4B
Accélération lors de la connexion de cx_Oracle à la base de données autonome
Notes de configuration du Raspberry Pi 4
Un mémorandum lors de la réalisation d'une caméra de surveillance avec Raspeye
[Raspberry PI & Garmin GLO] Jusqu'à ce que le GPS Bluetooth soit connecté à Raspberry PI & Garmin GLO
J'ai essayé d'automatiser [une certaine tâche] à l'aide d'une tarte à la râpe
Changer le message affiché lors de la connexion à Raspberry Pi
Comment obtenir la température du thermo-hygromètre SwitchBot à l'aide de Raspberry Pi
[Raspberry Pi] Mémo de création de pilote de périphérique minimal pour la sortie GPIO
J'ai parlé à Raspberry Pi
Présentation de PyMySQL à Raspberry pi3
Raspeye + Python + Mémo OpenGL
Lisez votre numéro d'inscription scolaire à partir de votre carte d'étudiant avec Raspberry Pi
J'ai créé un serveur Web avec Razpai pour regarder des anime
Je veux exécuter l'interface graphique Python au démarrage de Raspberry Pi
Raspberry Pi --1 --Première fois (Connectez un capteur de température pour afficher la température)
[Remarque] Utilisation d'un écran LCD à 16 caractères à 2 chiffres (1602A) de Python avec Raspeye
Portez FreeRTOS vers Raspberry Pi 4B
Mémo Tensorflow [mis à jour de temps à autre]
Utiliser une webcam avec Raspberry Pi
[Raspberry Pi] Changement par défaut de Python en Python3
[Mémo Python] Je souhaite obtenir un nombre hexadécimal à 2 chiffres à partir d'un nombre décimal
J'ai essayé de faire un signal avec Raspeye 4 (édition Python)
[Pyto] J'ai essayé d'utiliser un smartphone comme clavier pour PC
Une histoire qui a souffert d'une différence de système d'exploitation lors de la tentative d'implémentation d'un article
Je veux empêcher le haut-parleur connecté au Raspberry Pi (jessie) d'être bonked lorsque le système d'exploitation est redémarré (script Python)