混合APP低功耗蓝牙项目解析数据可能用到的一些小方法---ble

蓝牙的适用场景

可用于第三方蓝牙设备交互,必须要支持蓝牙 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可联系!

你可能感兴趣的:(混合APP低功耗蓝牙项目解析数据可能用到的一些小方法---ble)