關于: 安卓能否與iphone通過藍牙4.0(BLE)通訊?
安卓手機與iphone能通過藍牙4.0進行連接嗎? 不是說都開放了各自的藍牙API么?
iphone給安卓發數據, 在安卓上可以發現iphone的服務(Service)和特征(Characteristics), 但是connect了幾秒鐘, 后面又斷開了, 感覺有些不穩定啊
===============================================================
結論是:
截止到Android4.4.2,通過BLE(藍牙4.0), 安卓手機和iphone之間, ,無法進行數據的傳輸.
其實理論上是可以, 并且在Google的官方文檔上也說可以, 但是實際上是不行的, 當時看了官方的文檔說可以, 覺得沒問題, 結果鉆研了2個星期發現壓根不行, 真是浪費了不少的時間, 希望后來的朋友看到后能夠懸崖勒馬啊, 如果有一天可以實現互通了,還請各位朋友第一時間站內信告訴我哈 (我平常事情也不少, 并不只研究藍牙這一塊)
重要補充:
根據最新的消息:
Android L(也就是Android 5.0)上, 可以讓安卓設備做為外設(Peripheral)?了, 據說能夠實現iOS與Android的互通了(本人沒親測), 但Android5.0的普及, 估計還需要一段時間
===============================================================
原因:
Android4.3 規范了BLE的API,但是直到目前的4.4,還有些功能不完善。
在BLE協議標準中,有兩個角色,外圍設備(Periphery)和中心設備(Central);外設是數據提供者(發數據的), 比如可穿戴設備, 血糖儀, 手環, 等等有藍牙4.0的芯片的設備,中心設備是數據使用/處理者(收數據的);
在iOS SDK里面,可以把一個iOS設備作為一個外設(常用來模擬各種可穿戴設備),也可以作為一個中央;
但是在Android SDK里面,直到目前最新的Android4.4.2,Android手機只能作為中心設備來使用和處理數據;
So:
安卓(4.4.2)只能單向建立連接: 它只能作為中心設備收數據, 無法以Peripharal的身份發數據 (只能當大爺啊..).
在安卓發數據時: 它發出去的數據命令包, 無法被iOS設備讀懂
現象:
通過抓取安卓的HCI Log, 發現:
安卓設備發了一個以0x02開頭的連接請求包(L2CAP信號包), 而iOS設備回了一個以0x01開頭的拒絕命令包(并附帶原因: 指令錯誤 command not understood),
分析一下發現:
安卓通過 "L2CAP協議第5通道"(一個藍牙2.0的通訊通道) , 發送了一個請求連接的命令(以0x02開頭的那個包),
它之所以這么做, 是因為iOS設備發數據的時候 , 發出的數據包中, 有1 bit的標志位沒有發, 這樣肯定就會產生誤會, 少了這個標志位, 在安卓端就代表: 不支持BLE,僅支持BR/EDR(藍牙2.0)
SO:
結果就是: 安卓錯誤的去用BR/EDR的信號通道發數據, 這不用說, 肯定會讓連接崩掉的
最終解決方案:
等待新版iOS SDK的發布, 能在底層發數據的時候, 把那1bit的標志位補上
等待Android 新版SDK, 讓其能夠忽略那1bit的標志位, 不用傳統藍牙模式傳輸, 而直接用低功耗BLE傳輸
========================================The End===============================================
?吐個槽:
整了2個星期, 得出的結論就是iphone手機和android手機, 無法進行藍牙通訊, 找出了android底層的和iOS底層的小bug, 額, 感覺是給Google和蘋果干活的, 而且一分錢還都沒有.... 能不能不要這么苦逼啊..囧....