微信硬件蓝牙jsapi开发之sendDataToWXDevice接口和onReceiveDataFromWXDevice接口(11)

本文详细介绍如何使用微信硬件JSAPI实现与蓝牙设备的数据交互,包括数据发送与接收的实现方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文章来源 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接触式卡)复位按钮,日志已经打印出硬件返回的数据了


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值