2011-11-25 40 views
0

我需要用藍牙編寫某種客戶端 - 服務器應用程序。我需要在我的筆記本電腦上創建一些服務器(我使用java和bluecove),這將嚮應用程序發送一些數據(在android上)。這裏是我的代碼:android和bluecove

服務器:

public class OBEXPutServer { 

static final String serverUUID = "11111111111111111111111111111123"; 

public static void main(String[] args) throws IOException { 

    LocalDevice.getLocalDevice().setDiscoverable(DiscoveryAgent.GIAC); 

    SessionNotifier serverConnection = (SessionNotifier) Connector.open("btgoep://localhost:" 
      + serverUUID + ";name=ObexExample"); 

    int count = 0; 
    while(count < 2) { 
     RequestHandler handler = new RequestHandler(); 
     serverConnection.acceptAndOpen(handler); 
     System.out.println("Received OBEX connection " + (++count)); 
    } 
} 

private static class RequestHandler extends ServerRequestHandler { 

    public int onPut(Operation op) { 
     try { 
      HeaderSet hs = op.getReceivedHeaders(); 
      String name = (String) hs.getHeader(HeaderSet.NAME); 
      if (name != null) { 
       System.out.println("put name:" + name); 
      } 

      return ResponseCodes.OBEX_HTTP_OK; 
     } catch (IOException e) { 
      e.printStackTrace(); 
      return ResponseCodes.OBEX_HTTP_UNAVAILABLE; 
     } 
    } 
} 
} 

應用:

public class BTTestActivity extends Activity { 

String dStarted = BluetoothAdapter.ACTION_DISCOVERY_STARTED; 
String dFinished = BluetoothAdapter.ACTION_DISCOVERY_FINISHED; 
BluetoothAdapter bluetooth = BluetoothAdapter.getDefaultAdapter(); 
static final String serverUUID = "11111111111111111111111111111123"; 

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    BroadcastReceiver discoveryResult = new BroadcastReceiver() 
    { 
     public void onReceive(Context context, Intent intent) 
     { 
      String remoteDeviceName = intent.getStringExtra(BluetoothDevice.EXTRA_NAME); 
      BluetoothDevice remoteDevice; 

      remoteDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); 

      Log.i("@#$%^&*(*&^%$#@#$%^&*(", "WYSWIETLAM"); 
      Toast.makeText(getApplicationContext(), "Discovered: " + remoteDeviceName + " address " + remoteDevice.getAddress(), Toast.LENGTH_SHORT).show(); 

      try{ 
       BluetoothDevice device = bluetooth.getRemoteDevice(remoteDevice.getAddress()); 
       BluetoothSocket clientSocket = device.createRfcommSocketToServiceRecord(UUID.fromString(serverUUID)); 
       clientSocket.connect(); 

      } catch (IOException e) { 
       Log.d("BLUETOOTH", e.getMessage()); 
      } 
     } 
    }; 

    registerReceiver(discoveryResult, new IntentFilter(BluetoothDevice.ACTION_FOUND)); 
} 

public void fun(View view) 
{ 
    bluetooth.enable(); 

    if (!bluetooth.isDiscovering()) 
     bluetooth.startDiscovery(); 
} 

}

我的問題是,當我嘗試連接到從應用服務我得到這樣的事情:

11-26 13:41:04.959: E/AndroidRuntime(8830): FATAL EXCEPTION: main 
11-26 13:41:04.959: E/AndroidRuntime(8830): java.lang.RuntimeException: Error receiving broadcast Intent { act=android.bluetooth.device.action.FOUND (has extras) } in [email protected] 
11-26 13:41:04.959: E/AndroidRuntime(8830):  at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:722) 
11-26 13:41:04.959: E/AndroidRuntime(8830):  at android.os.Handler.handleCallback(Handler.java:587) 
11-26 13:41:04.959: E/AndroidRuntime(8830):  at android.os.Handler.dispatchMessage(Handler.java:92) 
11-26 13:41:04.959: E/AndroidRuntime(8830):  at android.os.Looper.loop(Looper.java:130) 
11-26 13:41:04.959: E/AndroidRuntime(8830):  at android.app.ActivityThread.main(ActivityThread.java:3835) 
11-26 13:41:04.959: E/AndroidRuntime(8830):  at java.lang.reflect.Method.invokeNative(Native Method) 
11-26 13:41:04.959: E/AndroidRuntime(8830):  at java.lang.reflect.Method.invoke(Method.java:507) 
11-26 13:41:04.959: E/AndroidRuntime(8830):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:847) 
11-26 13:41:04.959: E/AndroidRuntime(8830):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:605) 
11-26 13:41:04.959: E/AndroidRuntime(8830):  at dalvik.system.NativeStart.main(Native Method) 
11-26 13:41:04.959: E/AndroidRuntime(8830): Caused by: java.lang.IllegalArgumentException: Invalid UUID: 11111111111111111111111111111133 
11-26 13:41:04.959: E/AndroidRuntime(8830):  at java.util.UUID.fromString(UUID.java:226) 
11-26 13:41:04.959: E/AndroidRuntime(8830):  at andr.andr.BTTestActivity$1.onReceive(BTTestActivity.java:44) 
11-26 13:41:04.959: E/AndroidRuntime(8830):  at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:709) 
11-26 13:41:04.959: E/AndroidRuntime(8830):  ... 9 more 

有人知道這段代碼有什麼問題嗎?謝謝你的幫助。

編輯:

我會運行這個例子告訴你,我和我運行它,但它不是工作:(我有問題wyth服務器什麼他是「的StreamConnection的StreamConnection = connectionNotifier.acceptAndOpen停止() ;」在啓動方法線和野兔日誌從您的Android應用:

11-26 16:08:32.569: D/MyActivity(2725): ON CREATE 
11-26 16:08:32.569: D/MyActivity(2725): ON START 
11-26 16:08:32.569: D/MyActivity(2725): INSIDE WHILE STATE ON 
11-26 16:08:32.589: D/MyActivity(2725): Start discovery = true 
11-26 16:08:32.589: D/MyActivity(2725): INSIDE WHILE IS DISCOVERING 
11-26 16:08:32.589: D/MyActivity(2725): INSIDE WHILE IS DISCOVERING 
11-26 16:08:32.589: D/MyActivity(2725): INSIDE WHILE IS DISCOVERING 
11-26 16:08:32.589: D/MyActivity(2725): INSIDE WHILE IS DISCOVERING 
11-26 16:08:32.589: D/MyActivity(2725): INSIDE WHILE IS DISCOVERING 
11-26 16:08:32.589: D/MyActivity(2725): INSIDE WHILE IS DISCOVERING 
11-26 16:08:32.589: D/MyActivity(2725): INSIDE WHILE IS DISCOVERING 
11-26 16:08:32.619: D/MyActivity(2725): about to connect 
11-26 16:18:18.529: D/MyActivity(3166): Connected! 

,當我點擊按鈕,我得到的日誌

11-26 16:19:02.389: D/MyActivity(3166): In listener button. 

在你的應用程序代碼中,我改變藍牙地址到筆記本電腦上的藍牙設備。你知道什麼是錯的,也許我需要用你的代碼做別的事情?我有一個問題。你在哪裏的應用程序代碼你設置服務器的UUID?

我注意到,即使我不運行服務器,來自你的應用程序的日誌也是一樣的。它看起來像應用程序看到我的筆記本電腦上只有藍牙適配器,並沒有看到我的筆記本電腦上運行的服務器應用程序。

順便說一句。我使用BlueSoleil 6.4.149.0作爲藍牙堆棧,我的「東芝for windows」堆棧不適用於bluecove。也許這是問題?

回答

2

嘗試尋找我的答案是:Why am I losing bluetooth client/server connection?

調用createRfcommSocket時,你應該嘗試使用反射:

Method m = bt.getClass().getMethod("createRfcommSocket", new Class[] {int.class}); 

我已經做了服務器/客戶端的藍牙連接,以及它爲我工作。我有類似的問題,使用反射時結果很好。

+0

我在文章中做了一些修改,你能看看這個嗎? – klemens