2012-05-24 60 views
5

Tôi muốn kết nối Điện thoại Android của mình (2.3.6 Samsung Note) với thiết bị Bluetooth được nhúng (RN-42 BT UART module trên Arduino). Bắt đầu với ví dụ BluetoothChat và có thiết bị nhúng được ghép nối với điện thoại. Cho đến nay tất cả dường như hoạt động tốt, các thiết bị được kết nối và dữ liệu được truyền từ Android sang thiết bị nhúng. Những gì tôi vẫn còn thiếu là làm cho các thiết bị tự động kết nối khi hai thiết bị ở trong phạm vi phủ sóng.Tự động kết nối với các thiết bị Bluetooth đã ghép nối trên Android

Sử dụng trình gỡ lỗi Tôi thấy thiết bị nhúng là "Máy chủ" hoặc trong thuật ngữ "Slave" và Android là ứng dụng khách, khi Android đưa ra yêu cầu kết nối.

Trả lời

0

Vì vậy, tôi đã tìm ra "mẹo". Đầu tiên, điện thoại di động được đặt thành Chỉ chấp nhận các kết nối và thiết bị nhúng có đường dây điện để tự động kết nối. Thay đổi là đặt thiết bị được nhúng từ chế độ "Máy chủ" sang chế độ "Khách hàng" bằng tự động kết nối.

Trở ngại tiếp theo là Android phải có mã Chấp nhận trong một dịch vụ nếu không kết nối đó sẽ chỉ hoạt động nếu ứng dụng được kích hoạt. Với việc đưa đoạn Chấp nhận mã vào một dịch vụ, ứng dụng có thể không hoạt động và phụ kiện được nhúng sẽ tự động kết nối. Mã sẽ được chia sẻ trong Instructable: enter link description here

+0

Đừng quên bạn có thể chấp nhận câu trả lời của riêng bạn. –

+0

Vì vậy, ví dụ, Bạn có biết làm thế nào tôi có thể làm để kết nối với thiết bị Bluetooth gần nhất của tôi với chỉ kích hoạt Bluetooth mannually? –

3

Tôi có cấu hình tương tự (Android Galaxy S3 4.0 và RN-42 BT được kết nối với Arduino Uno) Tôi có thể ghép nối Android và Bluetooth và kết nối từ Android với RN-42 BT (Tôi đang sử dụng ứng dụng BlueTerm để kiểm tra) Tuy nhiên, tôi không thể kết nối từ BT RN-42 với điện thoại Android. Tôi đã làm theo các công trình xây dựng và ví dụ về mã số: http://www.instructables.com/id/Missed-calls-and-SMS-Notifier-Accessory/

Tôi đã lập trình 42 BT để phục vụ như một khách hàng và đặt nó ở chế độ Tự động kết nối (SR, 3). Trong mã Android của tôi, BluetoothSerialService (tương đương với mã ví dụ PhoneInfoServer) bị kẹt trong AcceptThread on: socket = mmServerSocket.accept(); Tôi gắn các mảnh sau mã có liên quan đến các vấn đề kết nối:

  1. Arduino mã mà đặt chế độ kết nối tự động và khởi kết nối với điện thoại Android
  2. Android BluetoothSerialService AcceptThread mã nghe incoming kết nối
  3. điệp logcat cho thấy rằng mã đang bị mắc kẹt chờ đợi kết nối đến

Trong ứng dụng demo BluetoothChat của Google, có một tùy chọn để làm cho điện thoại có thể phát hiện để một điện thoại khác có thể kết nối với nó. Tôi đang tìm một cái gì đó tương tự cho kết nối nối tiếp bluetooth. Tôi đã tìm một ứng dụng trên Google Play sẽ kiểm tra việc nghe yêu cầu kết nối đến từ thiết bị nối tiếp bluetooth nhưng không tìm thấy ứng dụng như vậy. Có ai đó biết về một ứng dụng như vậy không?

Kính trọng, Avner

  1. Arduino mã mà đặt chế độ kết nối tự động và khởi tạo một kết nối với điện thoại Android

    void setup() {   
        Serial.begin(115200); 
    
        Serial.println("BEG setup"); 
    
        static const char *initString0 = "$$$SR,04FE3144A0A4\r"; 
    
        // R,1 Forces a complete reboot of the device (similar to a power cycle). 
        static const char initString1a[] = "$$$"; 
        static const char initString1b[] = "R,1\r"; 
    
        // auto 
        static const char initString2a[] = "$$$"; 
        static const char initString2b[] = "SM,3\rSO,Z\r---\r"; 
        static const char *initVector[] = { initString0, initString1a, initString1b, initString2a, initString2b, NULL }; 
    
        int i; 
    
        for (i=0; initVector[i] != NULL; i++) { 
         Serial.print(initVector[i]); 
         delay(500); 
        } 
    
        Serial.println("Setup completed");   
    } 
    
  2. Android BluetoothSerialService AcceptThread mã mà lắng nghe kết nối đến

    // ... 
        private class AcceptThread extends Thread 
        { 
         // The local server socket 
        static private final String TAG = "BluetoothSerialServiceAcceptThread"; 
         private final BluetoothServerSocket mmServerSocket; 
         private String mSocketType; 
    
    
         /** Creates an thread for accepting incoming Bluetooth connections 
         * @param secure Currently ignored, but suppose to represent the mode of socket. 
         * All communication is currently done over insecure socket 
         */ 
         public AcceptThread(boolean secure) { 
          Log.i(TAG, "BEG AcceptThread::AcceptThread"); 
    
          BluetoothServerSocket tmp = null; 
          mSocketType = secure ? "Secure":"Insecure"; 
    
          // Create a new listening server socket 
          try { 
          Log.i(TAG, "AcceptThread constructor trying to create listening socket"); 
    
           if (!secure) { 
            // This is for Android 2.2 
            // tmp = mAdapter.listenUsingRfcommWithServiceRecord(NAME_INSECURE, BT_SPP_UUID); 
    
            // This is for Android 2.3 but testing the above on 2.3 device showed it to be working. 
            tmp = mAdapter.listenUsingInsecureRfcommWithServiceRecord(NAME_INSECURE, BT_SPP_UUID); 
           } 
    
           Log.d(TAG, "AcceptThread: Listening BT Socket " + mSocketType + " created"); 
          } 
          catch (IOException e) 
          { 
           Log.e(TAG, "AcceptThread: Listening BT Socket Type: " + mSocketType + " listen() failed " + e.getMessage()); 
           acceptProblem(); 
          } 
          mmServerSocket = tmp; 
    
          Log.d(TAG, "mmServerSocket: " + mmServerSocket); 
    
         } // public AcceptThread 
    
    
         public void run() {    
          Log.i(TAG, "BEG BluetoothSerialService::run"); 
    
          if (mmServerSocket == null) 
          { 
          Log.e(TAG, "AcceptThread.run: No server socket"); 
          return; 
          } 
    
          Log.d(TAG, "AcceptThread.run: socket type:" + mSocketType); 
          setName("AcceptThread" + mSocketType); 
    
          BluetoothSocket socket = null; 
    
          Log.i(TAG, "mState: " + mState); 
    
          // Listen to the server socket if we're not connected 
          while (mState != STATE_CONNECTED) 
          { 
           Log.i(TAG, "socket before mmServerSocket.accept(): " + socket); 
    
           try 
           { 
            // This is a blocking call and will only return on a 
            // successful connection or an exception 
            socket = mmServerSocket.accept(); 
            Log.d(TAG, "AcceptThread.run: returned from accept"); 
           } 
           catch (IOException e) 
           { 
            Log.e(TAG, "AcceptThread.run: Socket Type: " + mSocketType + "accept() failed " + e.getMessage()); 
            break; 
           } 
    
           Log.i(TAG, "socket after mmServerSocket.accept(): " + socket); 
    //... 
    
  3. điệp logcat cho thấy rằng mã đang bị mắc kẹt chờ đợi kết nối đến

    // ... 
    12-09 01:04:38.765: I/BluetoothSerialServiceAcceptThread(16175): BEG AcceptThread::AcceptThread 
    12-09 01:04:38.765: I/BluetoothSerialServiceAcceptThread(16175): AcceptThread constructor trying to create listening socket 
    12-09 01:04:38.765: V/BluetoothSocket.cpp(16175): initSocketNative 
    12-09 01:04:38.765: V/BluetoothSocket.cpp(16175): ...fd 49 created (RFCOMM, lm = 0) 
    12-09 01:04:38.765: V/BluetoothSocket.cpp(16175): initSocketFromFdNative 
    12-09 01:04:38.775: D/BluetoothUtils(16175): isSocketAllowedBySecurityPolicy start : device null 
    12-09 01:04:38.775: V/BluetoothSocket.cpp(16175): bindListenNative 
    12-09 01:04:38.775: V/BluetoothSocket.cpp(16175): ...bindListenNative(49) success 
    12-09 01:04:38.785: D/BluetoothSerialServiceAcceptThread(16175): AcceptThread: Listening BT Socket Insecure created 
    12-09 01:04:38.785: D/BluetoothSerialServiceAcceptThread(16175): mmServerSocket: [email protected] 
    12-09 01:04:38.785: D/BluetoothReadService(16175): END start 
    12-09 01:04:38.795: I/BluetoothSerialServiceAcceptThread(16175): BEG BluetoothSerialService::run 
    12-09 01:04:38.795: D/BluetoothSerialServiceAcceptThread(16175): AcceptThread.run: socket type:Insecure 
    12-09 01:04:38.795: I/BluetoothSerialServiceAcceptThread(16175): mState: 1 
    12-09 01:04:38.795: I/BluetoothSerialServiceAcceptThread(16175): socket before mmServerSocket.accept(): null 
    12-09 01:04:38.795: V/BluetoothSocket.cpp(16175): acceptNative 
    12-09 01:04:38.855: I/MainActivity(16175): mBtStatus: [email protected] 
    12-09 01:04:38.855: I/MainActivity(16175): In case: BluetoothSerialService.STATE_LISTEN 
    12-09 01:04:38.855: D/MainActivity(16175): Beg onCreateOptionsMenu 
    12-09 01:04:38.885: D/memalloc(16175): ion: Mapped buffer base:0x5d760000 size:3768320 offset:0 fd:57 
    12-09 01:04:38.925: D/CLIPBOARD(16175): Hide Clipboard dialog at Starting input: finished by someone else... ! 
    // ... 
    

Tôi cũng phát hiện ra rằng RN-42 BT là nhận được vào chế độ tự động kết nối nhưng cố gắng để kết nối với một phi android LG điện thoại ở nhà.

Tôi đã phát hiện ra điều này bằng cách đặt lại RN-42 BT về giá trị mặc định của nhà máy. Sử dụng ứng dụng BlueTerm Tôi đã kết nối thành công từ điện thoại Android với BT RN-42. Khi tôi thực hiện quét yêu cầu ($$$ I \ r) tôi nhận được địa chỉ mac và tên của điện thoại LG. Điện thoại này có Bluetooth với địa chỉ mac khác (0026e25d8a91) - Tôi không biết nguyên nhân gây ra RN-42 BT để thử và kết nối với thiết bị này.

Điều này có nghĩa là chế độ kết nối tự động không hoạt động nhưng kết nối được hướng đến sai điện thoại. Tôi pazzled vì tôi xác định địa chỉ mac của điện thoại Android sử dụng các lệnh sau (với sự chậm trễ giữa chúng)

// The mac address of the android phone 
$$$SR,04FE3144A0A4\r 

// Force a complete reboot of the device (similar to a power cycle). 
$$$R,1\r 

// SM,3 - mode=auto 
// SO,Z - Extended Status String, Setting this string enables status messages to be sent to the local serial port. 
// --- - exit command mode (three minus signs). 
$$$SM,3\rSO,Z\r---\r 

Tôi bây giờ nghĩ rằng khi bắt đầu kết nối từ RN-42 BT là Ok nhưng BluetoothServerSocket trên mã android không được thiết lập đúng cách.
Tôi đã thử đặt BluetoothServerSocket để nghe bằng cách sử dụng listenUsingInsecureRfcommWithServiceRecord và listenUsingRfcommWithServiceRecord. Tôi nhận thấy rằng có một lệnh createInsecureRfcommSocketToServiceRecord. Tôi có nên sử dụng nó thay thế không?

Mọi lời khuyên sẽ được đánh giá cao.

Xin cảm ơn, Avner

+0

Đây là thông tin hữu ích, nhưng dường như đây không phải là câu trả lời – KarlM

+0

Ứng dụng PhoneInfo trên Android có tùy chọn hiển thị địa chỉ MAC BT. Chỉ cần chắc chắn, kiểm tra xem nó. Ngoài ra, tôi nhận thấy bạn đã không làm lệnh C trên thiết bị đầu cuối với mô-đun BT. Hãy thử điều đó. Theo như tôi nhớ mã hoạt động trong giao tiếp không an toàn anyway (ở phía Android) – zmashiah

+0

Tôi tìm thấy một giải pháp cho vấn đề của điện thoại Android (Galaxy S3 4.0.3) không thể hoạt động như một máy chủ để kết nối tự động . Tôi đã thêm một tùy chọn cho điện thoại Android hoạt động như máy khách và khởi tạo RfcommSocket không an toàn với BT RN-42. Thay thế createRfcommSocketToServiceRecord bằng kết quả createInsecureRfcommSocketToServiceRecord trong kết nối thành công. Đèn BT RN-42 chuyển sang màu xanh lục và thiết bị giao tiếp mà không cần phải bấm mật khẩu (1234). – Avi

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