文章来源 http://www.vxzsk.com/130.html
已推出最新微信硬件jsapi学习笔记 地址 http://www.vxzsk.com/282.html
我们上一章节介绍了微信硬件蓝牙设备的绑定,连接,并且获取到硬件设备的deviceid,这节课接着上一章节的基础上来介绍通过微信H5界面向设备发送数据,并且接收设备返回的数据信息。
第一、首先看两个微信硬件jsapi函数,发送数据给设备sendDataToWXDevice和接收到设备数据onReceiveDataFromWXDevice(目前只支持蓝牙)
第二、发送数据给设备是base64编码,那么编码js方法如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
/**
* Byte数组转Base64字符,原理同上
* @Param [0x00,0x00]
* @return Base64字符串
**/
function
bytes_array_to_base64(array) {
if
(array.length == 0) {
return
""
;
}
var
b64Chars =
'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
;
var
result =
""
;
// 给末尾添加的字符,先计算出后面的字符
var
d3 = array.length % 3;
var
endChar =
""
;
if
(d3 == 1) {
var
value = array[array.length - 1];
endChar = b64Chars.charAt(value >> 2);
endChar += b64Chars.charAt((value << 4) & 0x3F);
endChar +=
"=="
;
}
else
if
(d3 == 2) {
var
value1 = array[array.length - 2];
var
value2 = array[array.length - 1];
endChar = b64Chars.charAt(value1 >> 2);
endChar += b64Chars.charAt(((value1 << 4) & 0x3F) + (value2 >> 4));
endChar += b64Chars.charAt((value2 << 2) & 0x3F);
endChar +=
"="
;
}
var
times = array.length / 3;
var
startIndex = 0;
// 开始计算
for
(
var
i = 0; i < times - (d3 == 0 ? 0 : 1); i++) {
startIndex = i * 3;
var
S1 = array[startIndex + 0];
var
S2 = array[startIndex + 1];
var
S3 = array[startIndex + 2];
var
s1 = b64Chars.charAt(S1 >> 2);
var
s2 = b64Chars.charAt(((S1 << 4) & 0x3F) + (S2 >> 4));
var
s3 = b64Chars.charAt(((S2 & 0xF) << 2) + (S3 >> 6));
var
s4 = b64Chars.charAt(S3 & 0x3F);
// 添加到结果字符串中
result += (s1 + s2 + s3 + s4);
}
return
result + endChar;
}
|
根据微信官方文档说明,我们无论发送什么数据,都要经过base64编码。
发送数据给设备的js代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
/*******************************************************************
* 发送数据函数
* 作者:V型知识库 www.vxzsk.com 2016-04-04
* 入口参数:
* cmdBytes: 需要发送的命令字节
* selDeviceID: 选择的需要发送设备的ID
* 出口参数:
* 返回: 0表示发送成功;1表示发送失败
* 如果成功,则接收事件应该能够收到相应的数据
*******************************************************************/
function
senddataBytes(cmdBytes,selDeviceID){
//1. 如果输入的参数长度为零,则直接退出
if
(cmdBytes.length<=0){
return
1};
// alert("向微信发送指令数据");
//1.1 如果设备ID为空,则直接返回
if
(selDeviceID.length<=0){
return
1};
//2. 发送数据
var
x=0;
WeixinJSBridge.invoke(
'sendDataToWXDevice'
, {
"deviceId"
:selDeviceID,
"base64Data"
:bytes_array_to_base64(cmdBytes)
},
function
(res){
//alert("向微信发送指令数据返回的状态"+res.err_msg);
if
(res.err_msg==
'sendDataToWXDevice:ok'
)
{
x=0;
alert(
"数据发送成功"
);
}
else
{
x=1;
alert(
"数据发送失败"
);
}
});
return
x;
}
|
上述代码中有两个alert,此函数会在ios系统下弹出窗口的时候卡死,查阅微信官方文档相关资料获知,此接口的确有卡死状态现象,建议读者不要在ios环境下用alert作为标识。
第三、接收设备数据onReceiveDataFromWXDevice 代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
/*********************************************************
* 接收到数据事件
* 作者:V型知识库 www.vxzsk.com
* my_onReceiveDataFromWXDevice
* 入口参数:无
* 出口参数:无
*********************************************************/
function
my_onReceiveDataFromWXDevice(){
WeixinJSBridge.on(
'onReceiveDataFromWXDevice'
,
function
(argv) {
mlog(
"接收的数据-->"
+argv.base64Data);
});
}
|
微信官方文档说的已经很清楚了,我们接收到硬件设备返回的数据是base64编码,所以需要我们自己解码,才能识别返回的数据。解码函数请读者自行百度或谷歌,网上例子很多,在这里不在累述。
第四、发送APDU命令数据(16进制)
我们有一节特意说过apdu命令,由于案例设备能识别16进制apdu指令码,所以读者可根据自己的业务替换成相应的apdu命令即可,当然指令也可以是个字符串之类的,我在这里的apdu命令为12345678901122
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
function
CheckBalance(){
var
Bytes=
new
Array();
Bytes[0]=0x12;
Bytes[1]=0x34;
Bytes[2]=0x56;
Bytes[3]=0x78;
Bytes[4]=0x90;
Bytes[5]=0x11;
Bytes[6]=0x22;
return
Bytes;
}
|
把CheckBalance方法16进制数组经过base64编码,调用微信发送数据给设备函数接口即可。
第五、完整jsp代码如下
1,首先点击获取设备按钮,获得设备的连接
2,点击IC卡复位,触发发送apdu指令函数,向蓝牙硬件设备发送apdu指令数据,并接收到硬件设备返回数据
第六、效果如下图
1,记得一定要在连接上设备的前提下
2,点击获取设备,获得设备的id
3,点击ic卡(cpu接触式卡)复位按钮,日志已经打印出硬件返回的数据了