先說我的應(yīng)用場景,android手機(jī)跟一塊帶有藍(lán)牙模塊的板子通信。為了節(jié)省成本那塊板子的藍(lán)牙模塊是2.0的,而現(xiàn)在大多數(shù)手機(jī)帶的藍(lán)牙都是4.0 以上的。所以我的應(yīng)用應(yīng)該是藍(lán)牙4.0以上與藍(lán)牙2.0的通信。
在此說明一下藍(lán)牙4.0 與2.0 之間通信是ok的,藍(lán)牙的開放性、兼容性都很強(qiáng)的,只是傳輸速率是按2.0的。還有藍(lán)牙傳輸?shù)氖亲止?jié)流,每包最大能發(fā)20個字節(jié),所以在定傳輸協(xié)議的時候一定要考慮進(jìn)去,我們的協(xié)議定義我會在下面詳細(xì)說明下。
參考項(xiàng)目地址:點(diǎn)我吧,親測可用
項(xiàng)目結(jié)構(gòu)

主要類說明:
MyApplication:打開藍(lán)牙
BleRotocoUtils:是我們自己定義的協(xié)議類
BlueToothManager:藍(lán)牙管理類(主要是:初始化,搜索設(shè)備,設(shè)備連接,發(fā)送數(shù)據(jù),接收數(shù)據(jù),關(guān)閉等功能)
MyBlueTooth2: 藍(lán)牙2.0管理類(上述參考項(xiàng)目里有源碼)
MyBlueTooth4:藍(lán)牙4.0管理類(上述參考項(xiàng)目里有源碼)
BluetoothConnectActivityReceiver: 監(jiān)聽藍(lán)牙配對的消息(兩個設(shè)備連接時,如果沒有配對,系統(tǒng)會彈出一個配對彈框,密碼默認(rèn)1234,只有配對成功才能連接通信)
藍(lán)牙通信協(xié)議定義:

命令碼:(以啟停功能為例,其他功能道理一樣,按自己需求定就ok)

異或校驗(yàn):(一個字節(jié))?
/**
*? datas 需要校驗(yàn)的字符數(shù)組
**/
public static byte getXor(byte[] datas){
? ? ?bytetemp=datas[0];
? ? ?for(int i =1; i < datas.length;i++){
? ? ? ? ?temp?^=datas[i];
? ? ?}
return temp;
}
代碼奉上,請笑納。注:i是從1開始的 因?yàn)閰f(xié)議定的是 起始碼 不參與校驗(yàn)?。?!
介紹完幀定義格式,接下來 就是按協(xié)議codding了
/**
*? 發(fā)送“啟動指令”:
**/
public static byte[] device2Start(){
byte[] date = new byte[5];
date[0] = (byte)0xFF;? //起始碼
date[1] = (byte)0x04;? ?//長度
date[2] = (byte)0x02;? ?// 命令
date[3] = (byte)0x01;? ?//命令字
date[4] = getXor(date);? //異或校驗(yàn)
return date;
}
返回的是字節(jié)數(shù)組 ,直接調(diào)用 sendMessage(btye[] msg) 就可以發(fā)動命令了。
接收數(shù)據(jù)同理:接收的也是字節(jié)數(shù)組,獲取到數(shù)據(jù)格式也是協(xié)議上的這個格式,直接按數(shù)組下標(biāo)取值就行。
項(xiàng)目過程中還有一點(diǎn)需要注意:
藍(lán)牙使用權(quán)限問題:
android 6.0 以下的手機(jī)只需要以下兩個權(quán)限即可

android6.0 以上的手機(jī) 用藍(lán)牙權(quán)限的話,需要打開定位權(quán)限。定位權(quán)限是啟動權(quán)限

啟動權(quán)限需要每次打開應(yīng)用請求用戶打開。
我的開發(fā)工具是Androidstudio,安裝了permissiondispatcher插件,使用很方便。
另外,我還添加了下面這個權(quán)限

required 為 true時,應(yīng)用只能在支持BLE的adroid設(shè)備是安裝運(yùn)行。
required 為 false時,android設(shè)備均能安裝,這時需要代碼運(yùn)行時判斷設(shè)備支持BLE。
至此結(jié)束,祝各位順利....