// 接收蓝牙传输的数据取出有用的数值编码
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)
},
以收到字符串AAAA01400262007204041FCC为例,所有字节都是16进制。
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),即下勾拳。