|
本帖最后由 winterhero 于 2017-9-19 10:26 编辑
首先先感谢 wgs7909 的技术指导。终于通过1个星期加班加点把加密跟开锁解决了。
文笔不是很好,写的不好不要介意。PS 在测试的如果觉得报错弹窗很难受可以在WEX5官网查一查怎么修改报错弹窗。我这边直接改成了console.log打印。
首先是CryptoJS加密
WEX5的JS引老是有些JS引用不到核心的aes.js里的CryptoJS。
我自己的处理方法是把rollups里的aes.js混淆解密后。全部复制到引用不到CryptoJS的JS文件里。就能用
具体例子可以看mode_ecb,js。
在网上的例子都是加密String类型的字符串。蓝牙发送的数据帧是16进制。需要转换。而在CryptoJS里没用提供。
http://www.jianshu.com/p/df3e5ba5a8a4
需要添加个 CryptoJS.enc.u8array这个方法: //我写在了enc-utf16.js里。
stringify: function (wordArray) {
var words = wordArray.words;
var sigBytes = wordArray.sigBytes;
var u8 = new Uint8Array(sigBytes);
for (var i = 0; i < sigBytes; i++) {
var byte = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;
u8=byte;
}
return u8;
},
parse: function (u8arr) {
var len = u8arr.length;
var words = [];
for (var i = 0; i < len; i++) {
words[i >>> 2] |= (u8arr & 0xff) << (24 - (i % 4) * 8);
}
return CryptoJS.lib.WordArray.create(words, len);
}
};
加密方法:
function encrypt(codes, key) {
var encryptkeyBytes = DataType.hexTo16Bytes(key); // 密钥,16bytes
encryptkeyBytes = CryptoJS.enc.u8array.parse(encryptkeyBytes);
var codeBytes = DataType.hexTo16Bytes(codes); // 内容
codeBytes = CryptoJS.enc.u8array.parse(codeBytes);
var encrypted = CryptoJS.AES.encrypt(codeBytes, encryptkeyBytes, {
mode : CryptoJS.mode.ECB, // 需要导入CryptoJS的ecb.js
padding : CryptoJS.pad.NoPadding, // 需要导入CryptoJS的nopadding.js
});
console.log(encrypted.ciphertext.toString());
return encrypted.ciphertext.toString();
}
加密操作:
Model.prototype.button2Click = function(event) {
// 加密key
var codebytes = "06010101000000000000000000000000";
var key = "20572f52364b3f473050415811632d2b";
var encryptedData = encrypt(codebytes, key);
};
解密方法:
function decrypt(encryptedStr, key) {
var decryptkey = DataType.hexTo16Bytes(key); // 密钥,16bytes
decryptkey = CryptoJS.enc.u8array.parse(decryptkey)
var encryptedHexStr = CryptoJS.enc.Hex.parse(encryptedStr); //内容
var encryptedBase64Str = CryptoJS.enc.Base64.stringify(encryptedHexStr);
var decryptedData = CryptoJS.AES.decrypt(encryptedBase64Str, decryptkey, {
mode : CryptoJS.mode.ECB,
padding : CryptoJS.pad.NoPadding
});
window.Strencrypted = encrypted.ciphertext.toString();
return decryptedData;
}
解密操作:
Model.prototype.button8Click = function(event) {
var key = "20572f52364b3f473050415811632d2b";
decrypt(window.Strencrypted, key);
};
具体的加密解密解释可以在
https://zhidao.baidu.com/question/1819427615658816228.html 查看
蓝牙连接其实也很简单。其实我这边涉及最头痛的是连接到设备后,到广播获取随机令牌. 获取到的广播是加密的。需要解密 再去拼接字符串。一个很繁琐的操作。
但是这是现在基本上共享单车锁的基本流程:搜索蓝牙设备,连接蓝牙设备,读取广播,开锁。
具体操作可以看http://www.jianshu.com/p/df3e5ba5a8a4 或者
http://bbs.wex5.com/forum.php?mo ... =%E8%93%9D%E7%89%99
Model.prototype.searchClick = function(event) {
// 每发现一个设备就会成功回调一次,会记录最后一个被发现设备的id
alert("扫描" + second + "秒后自动停止扫描")
ble.scan([], second, function(info) {
suCallBack(info);
}, errCallBack);
};
Model.prototype.connectClick = function(event) {
// 连接最后一个被发现的设备
ble.connect("FF:FF:80:04:0F:60", function(info) {
suCallBack(info);
}, errCallBack);
};
Model.prototype.readClick = function(event) {
var SERVICEID = "0000fee7-0000-1000-8000-00805f9b34fb"; //设备编号
var readDataUUID = "000036f6-0000-1000-8000-00805f9b34fb"; //特征读取指令ID
ble.read("FF:FF:80:04:0F:60", SERVICEID, readDataUUID, function(buffer) {
var x2 = new Uint8Array(buffer);
var x = new Uint8Array(16);
for (var int = 0; int < 16; int++) {
x[int] = x2[int];
}
sureadCallBack(x); //我读取到的广播的长度是20 但是我的协议长度都是16, 所以在这截取了16位
var codeBytes = CryptoJS.enc.u8array.parse(x); // 数据转成u8
window.readcodeybte = codeBytes;
}, errCallBack);
};
Model.prototype.openlock9Click = function(event) {
var SERVICEID = "0000fee7-0000-1000-8000-00805f9b34fb"; //设备编号
var writeDataUUID = "000036f5-0000-1000-8000-00805f9b34fb"; //特征写入指令ID
var key = "20572f52364b3f473050415811632d2b";
var read= window.readcodeybte;
var readStr = (decrypt(read.toString(), key)).toString();
var x3 = readStr.substring(6, 14)
var x1 = "050106303030303030";
var x2 = "000000"
var Strsdata = x1 + x3 + x2;
var encryptedData = encrypt(Strsdata, key);
var jiami = DataType.hexTo16Bytes(encryptedData);
ble.write("FF:FF:80:04:0F:60", SERVICEID, writeDataUUID, jiami.buffer, suCallBack, errCallBack); //"FF:FF:80:04:0F:60"我这里就一把锁所以我把蓝牙地址写死了。
};
|
评分
-
查看全部评分
|