當前位置:首頁 » 安卓系統 » android藍牙通訊

android藍牙通訊

發布時間: 2023-02-07 08:52:57

1. android中藍牙2.0和4.0的區別是什麼

最主要的區別就是藍牙2.0的傳輸速度沒有藍牙4.0快。以下為藍牙各版本的說明。x0dx0ax0dx0a1.1 為最早期版本,傳輸率約在748~810kb/s,因是早期設計,容易受到同頻率之產品所干擾下影響通訊質量。x0dx0a藍牙1.2標准x0dx0a1.2 同樣是只有 748~810kb/s 的傳輸率,但在加上了(改善 Software)抗干擾跳頻功能。x0dx0a藍牙2.0標准x0dx0a2.0 是 1.2 的改良提升版,傳輸率約在 1.8M/s~2.1M/s,開始支持雙工模式——即一面作語音通訊,同時亦可以傳輸檔案/高質素圖片,2.0 版本當然也支持 Stereo 運作。x0dx0a應用最為廣泛的是Bluetooth 2.0+EDR標准,該標准在2004年已經推出,支持Bluetooth 2.0+EDR標準的產品也於2006年大量出現。x0dx0a雖然Bluetooth 2.0+EDR標准在技術上作了大量的改進,但從1.X標准延續下來的配置流程復雜和設備功耗較大的問題依然存在。x0dx0a藍牙2.1標准x0dx0a2007年8月2日,藍牙技術聯盟今天正式批准了藍牙2.1版規范,即「藍牙2.1+EDR」,可供未來的設備自由使用。和2.0版本同時代產品,目前仍然占據藍牙市場較大份額,相對2.0版本主要是提高了待機時間2倍以上,技術標准沒有根本性變化。x0dx0a藍牙3.0標准x0dx0a2009年4月21日,藍牙技術聯盟(Bluetooth SIG)正式頒布了新一代標准規范"Bluetooth Core Specification Version 3.0 High Speed"(藍牙核心規范3.0版 ),藍牙3.0的核心是"Generic Alternate MAC/PHY"(AMP),這是一種全新的交替射頻技術,允許藍牙協議棧針對任一任務動態地選擇正確射頻。x0dx0a藍牙3.0的數據傳輸率提高到了大約24Mbps(即可在需要的時候調用802.11 WI-FI用於實現高速數據傳輸)。在傳輸速度上,藍牙3.0是藍牙2.0的八倍,可以輕松用於錄像機至高清電視、PC至PMP、UMPC至列印機之間的資料傳輸,但是需要雙方都達到此標准才能實現功能。x0dx0a藍牙4.0標准x0dx0a藍牙4.0規范於2010年7月7日正式發布,新版本的最大意義在於低功耗,同時加強不同OEM廠商之間的設備兼容性,並且降低延遲,理論最高傳輸速度依然為24Mbps(即3MB/s),有效覆蓋范圍擴大到100米(之前的版本為10米)。該標准晶元被大量的手機、平板所採用,如蘋果The New iPad平板電腦,以及蘋果iPhone 5、魅族MX4、HTC One X等手機上帶有藍牙4.0功能。x0dx0a藍牙4.1標准x0dx0a藍牙4.1於2013年12月6日發布,與LTE無線電信號之間如果同時傳輸數據,那麼藍牙4.1可以自動協調兩者的傳輸信息,理論上可以減少 其它信號對藍牙4.1的干擾。改進是提升了連接速度並且更加智能化,比如減少了設備之間重新連接的時間,意味著用戶如果走出了藍牙4.1的信號范圍並且斷開連接的時間不算很長,當用戶再次回到信號范圍中之後設備將自動連接,反應時間要比藍牙4.0更短。最後一個改進之處是提高傳輸效率,如果用戶連接的設備 非常多,比如連接了多部可穿戴設備,彼此之間的信息都能即時發送到接接收設備上。x0dx0a除此之外,藍牙4.1也為開發人員增加了更多的靈活性,這個改變對普通用戶沒有很大影響,但是對於軟體開發者來說是很重要的,因為為了應對逐漸興起的可穿戴設備,那麼藍牙必須能夠支持同時連接多部設備。x0dx0a目前支持該標準的手機還比較少,三星GALAXY Note4則是其中具有代表性的一款。x0dx0a藍牙4.2標准x0dx0a2014年12月4日,最新的藍牙4.2標准頒布,改善了數據傳輸速度和隱私保護程度,並接入了該設備將可直接通過IPv6和6LoWPAN接入互聯網。在新的標准下藍牙信號想要連接或者追蹤用戶設備必須經過用戶許可,否則藍牙信號將無法連接和追蹤用戶設備。x0dx0a速度方面變得更加快速,兩部藍牙設備之間的數據傳輸速度提高了2.5倍,因為藍牙智能(Bluetooth Smart)數據包的容量提高,其可容納的數據量相當於此前的10倍左右。藍牙的版本自然是越高級越好,考慮到傳輸距離和功耗的問題,最新的藍牙4.1是優選,但是目前市場上藍牙4.1的產品並不多,而主流的藍牙4.0產品性價比更高,至於藍牙3.0、2.1及以下的版本已經失去選購的價值。

2. Android開發之藍牙(Bluetooth)

在上一篇中有介紹了Wifi與網路連接處理
Android開發之WiFi與網路連接處理
下面,來繼續說說Android中藍牙的基本使用。

Bluetooth是目前使用的最廣泛的無線通訊協議之一,主要針對短距離設備通訊(10米),常用於連接耳機、滑鼠和移動通訊設備等。

值得一提的是:
android4.2新增了部分新功能,但是對於Bluetooth熟悉的人或許開始頭疼了,那就是Android4.2引入了一個新的藍牙協議棧針BLE。谷歌和Broadcom之間的合作,開發新的藍牙協議棧,取代了基於堆棧的Bluez。因此市場上出現了老設備的兼容問題,很多藍牙設備在android4.2手機上不能正常使用。

BluetoothAdapter簡單點來說就是代表了本設備(手機、電腦等)的藍牙適配器對象。

first:we need permission
要操作藍牙,先要在AndroidManifest.xml里加入許可權

**下面來看看如何使用藍牙。 **↓↓↓****
Demo已就緒:

返回值:如果設備具備藍牙功能,返回BluetoothAdapter 實例;否則,返回null對象。

打開藍牙設備的方式:
1.直接調用函數enable()去打開藍牙設備 ;
2.系統API去打開藍牙設備,該方式會彈出一個對話框樣式的Activity供用戶選擇是否打開藍牙設備。

注意: 1.如果藍牙已經開啟,不會彈出該Activity界面。2.在目前大多數Android手機中,是不支持在飛行模式下開啟藍牙的。如果藍牙已經開啟,那麼藍牙的開關 ,狀態會隨著飛行模式的狀態而發生改變。

1. 搜索藍牙設備
使用BluetoothAdapter的startDiscovery()方法來搜索藍牙設備
startDiscovery()方法是一個非同步方法,調用後會立即返回。該方法會進行對其他藍牙設備的搜索,該過程會持續12秒。該方法調用後,搜索過程實際上是在一個System Service中進行的,所以可以調用cancelDiscovery()方法來停止搜索(該方法可以在未執行discovery請求時調用)。

系統開始搜索藍牙設備
^( *  ̄(oo) ̄ ) ^ 系統會發送以下三個廣播:

2.掃描設備

3.定義廣播接收器接收搜索結果

4.注冊廣播

獲取附近的藍牙設備

第一步建立連接:首先Android sdk(2.0以上版本)支持的藍牙連接是通過BluetoothSocket建立連接,服務端BluetoothServerSocket和客戶端(BluetoothSocket)需指定同樣的UUID,才能建立連接,因為建立連接的方法會阻塞線程,所以伺服器端和客戶端都應啟動新線程連接。

(這里的服務端和客戶端是相對來說的)
兩個藍牙設備之間的連接,則必須實現服務端與客戶端的機制。
當兩個設備在同一個RFCOMM channel下分別擁有一個連接的BluetoothSocket,這兩個設備才可以說是建立了連接。

服務端設備與客戶端設備獲取BluetoothSocket的途徑是不同的。
1,服務端設備是通過accepted一個incoming connection來獲取的,
2,客戶端設備則是通過打開一個到服務端的RFCOMM channel來獲取的。

服務端
通過調用BluetoothAdapter的(String, UUID)方法來獲取BluetoothServerSocket(UUID用於客戶端與服務端之間的配對)

客戶端
調用BluetoothService的(UUID)方法獲取BluetoothSocket(該UUID應該同於服務端的UUID)。
調用BluetoothSocket的connect()方法(該方法為block方法),如果UUID同服務端的UUID匹配,並且連接被服務端accept,則connect()方法返回。

數據傳遞,通過以上操作,就已經建立的BluetoothSocket連接了,數據傳遞無非是通過流的形式
獲取流

該類就是關於遠程藍牙設備的一個描述。通過它可以和本地藍牙設備---BluetoothAdapter連接通信。

好多東西我也不知道怎麼描述,下面給出Demo:
剛好有剛學習的小夥伴問我ListView怎麼用,那我就用ListView。

源碼
RairDemo
GitHub: https://github.com/Rairmmd/android-demo
Coding: https://coding.net/u/Rair/p/RairDemo/git

3. Android BLE藍牙連接異常處理

藍牙通信過程中異常很常見,大致有以下幾種:

1,連接

2,發現服務

3,讀寫

4,通知

連接失敗可能是設備端原因,也可能是手機端原因。不同的手機來自不同的廠家,用的不同的晶元和藍牙協議棧都會導致藍牙功能的表現不一致,這都會導致各式各樣的兼容性問題,可能有的手機連接成功率高,有的成功率低。設備端原因可能有些時候出現異常導致死機無響應,或某些參數設置得有問題。但對於Android應用層開發來說,能做的很有限,藍牙通信是在系統服務進程中處理的,我們無法跨進程改變系統的行為,如果是在一個進程我們還可能通過Hook等手段來調整其內在邏輯。另外應用層的介面只是將請求封裝傳遞給系統服務進程,並未做一些實質性的通信,所以應用層雖然是同一個進程的,但是Hook意義也不大。所以我們能做的僅僅是看怎樣調整介面的調用,使得整體穩定性更好一點而已。

連接失敗分兩種,一種是超時,一種是提前返回失敗。

關於超時,一般是設備不在周圍,或設備斷電未發廣播,或設備當前被其他人連接。系統默認超時為30s,通常返回133,我們也可以自己設置更短的超時時間,超時則closeGatt,然後重新連接。

關於提前返回失敗,一般是有明確的異常,可能是手機藍牙的異常或者設備異常。

這兩種情況建議closeGatt,延時500ms,然後重試。如果重試三次仍然失敗,則可以考慮提示用戶重啟手機藍牙,或者檢查設備是否正常工作。

還有一種情況,連接成功後沒過多久連接又斷開了,這有可能是設備主動斷開,連接成功後有的設備會等待鑒權,如果一定時間內手機端還未發起鑒權則設備端主動斷開。也可能連接信道不夠穩定導致斷開的,此時closeGatt並重新連接即可。

當連接斷開時,會收到onConnectionStateChanged回調,這個回調可能會有一定延時,甚至有5s以上。解決的辦法是輪詢,如每隔1s發起一次讀請求,如果連接斷了會立即返回失敗。

如果藍牙連接不穩定,可以考慮關掉WIFI,因為WIFI通常和藍牙共用一個天線。

有的手機上discoverService可能會回調不止一次onServiceDiscover,這個要注意防禦。

當連接建立後,可以由設備端發起更改連接間隔,這樣能加快後續發現服務以及數據讀寫的速度。有的手機discover service很慢,原因是connect interval太大了,有的手機會主動向設備發起更改connect interval,而有的手機卻不會。這樣的話connect interval相差就會很大,實踐中發現有的手機是7ms,有的手機是默認的50ms,所以發現service都要8s,甚至20s的都很尋常,這對用戶來說是無法忍受的。所以比較好的辦法是設備主動發起更改connect interval,而Android系統是沒有提供對應API的。

如果發現服務失敗,通常來說不用closeGatt,重試一下就好了。如果重試三次還失敗,建議清一下緩存,再closeGatt,重新連接。

讀寫失敗要看失敗的原因是什麼,如果是許可權問題,則需要和設備端確認是否開放了相應的讀寫許可權。也可能是要讀寫的character不存在,可能是設備端修改了固件,手機端需要刷新一下藍牙緩存,closeGatt再重新連接。如果是其它未知錯誤,則重試三次,仍然失敗則closeGatt。不過通常來說如果是因為連接出了問題導致讀寫失敗的,會收到onConnectionStateChanged回調,此時就不用再無謂的重試了,直接closeGatt,重新連接。

打開/關閉character的notify,必須等收到onDescriptorWrite回調之後才算結束,才能開始下一個任務。

如果打開notify失敗,則可以改成周期性輪詢的方式去查詢character的值。

可參考該文章

Android-BLE-Issues

4. android 怎麼通過藍牙向一個硬體發送AT指令

將16進制的字元串轉換成bytes,通過hexstring2bytes轉換,從而發送指令。

5. Android藍牙開發——實現藍牙聊天

與藍牙開發主要的相關類是以下四個

知道對應API後就可以進行對應的藍牙開發,這里以獲取藍牙設備為例子

}

搜索設備的回調則需要通過注冊廣播的形式來獲取

定義廣播

之後就可以進行個人的一些操作

要實現藍牙聊天則涉及到藍牙之間的傳輸通信,前面也說到了,這里肯定就是用到BluetoothServerSocket以及BluetoothSocket。

藍牙傳輸通信相當於伺服器端與客戶端之間的通信,只不過不同是這里每一個藍牙設備本身自己 既充當伺服器端也充當客戶端 ,大致的關系就是

注意,這些連接都是阻塞式的,都要放在線程里去執行。

可以看到,當BluetoothServerSocket監聽到有設備連接的時候,就會調用dataTransfer開啟一個數據傳輸。

需要一個ConnectThread來發起

之後建立連接之後就會調用dataTransfer來進行數據傳輸,同樣也需要一個線程來維護數據傳輸

藍牙聊天則是基於上面三個線程來進行實現,同樣,對於藍牙文件間的傳輸也是同個道理,通過輸入輸出流來進行處理。之後的操作就比較容易處理了

藍牙聊天

Android 藍牙開發基本流程

6. 如何使用android原生BLE藍牙進行操作

之前的涉及的物聯網項目中使用的: BLE 低功耗藍牙(藍牙4.0), 支持android 4.3以上的手機
主從關系: BLE低功耗藍牙只能做從端設備 ,一個藍牙主端設備,可同時與7個藍牙從端設備進行通訊

1)低功耗
低功耗的原理:
1低功耗藍牙僅使用了3個廣播通道,傳統藍牙技術採用 16~32 個頻道
2每次廣播開啟時間也由傳統的 22.5ms 減少到 0.6~1.2ms(毫秒)

2)傳輸距離極大提高
傳統藍牙傳輸距離為 2~10m,而藍牙4.0的有效傳輸距離可達到 60~100m

3)安全性
使用AES-128 CCM加密演算法進行數據包加密和認證。
更多BLE藍牙的解析參考博客 : BLE4.0教程一 藍牙協議連接過程與廣播分析

添加許可權
打開藍牙
1.先拿到BluetoothManager bluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
2.再拿到BluetoothAdapter bluetoothAdapter = bluetoothManager.getAdapter();
判斷是否打開藍牙
未打開彈出 系統彈框 ,除了 魅族手機 是打開系統設置

設備/手機都是藍牙信號

在回調方法中:

一般在掃描的過程中,我們還會設置 設備過濾原則 (因為我只想要搜索到我們想要的設備,忽略無關設備)
如:從 scanRecord -- beacon -- beacon.type == 0xFF代表Manufacture,通過與嵌入式軟體定義 自己的 Manufacture值即可

用BluetoothDevice得到BluetoothGatt:

斷連:

關鍵問題:連接後一般要做什麼事?

( 必須在剛連接成功後2秒內app寫一個值給設備,否則會被設備斷開連接)

主要是讀寫 characteristic
gatt.wirteCharacteristic(mCurrentcharacteristic);

gatt.readCharacteristic(characteristic);

bluetoothGatt.setCharacteristicNotification(data, true);

真實工作中使用的藍牙庫BlueToothKit請參考我的另一篇博客:
android藍牙入門知識和優秀藍牙第三方庫BluetoothKit的使用

7. Android藍牙協議-藍牙配對與連接

藍牙設備在連接前,會先檢查設備是否已經配對過,如果沒有則先配對,配對完成後,再開始連接。

藍牙連接開始於設備列表 DeviceListPreferenceFragment的onPreferenceTreeClick方法。
DeviceListPreferenceFragment是藍牙設備列表,點擊其中一個藍牙設備,開始藍牙的連接過程。

調用onDevicePreferenceClick方法,接著調用BluetoothDevicePreference的onClicked方法,開始連接,以及連接前的狀態檢測。

獲取mCachedDevice的綁定狀態,

pair方法會調用CachedBluetoothDevice.startPairing,啟動配對

createBond調用BluetoothDevice.createBond方法,BluetoothDevice.createBond接著調用IBluetooth.createBond方法,下面會調用藍牙遠程服務。
和藍牙掃描一樣,實現IBluetooth介面的類是AdapterServiceBinder,

AdapterServiceBinder實現IBluetooth.Stub介面,並且是AdapterService的私有內部類, AdapterServiceBinder接受事件,都會轉交AdapterService處理 ,所以IBluetooth.createBond方法會調用AdapterService.createBond方法。

createBond方法會檢查一下遠程設備屬性信息,再次取消藍牙掃描任務,將配對任務轉交mBondStateMachine,由狀態機處理該信息。
BondStateMachine狀態機的初始狀態是StableState,所以BondStateMachine.CREATE_BOND由StableState處理,StableState在processMessage中調用BondStateMachine.createBond方法

createBondNative方法實現com_android_bluetooth_btservice_AdapterService.cpp中

8. Android-藍牙傳輸

通過藍牙傳輸數據與Socket類似。在網路中使用Socket和ServerSocket控制客戶端和服務端的數據讀寫。而藍牙通訊也由客戶端和服務端Socket來完成。藍牙客戶端Socket是BluetoothSocket,藍牙服務端Socket是BluetoothServerSocket。這兩個類都在android.bluetooth包中。

如果打算建議兩個藍牙設備之間的連接,則必須實現伺服器端與客戶端的機制。當兩個設備在同一個RFCOMM channel下分別擁有一個連接的BluetoothSocket,這兩個設備才可以說是建立了連接。

伺服器設備與客戶端設備獲取BluetoothSocket的途徑是不同的。伺服器設備是通過accepted一個incoming connection來獲取的,而客戶端設備則是通過打開一個到伺服器的RFCOMMchannel來獲取的。

通過調用BluetoothAdapter的(String, UUID) 方法來獲取
BluetoothServerSocket(UUID用於客戶端與伺服器端之間的配對)調用BluetoothServerSocket的 accept() 方法監聽連接請求,如果收到請求,則返回一個BluetoothSocket實例。

如果不想在accept其他的連接,則調用BluetoothServerSocket的 close() 方法釋放資源(調用該方法後,之前獲得的BluetoothSocket實例並沒有close。但由於RFCOMM一個時刻只允許在一條channel中有一個連接,則一般在accept一個連接後,便close掉BluetoothServerSocket)

通過搜索得到伺服器端的BluetoothService,調用BluetoothService的(String, UUID)方法獲取BluetoothSocket(該UUID應該同於伺服器端的UUID)。

調用BluetoothSocket的 connect() 方法(該方法為block方法),如果UUID同伺服器端的UUID匹配,並且連接被伺服器端accept,則 connect() 方法返回。

9. android藍牙通訊Socket.connect()方法調用不成功。為什麼

UUID值出現錯誤。
看一下android有關bluetooth的API,用於普通藍牙適配器和android手機藍牙模塊連接的,而且這個UUID的值必須是00001101-0000-1000-8000-00805F9B34FB。
這個是android的API上面說明的.connect().在連接的時候,android手機作client(主動和電腦建立連接),如果電腦作為server(一直監聽是否有服務連接),則需要在手機端調用這樣一行代碼.兩邊的UUID必須是一樣的,這是一個服務的唯一標識。

10. Android藍牙開發(二)經典藍牙消息傳輸實現

上篇文章中,我們主要介紹了藍牙模塊,傳統/經典藍牙模塊BT和低功耗藍牙BLE及其相關的API,不熟悉的可以查看 Android藍牙開發(一)藍牙模塊及核心API 進行了解。

本篇主要記錄用到的經典藍牙開發流程及連接通訊。

藍牙連接前,給與相關系統許可權:

安卓6.0以上系統要動態請求及獲取開啟GPS內容:

藍牙核心對象獲取,若獲取對象為null則說明設備不支持藍牙:

判斷藍牙是否開啟,沒有則開啟:

藍牙掃描:

取消掃描:

藍牙監聽廣播,監聽藍牙開關,發現設備,掃描結束等狀態,定義狀態回調介面,進行對應操作,例如:監聽到藍牙開啟後,進行設備掃描;發現設備後進行連接等。

客戶端,與服務端建立長連接,進行通訊:

服務端監聽客戶端發起的連接,進行接收及通訊:

客戶端連接及服務端監聽基類,用於客戶端和服務端之前Socket消息通訊,進行消息或文件的發送、接收,進行通訊關閉操作等:

我這里只是簡單記錄了項目中用到的藍牙通訊,兩個設備之間不通過配對進行連接、通訊。
相關詳細內容及使用請查看Github項目: https://github.com/MickJson/BluetoothCS

藍牙配對操作及其它內容,可以詳細查看我下面的參考資料,寫的十分詳細,比如設備通過MAC地址,可以通過BluetoothAdapter獲取設備,再通過客戶端connect方法去進行連接等。

連接中遇到問題:read failed, socket might closed or timeout, read ret: -1。

通過改UUID,反射等方法都還是會出現錯誤。連接時,要確保服務端及客戶端都處於完全斷開狀態,否則連接就會出現以上問題,但偶爾還是會有問題,期待有什麼好的方法可留言告訴我。

參考資料:

Android-經典藍牙(BT)-建立長連接傳輸短消息和文件

Android藍牙開發—經典藍牙詳細開發流程

歡迎點贊/評論,你們的贊同和鼓勵是我寫作的最大動力!

熱點內容
內置存儲卡可以拆嗎 發布:2025-05-18 04:16:35 瀏覽:331
編譯原理課時設置 發布:2025-05-18 04:13:28 瀏覽:371
linux中進入ip地址伺服器 發布:2025-05-18 04:11:21 瀏覽:606
java用什麼軟體寫 發布:2025-05-18 03:56:19 瀏覽:27
linux配置vim編譯c 發布:2025-05-18 03:55:07 瀏覽:100
砸百鬼腳本 發布:2025-05-18 03:53:34 瀏覽:935
安卓手機如何拍視頻和蘋果一樣 發布:2025-05-18 03:40:47 瀏覽:729
為什麼安卓手機連不上蘋果7熱點 發布:2025-05-18 03:40:13 瀏覽:798
網卡訪問 發布:2025-05-18 03:35:04 瀏覽:506
接收和發送伺服器地址 發布:2025-05-18 03:33:48 瀏覽:367