藍牙的適用場景
可用于第三方藍牙設(shè)備交互劳闹,必須要支持藍牙 4.0。
iOS上:硬件至少是 iphone4s伤为,系統(tǒng)至少是 iOS6催首。
android上:系統(tǒng)版本至少是 android4.3。
藍牙 4.0 以低功耗著稱疫衩,一般也叫 BLE(BluetoothLowEnergy)硅蹦。目前應用比較多的案例:運動手壞、嵌入式設(shè)備闷煤、智能家居
藍牙通訊原理概述
在藍牙通訊中有兩個主要的部分,Central 和 Peripheral童芹,有一點類似Client Server。Peripheral 作為周邊設(shè)備是服務器鲤拿。Central 作為中心設(shè)備是客戶端假褪。所有可用的藍牙設(shè)備可以作為周邊(Peripheral)也可以作為中央(Central),但不可以同時既是周邊也是中央近顷。
一般手機是客戶端生音, 設(shè)備(比如手環(huán))是服務器,因為是手機去連接手環(huán)這個服務器窒升。周邊(Peripheral)是生成或者保存了數(shù)據(jù)的設(shè)備缀遍,中央(Central)是使用這些數(shù)據(jù)的設(shè)備。你可以認為周邊是一個廣播數(shù)據(jù)的設(shè)備饱须,他廣播到外部世界說他這兒有數(shù)據(jù)域醇,并且也說明了能提供的服務。另一邊蓉媳,中央開始掃描附近有沒有服務譬挚,如果中央發(fā)現(xiàn)了想要的服務,然后中央就會請求連接周邊酪呻,一旦連接建立成功减宣,兩個設(shè)備之間就開始交換傳輸數(shù)據(jù)了。
除了中央和周邊玩荠,我們還要考慮他倆交換的數(shù)據(jù)結(jié)構(gòu)漆腌。這些數(shù)據(jù)在服務中被結(jié)構(gòu)化,每個服務由不同的特征(Characteristics)組成阶冈,特征是包含一個單一邏輯值的屬性類型闷尿。
服務和特性
上文中提到了特征(Characteristics),這里簡單說明下什么是特征眼溶。
特征是與外界交互的最小單位悠砚。藍牙4.0設(shè)備通過服務(Service)、特征(Characteristics)和描述符(Descriptor)來形容自己堂飞,同一臺設(shè)備可能包含一個或多個服務灌旧,每個服務下面又包含若干個特征绑咱,每個特征下面有包含若干個描述符(Descriptor)。比如某臺藍牙4.0設(shè)備枢泰,用特征A來描述設(shè)備信息描融、用特征B和描述符b來收發(fā)數(shù)據(jù)等。而每個服務衡蚂、特征和描述符都是用 UUID 來區(qū)分和標識的窿克。
切割字符串
source ==> 字符串
count ==> 切割的位數(shù)
var func = (source, count) => {
var arr = [];
for (var i = 0, len = source.length / count; i < len; i++) {
var subStr = source.substr(0, count);
arr.push(subStr);
source = source.replace(subStr, "");
}
return arr;
}
16進制轉(zhuǎn)10進制
function change_ten(sixteen) {
var ten = '';
ten = parseInt(sixteen, 16);
return ten;
//使用字符串轉(zhuǎn)換為整數(shù)的方法實現(xiàn)進制轉(zhuǎn)換
}
16進制轉(zhuǎn)字符串
function HexToAscll(str) {
var hexA = '';
var pos = 0;
var len = str.length / 2;
for (var i = 0; i < len; i++) {
var s = str.substr(pos, 2);
hexA += String.fromCharCode(`0x${s}`);
pos += 2;
}
return hexA;
}
16進制轉(zhuǎn)bcd (js的移位運算也可以做到,沒有去專門學習毛甲,歡迎留言)
function changeBcd(num) {
var num_one = [];
var bcd_value = '';
var num_one = func(num, 1);
var corres_arrey = {
'0': '0000',
'1': '0001',
'2': '0010',
'3': '0011',
'4': '0100',
'5': '0101',
'6': '0110',
'7': '0111',
'8': '1000',
'9': '1001',
'A': '1010',
'B': '1011',
'C': '1100',
'D': '1101',
'E': '1110',
'F': '1111',
'a': '1010',
'b': '1011',
'c': '1100',
'd': '1101',
'e': '1110',
'f': '1111'
}
for (var i = 0; i < num_one.length; i++) {
var bits = corres_arrey[num_one[0]] + corres_arrey[num_one[i]]
}
return bits
}
接收藍牙數(shù)據(jù)IOS與Android呈現(xiàn)方式不同年叮,安卓可以直接使用,IOS需進一步處理玻募,去掉頭尾和括號
轉(zhuǎn)換接收的ios數(shù)據(jù)
function byte_ios(value){
var str1=value.substring(0,value.indexOf("0x"));
var str2=value.substring(str1.length+2,value.length-1);
return str2
}
校驗和 藍牙回傳的硬件數(shù)據(jù)去掉前三位 去掉最后一位求和 (根據(jù)硬件的需求來求和只损,不同的硬件開發(fā)規(guī)則不同)
function byte_Sum(arr) {
var sum = 0;
arr.splice(0, 3);
arr.splice(-1, 1);
arr.splice(-1, 1);
for (let i = 0; i < arr.length; i++) {
sum += Number('0x' + arr[i]);
}
if(((0xFF - (sum & 0xFF)) + 1).toString(16).length!=2){
return '0'+(0xFF&((0xFF - (sum & 0xFF)) + 1)).toString(16)
}else{
return (0xFF&((0xFF - (sum & 0xFF)) + 1)).toString(16);
}
}
小結(jié):此次低功耗藍牙ble開發(fā)使用APIcloud混合開發(fā),調(diào)用模塊方法時要按照一定順序
初始化藍牙4.0管理器 => initManager
搜索藍牙4.0設(shè)備七咧,模塊內(nèi)部會不斷的掃描更新附近的藍牙4.0設(shè)備信息 => scan
注: 參數(shù)(params):single 類型:布爾 true 為單例模式,false為非單例模式;默認為false; 描述:(可選項)則掃描附近的所有支持藍牙4.0的設(shè)備類型:parmas:布爾 true 為單例模式,false為非單例模式;默認為false; 非單例模式為僅在本頁面生效連接跃惫,單例模式為在連接成功后整個app全局生效
獲取當前掃描到的所有外圍設(shè)備信息 => getPeripheral
連接指定外圍設(shè)備。iOS端無超時判斷艾栋,android端默認有30秒超時判斷 => connect
根據(jù)指定的外圍設(shè)備 UUID 獲取該外圍設(shè)備的所有服務 => discoverService
根據(jù)指定的外圍設(shè)備 UUID 及其服務 UUID 獲取該外圍設(shè)備的所有特征(Characteristic)=> discoverCharacteristics
根據(jù)指定的外圍設(shè)備 UUID 及其服務 UUID 和特征 UUID 監(jiān)聽數(shù)據(jù)回發(fā) =>setNotify
根據(jù)指定的外圍設(shè)備 UUID 及其服務 UUID 和特征 UUID 寫數(shù)據(jù) => writeValueForCharacteristic
剩余方法根據(jù)需求酌情使用
此次開發(fā)需求 傳遞字節(jié)以及ASCII碼,apicloud中ble模塊僅僅滿足于傳遞字節(jié),并且初始低功耗藍牙僅僅滿足于傳遞20字節(jié)以下數(shù)據(jù),需設(shè)置MTU進行大數(shù)據(jù)傳輸,此次流控為藍牙的特征FF03監(jiān)聽來進行數(shù)據(jù)流控, 藍牙模塊使用百瑞互聯(lián),如需定制開發(fā)模塊或SDK可聯(lián)系爆存!