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