在写蓝牙小程序时候会涉及到对发送的信息和返回的信息进行校验,使用的是异或校验,其目的就是为了检测传输数据过程中有没有数据丢失。我项目中使用的原理——字符串以" " 开 头 , 以 " ∗ " ( 星 号 ) 结 尾 , 检 测 "开头,以"*"(星号)结尾,检测 "开头,以"∗"(星号)结尾,检测与之间的assic值的异或和,即第一位与第二位的异或结果与第三位再进行异或,一直到最后一位。将获取到的异或和结果放到后,生成“$XXXXXXXXXXXX*Y"的格式通过蓝牙发送出去。其中Y是生成的异或和
yihuohe1:function(char){
var that=this;
let string=char
let num_front=that.strToHexCharCode(string[1])//获取首位的10进制数
for(let i=0;i<string.length;i++)
{
if(string[i]=='*'){
for(let j=1;j<i-1;j++){//对于*前的assic进行转10进制,再做异或和
num_front=num_front^((that.strToHexCharCode(string[j+1])))
}
if(((num_front).toString(16)).length==2){
var b=(num_front).toString(16)
var a=b.toUpperCase()
return a
}
if(((num_front).toString(16)).length==1)
{
return ('0'+(num_front).toString(16)).toUpperCase()
}
}
}
},
因为对方检测的是对异或和逐位检测,用的是ASSIC,所以我在return (‘0’+(num_front).toString(16)).toUpperCase()中使用了个toUpperCase()强制把小写改成大写
接下来我们测试下效果:
test:function(){
let b=this.yihuohe1('$HC13,28.39478985,112.75924959,28.39478987,112.75924959,28.39478987,112.75924955,28.39478987,112.75924955*')
console.log('测试b',b)
},
运行效果截图
完成的测试程序如下:
const app = getApp()
Page({
data: {
},
yihuohe1:function(char){
var that=this;
let string=char
let num_front=that.strToHexCharCode(string[1])//获取首位的10进制数
for(let i=0;i<string.length;i++)
{
if(string[i]=='*'){
for(let j=1;j<i-1;j++){//对于*前的assic进行转10进制,再做异或和
num_front=num_front^((that.strToHexCharCode(string[j+1])))
}
if(((num_front).toString(16)).length==2){
var b=(num_front).toString(16)
var a=b.toUpperCase()
return a
}
if(((num_front).toString(16)).length==1)
{
return ('0'+(num_front).toString(16)).toUpperCase()
}
}
}
},
test:function(){
let b=this.yihuohe1('$HC13,28.39478985,112.75924959,28.39478987,112.75924959,28.39478987,112.75924955,28.39478987,112.75924955*')
console.log('测试b',b)
},
//====================================异或和结束===============================================
ab2hex:function(buffer){
var hexArr =Array.prototype.map.call(
new Uint16Array(buffer),
function(bit){
return ('00'+bit.toString(16).slice(-2))
}
)
return hexArr.join('');
},
// 字符串转byte
stringToBytes(str) {
var array = new Uint8Array(str.length);
for (var i = 0, l = str.length; i < l; i++) {
array[i] = str.charCodeAt(i);
}
console.log(array);
return array.buffer;
},
ab2str:function(buf){
return String.fromCharCode.apply(null, new Uint8Array(buf));
},
//ASCII码转16进制
strToHexCharCode:function(str) {
if (str === "") {
return "";
} else {
var hexCharCode = [];
hexCharCode.push("0x");
for (var i = 0; i < str.length; i++) {
hexCharCode.push((str.charCodeAt(i)).toString(16));
}
return hexCharCode.join("");
}
},
})
``
其中wxml处用一个按钮绑定bindtap是函数"test"