7

Tôi gặp sự cố khi kết nối hai thiết bị Android qua Bluetooth, điều này chỉ xảy ra khi chúng đã được ghép nối trước đó. Tôi đang chạy một máy chủ và máy khách khác.Android Bluetooth chấp nhận()/connect() với các thiết bị đã ghép nối

Đây là chuỗi các thứ trên phía máy chủ:

  1. Kiểm tra trạng thái Bluetooth khác nhau (bộ chuyển đổi có sẵn, được kích hoạt, vv).
  2. cuộc gọi listenUsingRfcommWithServiceRecord() với UUID được xác định trước mà tôi đã chọn.
  3. yêu cầu đặt thiết bị ở chế độ có thể phát hiện
  4. vì có thể phát hiện xảy ra không đồng bộ, tôi gọi accept() và chờ kết nối đến.

Về phía khách hàng:

  1. Kiểm tra trạng thái Bluetooth khác nhau (bộ chuyển đổi có sẵn, được kích hoạt, vv).
  2. cho mỗi thiết bị trong getBondedDevices(), tôi so sánh getName() với tên của máy chủ. Nếu có kết quả phù hợp, hãy chuyển sang bước 6.
  3. Bắt đầu phát hiện BT
  4. Đối với mỗi thiết bị được phát hiện (lưu ý rằng thiết bị được ghép nối từ 2a không hiển thị ở đây), so sánh tên thiết bị với tên máy chủ. Nếu có kết quả phù hợp, hãy chuyển đến bước 6.
  5. Hủy khám phá
  6. Trên thiết bị được tìm thấy từ bước 2, hãy gọi createUfIDSocketToServiceRecord() với cùng UUID được xác định trước đã được sử dụng ở phía máy chủ.
  7. Kết nối cuộc gọi() và chờ cho nó trả về một ổ cắm được kết nối.

Quy trình trên hoạt động hoàn toàn tốt cho tôi khi khách hàng và máy chủ chưa bao giờ được ghép nối trước đó. Tuy nhiên, sau khi Android đăng ký chúng trong danh sách thiết bị, chúng chắc chắn sẽ hết thời gian chờ ở giai đoạn connect()/accept().

Tôi đã được tìm kiếm một giải pháp cho một vài ngày nay và đã thử khá một vài điều trong đó có một này: Connecting to a already paired Bluetooth device

Phương pháp này phản ánh không làm việc cho tôi cả. Dường như kết nối() sẽ trở lại ngay lập tức nhưng khi tôi cố gắng getOutputStream() tôi nhận được một ngoại lệ. Về phía accept() nó thậm chí không đăng ký mà ai đó đã cố gắng kết nối. Tôi nghiêm túc cần một số trợ giúp hoặc con trỏ trên nhận được các thiết bị để thiết lập một kết nối một khi họ đã được ghép nối trước.

Dưới đây là một số thông tin về các thiết bị:

  • Tôi đang thử nghiệm các máy chủ và máy khách trên hai chiếc điện thoại LG G2X.
  • Cả hai ứng dụng đều chạy trên Android 2.3.3, tương ứng với cấp API 10.
  • Một lần nữa, các bước trên hoạt động sau khi tôi hủy ghép nối thiết bị theo cách thủ công trong cài đặt.

Cảm ơn bạn trước thời hạn. Tôi khoảng 2 tuần tuổi trong Android và Bluetooth, vì vậy nếu bạn thấy bất kỳ bước nào thiếu hoặc thực tiễn tốt nhất, hãy chỉ ra chúng.

Trả lời

6

Trong ứng dụng khách khi cố gắng kết nối với thiết bị ngoại quan, tôi chỉ đơn giản gọi nó trên BluetoothDevice tôi tìm thấy trong BluetoothAdapter.getBondedDevices(). Điều này không làm việc.

Để thiết lập đúng cách kết nối Bluetooth, tôi đã phải làm một cái gì đó tương tự như giả dưới đây:

BluetoothDevice bonded = a device from BluetoothAdapter.getBondedDevices(); 
BluetoothDevice actual = BluetoothAdapter.getRemoteDevice(bonded.getAddress()); 

BluetoothSocket socket = actual.createRfcommSocketToServiceRecord(SOME_UUID); 
socket.connect(); 

tôi đến câu trả lời này bằng cách làm theo chính xác Bluetooth trò chuyện dụ: Bluetooth Chat Service. Tại sao nó không hoạt động trên thiết bị từ getBondedDevices() là ngoài tôi. Có thể ai đó có kiến ​​thức thân mật hơn về Android có thể trả lời điều đó.

+0

getRemoteDevice không phải là một phương pháp tĩnh, làm thế nào bạn đang gọi nó – raja

+1

Bạn luôn (gần?) Muốn sử dụng BluetoothAdapter.getDefaultAdapter() như BluetoothAdapter của bạn. Ở trên chỉ là mã giả, do đó bạn không thể chỉ sao chép và dán. –

+0

Bài đăng tuyệt vời, điều này thực sự hợp lý vì thiết bị là tham chiếu và sẽ cũ. Bộ điều hợp sẽ luôn được cập nhật. – Cookster

0
private static BluetoothSocket mSocket; 
BluetoothDevice selectDevice = null; 

void connectDevice(){ 
    if(mSocket == null) { 
     //Log.d(TAG, "Socket is null"); 
     UUID SPP_UUID = UUID 
       .fromString("8ce255c0-200a-11e0-ac64-0800200c9a66"); 
     Set<BluetoothDevice> bondedDevices = BluetoothAdapter 
       .getDefaultAdapter().getBondedDevices(); 
     //Log.d(TAG, "Size: " + bondedDevices.size()); 
     /** 
     * Select your divice form paired devices 
     */ 
     for (BluetoothDevice bluetoothDevice : bondedDevices) { 
      selectDevice = bluetoothDevice; 
      //Log.d(TAG, bluetoothDevice.getName()+" "+bluetoothDevice.getAddress()); 
     } 

     if(selectDevice.getBondState() == selectDevice.BOND_BONDED) { 
      //Log.d(TAG, selectDevice.getName()); 
      try { 
       mSocket = selectDevice.createInsecureRfcommSocketToServiceRecord(SPP_UUID); 
      } catch (IOException e1) { 
       // TODO Auto-generated catch block 
       //Log.d(TAG, "socket not created"); 
       e1.printStackTrace(); 
      } 
      try { 
       mSocket.connect(); 
      } catch (IOException e) { 
       try { 
        mSocket.close(); 
        //Log.d(TAG, "Cannot connect"); 
       } catch (IOException e1) { 
        //Log.d(TAG, "Socket not closed"); 
        e1.printStackTrace(); 
       } 
      } 
    } 
Các vấn đề liên quan