蓝牙的适用场景
可用于第三方蓝牙设备交互,必须要支持蓝牙 4.0。
iOS上:硬件至少是 iphone4s,系统至少是 iOS6。
android上:系统版本至少是 android4.3。
蓝牙 4.0 以低功耗著称,一般也叫 BLE(BluetoothLowEnergy)。目前应用比较多的案例:运动手坏、嵌入式设备、智能家居
蓝牙通讯原理概述
在蓝牙通讯中有两个主要的部分,Central 和 Peripheral,有一点类似Client Server。Peripheral 作为周边设备是服务器。Central 作为中心设备是客户端。所有可用的蓝牙设备可以作为周边(Peripheral)也可以作为中央(Central),但不可以同时既是周边也是中央。
一般手机是客户端, 设备(比如手环)是服务器,因为是手机去连接手环这个服务器。周边(Peripheral)是生成或者保存了数据的设备,中央(Central)是使用这些数据的设备。你可以认为周边是一个广播数据的设备,他广播到外部世界说他这儿有数据,并且也说明了能提供的服务。另一边,中央开始扫描附近有没有服务,如果中央发现了想要的服务,然后中央就会请求连接周边,一旦连接建立成功,两个设备之间就开始交换传输数据了。
除了中央和周边,我们还要考虑他俩交换的数据结构。这些数据在服务中被结构化,每个服务由不同的特征(Characteristics)组成,特征是包含一个单一逻辑值的属性类型。
服务和特性
上文中提到了特征(Characteristics),这里简单说明下什么是特征。
特征是与外界交互的最小单位。蓝牙4.0设备通过服务(Service)、特征(Characteristics)和描述符(Descriptor)来形容自己,同一台设备可能包含一个或多个服务,每个服务下面又包含若干个特征,每个特征下面有包含若干个描述符(Descriptor)。比如某台蓝牙4.0设备,用特征A来描述设备信息、用特征B和描述符b来收发数据等。而每个服务、特征和描述符都是用 UUID 来区分和标识的。
切割字符串
source ==> 字符串
count ==> 切割的位数
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进制转10进制
function change_ten(sixteen) {
var ten = '';
ten = parseInt(sixteen, 16);
return ten;
//使用字符串转换为整数的方法实现进制转换
}
16进制转字符串
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进制转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
}
接收蓝牙数据IOS与Android呈现方式不同,安卓可以直接使用,IOS需进一步处理,去掉头尾和括号
转换接收的ios数据
function byte_ios(value){
var str1=value.substring(0,value.indexOf("0x"));
var str2=value.substring(str1.length+2,value.length-1);
return str2
}
校验和 蓝牙回传的硬件数据去掉前三位 去掉最后一位求和 (根据硬件的需求来求和,不同的硬件开发规则不同)
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);
}
}
小结:此次低功耗蓝牙ble开发使用APIcloud混合开发,调用模块方法时要按照一定顺序
初始化蓝牙4.0管理器 => initManager
搜索蓝牙4.0设备,模块内部会不断的扫描更新附近的蓝牙4.0设备信息 => scan
注: 参数(params):single 类型:布尔 true 为单例模式,false为非单例模式;默认为false; 描述:(可选项)则扫描附近的所有支持蓝牙4.0的设备类型:parmas:布尔 true 为单例模式,false为非单例模式;默认为false; 非单例模式为仅在本页面生效连接,单例模式为在连接成功后整个app全局生效
获取当前扫描到的所有外围设备信息 => getPeripheral
连接指定外围设备。iOS端无超时判断,android端默认有30秒超时判断 => connect
根据指定的外围设备 UUID 获取该外围设备的所有服务 => discoverService
根据指定的外围设备 UUID 及其服务 UUID 获取该外围设备的所有特征(Characteristic)=> discoverCharacteristics
根据指定的外围设备 UUID 及其服务 UUID 和特征 UUID 监听数据回发 =>setNotify
根据指定的外围设备 UUID 及其服务 UUID 和特征 UUID 写数据 => writeValueForCharacteristic
剩余方法根据需求酌情使用
此次开发需求 传递字节以及ASCII码,apicloud中ble模块仅仅满足于传递字节,并且初始低功耗蓝牙仅仅满足于传递20字节以下数据,需设置MTU进行大数据传输,此次流控为蓝牙的特征FF03监听来进行数据流控, 蓝牙模块使用百瑞互联,如需定制开发模块或SDK可联系!