2011-11-02 23 views
25

Tôi đang làm việc với một số sinh viên tại trường đại học của tôi phát triển một ứng dụng Bluetooth Android đơn giản sẽ được sử dụng để liên lạc nối tiếp (RFCOMM) với vi điều khiển Arduino với mô-đun Bluetooth được kết nối với nó.Làm cách nào để kết nối đúng cách ứng dụng Android với ổ cắm RFCOMM trên bộ vi điều khiển Arduino có hỗ trợ Bluetooth?

Theo hiểu biết tốt nhất của tôi, tôi đang sử dụng đúng địa chỉ Bluetooth và UUID cho RFCOMM/SPP 00001101-0000-1000-8000-00805F9B34FB. Ứng dụng của tôi bắt đầu một chuỗi cố gắng kết nối với thiết bị bằng cách sử dụng BluetoothDevice.createRfcommSocketToServiceRecord(UUID). Nhưng vì một lý do nào đó, chúng tôi không thấy kết nối thành công. Các hoạt động luôn luôn thất bại khi gọi connect() trên kết quả BluetoothSocket mà đến từ lời gọi ở trên.

Khi được thử nghiệm trên HTC Evo của mình, chạy biến thể của HTC là Gingerbread, cuộc gọi connect() thường không thành công với thông báo ngoại lệ "Không thể bắt đầu khám phá dịch vụ". Tôi đã đọc một số và thấy rằng một số người nói rằng việc thực hiện HTC cho RFCOMM trong ngăn xếp Bluetooth là lỗi, vì vậy chúng tôi quyết định thử nó trên Samsung Galaxy S của học sinh khác. Lần đầu tiên mã chạy, mọi thứ hoạt động hoàn hảo. Bộ vi điều khiển Arduino được kết nối với một động cơ điện nhỏ bắt đầu hoạt động như mong đợi. Tôi đã không loại trừ vấn đề có thể ở phía bên vi điều khiển hay không.

Sử dụng sau đó của ứng dụng trên thiết bị Samsung sau đó không thành công, bây giờ với thông báo cho biết "Dịch vụ khám phá không thành công". Với tôi, có vẻ như có lẽ mô-đun Bluetooth ở phía thiết bị cho rằng dịch vụ RFCOMM vẫn đang được sử dụng. Nhưng chúng tôi đã khởi động lại vi điều khiển và vẫn thấy kết quả tương tự.

Tôi vừa liệt kê mã chuỗi vì đó là tất cả những gì thực sự có liên quan. Tôi đã đọc rằng có một cách giải quyết khá phổ biến (hack) cho những vấn đề này bằng cách sử dụng sự phản chiếu. Nỗ lực của tôi ở đó cũng đã thất bại nhưng đã có và nhận xét. Hy vọng rằng ai đó có thể chỉ đạo tôi đi đúng hướng ở đây. Cũng lưu ý rằng tôi có các quyền cần thiết được bật trong tệp kê khai và trong cả hai trường hợp, thiết bị đã được ghép nối thành công với Arduino bằng giao diện người dùng của Android.

private class ClientThread extends Thread { 

    private String _btAddress; 

    /** 
    * A handle to the local device's Bluetooth adapter hardware. 
    */ 
    private BluetoothAdapter _btAdapter = BluetoothAdapter.getDefaultAdapter(); 

    /** 
    * A handle to the remote device Bluetooth context. 
    */ 
    private BluetoothDevice _btRemoteDevice; 

    /** 
    * A handle to the Bluetooth serial socket. 
    */ 
    private BluetoothSocket _btSocket; 

    /** 
    * Constructor. 
    * @param btAddress The BluetoothHardware address. 
    */ 
    public ClientThread(String btAddress) 
    { 
     _btAddress = btAddress; 
    } 

    public void run() 
    { 
     // Retrieves the device identified by the _btAddress property. 
     _btRemoteDevice = retrieveDevice(); 
     if (_btRemoteDevice == null) 
      sendUIMessage(CONNECTION_BT_DEVICE_NOT_BONDED); 
     else 
      sendBeacon(); 
    } 

    /** 
    * Retrieves the device associated with this client thread. 
    * @return 
    */ 
    private BluetoothDevice retrieveDevice() 
    { 
     Set<BluetoothDevice> btDevices = _btAdapter.getBondedDevices(); 
     for (BluetoothDevice btd : btDevices) 
     { 
      String addr = btd.getAddress(); 
      String name = btd.getName(); 
      if (addr.equalsIgnoreCase(_btAddress)) 
       return btd; 
     } 
     return null; 
    } 

    /** 
    * Sends the beacon to the Bluetooth device. 
    */ 
    private void sendBeacon() 
    { 
     // Holds the output stream of the BluetoothDevice. 
     OutputStream os = null; 

     try 
     { 
      _btSocket = _btRemoteDevice.createRfcommSocketToServiceRecord(UUID.fromString("00001101-0000-1000-8000-00805F9B34FB")); 

      //Method m = _btRemoteDevice.getClass().getMethod("createInsecureRfcommSocket", new Class[] {int.class}); 
      //_btSocket = (BluetoothSocket) m.invoke(_btRemoteDevice, 1); 
      _btSocket.connect(); 
      os = _btSocket.getOutputStream(); 
      os.write('L'); 
     } 
     catch (IOException e) 
     { 
      String message = e.getMessage(); 
      e.printStackTrace(); 
      sendUIMessage(CONNECTION_FAILURE_IO); 
     } 
     catch (Exception e) 
     { 
      e.printStackTrace(); 
      sendUIMessage(CONNECTION_FAILURE_UNKNOWN); 
     } 
     finally 
     { 
      try 
      { 
       if (_btSocket != null) 
        _btSocket.close(); 
      } 
      catch (IOException e) 
      { 
       System.out.println("Failed closing Bluetooth output stream."); 
       e.printStackTrace(); 
      } 
     } 
    } 
} 

EDIT: Mô-đun Bluetooth là MDFLY RF-BT0417CB. Tôi biết rằng mã đang chạy trên arduino là không nhiều và chỉ đơn giản là giao tiếp với các mô-đun BT bằng cách sử dụng Serial.available() và Serial.read(). Tuy nhiên tôi có một thông tin mới có thể được sử dụng nhiều hơn. Khi ứng dụng của tôi được cài đặt trên thiết bị Samsung, ứng dụng này chỉ hoạt động một lần và không thành công trong các lần thử nghiệm tiếp theo. Trong khi đó, một sinh viên khác mà tôi đang làm việc, sử dụng Android App Inventor (một công cụ GUI kéo và thả cũng có thể tạo các tạo phẩm làm việc hợp lý) để tạo ra một ứng dụng đơn giản kết nối cùng một mô-đun BT/bo mạch Arduino. Anh ấy nói rằng khi ứng dụng của tôi được cài đặt, ứng dụng kia không thể kết nối với mô-đun BT, điều này khiến tôi tin rằng hệ thống vẫn nghĩ rằng tài nguyên đó đã được cấp phát cho ứng dụng của tôi. Sau khi anh gỡ cài đặt ứng dụng của tôi, người kia đã có thể kết nối. Anh ta không có mã nguồn cho ứng dụng khác, nhưng tôi sẽ thử bản thân App Inventor để xem liệu mã nguồn mà nó tạo ra nó tạo ra có làm gì khác không. Theo hiểu biết tốt nhất của tôi, tôi tuân thủ hầu hết các thực hành tiêu chuẩn được xác định trong tài liệu của Android, vì vậy có lẽ đó là điều lạ về mô-đun BT hoặc thực tế là mã arduino không nhất thiết phải kiểm soát mô-đun BT.

CHỈNH SỬA KHÁC: Tôi không phải là chuyên gia Bluetooth, nhưng chúng tôi có thể tìm ra một công việc xung quanh. Như một số nhận thức, có một loạt các API BluetoothDevice công cộng, ẩn tại thời gian biên dịch, nhưng được công khai hợp pháp trong thời gian chạy sử dụng sự phản chiếu. Một trong số đó là createRfCommSocket (int). API này không có trong tài liệu chính thức vì tài liệu bị ẩn nhưng bạn có thể đọc nó here.Tôi chưa thử nó với các tài liệu hỗ trợ API, nhưng vấn đề dường như là một cái gì đó của một vấn đề đồng thời giữa các thiết bị cầm tay và hội đồng quản trị nối tiếp. Chiếc điện thoại đã gửi một tin nhắn, tất nhiên là một cuộc gọi chặn, và khi nó quay trở lại từ đó, đóng kết nối. Các lá chắn trên bảng nối tiếp sau đó cũng sẽ đóng kết nối và do đó dữ liệu không có sẵn cho các ứng dụng Arduino. Chúng tôi nhận ra điều này khi chứng kiến ​​giao tiếp thành công trong khi ở chế độ gỡ lỗi ở phía bên android, nhưng thất bại trong chế độ phát hành. Thêm một sự chậm trễ nửa giây ở phía bên android, giữa việc truyền và đóng BluetoothSocket đã khắc phục được sự cố. Tôi không thể nói liệu vấn đề này có phải do mã arduino hay không vì tôi không quen thuộc với kiến ​​trúc, nhưng chúng tôi là sinh viên thiếu kinh nghiệm nên sẽ không làm tôi ngạc nhiên.

+0

Mô-đun và phần mềm bluetooth nào đang chạy trên thiết bị Arduino? Bạn có thể đăng một tham chiếu đến thiết bị bạn đang sử dụng không. Ngoài ra nếu bạn có thể đăng nhật ký hoàn chỉnh ở phía Android, nó sẽ giúp ích. –

+0

Dennis, Cảm ơn bạn đã trả lời và xin vui lòng chấp nhận lời xin lỗi của tôi đã dành quá nhiều thời gian để lấy lại cho bạn, kỳ thi và các nghĩa vụ khác đã được giữ tôi lên. Tôi đang xem xét các phiên bản phần mềm và mô hình của Arduino, nhưng tôi đã đăng một số thông tin về thiết bị BT và một số thông tin mới về vấn đề này. –

+0

Xin chào, tôi có vấn đề tương tự ... Tôi đang cố gắng kết nối điện thoại LG với TI PAN1315 Dev. hội đồng quản trị, tôi nhận được các ổ cắm với cùng một UUID, nhưng connect() luôn luôn ném một IOException. Trong khi gỡ lỗi PAN1315 được nhúng, tôi đã in ra một số nhật ký cho bảng điều khiển, cố gắng tìm ra nếu tôi đã làm hỏng thứ gì đó từ thiết kế ứng dụng gốc, tôi thấy rằng yêu cầu ngắt kết nối hci/acl đến từ điện thoại chứ không phải từ thiết bị nhúng sau khi gửi một khóa liên kết từ thiết bị được nhúng đến điện thoại ... bạn có thể đồng ý không? – TacB0sS

Trả lời

1
[Communication Between Android And Arduino With Bluetooth(1)][1] 

Tôi nghĩ điều này sẽ hữu ích cho bạn. Bạn có thể cung cấp một số chi tiết về điều này. Tôi đã thấy một liên kết, bạn cũng có thể thấy điều này. Hãy cho tôi biết liệu điều này có hữu ích hay không? How to create Insecure RFCOMM Socket in Android?

+0

Bạn có may mắn không? Làm ơn cho tôi biết. – mH16

0

Amarino Toolkit được xây dựng riêng để tạo điều kiện liên lạc Bluetooth nối tiếp giữa thiết bị Android và Arduino với Bluetooth.

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