2015-05-24 25 views
5

Tôi đang sử dụng hai thiết bị Android 5.0 với giao tiếp thông qua Bluetooth Low Energy và tôi wan't:BLE với Android 5.0: Cách để thiết bị hoạt động như Trung tâm và Máy chủ?

  • Device 1 để hoạt động như Trung ương và Server.

  • Thiết bị 2 hoạt động như Ngoại vi và khách hàng.


Đây là hành vi tôi muốn đạt được:

1) thiết bị 2 bắt đầu quảng cáo (vai trò ngoại vi).

2) Thiết bị 1 bắt đầu quét (vai trò trung tâm) và nhận thiết bị quảng cáo (đối tượng BluetoothDevice) thông qua phương pháp onScanResult của ScanCallback.

3) bây giờ tôi muốn các thiết bị quảng cáo (Device 2) để được thông báo rằng nó đã được quét và có thể nhận được các BluetoothDevice gắn liền với thiết bị 1.

4) Device 1 có một thể hiện của BluetoothGattServer. Thiết bị 2 bây giờ sẽ gọi connectGatt (bối cảnh bối cảnh, boolean autoConnect, BluetoothGattCallback gọi lại) trên thiết bị 1 để có được một thể hiện của BluetoothGatt.

5) Cuối cùng, Thiết bị 1 là Máy chủ và Thiết bị 2 là Ứng dụng khách.


Cho đến nay tôi đã thấy rằng ở bước 2, khi thiết bị 1 giữ BluetoothDevice cho thiết bị 2, nó chỉ có thể kết nối với máy khách như ở bước 4 sử dụng connectGatt.

tôi có thể có thể sử dụng BluetoothGattServer quy định tại Device 1, và gọi: (thiết bị BluetoothDevice, boolean AutoConnect) gattServer.connect với thiết bị là Device 2.

Nhưng sẽ như thế nào Thiết bị 2 được thông báo rằng nó đã được kết nối với?

làm thế nào tôi sẽ nhận được một thể hiện của BluetoothGatt trong Device 2 nếu tôi không thể gọi connectGatt (Context, boolean, BluetoothGattCallback) trên BluetoothDevice?

Cảm ơn bạn đã trợ giúp!

Một số tài liệu:

BluetoothGattServer

BluetoothDevice

+0

Hi Thomas, bạn đã tìm thấy bất kỳ giải pháp cho vấn đề của bạn? – Hollerweger

+0

Hi Hollerweger, thật không may là tôi chưa bao giờ tìm được giải pháp. Đó là một dự án ở trường đại học, tôi đã kết thúc cuộc biểu tình của mình với hai điện thoại và giải thích tại sao nó không thể làm việc với vi điều khiển cụ thể đó. Tôi đã tốt nghiệp và không cho nó nhiều thời gian hơn. Tuy nhiên nó có thể là giá trị kiểm tra nếu bất cứ điều gì thay đổi với Android 6. Xin vui lòng cho tôi biết nếu bạn tìm ra một cái gì đó! ;) –

Trả lời

0

Bạn phải bật nó xung quanh một chút. Máy quét là máy quét kết nối với nhà quảng cáo. Dev1 quét dev2 adv và quét phản hồi.sau đó dev1 nên kết nối. Dev2 sẽ nhận được gọi lại trên kết nối. Không có gọi lại khi ai đó nghe thấy lời khuyên của bạn hoặc yêu cầu phản hồi quét trên Android. Kiểm tra thay vì 0x14 «Danh sách 16-bit Dịch vụ Gây UUID» từ btsig nếu Bạn muốn quảng cáo yêu cầu cho các máy chủ có một dịch vụ nhất định để kết nối với Bạn. Đó là một chút bất thường ti thấy điều này được sử dụng.

+0

Xin chào henrik, cảm ơn bạn đã trả lời. –

+0

Bạn có nghĩa là dev1 nên mở một BluetoothGattServer và sau đó gọi gattServer.connect (device2, boolean)? Kết nối hoạt động khi gỡ lỗi dev1 khi tôi làm như vậy. Vấn đề là: cách duy nhất để có được và ví dụ của BluetoothGatt trong dev2 và thực hiện gọi lại là thông qua BluetoothDevice.connectGatt (contect, boolean, gọi lại). Và tôi không thể làm như vậy trong dev2 mà không biết ai là dev1. –

1

1) Thiết bị 2 bắt đầu quảng cáo (vai trò ngoại vi).

vai trò ngoại vi sẽ quảng cáo, hãy chắc chắn để thêm khả năng kết nối

 AdvertiseSettings.Builder settingBuilder = new AdvertiseSettings.Builder(); 
    settingBuilder.setConnectable(true); 

Và bắt đầu quảng cáo cho phù hợp.

2) Thiết bị 1 bắt đầu quét (vai trò trung tâm) và nhận thiết bị quảng cáo (đối tượng BluetoothDevice) thông qua phương pháp onScanResult của ScanCallback.

Hoàn hảo, bây giờ gọi connectGatt trên thiết bị này (ngoại vi), đảm bảo bạn dừng quảng cáo sau khi bạn nhận được thiết bị bắt buộc, nếu không bạn sẽ kết thúc gửi nhiều lệnh kết nối.

3) bây giờ tôi muốn các thiết bị quảng cáo (Device 2) để được thông báo rằng nó đã được quét và có thể nhận được các BluetoothDevice gắn liền với thiết bị 1.

Khi bạn gọi connectGatt từ Trung/khách hàng vai trò, thiết bị ngoại vi của bạn sẽ nhận được thông báo trongBluetoothGattServerCallback'onConnectionStateChange của nó.

ở đó bạn sẽ biết rằng kết nối đã được thực hiện. mặc dù bạn phải đăng ký dịch vụ gatt với các đặc tính ở bên ngoại vi.

4) Thiết bị 1 có phiên bản của BluetoothGattServer. Thiết bị 2 bây giờ sẽ gọi connectGatt (bối cảnh bối cảnh, boolean autoConnect, BluetoothGattCallback gọi lại) trên thiết bị 1 để có được một thể hiện của BluetoothGatt.

Sai, thiết bị 1 sẽ khởi tạo kết nối như tôi đã nêu ở điểm 3. cả hai thiết bị trênConnectionStateChange sẽ được gọi để biết rằng kết nối đã được thực hiện.

5) Cuối cùng, Thiết bị 1 là Máy chủ và Thiết bị 2 là Ứng dụng khách.

sai, Device 2 là ngoại vi (máy chủ), thiết bị 1 là Monitor (Client)

+0

Tôi đã triển khai giải pháp này và ứng dụng của tôi hoạt động tốt trên cả hai mặt. Vấn đề là nó không tương ứng với hành vi mà tôi đang cố gắng đạt được.Những gì tôi đang cố gắng làm với Thiết bị 2 là mô phỏng một bộ điều khiển vi mô cụ thể mà KHÔNG thể quét thiết bị nhưng chỉ có thể quảng cáo. (Do đó Thiết bị 2 phải là thiết bị ngoại vi GAP và Thiết bị 1 phải là trung tâm GAP). Tuy nhiên, điện thoại của tôi (thiết bị 1) đang gửi dữ liệu đến bộ điều khiển vi mô (thiết bị 2), làm cho thiết bị 1 trở thành máy chủ Gatt và thiết bị 2 là máy khách Gatt. –

+0

Ở trên là theo các định nghĩa được tìm thấy trong ** Vai trò và trách nhiệm ** ở đây: [BLE Android] (https://developer.android.com/guide/topics/connectivity/bluetooth-le.html) Sử dụng nào Bạn có nghĩ rằng phương pháp sau đây có thể được? BluetoothGattServer.connect (thiết bị BluetoothDevice, boolean autoConnect) –

+0

BluetoothGattServer.connect có thể được sử dụng để kết nối, nếu autoConnection là đúng, và vai trò máy chủ/giám sát thấy sự kiện bị ngắt kết nối. – AAnkit

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