ฉันจะเชื่อมต่อและส่งข้อมูลไปยังพอร์ตอนุกรม Bluetooth บน Linux ได้อย่างไร


30

ฉันพยายามติดตั้งพอร์ตอนุกรมเสมือนผ่านอะแดปเตอร์ USB-Bluetooth บน Linux และส่งข้อความไปยังอุปกรณ์ Android ฉันใช้เคอร์เนล 3.6 ฉันสามารถจับคู่อุปกรณ์ได้สำเร็จโดยใช้ gnome-bluetooth และสามารถส่งไฟล์ได้

หากต้องการตั้งค่าพอร์ตอนุกรมฉันจะเพิ่มช่องทางที่มีโปรไฟล์ SP ลงในอะแดปเตอร์ของฉันก่อน:

sdptool add --channel=22 SP

จากนั้นฉันก็เรียก 'ฟัง' ด้วย rfcomm:

rfcomm listen /dev/rfcomm0 22

ซึ่งบล็อกบน

Waiting for connection on channel 22

Apparently rfcomm จะสร้าง / dev / rfcomm0 เมื่อเชื่อมต่อสำเร็จ หลังจากนั้นเกิดขึ้นฉันต้องการใช้สิ่งที่ชอบ cutecom เพื่อส่งข้อความกลับไปกลับมาไปยังอุปกรณ์ที่เชื่อมต่อ

บนอุปกรณ์ Android ของฉันฉันเปิดเทอร์มินัลบลูทู ธ SPP (มีหลายอย่างที่นั่นฉันลองหลาย ๆ อัน) และลองเชื่อมต่อ พวกเขาทั้งหมดล้มเหลว

เนื่องจากฉันสามารถจับคู่สำเร็จและส่งไฟล์โดยไม่มีปัญหาฉันรู้ว่าการจับคู่บลูทู ธ และการสื่อสารทำงานได้

ฉันไม่แน่ใจเหมือนกันว่าจะลองอะไรอีก ฉันใช้ 'เรียกดู sdptool' บนอุปกรณ์ในพื้นที่ของฉันและอุปกรณ์ Android เพื่อให้แน่ใจว่าไม่มีข้อขัดแย้งของช่อง RFCOMM

คำตอบ:


21

ฉันดูเหมือนว่าจะได้งานนี้แล้ว บลูทู ธ ดูค่อนข้างพิถีพิถัน ฉันทำขั้นตอนของฉันใหม่เต็มในกรณีที่คนอื่นเห็นว่ามีประโยชน์ (แม้ว่ามันจะเป็นสิ่งที่ฉันพยายามในตอนแรก) นี่สำหรับ Android JB (4.2.2) บน Nexus 4 และ Arch Linux 3.6.7-1 โดยมี bluez 4.101 บน Gnome 3.6 (w / gnome-bluetooth)

(ขั้นตอนนี้อาจไม่ทำสิ่งใดมีประโยชน์) ปิดบลูทู ธ Android และถอดอะแดปเตอร์ USB / บลูทู ธ จากเครื่อง Linux ของคุณ (หรือถ้าคุณมีบิวด์อินภายในให้รีเซ็ตโดยใช้ hcitool devname reset)

เชื่อมต่อ / เปิดอะแดปเตอร์บลูทู ธ ของคุณบน Linux ตรวจสอบให้แน่ใจว่าอแด็ปเตอร์ของคุณสามารถมองเห็นได้ (สามารถตั้งค่าเป็น gnome-bluetooth ได้ - คุณควรเห็นไอคอนถาดระบบบลูทู ธ )

เปิดบลูทู ธ บนอุปกรณ์ Android ของคุณ ใช้ Android เพื่อจับคู่กับอะแดปเตอร์ (ฉันไม่สามารถจับคู่วิธีอื่น ๆ จาก Linux) กล่องโต้ตอบจะปรากฏขึ้นเพื่อขอรหัสจากคุณ ใส่ PIN ใด ๆ ที่คุณต้องการ Gnome ควรปรากฏข้อความแจ้งเตือนเพื่อขอกุญแจ ใส่ PIN เดียวกันกับที่คุณป้อนก่อนหน้านี้ อุปกรณ์ Android และกุญแจของคุณควรจะจับคู่กัน ณ จุดนี้

ใน Linux ให้เปิดเทอร์มินัลแล้วตรวจสอบว่ามีบริการบลูทู ธ ใดบ้างโดยพิมพ์

sdptool browse local

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

sdptool add --channel=22 SP

ตอนนี้ฟังช่องนี้โดยใช้ rfcomm:

sudo rfcomm listen /dev/rfcomm0 22

rfcomm จะบล็อก, กำลังฟังการเชื่อมต่อกับข้อความที่ชอบ

Waiting for connection on channel 22

ย้อนกลับไปที่ Android ฉันใช้แอปพลิเคชั่น BlueTerm ( http://pymasde.es/blueterm/ซึ่งมีให้ใช้อย่างอิสระบน google play store) แต่แอพพลิเคชั่นที่คล้ายกันควรใช้งานได้ เปิด BlueTerm ไปที่ตัวเลือก> เชื่อมต่ออุปกรณ์: เลือกอะแดปเตอร์ที่จับคู่

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

Waiting for connection on channel 22
Connection from 22:22:22:22:22:22 to /dev/rfcomm0
Press CTRL-C for hangup

ทุกสิ่งที่คุณพิมพ์ลงในแอพ BlueTerm ควรจะเป็น / dev / rfcomm0 คุณสามารถเห็นสิ่งต่าง ๆ ปรากฏขึ้นขณะพิมพ์โดยเปิดเทอร์มินัลใหม่และทำสิ่งที่ชอบ:

cat /dev/rfcomm0

1
คำตอบที่ดี. ผมได้รับมันทำงานร่วมกับอูบุนตู 16 / Bluez 5 และข้อมูลนี้: bbs.archlinux.org/viewtopic.php?id=201672
wojciii

10

ตะโกนขั้นตอนที่ทำงานสำหรับฉัน:

ประการแรกคุณต้องจับคู่อุปกรณ์ การจับคู่ค่อนข้างง่าย ฉันจะโทรหาลูกค้า (ผู้ที่เริ่มพูดคุย) และเซิร์ฟเวอร์ (ใครตอบ)

คุณต้องติดตั้งเซิร์ฟเวอร์ก่อน: ฝั่งเซิร์ฟเวอร์ (ในฐานะรูท):

sdptool add --channel=3 SP
mknod -m 666 /dev/rfcomm0 c 216 0
rfcomm watch /dev/rfcomm0 3 /sbin/agetty rfcomm0 115200 linux

ฝั่งไคลเอ็นต์ (เหมือนรูท):

sdptool add --channel=3 SP
rfcomm connect /dev/rfcomm0 [SERVER_ADDR] 3

ตอนนี้เพื่อเปิดเทอร์มินัลอนุกรมบนไคลเอนต์:

screen /dev/rfcomm0 115200

ความคิดเห็นที่:

เมื่อคุณเรียกใช้คำสั่งสุดท้าย RFCOMM เชื่อมต่อ ... ในลูกค้าอุปกรณ์ที่จะถูกสร้างขึ้นและเชื่อมโยงไปยังเซิร์ฟเวอร์/dev/rfcomm0 /dev/recomm0สิ่งนี้แสดงถึงลิงก์อนุกรมระหว่างทั้งสอง

คำสั่งเซิร์ฟเวอร์ล่าสุด: rfcomm watch.... จะ 'ฟัง' สำหรับการเชื่อมต่อขาเข้า ในการเชื่อมต่อที่หายไปคำสั่งจะรีสตาร์ทสถานะ 'Listen' ใหม่


1
คำตอบที่ได้รับจาก ismaia เกือบจะพาคุณไปที่นั่น คุณต้องจำไว้ว่า Bluez stack ที่ใหม่กว่านั้นต้องการ--compatตัวเลือกพิเศษไม่เช่นนั้นการเพิ่ม SP อาจล้มเหลว ดูที่นี่ ดังนั้นปรับ / แก้ไขสคริปต์เริ่มทำงาน systemd / initd startup ของคุณเพื่อให้--compatมี
blacktofu

5

ฉันแก้ไขสิ่งนี้ด้วยความแตกต่างเล็กน้อยกับคำสั่งของ Pris ให้ภาพเหล่านี้ถ้าใครยังคงมีปัญหาในการตั้งค่าการเชื่อมต่อ rfcomm

sudo service bluetooth restart

^ นี้ทำให้มั่นใจได้ว่าคุณเริ่มต้นด้วยกระดานชนวนใหม่ทุกครั้งที่คุณพยายามตั้งค่าการเชื่อมต่อ

rfcomm add --channel=<a_channel_#> SP

หมายเลขช่องนี้ควรแตกต่างจากช่องที่กำหนดในปัจจุบัน

(ตัวเลือก) วิธีตรวจสอบช่อง:

sdptool browse local | grep Channel

ฉันไม่แน่ใจว่าทำไมต้องใช้คำสั่งต่อไปนี้ แต่ก็ใช้งานได้สำหรับฉัน

rfcomm release 0

จากนั้นฟังการเชื่อมต่อที่ไม่คาดคิด:

rfcomm watch 0 <a_channel_#>

หมายเหตุ: ที่อยู่ bt MAC ใน /etc/bluetooth/rfcomm.conf แต่เป็น bt MAC ของโทรศัพท์ของคุณ นอกจากนี้ช่องในไฟล์นี้จะต้องเหมือนกับช่องที่เลือกสำหรับ a_channel_ #

เมื่อฉันทำทั้งหมดนี้ฉันใช้เครื่องจำลองเทอร์มินัล bt บนโทรศัพท์ของฉันเพื่อตรวจสอบทุกอย่าง


0

ฉันลองใช้เครื่องมือบลูทู ธ ที่แตกต่างกันและมันก็ยากที่จะหาลำดับที่ถูกต้องของคำสั่งในการเชื่อมต่อและแลกเปลี่ยนข้อมูลกับโมดูลบลูทู ธ ลองใช้ rfcomm และ minicom:

นี่คือ /etc/bluetooth/rfcomm.conf ของฉัน

rfcomm0 {
  # Automatically bind the device at startup
  bind no;
  # Bluetooth address of the device
  device 11:22:33:44:55:66;
  # RFCOMM channel for the connection
  channel 3;
  # Description of the connection
  comment "This is Device 1's serial port.";
}

สแกนหาอุปกรณ์บลูทู ธ :

hcitool scan
Scanning ...
    20:15:12:08:62:95   HC-06

ผูกโดยใช้ rfcomm

sudo rfcomm bind 0 20:15:12:08:62:95 1

หมายเหตุ: ผูก 0 หมายถึงหมายเลขอุปกรณ์ 0 (rfcomm0) และ 1 คือช่องทาง

จากนั้นใช้ minicom ด้วย sudo และบันทึกการกำหนดค่าที่คุณระบุ baudrate และพอร์ต คุณสามารถค้นหารายละเอียดเพิ่มเติมที่นี่

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