[英]connecting to host on a specific port with bluetooth socket on Android
[英]Connecting to a specific bluetooth port on a bluetooth device using Android
有沒有辦法讓Android使用特定端口而不是使用服務UUID連接到藍牙設備? 我知道這個選項在其他提供藍牙支持的平台上可用(例如,通過指定“btspp://”樣式URL,Java ME)。
謝謝!
好吧,已經有一段時間了,但我找到了問題的解決方案。 我實際上打算放棄並使用UUID,但我一直收到服務發現失敗(IO)異常,當我試圖找到服務發現問題的解決方案時,我找到了原始問題的解決方案...... Ain'生活中的東西?:)
無論如何, 這是我偶然發現的鏈接 ,但你應該注意到答案中有一個錯誤(它們實際上只是連接到端口1,而不是使用服務UUID)。
在這個短暫的歷史課后,這是解決方案:
使用反射,可以創建連接到端口號而不是UUID的Rfcomm套接字:
int bt_port_to_connect = 5; // just an example, could be any port number you wish
BluetoothDevice device = ... ; // get the bluetooth device (e.g., using bt discovery)
BluetoothSocket deviceSocket = null;
...
// IMPORTANT: we create a reference to the 'createInsecureRfcommSocket' method
// and not(!) to the 'createInsecureRfcommSocketToServiceRecord' (which is what the
// android SDK documentation publishes
Method m = device.getClass().getMethod("createInsecureRfcommSocket", new Class[] {int.class});
deviceSocket = (BluetoothSocket) m.invoke(device,bt_port_to_connect);
有幾點需要注意:
祝你們好運。
藍牙Android連接僅通過UUID完成。 每個藍牙設備都為其運行的每項服務都有一個UUID(參見藍牙SDP)。
你只需要給Android注意UUID,在客戶端模式下,它會找到一個自動連接的套接字(包括端口)。 在服務器模式下,它將等待指定的設備使用指定的UUID啟動連接。 建立連接時,BluetoothSocket對象也有效(使用getInput / Output Stream)請參閱Server Socket文檔和Client Socket文檔 。
如果你真的想檢查所有內容,你可以看到Android從其他設備的SDP和你提供的UUID解碼。
使用本教程獲取藍牙接口(非常容易)。 那么代碼看起來應該是這樣的:
IBluetooth ib =getIBluetooth();
Int otherDevicePort = ib.getRemoteServiceChannel(otherDeviceAddress, UUID);
我正在使用bluecove ,它允許我使用Connector.open()
函數這樣做。
我使用以下網址: btspp://" + phoneID + ":" + phonePort
Nb:可以添加一些選項(例如: authenticate=false;
或encrypt=false;
)。
phoneID
是藍牙地址, phonePort
是端口號。
如何找到藍牙地址? 從這個鏈接 :
- 在主屏幕中,打開應用程序抽屜,然后打開“設置”。
- 選擇“系統”。 (在某些型號上略過這一步)
- 向下滾動到底部,然后點按“關於手機”,“關於設備”或“關於平板電腦”。
- 向下滾動到底部,然后點擊“狀態”。
- 向下滾動,“藍牙地址”將顯示在列表中。
如何查找端口號? 我還沒有找到應該使用哪個端口...我使用了5並且它有效但我需要研究為什么如果我想要更換手機我需要知道我是否還需要更改港口。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.