ยอมรับการเชื่อมต่อบลูทู ธ โดยอัตโนมัติใน Pi 3


14

ฉันกำลังมองหาที่จะพัฒนาแพลตฟอร์มสำหรับรถของฉันซึ่งเชื่อมต่ออุปกรณ์ใด ๆ ที่พยายามเชื่อมต่อกับ Pi ผ่านบลูทู ธ โดยอัตโนมัติ ขณะนี้ต้องมีการยอมรับการจับคู่โดย Pi แต่ในกรณีนี้จะไม่มีหน้าจอดังนั้นจึงต้องดำเนินการโดยอัตโนมัติ ฉันจะทำสิ่งนี้ได้อย่างไร


คุณช่วยอธิบายได้อย่างละเอียดว่าคุณใช้ pi รุ่นใดเพียงเพราะ 3 คือ carib; e ของบลูทู ธ ที่ไม่มีฮาร์ดแวร์ภายนอก?
Mohammad Ali

Raspberry Pi 3 รุ่น B - Bluetooth ในตัว
Oliver Kuchies

ดังนั้นสิ่งที่คุณคาดหวังคือการที่ Pi จะออกอากาศอย่างต่อเนื่องและยอมรับการเชื่อมต่อที่จับคู่โดยโทรศัพท์ของคุณ? คุณเข้าใจความหมายของความปลอดภัยหรือไม่ ขวา? และกำลังเขียนสคริปต์ Python ขนาดเล็กเพื่อทำงานเป็นโซลูชันที่ยอมรับได้หรือไม่
Mohammad Ali

ใช่ แต่เพื่อให้ปลอดภัยยิ่งขึ้นฉันขอแนะนำให้แสดงวิธี จำกัด การเชื่อมต่อเดียวก่อนที่จะค้นพบอีกครั้ง นอกจากนี้โปรดเพิ่มความปลอดภัยเพื่อตอบคำถามเพื่อช่วยเหลือผู้อื่น :)
Oliver Kuchies

คำตอบ:


12

( โปรดทราบว่าคำตอบนี้ไม่สามารถใช้งานได้กับ Raspbian Jessie อีกต่อไปเนื่องจาก bluez ลบคำสั่ง bluetooth-agent )

ดังนั้นในปัจจุบันคุณระบุว่าคุณสามารถเชื่อมต่อกับ Pi ได้ แต่จำเป็นต้องมีจอภาพสำหรับกระบวนการจับคู่

หมายเหตุ: การยอมรับการเชื่อมต่อใด ๆ เป็นความคิดที่ไม่ปลอดภัยอย่างเหลือเชื่อและหากคุณใช้ชุดอุปกรณ์ที่ จำกัด เพียงอย่างเดียวการตั้งค่าให้เป็นอุปกรณ์ที่เชื่อถือได้จะช่วยให้เข้าใจได้มากขึ้นเนื่องจากจะ จำกัด การเชื่อมต่อกับที่อยู่ Mac ของคุณ อุปกรณ์ที่จะเพิ่มโดยไม่มีจอภาพ

แต่อย่างไรก็ตามคำสั่งที่คุณจะต้องเรียกใช้เพื่อยอมรับการเชื่อมต่อทั้งหมดที่เกิดขึ้นกับ Pi เพื่อให้ค้นพบได้และตั้งค่าหมุดที่สามารถคาดเดาได้ดังต่อไปนี้:

หมายเหตุ: คุณอาจต้องเปลี่ยนhci0 เลขศูนย์เป็นหมายเลขอุปกรณ์บลูทู ธ ของคุณ

hciconfig hci0 up
hciconfig hci0 sspmode 1
hciconfig hci0 piscan
sudo bluetooth-agent 1234

ตอนนี้หลังจากรันคำสั่งเหล่านี้และดูว่ามันทำงานได้ตามที่คาดไว้หรือไม่

  1. เราเริ่มต้นด้วยการสร้างไฟล์ bash โดยการรันคำสั่ง sudo nano mohammadIsAmazing.sh
  2. ตอนนี้เราป้อนสิ่งต่อไปนี้ลงในไฟล์:

    #!/bin/sh
    sleep 20
    hciconfig hci0 up
    hciconfig hci0 sspmode 1
    hciconfig hci0 piscan
    sudo bluetooth-agent 1234
    
  3. ตอนนี้เราบันทึกและปิดไฟล์ของเราโดยใช้ control key and x

  4. เราเปิดไฟล์/etc/rc.localโดยใช้คำสั่งต่อไปนี้:

    Sudo nano /etc/rc.local
    
  5. ตอนนี้เราป้อนคำสั่งเพื่อเรียกใช้สคริปต์ทุบตีของเรา /etc/rc.local

    sudo /path/to/script/mohammadIsAmazing.sh &
    

    หมายเหตุ: คุณต้องใส่คำสั่งก่อนบรรทัดสุดท้ายใน /etc/rc.local ที่มี: exit 0

  6. ตอนนี้เราบันทึกและปิดไฟล์นั้นจากนั้นรีบูต Pi

ในหมายเหตุด้าน: อย่าลืมเลือกพินแบบสุ่มเพื่อเพิ่มความปลอดภัยเล็กน้อย

ในอีกด้านหนึ่งหมายเหตุ: หากคุณต้องการเปลี่ยนชื่ออุปกรณ์บลูทู ธ คุณจะต้องสร้างไฟล์ชื่อ/etc/machine-infoที่ควรมีดังต่อไปนี้:

PRETTY_HOSTNAME=device-name

จากนั้นเรียกใช้service bluetooth restartหลังจากนั้น


2
โปรดจำไว้ว่า&ในตอนท้ายของบรรทัดในrc.localไฟล์ - หากไม่มีไฟล์ RPi อาจไม่สามารถบู๊ตได้เนื่องจากเชลล์รอให้สคริปต์ของคุณ/path/to/script/mohammadIsAmazing.shดำเนินการเสร็จก่อนที่จะดำเนินการต่อ - และหากการบู๊ตนั้นไม่เสร็จสิ้นคุณจะไม่สามารถsshเข้าสู่ระบบได้ เพื่อแก้ไขสิ่งต่างๆ ... !
SlySven

สวัสดีโมฮัมหมัด sudo bluetooth-agent เป็นคำสั่งที่ไม่รู้จัก
Oliver Kuchies

@OliverKuchies ลองเรียกใช้apt-get install bluetooth bluezก่อนและบอกฉันว่าเหมาะกับคุณหรือไม่
Mohammad Ali

ฉันลองวิ่งbluetooth-agentแล้วก็หามันไม่เจอ การติดตั้งแพ็คเกจไม่สามารถแก้ไขได้
Gilad Naaman

@GiladNaaman คุณใช้ระบบปฏิบัติการอะไรอยู่
Mohammad Ali

0

จากสิ่งที่ฉันเข้าใจในสิ่งที่คุณต้องการคือโมดูลบลูทู ธ สลาฟ คุณสามารถใช้โมดูล HC-06 ที่เป็นที่นิยมและเชื่อมต่อกับราสเบอร์รี่ pi ผ่านตัวเปลี่ยนระดับไปยังหมุด TX และ RX บน Pi และใช้สคริปต์หลามเพื่ออ่านข้อมูลอนุกรมและประมวลผลตามที่ต้องการ


ฉันจะสมมติว่าจะมีโมดูลหลามซึ่งสามารถทำงานได้ทันทีที่อุปกรณ์บลูทู ธ เชื่อมต่อแทนที่จะเชื่อมต่อฮาร์ดแวร์? ฉันไม่โทรมเกินไปกับปี่ยังคงเป็นผู้เริ่มต้น แต่ดูเหมือนว่ามันจะเป็นวิธีการที่มีเหตุผล
Oliver Kuchies

@OliverKuchies ฉันไม่เคยทำการเขียนโปรแกรมบลูทู ธ ใด ๆ (หรือใช้!) บน linux แต่คุณกำลังมองหาบริการ daemon บางประเภทที่จะตอบสนองต่อสิ่งเหล่านี้ ในการทำอย่างละเอียด: โมดูลหลามจะไม่เรียกใช้ตัวเองมันจะต้องมีการใช้โดยกระบวนการที่ทำงานอยู่แล้ว นั่นคือภูต การค้นหา "bluetooth linux daemon" ช่วยเปิดบางสิ่ง ฉันคิดว่าฉันสังเกตเห็นว่าsystemdมีหนึ่งคุณคงต้องกำหนดค่าให้ทำงานในรูปแบบเฉพาะ
goldilocks

@OliverKuchies ได้ดูที่blog.miguelgrinberg.com/post/…
evolutionizer

0

ฉันจะไม่พูดคุยเกี่ยวกับการรักษาความปลอดภัยหรือไม่ แต่นี่คือวิธีที่ฉันทำ:

  1. สร้างสคริปต์ชื่อ auto_connect.sh ด้วยเนื้อหาต่อไปนี้:
#!/bin/bash
bt-adapter --set Powered 1
bt-adapter --set DiscoverableTimeout 0
bt-adapter --set Discoverable 1
bt-adapter --set PairableTimeout 0
bt-adapter --set Pairable 1
/path/to/python_script.py >/dev/nul 2>dev/nul &
list=""
bt-device -l | grep -E -o '[[:xdigit:]]{2}(:[[:xdigit:]]{2}){5}' | { while read line
do
       list="$list connect $line
"
done
bluetoothctl << EOF
$list
EOF
}
  1. สร้างไฟล์ /path/to/python_script.py ด้วยเนื้อหาต่อไปนี้:
#!/usr/bin/python3

from __future__ import absolute_import, print_function, unicode_literals

#import gobject
from gi.repository import GObject as gobject

import re
import dbus
import dbus.mainloop.glib
import subprocess

relevant_ifaces = [ "org.bluez.Adapter1", "org.bluez.Device1" ]

def property_changed(interface, changed, invalidated, path):
    iface = interface[interface.rfind(".") + 1:]
    for name, value in changed.iteritems():
        val = str(value)
        print("{%s.PropertyChanged} [%s] %s = %s" % (iface, path, name, val))

def interfaces_added(path, interfaces):
    for iface in interfaces:
        if not(iface in relevant_ifaces):
            continue
        try:
            found = re.search('dev\_(..\_..\_..\_..\_..\_..)', path).group(1)
        except AttributeError:
            found = '' # apply your error handling
            mac=found.replace("_",":")
            cmd='echo -e "trust '+mac+' \\nconnect '+mac+' \\nquit" | bluetoothctl'
            subprocess.call(cmd, shell=True)

def interfaces_removed(path, interfaces):
    for iface in interfaces:
        if not(iface in relevant_ifaces):
            continue
        print("{Removed %s} [%s]" % (iface, path))

if __name__ == '__main__':
    dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)

    bus = dbus.SystemBus()

    bus.add_signal_receiver(interfaces_added, bus_name="org.bluez", dbus_interface="org.freedesktop.DBus.ObjectManager", signal_name="InterfacesAdded")

    bus.add_signal_receiver(interfaces_removed, bus_name="org.bluez", dbus_interface="org.freedesktop.DBus.ObjectManager", signal_name="InterfacesRemoved")

    mainloop = gobject.MainLoop()
    mainloop.run()
  1. ขึ้นอยู่กับระบบปฏิบัติการที่คุณใช้ตรวจสอบให้แน่ใจว่าคุณเรียกใช้ auto_connect.sh ในการบู๊ต

สิ่งนี้ทำทั้งหมด:

  1. ตั้งค่าอุปกรณ์ให้ค้นหาได้ตลอดเวลา

  2. เมื่ออุปกรณ์จับคู่อุปกรณ์จะทำเครื่องหมายโดยอัตโนมัติในอุปกรณ์ที่เชื่อถือได้และเชื่อมต่อกับอุปกรณ์

  3. ในทุกการบู๊ตเครื่องจะทำการเดินทางผ่านรายการอุปกรณ์ที่รู้จักและจะพยายามเชื่อมต่อกับอุปกรณ์เหล่านั้น

โปรดทราบว่าวิธีการนี้จะตรงข้ามกับการรักษาความปลอดภัยทุกประเภท แต่อาจมีกรณีผู้ใช้เมื่อคุณต้องการบรรลุเป้าหมายนั้น


-1

ใน Raspberry Pi3 รุ่น B มีหัวกระสุนในบลูทู ธ และ wifi การใช้เซิร์ฟเวอร์ OBEX คุณสามารถรับไฟล์จากอุปกรณ์อื่น ๆ โดยไม่ต้องถามเกี่ยวกับการจับคู่คำขอทุกครั้ง คุณต้องทำการจับคู่ครั้งแรกกับอุปกรณ์นั้นและสร้างหนึ่งไดเรกทอรีซึ่งไฟล์จะได้รับตลอดเวลา

เพียงทำตามขั้นตอนด้านล่างลิงค์

https://www.raspberrypi.org/forums/viewtopic.php?p=963751#p963751


1
คุณอ่านคำถามหรือไม่ OP ถามวิธีการหลีกเลี่ยงการจับคู่ด้วยตนเองโดยเฉพาะเพราะจะไม่มีหน้าจอและคุณแนะนำว่าควรทำการจับคู่หรือไม่
Dmitry Grigoryev

คุณต้องทำการจับคู่เพียงครั้งเดียวเพื่อให้เป็นครั้งแรกที่คุณสามารถเชื่อมต่อกับจอแสดงผลสำหรับการจับคู่
Mihit Gandhi

คุณจะต้องทำเพียงครั้งเดียวต่ออุปกรณ์ และถ้ามีใครอยากจะลองใหม่นั่นหมายถึงการขุดมันออกมาไม่ว่าจะอยู่ที่ใดและเชื่อมโยงมันเข้ากับจอภาพและคีย์บอร์ดซึ่งเป็นเหตุผลว่าทำไมเขาถึงมองหาวิธีหลีกเลี่ยงสิ่งนั้น
ต่างกัน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.