2013-04-25 42 views
5

Tôi hiện đang cố gắng kết nối với nhiều thiết bị BLE sử dụng BlueZ 5.0 và Linux. Tôi có một máy chủ BLE adapter và tôi đã sửa đổi gatttool để kết nối và thực hiện chức năng này. Nếu tôi chạy một thể hiện của gatttool đã sửa đổi, tôi kết nối thành công và nhận dữ liệu thông báo từ thiết bị BLE. Nếu tôi chạy một thể hiện khác của gatttool đã sửa đổi và kết nối với một thiết bị BLE khác, ứng dụng này bắt đầu nhận dữ liệu thông báo từ cả hai thiết bị BLE và ứng dụng ban đầu không còn nhận bất kỳ dữ liệu nào. Tôi tin rằng điều này là do thiết lập socket, nơi cả hai ứng dụng đang cấu hình các socket của chúng đến cùng một địa chỉ và PSM (cá thể mới nhất nhận dữ liệu trong khi các ứng dụng khác bị bỏ đói). Có cách nào để ngăn ngừa tình trạng này không? Lý tưởng nhất, tôi muốn một ứng dụng kết nối với nhiều thiết bị. Tôi cho rằng ứng dụng chỉ có thể có một socket vì lý do nhiều socket sẽ có cùng một vấn đề với nhiều trường hợp ở trên. Thiết bị BLE của tôi là một phím chức năng TI CC2540 hoạt động như một màn hình điều khiển nhịp tim.Nhiều kết nối BLE bằng Linux và Bluez 5.0

+0

Đây không phải là điều bạn muốn? Nếu bạn muốn một ứng dụng kết nối với nhiều thiết bị thì bạn có thể thực hiện nó thông qua một ổ cắm duy nhất. Tôi tin rằng mỗi thông điệp đi kèm với địa chỉ BT của thiết bị để bạn có thể kết hợp nó với thiết bị phù hợp. –

+0

Bây giờ tôi hiểu rằng tôi nên sử dụng một ổ cắm. Cần sử dụng bộ điều khiển kết nối ACL để tách dữ liệu. Tôi gặp khó khăn khi truy cập bộ xử lý này thông qua BlueZ. socket (PF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM) tạo ổ cắm. kết nối (sock, (struct sockaddr *) & addr, sizeof (addr)) kết nối socket. Truy cập tay cầm bằng ioctl (socket, HCIGETCONNINFO, cr) trả về một errno 2 (không có tập tin). Địa chỉ đích là chính xác. Ổ cắm được tạo ở trên của tôi trả về một giá trị là 5 trong khi socket = hci_open_dev (dev_id) trả về giá trị của 6. Có cách nào tốt hơn để có được xử lý này không. – user2321427

+1

Phương pháp ioctl (socket, HCIGETCONNINFO, cr) hoạt động tốt cho các thiết bị bluetooth cổ điển nhưng không hoạt động trên các thiết bị BLE. Tôi cần một phương pháp để truy cập vào xử lý dữ liệu ACL cho một thiết bị BLE cho mục đích ghép nối dữ liệu. Điều này có thể xảy ra với BlueZ không? – user2321427

Trả lời

2

tôi bắt đầu một câu trả lời để tôi có thể có nhiều không gian hơn ...

Tôi đang sử dụng một sự kết hợp của Python và C để lấy mã của tôi để làm việc, vì vậy "mã" của tôi có thể trông buồn cười bởi vì nó có thể là từ một trong hai. Ngoài ra, tôi đã sử dụng Bluez 4 vì 5 không hỗ trợ hạt nhân tôi đang sử dụng. Hãy cho tôi biết nếu có vấn đề và tôi có thể làm rõ.

Có vẻ như có nhiều cách để thực hiện mọi việc, nhưng tôi đã kết thúc việc mở ổ cắm riêng biệt cho các tác vụ khác nhau. Bạn có thể mở một ổ cắm và sau đó đặt các tùy chọn ổ cắm để tắt bộ lọc và bạn sẽ nhận được tất cả các gói ở một nơi. Tuy nhiên, đó là cách đầu tiên của tôi để làm điều đó và tôi thấy rằng các kết nối của tôi sẽ chết trong vài giây.

Để quét kết nối, tôi đã mở socket(AF_BLUETOOTH, SOCK_RAW, BTPROTO_HCI) sau đó đã thực hiện bind trên thiết bị 0. (có chức năng gọi là hci_get_route để nhận số thiết bị khả dụng) Sau đó, bạn có thể gọi hci_le_set_scan_parameters để đặt tùy chọn, setsockopt(SOL_HCI, HCI_FILTER, filter) để chỉ nhận các sự kiện quét LE và sau đó gọi là hci_le_set_scan_enable để bật quét.

Mỗi kết nối thiết bị được thực hiện với socket(AF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_L2CAP) mà sau đó bạn yêu cầu kết nối với một thiết bị cụ thể bằng cách gọi connect trên ổ cắm với struct sockaddr_l2 có địa chỉ thiết bị cụ thể trong đó. Trên ổ cắm đó, bạn chỉ nên nhận các gói dữ liệu từ thiết bị đó. (một trong những caveat ... Tôi thấy rằng dongle của tôi sẽ không cho phép một kết nối trong khi hoạt động quét đang diễn ra .. Tôi đã phải tạm thời tắt nó ngay trước khi kết nối và sau đó bật nó trở lại.Nếu không, tôi nhận được một lỗi BUSY từ errno)

Sau khi nói tất cả điều đó, mặc dù ... Tôi nghĩ cách bạn phải làm tất cả mọi thứ trong Bluez 5 là sử dụng DBUS. Thật không may đó không thực sự là một lựa chọn cho những gì tôi đã làm. Các chức năng tôi đã đề cập nằm trong lib được chia sẻ mà dường như không được cài đặt theo mặc định trong 5 (bạn phải yêu cầu cài đặt nó một cách rõ ràng với configure). Họ đã ngừng cài đặt lib được chia sẻ theo mặc định vì họ muốn khuyến khích mọi người sử dụng DBUS thay vào đó.

+0

Tôi muốn ban đầu giải quyết vấn đề này không sử dụng DBUS. Tôi cần lấy lại bộ xử lý được kết hợp với dữ liệu ổ cắm đến để tôi có thể kết hợp dữ liệu với kết nối chính xác. Cuộc gọi ioctl (socket, HCIGETCONNINFO, cr) không hoạt động đối với các thiết bị BLE. Bạn có phương pháp truy cập thông tin xử lý được kết hợp với kết nối và dữ liệu đến không? – user2321427

+0

Tôi không chắc mình có hiểu ... Bạn không khởi tạo kết nối? Bạn sẽ không có tay cầm trong trường hợp đó và biết những gì bạn kết nối với? –

+1

Khi tôi thực hiện kết nối (socket, (struct sockaddr *) & addr, sizeof (addr)), giá trị 0 được trả về cho biết kết nối socket đã được thực hiện. Nếu tôi chạy hcidump cùng một lúc, tôi thấy rằng xử lý 1025 được gán cho kết nối. Các giao dịch dữ liệu khác cho kết nối đó sử dụng xử lý đó. Tôi đang cố gắng truy cập vào tay cầm đó. – user2321427

1

CHÚNG TÔI đã kết hợp mã từ hcitool và gatttool. Mã hoạt động tốt cho 2 thiết bị (quét, hci_le_create_conn và gatt_connect). Tôi tin rằng không có giới hạn về số lượng thiết bị được sử dụng.

1 Start cmd_lescan (from hcitool.c) 
2.For each device scanned - 
     cmd_lecc (from hcitool.c) 
     gatt_connect (from gatttool.c) 

Bằng cách này, một quy trình có thể quản lý nhiều thiết bị BLE.Chúng tôi không phải TẮT chức năng quét, chỉ cần bỏ qua các thông điệp không quảng cáo:

 if (meta->subevent != 0x02) 
       continue; 

Cảm ơn và mong nhận xét.

+0

Bạn có thể giải thích tại sao bạn tạo hai kết nối tới cùng một thiết bị bằng cmd_lecc và GATT_connect? – abhiarora

Các vấn đề liên quan