2012-09-18 106 views
7

好吧,這裏是交易。我有兩個啓用藍牙的Galaxy Nexus手機。Android藍牙IOException:連接被拒絕

我寫了一個藍牙連接管理應用程序,用於設備發現和連接。它還輸出設備可支持的所有可用UUID。

http://www.bluetooth.org/Technical/AssignedNumbers/service_discovery.htm查看以下標準UUID是從Galaxy Nexus設備公開的。

  • 0x1116 - NAP
  • 0x112f - PBAP(電話簿連接配置文件)
  • 0x111F的 - HFP(免提)
  • 0x1105 - OPP(對象推送模式)
  • 0x1112 - HSP(耳機模式)
  • 0x110c - AVRCP
  • 0x110a - A2DP

我正嘗試通過OPP配置文件(UUID 00001105-0000-1000-8000-00805F9B34FB)連接並在設備之間推送對象(文件)。我已經去了整個Android API documentation如何發現,配對/綁定(線程等)和管理所有的藍牙連接。我設法通過SPP(0x1101)配置文件成功連接並與傳統主板設備通話。

但是,當我嘗試在兩個星系聯網電話之間使用socket.connect()時,配對對話框出現,並且我在兩個設備上單擊了Pair按鈕。之後,我立即得到一個Connection Refused IOException。請注意,在配對發生後,一旦我再也不會再問到問題,因爲安全鏈接已被緩存。

如果我無法使用這些標準UUID連接到這些標準配置文件,爲什麼它們暴露?如何從我的應用程序連接到這些配置文件中的任何一個並與它們交互?是否因爲我的應用程序不是某種可信的?奇怪的是,即使Android上的Share功能也根本不起作用。這是Android上完全破壞的東西嗎?

請避免給我暗示使用「衆所周知的UUID SPP一個0x1101」像文檔說。這不是我想要的。我對這些東西的工作原理有了很好的理解,並且正在尋找真正的解決方案或問題的解釋。

我見過典型的「反射」解決方案,但我不明白爲什麼這仍然是Android上的問題?爲什麼人們使用反思來完成這項工作?我們可以在Android上提交一個錯誤來解決這個問題嗎?

如果這些UUID是標準的,那麼任何應用程序都應該能夠連接並與它們交互。爲什麼這是一個問題,爲什麼我會得到這個異常?

在此先感謝。

UPDATE

所以,出於某種原因,在Android系統中的對象推送開始工作。我實際上試圖通過我的應用程序連接,它不工作。然後,我去了通訊錄應用程序,並試圖分享一個神奇的聯繫人。然後,我回到我的應用程序,現在它的工作原理...哇。這很奇怪,必須有解釋。

+0

你設置了正確的權限? http://developer.android.com/guide/topics/connectivity/bluetooth.html#Permissions – Lars

+0

@Lars當然,他做到了。 dnkoutso:你究竟打開了什麼插口?你可以嘗試重新配對,那就是 - 不配對然後再配對。順便說一句,它是2層? – nullpotent

+0

@iccthedral,你是什麼意思2層?我經常進入兩臺設備上的真實設置應用並刪除配對。一旦我再次調用'socket.connect()',它會提示我配對對話框和填入的密鑰號碼。不幸的是,在我得到「Connection Refused」IOException後。 – dnkoutso

回答

2

您是否嘗試過使用非標準配置文件?即只爲您的應用定製UUID。這也將幫助您瞭解您的(最有可能)只連接到您自己的應用程序,而不是其他一些使用相同配置文件註冊的應用程序。

從我的經驗來看,藍牙配對對於第一對嘗試來說是非常麻煩的。但是,使用自定義UUID有助於這一點。

反射方法(我認爲),本來是修復bug與特定設備的嘗試,但我覺得有些人發現在使用它在其他地方,以及成功。該設備被稱爲Spica或類似的東西。

作爲其中一條評論也張貼,我也會嘗試失敗後再次連接。

基本上寫計劃失敗的第一次嘗試的代碼,但隨後的代碼嘗試,如果有一個未能在5秒內重新連接。

這些都是不完美的解決方案,但Android上的藍牙實現也不完美(恕我直言)。希望基於問題的更新和評論,幫助

編輯

我同意的東西絕對是越野車。我認爲部分問題是BT驅動程序各不相同,而且每個BT堆棧都有不同的怪癖。我還發現使用反射方法和自定義UUID以及其他標準方法的問題。這對我來說似乎極端,但確實涵蓋了最多的內容。不幸的是,作爲應用程序開發人員,我們無法控制低級堆棧/代碼/驅動程序。

我發現與我的兩個藍牙共享應用程序第一次配對總是棘手

我很高興知道這不只是我。

+1

我設法與自己的自定義UUID建立連接。我只是不明白這些公共藍牙標準UUID是如何工作的。他們也沒有在Android上正常的「共享」系統上工作,這也暗示Android代碼中有些bug。 – dnkoutso

+0

我同意的東西肯定是越野車。我認爲部分問題是BT驅動程序各不相同,而且每個BT堆棧都有不同的怪癖。我還發現一個使用反射方法和自定義以及其他標準方法的問題。這對我來說似乎極端,但確實涵蓋了最多的內容。不幸的是,作爲應用程序開發人員,我們無法控制低級堆棧/代碼/驅動程序。 – pjco

4

我遇到了同樣的問題,並設法找到了適合我的解決方案。

在我來說,我用三種不同的測試設備(Nexus 5上,銀河S4,注2),由於某種原因,該注2將無法連接到我的藍牙模塊,但另外兩個會。

我發現的理由是,藍牙驅動程序有所不同,需要稍微不同的連接方法來創建不同設備之間的連接。

這三種方法我用被稱爲「安全的」,「不安全」和「反射法」 /「HAX」。

  switch(connType) 
      { 
      case Secure: 
       tmpSocket = device.createRfcommSocketToServiceRecord(_uuid); 
       break; 

      case Insecure: 
       tmpSocket = device.createInsecureRfcommSocketToServiceRecord(_uuid); 
       break; 

      case Hax: 
       Method createSocket = device.getClass().getMethod("createRfcommSocket", new Class[] {int.class}); 
       tmpSocket = (BluetoothSocket)createSocket.invoke(device, Integer.valueOf(1)); 
       break; 
      } 

在我的情況下,安全模式下工作爲Nexus 5都和Galaxy S4但它沒有爲注2

工作,經過一些測試,我發現了注2只能用'不安全「模式,所以爲了迎合這一點,我基本上嘗試連接並在必要時循環通過不同的模式。當嘗試不同的連接模式時,我只需提示'重試連接'。所以,如果連接失敗使用安全,那麼我會嘗試使用不安全,然後使用反射方法。

我還沒有遇到這三種方法之一沒有奏效的情況。