[PYTHON] Hinweise zum Verbinden von Bluetooth von einem Smartphone / PC mit Raspeye 4

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

Betriebsumgebung

Installation der Umgebung

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

Überprüfen Sie die Bluetooth-Mac-Adresse von Raspeye (falls erforderlich).

$ 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

Untersuchen Sie nicht verwendete Kanäle (falls erforderlich).

$ 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

Bearbeiten Sie die Einstellungsdatei, um die serielle Kommunikation über Bluetooth unmittelbar nach dem Start zu aktivieren.

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

Paar

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,

image.png

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

image.png

image.png

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

Versuchen Sie zu empfangen

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

Versuchen Sie mit Python & Bluez zu empfangen

  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

Hinweise zum Verbinden von Bluetooth von einem Smartphone / PC mit Raspeye 4
Steuern Sie die Musikwiedergabe auf einem Smartphone, das mit Raspberry Pi 3 und Bluetooth mit AVRCP verbunden ist
Ausgabe von Raspberry Pi an Line
Über den Fehler, den ich beim Versuch, Adafruit_DHT von Python auf Raspberry Pi zu verwenden, festgestellt habe
Ein Memo zur einfachen Verwendung des Beleuchtungsstärkesensors TSL2561 mit Raspberry Pi 2
Verbinden Sie Ihren Raspberry Pi mit Blynk mit Ihrem Smartphone
Memo zur Migration von Djangos DB von SQLite3 nach MySQL auf Docker auf Raspberry Pi 4B
Beschleunigen Sie die Verbindung von cx_Oracle zur autonomen Datenbank
Raspberry Pi 4 Setup-Hinweise
Ein Memorandum bei der Herstellung einer Überwachungskamera mit Raspeye
[Raspberry PI & Garmin GLO] Bis Bluetooth GPS mit Raspberry PI & Garmin GLO verbunden ist
Ich habe versucht, [eine bestimmte Aufgabe] mit einem Raspeltorte zu automatisieren
Ändern Sie die Meldung, die beim Anmelden bei Raspberry Pi angezeigt wird
So erhalten Sie die Temperatur vom SwitchBot-Thermo-Hygrometer mit Himbeer-Pi
[Raspberry Pi] Minimales Memo zur Erstellung von Gerätetreibern zur Ausgabe von GPIO
Ich habe mit Raspberry Pi gesprochen
Einführung von PyMySQL in Himbeer-Pi3
Raspeye + Python + OpenGL-Memo
Lesen Sie mit Raspberry Pi Ihre Schulregistrierungsnummer aus Ihrem Studentenausweis
Ich habe mit Razpai einen Webserver erstellt, um Anime zu schauen
Ich möchte Python GUI ausführen, wenn Raspberry Pi startet
Raspberry Pi --1 - Zum ersten Mal (Schließen Sie einen Temperatursensor an, um die Temperatur anzuzeigen)
[Hinweis] Verwenden eines 16x2-stelligen LCD-Zeichens (1602A) von Python mit Raspeye
Port FreeRTOS auf Raspberry Pi 4B
Tensorflow-Memo [von Zeit zu Zeit aktualisiert]
Verwenden einer Webkamera mit Raspberry Pi
[Raspberry Pi] Python wurde standardmäßig in Python3 geändert
[Python-Memo] Ich möchte eine zweistellige Hexadezimalzahl aus einer Dezimalzahl erhalten
Ich habe versucht, mit Raspeye 4 (Python Edition) ein signalähnliches Signal zu erzeugen.
[Pyto] Ich habe versucht, ein Smartphone als Flick-Tastatur für den PC zu verwenden
Eine Geschichte, die unter einem Unterschied im Betriebssystem litt, als sie versuchte, ein Papier zu implementieren
Ich möchte verhindern, dass der an den Raspberry Pi (jessie) angeschlossene Lautsprecher beim Neustart des Betriebssystems bon wird (Python-Skript).