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 ...)
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
$ 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
$ 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
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
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,

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 ...)


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é.
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
  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