Ich habe versucht, die allgemeine Vorgehensweise beim Verbinden von Bluetooth von einem Smartphone / PC mit Raspai und beim Ausführen der Steuerung mithilfe von Python auf der Raspai-Seite zusammenzufassen. (Da ich mich auf eine externe Site bezog und an einigen Stellen feststeckte ...)
Referenz: https://qiita.com/shippokun/items/0953160607833077163f
#Installieren Sie abhängige Pakete für pyBluez
$ sudo apt-get install -y python-dev libbluetooth3-dev
#Installieren Sie 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
Führen Sie einfach sudo sdptool browse local aus und Sie werden sehen, welcher Kanal für was verwendet wird.
$ 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
...
Fügen Sie den seriellen Portdienst hinzu, indem Sie einen nicht verwendeten Kanal angeben. (Wenn Sie einen verwendeten Kanal angeben, schlägt dieser natürlich im nächsten Schritt fehl. Ich habe dies nicht bemerkt und zuerst erhalten ...)
sudo sdptool add --channel=22 SP
Wenn Sie einen seriellen Portdienst hinzufügen möchten, ohne einen Kanal anzugeben, gehen Sie wie folgt vor:
sudo sdptool add SP
Überprüfen Sie, ob der Dienst für die serielle Schnittstelle hinzugefügt werden kann.
sudo sdptool browse local
Wenn das oben Gesagte ausgeführt wird, sieht es wie folgt aus Service Name: Serial Port Sie sollten die Ausgabe erhalten. Hier Channel: 1 Die Kanalnummer wird wie gezeigt angezeigt. Überprüfen Sie sie daher.
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
Fügen Sie --compat zur Zeile ExecStart ... hinzu (damit es im kompatiblen Modus funktioniert). Ebenfalls,
ExecStartPost=/usr/bin/sdptool add SP
#Beschreiben Sie bei der Angabe eines Kanals Folgendes anstelle des oben genannten.
#Achten Sie darauf, keinen verwendeten Kanal anzugeben.
# ExecStartPost=/usr/bin/sdptool add --channel=22 SP
Wird hinzugefügt, damit das serielle Kommunikationsprotokoll (SPP) beim Start hinzugefügt wird. Die Angabe der Kanalnummer ist optional.
[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
#Beschreiben Sie bei der Angabe eines Kanals Folgendes anstelle des oben genannten.
#Achten Sie darauf, keinen verwendeten Kanal anzugeben.
# 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
Starten Sie Razzpie neu.
$ sudo reboot -h
Schalten Sie das Bluetooth von Raspeye ein und lassen Sie den Server nach Bluetooth suchen.
sudo bluetoothctl
[bluetooth] power on
[bluetooth] discoverable on
[bluetooth] agent on
[bluetooth] default-agent
Wenn Sie versuchen, in diesem Status eine Verbindung herzustellen, werden Sie aufgefordert, die Passkey- und Dienstauthentifizierung wie unten gezeigt zu bestätigen. Geben Sie also Ja / Nein ein.
Referenz: 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]#
Hier,
Wenn es wie in der Abbildung oben gezeigt als Audiogerät erkannt wird, wählen Sie raspberrypi aus dem Gerät und dem Drucker aus.
--Serialport (SPP) 'SerialPort'
Deaktivieren Sie andere Elemente als. (Wenn Sie es nicht entfernen, wird es als Audiogerät behandelt. In meiner Umgebung wurde das ursprünglich verwendete Audiogerät inaktiviert und es wurde kein Ton erzeugt ...)
Übrigens, wenn "Serial Port (SPP) 'SerialPort'" nicht angezeigt wird, befolgen Sie die Anweisungen am Anfang. sdptool add SP Um erneut zu überprüfen, ob der serielle Kommunikationsdienst aktiviert ist.
Mach Folgendes:
sudo rfcomm listen /dev/rfcomm0
Führen Sie die folgenden Schritte aus, um die Kanalnummer anzugeben (im Fall der Kanalnummer 22).
sudo rfcomm listen /dev/rfcomm0 22
Starten Sie eine andere Konsole und cat / dev / rfcomm0, um die Meldung auf der Raspberry Pi-Seite zu überprüfen.
$ sudo cat /dev/rfcomm0
Starten Sie auch eine andere Konsole Versuchen Sie, die Nachricht an das Gerät / dev / rfcomm0 auf dem Raspberry Pi weiterzuleiten.
$ 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_Client-Socket, der als Ergebnis der Socket-Annahme zurückgegeben wurde.
13 @param notify_Empfangen von Funktionen / Methoden, die durch serielle Kommunikation empfangene Daten verarbeiten.
14 @param notify_Fehler Funktion / Methode, die die Verarbeitung ausführt, wenn ein Fehler auftritt
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_Empfangen von Funktionen / Methoden, die durch serielle Kommunikation empfangene Daten verarbeiten.
55 @param notify_Fehler Funktion / Methode, die die Verarbeitung ausführt, wenn ein Fehler auftritt
56 @param debug Wird beim Ausgeben von Debug-Meldungen auf True gesetzt
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