Làm cách nào để kết nối và gửi dữ liệu tới cổng nối tiếp bluetooth trên Linux?


30

Tôi đang cố gắng thiết lập một cổng nối tiếp ảo qua bộ điều hợp USB-Bluetooth trên Linux và gửi tin nhắn đến nó thông qua thiết bị Android. Tôi đang sử dụng kernel 3.6. Tôi có thể ghép nối thiết bị thành công bằng gnome-bluetooth và cũng có thể gửi tệp đến thiết bị.

Để thiết lập cổng nối tiếp, trước tiên tôi thêm kênh có cấu hình SP vào bộ điều hợp:

sdptool add --channel=22 SP

Sau đó, tôi gọi 'lắng nghe' với rfcomm:

rfcomm listen /dev/rfcomm0 22

khối nào trên

Waiting for connection on channel 22

Rõ ràng rfcomm sẽ tạo / dev / rfcomm0 khi kết nối thành công. Khi điều đó xảy ra, tôi muốn sử dụng một cái gì đó như cutecom để gửi tin nhắn qua lại với thiết bị được kết nối.

Trên thiết bị Android của tôi, tôi mở một thiết bị đầu cuối Bluetooth SPP (có một số thiết bị ngoài kia, tôi đã thử một vài thiết bị khác nhau) và thử kết nối. Tất cả đều thất bại.

Cho rằng tôi có thể ghép nối thành công và gửi tệp mà không gặp sự cố nào, tôi biết rằng kết nối và kết nối bluetooth hoạt động.

Tôi không chắc chắn những gì tôi có thể thử. Tôi đã sử dụng 'sdptool duyệt' trên thiết bị cục bộ của mình và thiết bị Android để đảm bảo rằng không có bất kỳ xung đột kênh RFCOMM nào.

Câu trả lời:


21

Tôi dường như đã làm việc này bây giờ. Bluetooth có vẻ hơi khó tính. Tôi đang tóm tắt lại các bước của mình đầy đủ trong trường hợp người khác thấy nó hữu ích (mặc dù nó khá giống với những gì tôi đã thử ban đầu). Điều này dành cho Android JB (4.2.2) trên Nexus 4 và Arch Linux 3.6.7-1, với bluez 4.101 trên Gnome 3.6 (w / gnome-bluetooth).

(bước này có thể không làm gì hữu ích) Tắt Bluetooth trên Android và ngắt kết nối Bộ chuyển đổi USB / Bluetooth khỏi máy Linux của bạn (hoặc nếu bạn đã tích hợp sẵn, hãy đặt lại bằng cách sử dụng đặt lại tên của hcitool)

Kết nối / bật bộ chuyển đổi bluetooth của bạn trên Linux. Đảm bảo bộ điều hợp của bạn hiển thị (có thể được đặt trong gnome-bluetooth - bạn sẽ thấy biểu tượng khay hệ thống bluetooth).

Bật bluetooth trên thiết bị Android của bạn. Sử dụng Android để ghép nối với bộ điều hợp (Tôi không thể ghép nối theo cách khác từ Linux). Một hộp thoại sẽ xuất hiện để hỏi bạn về một chìa khóa. Đặt bất kỳ mã PIN nào bạn muốn. Gnome sẽ bật lên một thông báo yêu cầu bạn cung cấp chìa khóa; nhập cùng mã PIN bạn đã nhập trước đó. Thiết bị Android của bạn và khóa nên được ghép nối tại thời điểm này.

Trong Linux, mở một thiết bị đầu cuối và kiểm tra những dịch vụ bluetooth nào có sẵn bằng cách nhập vào

sdptool browse local

Nếu bạn đã có một dịch vụ cổng nối tiếp, hãy ghi lại xem đó là kênh nào. Nếu bạn không, bạn có thể thêm dịch vụ:

sdptool add --channel=22 SP

Bây giờ hãy nghe trên kênh này bằng rfcomm:

sudo rfcomm listen /dev/rfcomm0 22

rfcomm sẽ chặn, lắng nghe một kết nối với một tin nhắn như

Waiting for connection on channel 22

Quay trở lại với Android, tôi đã sử dụng ứng dụng BlueTerm ( http://pymasde.es/blueterm/ , cũng có sẵn miễn phí trên cửa hàng google play) mặc dù mọi ứng dụng tương tự đều hoạt động. Mở BlueTerm, đi đến tùy chọn> Kết nối thiết bị: chọn bộ điều hợp được ghép nối.

Hy vọng, ứng dụng đã có thể kết nối. Bạn sẽ thấy xác minh bổ sung trong thiết bị đầu cuối nơi bạn đã chặn nghe bằng một thông báo như:

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

Bất cứ điều gì bạn nhập vào ứng dụng BlueTerm sẽ là / dev / rfcomm0. Bạn có thể thấy các công cụ hiển thị khi bạn nhập bằng cách mở một thiết bị đầu cuối mới và làm một cái gì đó như:

cat /dev/rfcomm0

1
Câu trả lời tốt. Tôi đã làm cho nó hoạt động với Ubuntu 16 / Bluez 5 và thông tin này: bbs.archlinux.org/viewtopic.php?id=201672 .
wojciii

10

Các bước dưới đây làm việc cho tôi:

Đầu tiên bạn phải ghép các thiết bị. Ghép nối tương đối dễ dàng. Tôi sẽ gọi cho khách hàng (người bắt đầu nói chuyện) và máy chủ (người trả lời)

Bạn phải thiết lập máy chủ trước: Phía máy chủ (với quyền root):

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

Phía khách hàng (là root):

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

Bây giờ để mở một thiết bị đầu cuối nối tiếp trên máy khách:

screen /dev/rfcomm0 115200

Bình luận:

Khi bạn gọi lệnh cuối cùng rfcomm kết nối ... trong máy khách, một thiết bị /dev/rfcomm0sẽ được tạo và liên kết với máy chủ /dev/recomm0. Điều này thể hiện liên kết nối tiếp giữa cả hai

Lệnh máy chủ cuối cùng: rfcomm watch.... sẽ 'lắng nghe' cho các kết nối đến. Khi mất kết nối, lệnh sẽ khởi động lại trạng thái 'nghe' mới.


1
Câu trả lời được cung cấp bởi ismaia gần như đưa bạn đến đó. Bạn cần nhớ rằng ngăn xếp bluez mới hơn cần --compattùy chọn đặc biệt , nếu không, việc thêm SP có thể thất bại. Xem tại đây . Vì vậy, điều chỉnh / sửa đổi các kịch bản khởi động systemd / initd của bạn để --compatcó.
đậu phụ đen

5

Tôi đã giải quyết điều này bằng một biến thể nhỏ cho các lệnh của Pris. Hãy thử những lần này nếu bất cứ ai vẫn gặp sự cố khi thiết lập kết nối rfcomm.

sudo service bluetooth restart

Điều này ^ đảm bảo rằng bạn đang bắt đầu với một bảng rõ ràng mỗi khi bạn cố gắng thiết lập kết nối.

rfcomm add --channel=<a_channel_#> SP

Số kênh này phải khác với bất kỳ kênh nào hiện được chỉ định.

(TÙY CHỌN) Để kiểm tra các kênh:

sdptool browse local | grep Channel

Tôi không chắc tại sao lệnh tiếp theo này lại cần thiết, nhưng nó hiệu quả với tôi.

rfcomm release 0

Sau đó để lắng nghe các kết nối không liên quan:

rfcomm watch 0 <a_channel_#>

LƯU Ý: địa chỉ MAC bt trong /etc/bluetooth/rfcomm.conf nhưng là điện thoại bt MAC của bạn. Ngoài ra, kênh trong tệp này phải giống với kênh được chọn cho a_channel_ #.

Khi tôi đã làm tất cả điều này, tôi đã sử dụng trình giả lập thiết bị đầu cuối bt trên điện thoại của mình để kiểm tra tất cả.


0

Tôi đã thử các công cụ bluetooth khác nhau và thật khó để tìm ra chuỗi lệnh chính xác để kết nối và trao đổi dữ liệu với mô-đun bluetooth. Hãy thử sử dụng rfcomm và minicom:

Đây là /etc/bluetooth/rfcomm.conf của tôi

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.";
}

Quét các thiết bị bluetooth:

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

Ràng buộc sử dụng rfcomm

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

NB: bind 0 đề cập đến số thiết bị 0 (rfcomm0) và 1 là kênh.

Sau đó sử dụng minicom với sudo và lưu cấu hình trong đó bạn chỉ định baudrate và cổng. Bạn có thể tìm thêm thông tin ở đây .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.