2014-04-16 15 views
31

API năng lượng thấp Android Bluetooth thực hiện 1 phương pháp để kết nối với thiết bị connectGatt() nhưng 2 phương pháp để đóng kết nối disconnect()close().Sự khác biệt giữa close() và ngắt kết nối() trong Android Bluetooth API là gì?

Documentation nói:

  • disconnect(): ngắt kết nối một kết nối được thiết lập, hoặc hủy bỏ một nỗ lực kết nối hiện cơ bản dở dang.

  • close(): Ứng dụng nên gọi phương thức này càng sớm càng tốt sau khi được thực hiện với khách hàng GATT này.

Mã nguồn của BluetoothGatt.java cho thấy rằng() hủy đăng ký và ngắt kết nối() ngắt kết nối máy khách. Tuy nhiên nó không nói điều đó thực sự có ý nghĩa gì. Ý tôi là, nếu chỉ có 1 cách để kết nối với máy khách, tại sao có 2 cách để đóng/ngắt kết nối?

+0

Tôi đoán 'Close' có nghĩa là bạn sẽ không còn sử dụng Gatt đối tượng –

Trả lời

35

Với disconnect(), sau đó bạn có thể gọi connect() và tiếp tục với chu kỳ đó.

Khi bạn gọi close() bạn đã hoàn tất. Nếu bạn muốn kết nối lại, bạn sẽ phải gọi lại số connectGatt() trên số BluetoothDevice; close() sẽ phát hành bất kỳ tài nguyên nào được giữ bởi BluetoothGatt.

+2

Siêu helpful- chỉ gọi' ngắt kết nối() 'và giữ chạy ra khỏi giao diện BT ngăn chặn bất kỳ kết nối mới. Gọi 'close()' ngăn chặn điều này. – dgel

+7

Bất cứ khi nào tôi sử dụng 'disconnect()' hoặc 'close()' phương thức gọi lại 'onConnectionStateChange' không bao giờ được gọi là STATE_DISCONNECTED. – DaviF

+1

close() sẽ không nhận được cuộc gọi đến onConnectionStateChange, nhưng ngắt kết nối() nên. Bạn có chắc chắn bạn đã thực sự kết nối khi bạn gọi là ngắt kết nối()? –

9

Dưới đây là một số thực phẩm cho rằng:

Chừng nào bạn chưa gọi là đóng trên Gatt, bạn vẫn có thể cố gắng để kết nối với nó, hoặc khám phá. Vì vậy, khi tôi cố gắng khám phá các dịch vụ cho một máy, tôi thường sẽ chạy một luồng hoặc runnable mà làm cho yêu cầu kết nối với máy trong một khoảng thời gian nhất định.

Lần thử đầu tiên với kết nối máy, sẽ trả về một đối tượng BluetoothGatt mà sau này bạn có thể sử dụng để tìm cách khám phá các dịch vụ cho đối tượng BluetoothDevice. Nó có vẻ khá dễ dàng để kết nối, nhưng khó khăn hơn nhiều để khám phá các máy phục vụ.

mBluetoothGatt = machine.getDevice().connectGatt(this, false, mGattCallback); 

Vì vậy, trong chủ đề/runnable của mình, tôi sẽ kiểm tra xem BluetoothGatt có rỗng không. Nếu có, tôi sẽ gọi lại dòng mã trên, nếu không tôi sẽ cố gắng khám phá các dịch vụ BluetoothGatt như vậy.

mBluetoothGatt.discoverServices(); 

Ồ, và tôi luôn đảm bảo gọi BluetoothAdapter.cancelDiscovery() trước khi kết nối khám phá dịch vụ.

mBluetoothAdapter.cancelDiscovery(); 

Đây là một phương pháp là sử dụng để kết nối trong vv Runnable tôi:

public void connectToMachineService(BLEMachine machine) { 
    Log.i(SERVICE_NAME, "ATTEMPTING TO CONNECT TO machine.getDevice().getName()); 

    mBluetoothAdapter.cancelDiscovery(); 

    if(mBluetoothGatt == null) 
     mBluetoothGatt = machine.getDevice().connectGatt(this, false, mGattCallback); 
    else 
     mBluetoothGatt.discoverServices(); 
} 

Cuối cùng, hãy chắc chắn rằng bạn đóng bất kỳ đối tượng BluetoothGatt mà bạn đã kết nối với. Có vẻ như Android có thể xử lý năm đối tượng BluetoothGatt trước khi nó bắt đầu nói "không thể kết nối với máy chủ Gatt" hoặc một cái gì khác như thế.

Trên mỗi BluetoothGatt mà tôi tạo, tôi sẽ gọi gần nó sau đó phát sóng bản cập nhật cho biết kết nối đã bị đóng.Có vẻ như có rất nhiều lần BluetootGatt sẽ không phản hồi với sự thay đổi trạng thái khi nó bị ngắt kết nối. Phương pháp của tôi đóng BluetoothGatt đi một cái gì đó như thế này. Tôi rời khỏi phương thức mở cho Activity để gọi dịch vụ và ngắt kết nối nếu máy trở nên không đáp ứng và trạng thái ngắt kết nối không được gọi.

public void disconnectGatt(BluetoothGatt gatt) { 
    if(gatt != null) { 
     gatt.close(); 
     gatt = null; 
    } 

    broadcastUpdate(ACTION_STATE_CLOSED); 
} 
Các vấn đề liên quan