微信蓝牙硬件设备接入(1)

微信jsapi是网页javascript的接口,该接口允许厂商的网页对局域网设备(设备必须支持AirKiss3.0)和蓝牙设备进行操作。例如扫描设备,连接设备,收发数据,绑定设备等。

大概流程图如下(以蓝牙设备为例,途径是红色箭头那个)

微信蓝牙硬件设备接入(1)_第1张图片

1、用户场景

1、用户打开微信app的扫一扫,进入我们的html页面

2、然后通过html界面上的操作进行跟设备的通讯

2、前端 jsapi编写

(1)调后端接口获取appId、timestamp、nonceStr、signature

微信蓝牙硬件设备接入(1)_第2张图片

(2)初始化微信硬件JSAPI接口库

注意:beta字段一定要设置为true,具体为什么不知道。如果有哪位大神知道请告知
export function loadXMLDoc (params) {
    wx.config({
        beta: true,
        debug: true,// 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
        appId: params.appId, 
        timestamp: params.timestamp,
        nonceStr: params.nonceStr,
        signature: params.signature,
        jsApiList: [
            'openWXDeviceLib',
            'closeWXDeviceLib',
            'getWXDeviceInfos',
            'getWXDeviceBindTicket',
            'getWXDeviceUnbindTicket',
            'startScanWXDevice',
            'stopScanWXDevice',
            'connectWXDevice',
            'disconnectWXDevice',
            'sendDataToWXDevice',
            'onWXDeviceBindStateChange',
            'onWXDeviceStateChange',
            'onScanWXDeviceResult',
            'onReceiveDataFromWXDevice',
            'onWXDeviceBluetoothStateChange',
        ]
    });
    alert("初始化库结束");
}

(3)打开微信设备

注意:brandUserName也是必须,后面的值可以在公众号里面有
export function my_openWXDeviceLib(){
        wx.ready(function(){
            var x=0; 
            wx.invoke('openWXDeviceLib', {'brandUserName': 'gh_xxxxxx'}, 
                function(res){
                    alert(JSON.stringify(res))
                    if(res.err_msg=="openWXDeviceLib:ok")
                    {   
                        if(res.bluetoothState=="off")
                        {    
                            alert("1.请打开手机蓝牙");
                            x=1;
                        };
                        if(res.bluetoothState=="unauthorized")
                        {    
                            alert("1.请授权蓝牙功能");
                            x=1;
                        }; 
                        if(res.bluetoothState=="on")
                        { 
                            alert("1.蓝牙已打开,未找到设备");
                            x=0;
                        };      
                    }
                    else
                    {
                          alert("1.微信蓝牙打开失败");
                          x=1;  
                    }
            });
            return x;  //0表示成功 1表示失败
        })  
}

(4)获取微信设备信息

export function gainWXDeviceResult () {
    wx.ready(function(){
        wx.invoke("getWXDeviceInfos",{'connType' : 'blue'},function(res){            
            alert("getWXDeviceInfos :: 获取用户已经绑定设备"+JSON.stringify(res));
            var len=res.deviceInfos.length;  //绑定设备总数量
            for(i=0; i<=len-1;i++)
            {
                //alert(i + ' ' + res.deviceInfos[i].deviceId + ' ' +res.deviceInfos[i].state); 
                if(res.deviceInfos[i].state==="connected")
                {
                    document.getElementById('device').innerText = res.deviceInfos[i].deviceId
                    document.getElementById('device').innerText = '设备已成功连接'
                    break;   
                }  
            }
        }); 
    })
}

(5)发送数据给设备

export function senddataBytes(){
    var x=0;
    var Bytes=CheckBalance();
    alert('向微信发送指令数据返回的状态')
    wx.invoke('sendDataToWXDevice', {
            "deviceId": deviceId, 
            "base64Data":bytes_array_to_base64(Bytes)
            }, function(res){
            alert("向微信发送指令数据返回的状态"+res.err_msg);
            if(res.err_msg=='sendDataToWXDevice:ok')
               {

                 x=0;
                 alert("数据发送成功");
               }  
            else
               {

                 x=1; 
                 alert("数据发送失败");
               } 
        });  
    return x;      
}

//发送命令数据(16进制)  读者可根据自己的业务替换成相应的命令即可
function CheckBalance(){
    var Bytes=new Array();
        Bytes[0]=0x02;

        Bytes[1]=0x00;
        Bytes[2]=0x02;

        Bytes[3]=0x37;
        Bytes[4]=0x40;

        Bytes[5]=0x03;
        Bytes[6]=0x74;
    return Bytes;  
}

//发送数据给设备是base64编码,那么编码js方法如下
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;
}

(5)接收设备回应数据

特别注意:如果onReceiveDataFromWXDevice不触发,html未接收到设备返回的数据包,就要检查一下是否设备把数据返回到了服务端那边,如果onReceiveDataFromWXDevice不触发,设备肯定是把数据包发送回给了我们的服务端,而不是我们的前端
具体后端检测方法可参考链接:http://www.vxzsk.com/143.html
export function Receivedata () {
    alert('onReceiveDataFromWXDevice:点击事件触发')
    wx.on('onReceiveDataFromWXDevice',function(res){
        mlog('onReceiveDataFromWXDevice' + JSON.stringify(res))
    });
}

你可能感兴趣的:(微信,蓝牙,微信硬件)