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

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)
			},

以收到字符串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),即下勾拳。
 

参与评论 您还未登录,请先 登录 后发表或查看评论

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:游动-白 设计师:我叫白小胖 返回首页

打赏作者

Mr.冬冬

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值