zoukankan      html  css  js  c++  java
  • 微信硬件蓝牙开发各种坑不全然开发指南

    几个基本要用的东西:
    1、微信公众平台
    网址:https://mp.weixin.qq.com
    申请微信公众号,获取微信測试号。

    2、微信JS-SDK说明文档
    网址:http://mp.weixin.qq.com/wiki/7/aaa137b55fb2e0456bf8dd9148dd613f.html

    3、微信硬件平台说明文档
    网址(新版):http://iot.weixin.qq.com/wiki/new/index.html
    网址(旧版):http://iot.weixin.qq.com/wiki/index.html

    – 開始开发 –

    1、首先到微信公众平台申请微信公众号,就选个人订阅号。


    2、登录你的公众号。进入公众平台管理页,左边最以下有个“开发人员工具”。


    3、点“开发人员工具”。进去后找到“公众平台測试帐号”,自己依照步骤申请开通一个。
    4、进入測试号管理页面,就会得到:

    原始ID:gh_xxxxxxxxxx (右上角显示的。这个是微信原始ID,不是微信号)
    (坑:微信原始ID 和 微信帐号不是同一个。微信帐号在之后都不会用到,用到的是原始ID)
    appID:wxxxxxxxxxxxx (appID)
    appsecret:xxxxxxxxxxxxxx (密钥)

    5、測试号管理页面。以下找到“JS接口安全域名”,要配置成你们自己的server域名,后面有些微信API会返回数据,它会去匹配这个域名,假设不是指定的域名,会报错。
    6、继续往下看。以下有个“体验接口权限表”,在里面找到“设备功能”。开通它
    7、开通设备功能后,点右边的“设置”,进入设备功能页面
    8、自己”加入产品”,随便搞,连接类型勾选”蓝牙”就可以(加入完毕后。该产品有个产品编号。后面设备授权时实用)

    ======= 以上是公众平台的配置,以下開始写前端代码 ======

    1、新建HTML,基本结构写好。
    2、引入”http://res.wx.qq.com/open/js/jweixin-1.0.0.js“,这个JS
    3、写JS代码:

    wx.config({
        beta:true,                  //坑:这个非常重要,必须配置这个为true,才干调用微信的硬件API
        debug: false,               //是否开启调试模式,会自己主动弹一些消息框显示微信返回的数据
        appId: 这里填写appID,        //让后台返回appid
        timestamp: 时间戳,          //让后台返回生成证书时用的时间戳
        nonceStr: 随机字符串,        //让后台返回生成证书时用的随机串
        signature: 证书,            //让后台返回以当前URL地址生成的证书
        jsApiList: [                //须要调用的接口。都得在这里面写一遍
            "openWXDeviceLib",//初始化设备库(仅仅支持蓝牙设备)
            "closeWXDeviceLib",//关闭设备库(仅仅支持蓝牙设备)
            "getWXDeviceInfos",//获取设备信息(获取当前用户已绑定的蓝牙设备列表)
            "sendDataToWXDevice",//发送数据给设备
            "startScanWXDevice",//扫描设备(获取周围全部的设备列表,不管绑定还是未被绑定的设备都会扫描到)
            "stopScanWXDevice",//停止扫描设备
            "connectWXDevice",//连接设备
            "disconnectWXDevice",//断开设备连接
            "getWXDeviceTicket",//获取操作凭证
    
            //以下是监听事件:
            "onWXDeviceBindStateChange",//微信client设备绑定状态被改变时触发此事件
            "onWXDeviceStateChange",//监听连接状态。能够监听连接中、连接上、连接断开
            "onReceiveDataFromWXDevice",//接收到来自设备的数据时触发
            "onScanWXDeviceResult",//扫描到某个设备时触发
            "onWXDeviceBluetoothStateChange",//手机蓝牙打开或关闭时触发
        ]
    });

    上面这种方法,在进入页面时应该首先被调用,这是初始化微信JS-SDK
    当中:
    beta 这个參数需设为true。才干调用那些微信还没有正式开放的新接口
    appID,timestamp,nonceStr,signature这几个由后台传递到前端。


    生成证书的方法JS-SDK文档中有,此处临时省略

    4、继续写方法:

    wx.ready(function(){
        //初始化设备库 需填写參数 公众号的原始ID
        wx.invoke('openWXDeviceLib', {'brandUserName':'gh_xxxxxxxxxx'}, function(res){
            //自己把res输出来看一下吧。里面包含了是否初始化成功。当前手机的蓝牙状态等信息
            //这里有个坑。当时研究了好久,跟论坛里的人讨论了半天,就是IOS下正常。
            //安卓下,请带上这个參数:brandUserName:后面是你公众号的原始ID。不然会初始化失败
            //正式的公众号。也有原始ID,是gh_开头的那个,进入公众号,自己找一下吧。有的
            //測试号,就用測试号管理页面右上角的那个gh_开头的那一串数字
        });
    
        //手机蓝牙状态改变时触发 (这是监听事件的调用方法,注意,监听事件都没有參数)
        wx.on('onWXDeviceBluetoothStateChange',function(res){
                //把res输出来看吧
        });
    
        //设备绑定状态改变事件(解绑成功。绑定成功的瞬间。会触发)
        wx.on('onWXDeviceBindStateChange',function(res){
                //把res输出来看吧
        });
    
        //设备连接状态改变
        wx.on('onWXDeviceStateChange',function(res){
            //有3个状态:connecting连接中,connected已连接,unconnected未连接
            //每当手机和设备之间的状态改变的瞬间。会触发一次
        });
    
        //接收到设备传来的数据
        wx.on('onReceiveDataFromWXDevice',function(res){
            //接收到的原始数据:JSON.stringify(res)
            //自己去百度下载一个jbase64.js,能够对字符串进行base64编码解码
            //这里就是用的jbase64.js对原始数据进行解码
            var unicode= BASE64.decoder(res.base64Data);
            var str = '';  
            for(var i = 0 , len =  unicode.length ; i < len ;++i){  
                     str += String.fromCharCode(unicode[i]);  
            }
            //解码后的数据:str
            //坑:你们測试的时候,不要在这里用alert(),页面会卡死。自己把信息输出到页面中查看吧
            //不要在这里alert出来
        });
    });
    

    5、继续写方法:

    wx.error(function(res){
        alert("wx.error错误:"+JSON.stringify(res));
        //假设初始化出错了会调用此方法,没什么特别要注意的
    });

    6、扫描设备:
    (我做的那个项目,是通过手机扫描附近的设备,得到设备的deviceid,然后进行绑定,不是用户扫描二维码进行绑定,所以这里介绍扫描设备的过程)

    //扫描前请先监听设备扫描事件
    wx.on('onScanWXDeviceResult',function(res){
        alert("扫描到1个设备");
        //自己解析一下res。里面会有deviceid,扫描设备的目的就是为了得到这个
        //然后就能够開始绑定了
    }
    
    //開始扫描
    wx.invoke("startScanWXDevice",{"btVersion":"ble"},function(res){});
    //这里填的參数是ble,也能够填bc,bc是经典蓝牙,我们做的这个设备不支持经典蓝牙。所以直接填ble
    //安卓系统不能同一时候支持ble和bc,这个后面具体说一下
    //运行此方法后。就開始一直不停的扫描。扫描到了设备会触发上面的监听事件
    
    //假设不想扫了,能够停止扫描
    //然而经測试,这种方法并没有什么卵用
    //你发现又一次扫描根本什么都扫不出来,即使你如今刷新页面,也扫不出不论什么东西
    //解决方法:每次扫描前,先调用closeWXDeviceLib关闭设备库。再调用openWXDeviceLib打开设备库
    //这样就相当于又一次初始化了一遍设备库,你如今再又一次扫描,就能够扫描到设备了。
    wx.invoke("stopScanWXDevice",{},function(res){});

    7、绑定和解除绑定

    //用户绑定设备
    //1、先获取操作凭证(type为1表示绑定。2表示解除绑定)
    wx.invoke('getWXDeviceTicket',{"deviceId":"填写设备的deviceID","type":1},function(res){
        if(res.err_msg !="getWXDeviceTicket:ok"){
                alert("获取操作凭证失败,请重试");  
                return;
        }else{
            //2.将deviceID和操作凭证通过ajax传给后台 进行绑定   
            //后台应该是有当前用户的openId的。事实上前端也能够获取到,但比較麻烦
            //我们这边的做法是。后台在数据库里保存了用户的openId,每次要用直接从数据库拿
            //就不用每次还去调微信的接口拿。太麻烦了
            //...此处ajax代码略      
        }
    });
    
    //用户解除绑定
    //与上面的方法基本同样,仅仅有type參数不同
    wx.invoke('getWXDeviceTicket',{"deviceId":"填写设备的deviceID","type":2},function(res){
        if(res.err_msg !="getWXDeviceTicket:ok"){
                alert("获取操作凭证失败,请重试");  
                return;
        }else{
            //2.将deviceID和操作凭证通过ajax传给后台 进行绑定   
            ...代码略      
        }
    });

    8、向设备发送数据

    wx.invoke('sendDataToWXDevice', {'deviceId':dev,"base64Data":BASE64.encoder(str)}, function(res){
        if(res.err_msg =="sendDataToWXDevice:ok"){
                alert("数据已发送");
        }else{
                alert("数据发送失败");
        }
    });
    //发送的数据须要经过base64编码

    以上是前端页面中。基本就这些代码
    当用户绑定了设备后,微信会不停的尝试连接设备,所以事实上不用程序猿写代码去连接设备。

    以下来说一下遇到的各种坑:(上面内容中提到的就不说了)
    1、开发流程:
    ①、硬件厂商,他们仅仅要得到了设备的mac地址,就能够開始授权了(好像仅仅要有蓝牙板子,就有mac地址了)。


    ②、然后再開始生产设备
    ③、然后才卖给用户
    ④、用户关注公众号,扫描设备(假设用的二维码方式。那就是扫二维码。

    我们没实用二维码那种方式)
    ⑤、用户绑定设备
    ⑥、微信自己主动连接设备
    ⑦、连接上后。就能够收发数据了

    2、关于授权:
    我们用的授权新接口,即不须要厂商提供deviceid,由微信分配deviceid
    然后是授权时的那些參数:
    product_id:就是你之前“加入设备”后,就会得到那个编号
    connect_protocol:连接协议
    仅仅能填3。或者仅仅能填1.你别弄成:3|1。
    以下写了。安卓设备不能同一时候支持ble和经典蓝牙
    IOS一切正常。可是填成3|1,你就发现安卓的ble蓝牙调用“getWXDeviceInfos”(获取设备信息),获取不到!
    假设用户的手机是经典蓝牙。你就写一个html页面,搞个button叫“刷成经典蓝牙”,用户能够自己去更新设备属性(就是授权那个地方,不是能够更新设备属性吗。让你们后台project师写个接口。用户能够自己去把connect_protocol刷成1)

    3、IOS连接设备非常快非常稳定,安卓连不上设备,显示“已连接0个设备”:
    在微信硬件平台的文档里面的某个地方。有一句话,说安卓设备要先订阅个什么东西,订阅上了,这个时候再连接就OK。由于设备仅仅发了一次Auth和Init包,假设错过这个时机,就错过了…就再也连不上了,除非设备断电重新启动。


    但IOS预计是订阅那个什么东西非常快,不会过期,所以一下就连上了。


    (2016-9-23更新:听IOSproject师说:IOS连接蓝牙仅仅须要3步,非常快非常稳定。

    安卓须要5步,当中2步easy失败,就是错过了某个时机就连不上了。貌似微信官方也没有好的解决的方法。

    我们是让硬件开发人员写了个又一次连接的机制。可是也不是非常好用)

    那句话具体在什么地方,我真的找不到了。微信太坑了。
    眼下的解决的方法:蓝牙板子是有相关接口的,蓝牙板子能够得到当前手机的连接状态。

    所以假设当前微信显示的是“正在连接中…”,这个时候。让硬件开发人员再发送Auth和Init包。

    4、关于设备向手机发数据:
    设备发的数据,里面有两个值,一个代表包含包头包尾的总长度,一个代表除去包头包尾的长度,必须与所发数据的实际情况相相应。HTML页面中才干接收到。否则不报错。但也接收不到。

    5、继续补充中

  • 相关阅读:
    Python 进度条
    python多线程的使用
    Python 进程间通信问题—Manager方法
    生产消费者模型(进程通信,队列)
    进程锁 购票问题
    多进程并行实现socket并发代码
    一次完整的socket文件的传输
    python实现基本计算器(可处理括号和负值)
    模拟论坛登录
    JS
  • 原文地址:https://www.cnblogs.com/zhchoutai/p/8336508.html
Copyright © 2011-2022 走看看