談談幾個月以來開發android藍牙4.0 BLE低功耗應用的感受


 
談談幾個月以來開發android藍牙4.0 BLE低功耗應用的感受,注明下時間: 2012-10-17寫的博客,后期更新的也注明了時間的。
注:現在(2016-05-21)android ble 很好調試,sdk都已經統一了,關鍵API依然沒那么好理解,需要一定閱讀文檔的能力。
--------------------------------------------
開始對藍牙4.0的各種特性和各種應用場景的美好描繪充滿了向往,但願望很美好,現實很骨干。
在這幾個月中遭遇了很多挫折和痛苦的折磨,相當的難熬,android2.3的沒有ble的API,android4.0系統有個HDP的API,把新買的XT910刷了系統到4.0以后仍然連接不上,后來想刷回去都刷不了,手機就此廢了,只能自己掏錢重新買一個xt910。搜索到博通的開源SDK但需要手機add-on功能的,根本就沒法用,經過多方多次搜索才找到摩托羅拉的SDK開發包,折騰了一個多月才第一次連接上藍牙4.0的設備,但開發包的例子程序是個雞筋,有很多問題很多地方需要優化處理才能使用,又整了一個多月才最終做出了一個勉強可以使用的防丟器簡單應用產品。
雖然現在開發出了幾個應用,但藍牙4.0不穩定,單片機硬件不穩定,手機底層API不穩定,尤其是android上目前只能在摩托羅拉刀鋒系列2.3版本上才能使用,升級到4.0都不能使用,摩托羅拉本身銷量就不大,前幾個月有進行了大裁員想獲得大的市場份額更加渺茫了,特別是在中國市場份額只會越來越小,逐漸給人們淡忘,甚至再次給出售消失這個品牌,所以老板都不願意再投入開發了,只能坐等三星成熟的開發包出來再做了。
 
目前有藍牙4.0功能的手機就只有幾款,摩托羅拉的刀鋒系列、HTC1x和三星GS3,HTC1x和三星GS3雖然有藍牙4.0的硬件設備但遲遲沒有成熟相關SDK可以進行開發,開源的博通BLE SDK開發出來的沒有手機可以使用。
目前市場上銷量最好的android藍牙4.0的就是三星GS3,但系統本身的藍牙功能連搜索BLE的設備都搜索不到,更別說連接使用了,持續關注了幾個月也只有些零散的資料有些牛人整出了些framework但需要root的用戶才能使用,跟蘋果需要越獄一樣,買GS3這種手機的人除了開發人員估計很多都不會root的,因為一root就失去了保修服務。
最近有看到了些希望,有人用三星的開發包弄出可以搜索到所有藍牙設備的應用了,但沒有真機測試還不能確定是否可以使用。

 

話說iPhone的版本也只有iPhone4S以上的手機才可以使用,但ios5升級到ios6系統后也是有驗證bug的,導致手機app無法下發指令數據到藍牙設備,所以需要交互的BLE應用都沒法使用,iPhone5默認的系統是ios6應該也是用不了的,而且功耗比ios5的大很多,也只能坐等蘋果升級系統,不過蘋果由於閉源和開發投入比較大升級日期應該不會太久,應該等幾個月就可以解決了。(后注:不出所料很快就出ios6.0.1版本解決了wifi連接等問題了,同時出ios6.1bate版本)

 

android的就蛋痛了,各個廠商的都定制成不一樣的,各個系統版本上也有差異,兼容性很難保證,屏幕大小也差別非常大,開發廣泛使用的應用在兼容性上就浪費了很多精力,而需要根據各個廠商提供的不同sdk開發的應用就只能適應某一類手機了,不同廠商的基本上都不兼容得重新開發了。

另外iPhone手機的藍牙是不能夠和android手機的藍牙通信的,而且iPhone除了藍牙4.0以外其他版本的藍牙外設需要通過蘋果的認證才能使用的,除非大廠商大批量生產否則不可能通過認證的,當然也可以再加一個認證芯片上去解決。所以很多小公司,解決方案的公司做iPhone的應用只能做藍牙4.0的,android的則沒有這個限制。

 

 另外當初就搜索到健康類的應用有人做出產品的 但不是基於藍牙4.0低功耗的 還是用藍牙2.1的spp協議來做的,藍牙2.1或者3.0的耗電是個比較大的問題,一些小外設,需要用紐扣電池的應用就無法真正使用,對一些創意產品如果需要經常換電池或充電對用戶體驗都會大打折扣,成本也會大大提高。

 相對wifi和zigbee無線方案,藍牙和無線射頻模塊nRF24l01成本會低很多,wifi的好處是可以比較方便實現遠程控制,距離比較遠,信號也相對比較穩定。

 

補充內容:

經過不斷努力終於可以讓三星的支持BLE了,HTC1X,moto這幾個主流藍牙4.0的android都可以開發了,但估計以后只會先開發三星銷量大的了,不同廠商底層差別太大了。

另外ios6.0可以把iPhone手機當從設備了,可以兩台iPhone通過藍牙通信傳數據了,有點類似spp協議,但android的藍牙4.0的沒有看到相關的api。

現在LG出的google nexus 4 也支持ble藍牙4.0了,但目前也沒有對應的api和sdk ,小米2也支持BLE 藍牙4.0了,由於小米的rom是開源的研究起來估計輕松點,只是用戶量太小的話就沒必要花精力專門搞了。

 ble的發展變化比較快,之前收藏的很多網址現在都訪問不了了,更新或者作廢了

-------------------------------------------------------------------------

補充內容2:

http://processors.wiki.ti.com/index.php/Category:BluetoothLE
這個是TI的wiki上的文章,上面有moto和HTC的例子程序的,但支持不全面,之前的描述是
MotoRAZRAndroidBLEDemo Obsolete. Updated Motorola BLE SDK with new API is not compatible.
HTC1X BLE API - Complete BLE API for HTC1X (European version only!) NEW!

現在有變成下面的了
MotoRAZRAndroidBLEDemo Obsolete. Updated Motorola BLE SDK with new API is not compatible.
HTC1X BLE API - Complete BLE API for HTC1X (European version only!) Obsolete. Updated Android SDK is not 100% compatible.

三星4.0.4可以搜索到ble設備,但連接有問題,需要升級到android4.1.1以后才行

 nordic 發布了兩個版本的nRF的app在google play上的(心率計和防丟器在一個應用里),一個摩托羅拉的,一個三星gs3的,可以下載了反編譯參考下。

請不要問我怎么下載apk、怎么反編譯和怎么用這個的,直接下載連接不是nordic的產品不一定能成功,我自己的xt910和gs3手機連接自己公司開發的csr1000做的藍牙4.0的產品就都沒成功過,聽說TI的可以直接連接上,但也讀不到數據。

但由於他沒有混淆,寫法還是值得參考的。給出Samsung Galaxy S3 and Samsung Note 2 app的連接地址:

https://play.google.com/store/apps/details?id=com.nordic.nordicbleapp&feature=search_result#?t=W251bGwsMSwyLDEsImNvbS5ub3JkaWMubm9yZGljYmxlYXBwIl0.

The nRF Utility App is a tool to demonstrate Bluetooth Smart connection to Samsung Galaxy S3. The App enables you to connect to different Bluetooth Smart accessories such as wireless heart rate monitors and proximity tags. This app complements Nordic Semiconductor’s nRF8000 and nRF518 Series Bluetooth® Smart solutions, compatible with Bluetooth v4.0.

Bluetooth® Smart support for:
- Heart rate monitor
- Proximity tag

Note:
Samsung Galaxy S3 and Samsung Note 2 are currently supported handsets.
Miminum Supported Android Version is Jelly Bean

摩托羅拉現在能訪問的心率計sdk網址:

http://www.motorola.com/sites/motodev/library/bluetooth_apis.html

------------------------------------------------------------------------------

Open Bluetooth Low Energy API
http://android-btle.github.com/framework/
這個是博通的開源的api 需要root權限才能用的,用戶需要像精簡版rom增加google maps的add-on那樣增加相關文件到手機系統里面后才能用,除了需要root外對用戶要求也比較高。

 最近發現三星 Galaxy S3 4.1.1底層ble api的問題也很多,藍牙硬件很不穩定,連接失敗后用系統設置里面關閉開啟藍牙都經常會導致手機重啟,用代碼延遲重啟藍牙幾乎都是導致手機重啟的,這種情況在連接異常后讓人措手無策,需要用各種延時處理來避免異常和手機重啟也導致了自動連接延時緩慢也很無奈,無法完全控制底層。摩托羅拉的雖然問題多但用TI的藍牙硬件倒還穩定些,可以用代碼重啟藍牙來解決各種異常,不過代碼量和代碼復雜度比三星的多了很多。

摩托羅拉的ble sdk支持設備非安全模式,gs3的不支持,非安全模式下無法bond也就無法連接了。

 ==========================

2013-01-17 補充

最近有不少人找我要代碼和開發,這里說明下,ble app的開發需要跟藍牙工程師配合才能進行的,每個芯片廠商的底層通信可能不一樣的,同樣芯片不同sdk版本的結果也是不一樣的,目前做解決方案比較多的是TI的芯片,我做的是csr的,還有些人用nordic的,或者博通等其他牌子的,ti能用的app換到csr做的設備不一定能用,同樣的防丟器可能每個公司做的藍牙模塊都不一樣的,最終使用可能只能匹配自己的藍牙模塊的產品。這里說明下本人時間精力有限,同時基於商業競爭的因素,不能免費提供demo代碼和技術支持。

 2013-02-01 補充

現在開發完成了幾個 三星 Galaxy S3 版本(需要升級到android4.1.1版本)的 BLE 應用了(防丟器、心率計、計步器、體重秤、智能手表、智能燈座),正常情況下使用沒有問題,但發現三星gs3手機在discoverCharacteristics后會卡住 導致手機假死狀態 不能做其他操作,盡管在連接的時候使用異步Service也一樣,使用了其他非藍牙的app也經常出現這種情況,感覺是手機底層系統的問題,完全沒有發揮出四核多線程的優勢。代碼異常自動重啟跟xt910一樣甚至更頻繁。

 2013-02-20 補充

三星終於開了一個ble的專欄出來了 不過很快就廢棄了 估計問題太多了不敢公布

http://developer.samsung.com/ble    

[Samsung BLE SDK] Samsung BLE SDK 2.0 beta

SAMSUNG Developers ble

在百度搜索 藍牙4.0 開發,安卓 藍牙4.0 開發,android 藍牙4.0開發 android ble 等關鍵字都可以搜索到這篇博客,也有很多人加入QQ群討論了。

2013-02-25 補充

最近和朋友交流了解到gs3升級到android4.1.2以后api和android4.1.1有些差別,比如斷開連接后不會自動連接幾次了。另外note2和gs3的底層也有些差別,有些bug不一樣,同樣很多問題,估計針對gs3開發的在note2上不能很好的運行,這個兼容性就相當讓人惱火了,ios的開發就文檔容易多了。

 2012-03-12補充

今天試了下gs3的用4.0.4的也可以連接收發數據 可以以4.1.1為基准開發兼容其他系統版本使用。

發現TI的很多人會彈出配對提示框,藍牙那邊設置為非安全連接的,這樣就沒辦法做到自動連接了,很多功能都不能實現了。我用CSR的沒有遇到過,ios上的不會彈出,ios和android的底層處理方式不一樣的。最近發現做ble的人越來越多了,有時間可能再整理一篇具體開發相關的文章出來。

2013-03-27 補充 上傳兩張三星ble api的圖片:

 

 

 2013-04-10 補充

最近測試發現NFC嚴重影響ble使用,試了幾次了100%有影響,而且重啟藍牙還會導致手機自動重啟

android的ble藍牙受限制太多了不能同時和wifi NFC一起使用,這個要在產品說明里面標注下,不然出問題用戶都不知道怎么回事

Bluetooth may conflict with WIFI and NFC.Advised to turn off WIFI and NFC.

======================================================

2013-04-23 補充

最近有人在群里說gatt協議總是沒理解到, 協議的建議還是多看官方文檔吧,這里簡單介紹下思路:
Gatt的分三層Services-->Characteristic-->Handle 都是用uuid標識的。 一個設備可以注冊多個Services,一個Services可以有多個Characteristic,一個Characteristic可以有多個Handle。
數據通信的時候要找到藍牙設備最終定義的Handle才行,三星和ios的底層封裝了Handle層,不用應用程序處理,只要獲取到對應Characteristic就可以了,moto的需要獲取到指定Handle后才能用。
 
再發幾個本人已經發布到google play上的app吧,喜歡折騰的可以反編譯看看
 
 
 
 
2013-04-25 補充

http://developer.samsung.com/ble
三星公布ble的api了,跟原來的類不同了
要升級系統到4.2才能用,估計很少人升級到4.2,升級到4.2后原來按反編譯api開發的估計也用不了了,兼容又是一個蛋痛的事情了

 ================================
2013-05-16 補充
Android將支持Bluetooth Smart Ready
http://www.beareyes.com.cn/html/2013/05/16/news/79112.shtml
在Google I/O開發者年會上,Google宣布未來幾個月內其Android操作系統將全面支持Bluetooth Smart Ready和 Bluetooth Smart設備。
  采用新版Android系統的移動電話和平板,只要搭載雙模藍牙芯片即屬於Bluetooth Smart Ready規格。Bluetooth Smart Ready是藍牙技術的進階標准,幾乎可與所有支持藍牙技術的電子產品兼容,包括鍵盤、耳機,以及超級省電的下一代Bluetooth Smart智能應用配件(Bluetooth Smart appcessory),如FitBit Flex智能腕帶及Pebble智能手表等。
2013-08-02補充
android4.3系統出來了,api統一了以后應該開發就沒那么蛋痛了,但現實是大部分手機都沒升級到4.3,都用不了,或許再過半年 一年就普及了,等不起的還得蛋痛開發4.2兼容版本了。
 安卓4.3以上版本已經完美支持BLE!
Android 4.3 (API Level 18) introduces built-in platform support for Bluetooth Low Energy in the central role and provides APIs that apps can use to discover devices, query for services, and read/write characteristics. In contrast to Classic Bluetooth, Bluetooth Low Energy (BLE) is designed to provide significantly lower power consumption. This allows Android apps to communicate with BLE devices that have low power requirements, such as proximity sensors, heart rate monitors, fitness devices, and so on.
 

If you want your app to initiate device discovery or manipulate Bluetooth settings, you must also declare theBLUETOOTH_ADMIN permission. Note: If you use the BLUETOOTH_ADMIN permission, then you must also have theBLUETOOTH permission.

Declare the Bluetooth permission(s) in your application manifest file. For example:

<uses-permissionandroid:name="android.permission.BLUETOOTH"/>
<uses-permissionandroid:name="android.permission.BLUETOOTH_ADMIN"/>

If you want to declare that your app is available to BLE-capable devices only, include the following in your app's manifest:

<uses-featureandroid:name="android.hardware.bluetooth_le"android:required="true"/>

However, if you want to make your app available to devices that don't support BLE, you should still include this element in your app's manifest, but set required="false". Then at run-time you can determine BLE availability by using PackageManager.hasSystemFeature():

// Use this check to determine whether BLE is supported on the device. Then
// you can selectively disable BLE-related features.
if(!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)){
   
Toast.makeText(this, R.string.ble_not_supported,Toast.LENGTH_SHORT).show();
    finish
();
}
 
2014-06-12補充

藍牙4.1出來了。藍牙4.1新技術全面解析:這次藍牙4.1玩了回大的—IOT(物聯網)。而為了實現這一點,迎合可穿戴和多設備連接,對通訊功能的改進(改善數據傳輸能力)成為4.1標准最重要的升級之一。聽說5.0還要全面組網。

看來當時(2012年)搞藍牙4.0可穿戴設備的真是搞得太早了,浪費時間精力啊!

注:現在(2016-05-21)android ble 很好調試,sdk都已經統一了,關鍵API依然沒那么好理解,需要一定閱讀文檔的能力。

 硬件+軟件就可以實現利潤翻2倍,現在國內成本高單硬件利潤不行了。

Android技術交流QQ群(253065556)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM