微信jsapi是网页javascript的接口,该接口允许厂商的网页对局域网设备(设备必须支持AirKiss3.0)和蓝牙设备进行操作。例如扫描设备,连接设备,收发数据,绑定设备等。
大概流程图如下(以蓝牙设备为例,途径是红色箭头那个)
1、用户场景
1、用户打开微信app的扫一扫,进入我们的html页面
2、然后通过html界面上的操作进行跟设备的通讯
2、前端 jsapi编写
(1)调后端接口获取appId、timestamp、nonceStr、signature
(2)初始化微信硬件JSAPI接口库
注意:beta字段一定要设置为true,具体为什么不知道。如果有哪位大神知道请告知
export function loadXMLDoc (params) {
wx.config({
beta: true,
debug: true,
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;
})
}
(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++)
{
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;
}
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;
}
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))
});
}