ฉันกำลังมองหาที่จะพัฒนาแพลตฟอร์มสำหรับรถของฉันซึ่งเชื่อมต่ออุปกรณ์ใด ๆ ที่พยายามเชื่อมต่อกับ Pi ผ่านบลูทู ธ โดยอัตโนมัติ ขณะนี้ต้องมีการยอมรับการจับคู่โดย Pi แต่ในกรณีนี้จะไม่มีหน้าจอดังนั้นจึงต้องดำเนินการโดยอัตโนมัติ ฉันจะทำสิ่งนี้ได้อย่างไร
ฉันกำลังมองหาที่จะพัฒนาแพลตฟอร์มสำหรับรถของฉันซึ่งเชื่อมต่ออุปกรณ์ใด ๆ ที่พยายามเชื่อมต่อกับ Pi ผ่านบลูทู ธ โดยอัตโนมัติ ขณะนี้ต้องมีการยอมรับการจับคู่โดย Pi แต่ในกรณีนี้จะไม่มีหน้าจอดังนั้นจึงต้องดำเนินการโดยอัตโนมัติ ฉันจะทำสิ่งนี้ได้อย่างไร
คำตอบ:
( โปรดทราบว่าคำตอบนี้ไม่สามารถใช้งานได้กับ Raspbian Jessie อีกต่อไปเนื่องจาก bluez ลบคำสั่ง bluetooth-agent )
ดังนั้นในปัจจุบันคุณระบุว่าคุณสามารถเชื่อมต่อกับ Pi ได้ แต่จำเป็นต้องมีจอภาพสำหรับกระบวนการจับคู่
หมายเหตุ: การยอมรับการเชื่อมต่อใด ๆ เป็นความคิดที่ไม่ปลอดภัยอย่างเหลือเชื่อและหากคุณใช้ชุดอุปกรณ์ที่ จำกัด เพียงอย่างเดียวการตั้งค่าให้เป็นอุปกรณ์ที่เชื่อถือได้จะช่วยให้เข้าใจได้มากขึ้นเนื่องจากจะ จำกัด การเชื่อมต่อกับที่อยู่ Mac ของคุณ อุปกรณ์ที่จะเพิ่มโดยไม่มีจอภาพ
แต่อย่างไรก็ตามคำสั่งที่คุณจะต้องเรียกใช้เพื่อยอมรับการเชื่อมต่อทั้งหมดที่เกิดขึ้นกับ Pi เพื่อให้ค้นพบได้และตั้งค่าหมุดที่สามารถคาดเดาได้ดังต่อไปนี้:
หมายเหตุ: คุณอาจต้องเปลี่ยนhci0
เลขศูนย์เป็นหมายเลขอุปกรณ์บลูทู ธ ของคุณ
hciconfig hci0 up
hciconfig hci0 sspmode 1
hciconfig hci0 piscan
sudo bluetooth-agent 1234
ตอนนี้หลังจากรันคำสั่งเหล่านี้และดูว่ามันทำงานได้ตามที่คาดไว้หรือไม่
sudo nano mohammadIsAmazing.sh
ตอนนี้เราป้อนสิ่งต่อไปนี้ลงในไฟล์:
#!/bin/sh
sleep 20
hciconfig hci0 up
hciconfig hci0 sspmode 1
hciconfig hci0 piscan
sudo bluetooth-agent 1234
ตอนนี้เราบันทึกและปิดไฟล์ของเราโดยใช้ control key and x
เราเปิดไฟล์/etc/rc.local
โดยใช้คำสั่งต่อไปนี้:
Sudo nano /etc/rc.local
ตอนนี้เราป้อนคำสั่งเพื่อเรียกใช้สคริปต์ทุบตีของเรา /etc/rc.local
sudo /path/to/script/mohammadIsAmazing.sh &
หมายเหตุ: คุณต้องใส่คำสั่งก่อนบรรทัดสุดท้ายใน /etc/rc.local ที่มี: exit 0
ตอนนี้เราบันทึกและปิดไฟล์นั้นจากนั้นรีบูต Pi
ในหมายเหตุด้าน: อย่าลืมเลือกพินแบบสุ่มเพื่อเพิ่มความปลอดภัยเล็กน้อย
ในอีกด้านหนึ่งหมายเหตุ: หากคุณต้องการเปลี่ยนชื่ออุปกรณ์บลูทู ธ คุณจะต้องสร้างไฟล์ชื่อ/etc/machine-info
ที่ควรมีดังต่อไปนี้:
PRETTY_HOSTNAME=device-name
จากนั้นเรียกใช้service bluetooth restart
หลังจากนั้น
&
ในตอนท้ายของบรรทัดในrc.local
ไฟล์ - หากไม่มีไฟล์ RPi อาจไม่สามารถบู๊ตได้เนื่องจากเชลล์รอให้สคริปต์ของคุณ/path/to/script/mohammadIsAmazing.sh
ดำเนินการเสร็จก่อนที่จะดำเนินการต่อ - และหากการบู๊ตนั้นไม่เสร็จสิ้นคุณจะไม่สามารถssh
เข้าสู่ระบบได้ เพื่อแก้ไขสิ่งต่างๆ ... !
apt-get install bluetooth bluez
ก่อนและบอกฉันว่าเหมาะกับคุณหรือไม่
bluetooth-agent
แล้วก็หามันไม่เจอ การติดตั้งแพ็คเกจไม่สามารถแก้ไขได้
จากสิ่งที่ฉันเข้าใจในสิ่งที่คุณต้องการคือโมดูลบลูทู ธ สลาฟ คุณสามารถใช้โมดูล HC-06 ที่เป็นที่นิยมและเชื่อมต่อกับราสเบอร์รี่ pi ผ่านตัวเปลี่ยนระดับไปยังหมุด TX และ RX บน Pi และใช้สคริปต์หลามเพื่ออ่านข้อมูลอนุกรมและประมวลผลตามที่ต้องการ
systemd
มีหนึ่งคุณคงต้องกำหนดค่าให้ทำงานในรูปแบบเฉพาะ
ฉันจะไม่พูดคุยเกี่ยวกับการรักษาความปลอดภัยหรือไม่ แต่นี่คือวิธีที่ฉันทำ:
#!/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
}
#!/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()
สิ่งนี้ทำทั้งหมด:
ตั้งค่าอุปกรณ์ให้ค้นหาได้ตลอดเวลา
เมื่ออุปกรณ์จับคู่อุปกรณ์จะทำเครื่องหมายโดยอัตโนมัติในอุปกรณ์ที่เชื่อถือได้และเชื่อมต่อกับอุปกรณ์
ในทุกการบู๊ตเครื่องจะทำการเดินทางผ่านรายการอุปกรณ์ที่รู้จักและจะพยายามเชื่อมต่อกับอุปกรณ์เหล่านั้น
โปรดทราบว่าวิธีการนี้จะตรงข้ามกับการรักษาความปลอดภัยทุกประเภท แต่อาจมีกรณีผู้ใช้เมื่อคุณต้องการบรรลุเป้าหมายนั้น
ใน Raspberry Pi3 รุ่น B มีหัวกระสุนในบลูทู ธ และ wifi การใช้เซิร์ฟเวอร์ OBEX คุณสามารถรับไฟล์จากอุปกรณ์อื่น ๆ โดยไม่ต้องถามเกี่ยวกับการจับคู่คำขอทุกครั้ง คุณต้องทำการจับคู่ครั้งแรกกับอุปกรณ์นั้นและสร้างหนึ่งไดเรกทอรีซึ่งไฟล์จะได้รับตลอดเวลา
เพียงทำตามขั้นตอนด้านล่างลิงค์
https://www.raspberrypi.org/forums/viewtopic.php?p=963751#p963751