2010-12-09 9 views
2

다른 제안에 유용하지 않고 모든 제안을 시도하고 누군가가 나를 도울 수 있기를 바랍니다. 나는이 문제에 3 일 동안 고심하고있다. 나는 내 UUID가 정확하다는 것을 잘 알고 있으며, 브로드밴드 액세스가 매니페스트에서 가능하다는 것을 알고있다.android.bluetooth.BluetoothSocket 연결할 수 없습니다

내 안드로이드 응용 프로그램을 Fedora에서 실행되는 Python 서버에 연결하려고합니다. 그것은 간헐적으로 일했으며 전혀 그렇지 않았습니다. 일반적으로받는 안드로이드 예외는 ..의 줄을 따라 있습니다. 이들은 btSocket.connect(); 아래에 첨부 된 코드에서 실행됩니다.

12-09 05:08:42.331: ERROR/BluetoothService(676): java.io.IOException: Service discovery failed 

또는

12-09 05:27:00.757: ERROR/BluetoothService(729): java.io.IOException: Service discovery failed 

이 모든 것을 알아서하도록되어 내 안드로이드 블루투스 클래스입니다. 스레드는 주 응용 프로그램 클래스가 소켓이 연결된 메시지를 받으면 시작됩니다. 내 블루투스 클래스는 http://www.anddev.org/viewtopic.php?p=35487#35487을 기준으로합니다.

package spin.halo; 

import java.io.*; 
import java.lang.reflect.InvocationTargetException; 
import java.lang.reflect.Method; 
import java.util.UUID; 

import android.bluetooth.*; 
import android.os.Handler; 
import android.util.Log; 

public class BluetoothService extends Thread{ 

    private static final String TAG = "BluetoothService"; 
    private static final boolean D = true; 
    private BluetoothAdapter mBluetoothAdapter = null; 
    private BluetoothSocket btSocket = null; 
    private OutputStream outStream = null; 
    private InputStream inStream = null; 
    private static final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"); 

    private static String address; 

    private Handler appHandler; 

    public BluetoothService(Handler h) { 
     if (D) 
      Log.e(TAG, "+++ ON CREATE +++"); 

     appHandler = h; 

     mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); 
     if (mBluetoothAdapter == null) { 
      Log.e(TAG, "NO BT ADAPTER!"); 
      return; 
     } 

     if (!mBluetoothAdapter.isEnabled()) { 
      Log.e(TAG, "Bluetooth is not enabled!"); 
      return; 
     } 

     if (D) 
      Log.e(TAG, "+++ DONE IN ON CREATE, GOT LOCAL BT ADAPTER +++"); 
    } 

    public void connectToServer() { 
     connectToServer("60:33:4B:25:0D:37"); 
    } 

    public void connectToServer(String serverMacAddress) { 

     address = serverMacAddress; 
     // 
     if (D) { 
      Log.e(TAG, "+ ABOUT TO ATTEMPT CLIENT CONNECT +"); 
     } 

     BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address); 
     Log.v(TAG, "REMOTE DEVICE: " + device.toString()); 

     try { 
      btSocket = device.createRfcommSocketToServiceRecord(MY_UUID); 
      Log.v(TAG, "SOCKET: " + btSocket.toString()); 
     } catch (Exception e) { 
      Log.e(TAG, "ON RESUME: Socket creation failed.", e); 
     } 

     /* Discovery may be going on, e.g., if you're running a 
     'scan for devices' search from your handset's Bluetooth 
     settings, so we call cancelDiscovery(). It doesn't hurt 
     to call it, but it might hurt not to... discovery is a 
     heavyweight process; you don't want it in progress when 
     a connection attempt is made.*/ 
     mBluetoothAdapter.cancelDiscovery(); 

     // Blocking connect, for a simple client nothing else can 
     // happen until a successful connection is made, so we 
     // don't care if it blocks. 

     try { 
      btSocket.connect(); 
      Log.e(TAG, "ON RESUME: BT connection established, data transfer link open."); 
      appHandler.sendMessage(appHandler.obtainMessage(ValidationApp.BT_CONNECTION_MADE, "")); 
     } catch (IOException e) { 
      try { 
       Log.e(TAG, "ON RESUME: Could not connect", e); 
       btSocket.close(); 
      } catch (IOException e2) { 
       Log.e(TAG, "ON RESUME: Unable to close socket during connection failure", e2); 
      } 
     } 

     // Create output stream 
     try { 
      outStream = btSocket.getOutputStream(); 
     } catch (IOException e) { 
      Log.e(TAG, "ON RESUME: Output stream creation failed.", e); 
     } 

     // Create input stream 
     try { 
      inStream = btSocket.getInputStream(); 
     } catch (IOException e) { 
      Log.e(TAG, "Input stream creation failed.", e); 
     } 
    } 

    public void write(String message) { 
     if(message.length() > 0) { 
      byte[] msgBuffer = message.getBytes(); 
      try { 
       outStream.write(msgBuffer); 
      } catch (IOException e) { 
       Log.e(TAG, "ON RESUME: Exception during write.", e); 
      } 
     } 
    } 

    public void run() { 
     LineNumberReader mLineReader = new LineNumberReader(new InputStreamReader(inStream)); 
     while(true) { 
      try { 
       String message = mLineReader.readLine(); 

       if(D) {Log.v(TAG, "Bluetooth says: " + message);} 
       Log.v(TAG, appHandler.obtainMessage(ValidationApp.BT_MESSAGE, message).toString()); 
       appHandler.sendMessage(appHandler.obtainMessage(ValidationApp.BT_MESSAGE, message)); 
      } catch (IOException e) { 
       Log.e(TAG, "startListen: ", e); 
      } 
     } 
    } 
} 

내 파이썬 코드의 핵심 부분은 아래와 같습니다. 나는이 코드에 대해 매우 확신한다.

# pybluez library 
import bluetooth 

server_socket = bluetooth.BluetoothSocket(bluetooth.RFCOMM) 
client_sockets = [] 

server_socket.bind(("",bluetooth.PORT_ANY)) 
port = server_socket.getsockname()[1] 
uuid = "00001101-0000-1000-8000-00805F9B34FB" 

print "Listening for devices..." 

# advertise service 
server_socket.listen(1) 
bluetooth.advertise_service(server_socket, "Validation Host", 
    service_id = uuid, 
    service_classes = [ uuid, bluetooth.SERIAL_PORT_CLASS ], 
    profiles = [ bluetooth.SERIAL_PORT_PROFILE ], 
) 

# accept incoming connections 
client_sock, client_info = server_socket.accept() 
client_sockets.append(client_sock) 
print "Accepted Connection from ", client_info 

감사합니다.

답변

3

코드가 일반적으로 좋아 보이는 것 같습니다. 일부 예제에서는 복사하여 붙여 넣기 만하면됩니다.

HTC 욕망과 같은 일부 Android 휴대 전화에는 device.createRfcommSocketToServiceRecord 메소드가 실패하는 버그가 있습니다. 나는 다음과 같은 접근 방식을 제안 : (여기서 당신이 알고있는) 당신이 당신의 리눅스 설치가 제대로 작동하는지 확인하는에 의해 에서 제공하는 두 개의 리눅스 컴퓨터 사용 pythong 스크립트 사이에 채팅을 시도

1).

2) 컴퓨터에서 Android로 연결을 시도하는 중입니다. (android-bluetooth-chat-client-python 사용) 기본 BluetoothChat 데모는 첫 번째 시도에서만 연결을 허용 할 수 있습니다.

3) 리눅스 컴퓨터에 안드로이드 휴대 전화에서 연결 시도하지만, 수동으로 코드

// BUGBUG: Following code is not properly implemented on HTC DESIRE 
// mSocket =     device.createRfcommSocketToServiceRecord(UUID.fromString("6a462dc0-703a-4bf3-a80e-a473a6332c64")); 
// WORKAROUND: Connecting directly to RFCOMM channel 1 
Method m = device.getClass().getMethod("createRfcommSocket", new Class[] { int.class }); 
mSocket = (BluetoothSocket) m.invoke(device, Integer.valueOf(1)); // 1==RFCOMM channel code 

당신은

# sdptool browse local 
+0

를 사용하여 RFCOMM 채널 번호가 무엇인지 찾아야합니다 다음 사용 RFCOMM 채널 번호를 지정 너는 성자 야! –

+0

이것이 작동하지 않으면 "createRfcommSocket"대신 "createInsecureRfcommSocket"을 시도하십시오. – vanomart

관련 문제