# 根据蓝牙协议解析蓝牙传输数据

9 篇文章 2 订阅
4 篇文章 1 订阅
27 篇文章 0 订阅
// 接收蓝牙传输的数据取出有用的数值编码
let num = "AAAA01400262007204041FCC".replace("AAAA","").replace("CC",""); //蓝牙回调数据
let sun = 0; //用来验证
let strArr = []; //字节数组
for(let i=0;i<num.length-2;i=i+2){
// 以两个为一组分割计算（16转10进制计算）
sun = sun + parseInt((num[i]+num[i+1]),16);
strArr.push(parseInt((num[i]+num[i+1]),16))
}
// 取低八位与第九字节验证对比正确继续错误丢弃
console.log(sun);
console.log(sun&0xff);
console.log(parseInt(num.substring(num.length-2,num.length),16));
if((sun&0xff)==parseInt(num.substring(num.length-2,num.length),16)){
// 计算速度值
let str0 = this.check8Bit(parseInt(strArr[0]).toString(2))
let str1 = this.check8Bit(parseInt(strArr[1]).toString(2))
let speed = this.bit6_0bit6_4(str0,str1)
console.log("速度值:"+speed);
// 计算加速度
let str2 = this.check8Bit(parseInt(strArr[2]).toString(2))
let str3 = this.check8Bit(parseInt(strArr[3]).toString(2))
let g = this.bit6_0bit6_4(str2,str3)
console.log("加速度:"+g);
// 计算加减数值
let str4 = this.check8Bit(parseInt(strArr[4]).toString(2))
let str5 = this.check8Bit(parseInt(strArr[5]).toString(2))
let gSpeed = this.bit6_0bit6_4(str4,str5)
console.log("加减数值变化:"+gSpeed);
// 撞击次数
let str6 = this.check8Bit(parseInt(strArr[6]).toString(2))
let str7 = this.check8Bit(parseInt(strArr[7]).toString(2))
let gCount = this.bit6_0bit6_4(str6,str7)*10;
console.log("撞击次数:"+gCount);
// 撞击时间
let str8 = this.check8Bit(parseInt(strArr[1]).toString(2))
let str9 = this.check8Bit(parseInt(strArr[3]).toString(2))
let tCount = this.bit3_0bit3_0(str8,str9)
console.log("撞击时间:"+tCount);
// 电池电量
let str10 = this.check8Bit(parseInt(strArr[5]).toString(2))
let str11 = this.check8Bit(parseInt(strArr[7]).toString(2))
let eCount = this.bit3_2bit3_0(str10,str11)
console.log("电池电量:"+eCount+"v");
//出拳类型
let str12 = this.check8Bit(parseInt(strArr[5]).toString(2))
let oType = this.bit1_0(str12)
console.log("出拳类型:"+oType);
}

//methods方法内
// bit位不够八位补0
check8Bit(str){
let i=str.length;
if (i>=8){
str=str.substring(i-8,i);
}else{let str0="00000000";
str=str0.substring(0,str0.length-i)+str;
}
return str;
},
// bit6-bit0 -- bit6-bit4
bit6_0bit6_4(str0,str1){
return ((parseInt(str0.substring(1,8) + str1.substring(1,4),2).toString(10))/10).toFixed(2)
},
// 解析撞击时间
bit3_0bit3_0(str0,str1){
return ((parseInt(str0.substring(4,8) + str1.substring(4,8),2).toString(10)))
},
// 解析电量
bit3_2bit3_0(str0,str1){
return ((parseInt(str0.substring(4,6) + str1.substring(4,8),2).toString(10))/10).toFixed(2)
},
// 解析出拳类型
bit1_0(str0){
return str0.substring(6,8)
},

1，先去除起始字节AAAA和终止字节CC,有用的数据为：01,40,02,62,00,72,04,04,1F.共9个字节！
2,判断和校验是否正确，将前8个字节相加：01+40+02+62+00+72+04+04=11F,取低8位为1F,与第9字节相同，校验正确，进行下一步，不正确，这包字节丢弃。
3，上述前8个字节依次用Byte0~Byte7表示，速度值speed由Byte0的bit6-bit0 和 Byte1的bit6-bit4组成，即01的低7位（0000001）与40的bit6-bit4（100）组成，组合后为0000001100=0X0C=12,显示的数值要除以10，即显示1.2m/s.
4,加速度g值由Byte2的bit6-bit0 和 Byte3的bit6-bit4组成，即02的低7位（0000010）与62的bit6-bit4（110）组成，组合后为0000010110=0X16=22,显示的数值要除以10，即显示2.2m/s^2.
5,减速加速度值由Byte4的bit6-bit0 和 Byte5的bit6-bit4组成，即00的低7位（0000000）与72的bit6-bit4（111）组成，组合后为0000000111=0X07=7,显示的数值要除以10，即显示0.7m/s^2.
6，撞击次数由Byte6的bit6-bit0 和 Byte7的bit6-bit4组成，即04的低7位（0000100）与04的bit6-bit4（000）组成，组合后为0000100000=0X20=32,即显示32ms.
7,撞击时间由Byte1的bit3-bit0 和 Byte3的bit3-bit0组成，即40的低4位（0000）与62的低4位（0010）组成，组合后为00000010=0X02=2,即显示2.
8，电池电量Byte5的bit3-bit2 和 Byte7的bit3-bit0组成，即72的bit3-bit2位（00）与04的低4位（0100）组成，组合后为000100=0X04=4,显示的数值要除以10，即显示0.4v
9，出拳种类由Byte5的bit1-bit0表示，即72的低2位（10），即下勾拳。

10-25 2333

03-25 1965
11-29 3710
12-29 2011
09-29 6320
11-15 6085
12-11 127
02-23 478

### “相关推荐”对你有帮助么？

• 非常没帮助
• 没帮助
• 一般
• 有帮助
• 非常有帮助

Mr.冬冬

¥2 ¥4 ¥6 ¥10 ¥20

1.余额是钱包充值的虚拟货币，按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载，可以购买VIP、C币套餐、付费专栏及课程。