混合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可联系!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,457评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,837评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,696评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,183评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,057评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,105评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,520评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,211评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,482评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,574评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,353评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,897评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,489评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,683评论 2 335