几个基本要用的东西:
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接口安全域名”,要配置成你们自己的服务器域名,后面有些微信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,才能调用微信的硬件APIdebug: false,               //是否开启调试模式,会自动弹一些消息框显示微信返回的数据appId: 这里填写appID,        //让后台返回appidtimestamp: 时间戳,          //让后台返回生成证书时用的时间戳nonceStr: 随机字符串,        //让后台返回生成证书时用的随机串signature: 证书,            //让后台返回以当前URL地址生成的证书jsApiList: [                //需要调用的接口,都得在这里面写一遍"openWXDeviceLib",//初始化设备库(只支持蓝牙设备)"closeWXDeviceLib",//关闭设备库(只支持蓝牙设备)"getWXDeviceInfos",//获取设备信息(获取当前用户已绑定的蓝牙设备列表)"sendDataToWXDevice",//发送数据给设备"startScanWXDevice",//扫描设备(获取周围所有的设备列表,无论绑定还是未被绑定的设备都会扫描到)"stopScanWXDevice",//停止扫描设备"connectWXDevice",//连接设备"disconnectWXDevice",//断开设备连接"getWXDeviceTicket",//获取操作凭证//下面是监听事件:"onWXDeviceBindStateChange",//微信客户端设备绑定状态被改变时触发此事件"onWXDeviceStateChange",//监听连接状态,可以监听连接中、连接上、连接断开"onReceiveDataFromWXDevice",//接收到来自设备的数据时触发"onScanWXDeviceResult",//扫描到某个设备时触发"onWXDeviceBluetoothStateChange",//手机蓝牙打开或关闭时触发]
});

上面这个方法,在进入页面时应该首先被调用,这是初始化微信JS-SDK
其中:
beta 这个参数需设为true,才能调用那些微信还没有正式开放的新接口
appID,timestamp,nonceStr,signature这几个由后台传递到前端。
生成证书的方法JS-SDK文档中有,此处暂时省略

4、继续写方法:

wx.ready(function(){//初始化设备库 需填写参数 公众号的原始IDwx.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页面,搞个按钮叫“刷成经典蓝牙”,用户可以自己去更新设备属性(就是授权那个地方,不是可以更新设备属性吗,让你们后台工程师写个接口,用户可以自己去把connect_protocol刷成1)

3、IOS连接设备很快很稳定,安卓连不上设备,显示“已连接0个设备”:
在微信硬件平台的文档里面的某个地方,有一句话,说安卓设备要先订阅个什么东西,订阅上了,这个时候再连接就OK,因为设备只发了一次Auth和Init包,如果错过这个时机,就错过了…就再也连不上了,除非设备断电重启。
但IOS估计是订阅那个什么东西非常快,不会过期,所以一下就连上了。
(2016-9-23更新:听IOS工程师说:IOS连接蓝牙只需要3步,非常快非常稳定。安卓需要5步,其中2步容易失败,就是错过了某个时机就连不上了。貌似微信官方也没有好的解决办法。我们是让硬件开发人员写了个重新连接的机制。但是也不是很好用)

那句话具体在什么地方,我真的找不到了,微信太坑了。
目前的解决办法:蓝牙板子是有相关接口的,蓝牙板子可以得到当前手机的连接状态。所以如果当前微信显示的是“正在连接中…”,这个时候,让硬件开发人员再发送Auth和Init包。

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

5、继续补充中

微信硬件蓝牙开发各种坑不完全开发指南相关推荐

  1. php扫描蓝牙设备接口,微信硬件蓝牙扫描某个设备接口onScanWXDeviceResult

    好久没更新微信硬件蓝牙开发的技术文章了,最近闲来无事,翻了翻系列文章以及微信硬件jsapi接口,发现onScanWXDeviceResult扫描某个设备接口并没有做案例demo给大家分享出来,所以接着 ...

  2. 微信硬件蓝牙教程全集

    微信硬件蓝牙教程: 微信公众号蓝牙开发准备工作(第一课) java,H5微信蓝牙设备开发教程申请设备和添加设备(第二课) 微信蓝牙设备开发教程之获取设备deviceid和二维码(第三课) 微信蓝牙设备 ...

  3. 微信硬件蓝牙开发指南

    几个基本要用的东西: 1.微信公众平台 网址:https://mp.weixin.qq.com 可以在此申请微信公众号,获取微信测试号. 微信测试号拥有所有功能权限,如果你有正式的企业服务号,就不必用 ...

  4. 微信硬件蓝牙开发教程之添加蓝牙设备(1)

    @V型知识库原创    已推出最新微 信硬件jsapi学习笔记 地址 http://www.vxzsk.com/282.html 申请设备功能 a. 登录公众平台,点击左边功能栏的"添加功能 ...

  5. 微信硬件蓝牙设备开发之设备解绑(13)

    文章来源 http://www.vxzsk.com/158.html 微信绑定设备后,有时候用户需求的变化并不需要这个设备了,那么此时如何解绑设备呢,其实微信解绑设备有两种方式,一种方式就是在微信ap ...

  6. 智能硬件蓝牙配网方案概要

    智能硬件开发系列 Google Protobuf 实践使用开发 智能硬件蓝牙配网方案概要 JNI开发必学C++基础 JNI开发必学C++使用实践 Android Studio 4.0.+NDK项目开发 ...

  7. 【微信小程序控制硬件16 】 安信可 ESP32-S 开发板实现移植腾讯物联开发平台蓝牙 llsync 协议,实现一键蓝牙快速配网+远程控制。(附带源码)

    文章目录 一.前言 二.源码目录说明 三.编译指导 四.常见问题 五.开源微信物联网控制一览表 另外,不要把我的博客作为学习标准,我的只是笔记,难有疏忽之处,如果有,请指出来,也欢迎留言哈! 微信物联 ...

  8. 【支付宝小程序控制硬件①】 申请个人支付宝小程序开发的个人账户,说说那些睬坑日志,集成mqtt协议在支付宝小程序,实现基本通讯!

    [支付宝小程序控制硬件①] 申请个人支付宝下程序开发的个人账户,认识支付宝小程序框架结构,做好智能控制第一步! 文章目录 一.前言: 二.回忆支付宝小程序移植的过程: 三.注册账号了解支付宝开发者工具 ...

  9. h5键盘把页面顶走了_微信h5开发的坑

    记一次微信h5开发的坑... 正常的效果如下: 本身用的cube-ui开发,上半部分是自己写的,下边用的是better-scroll,为了滑动更流畅.这个页面前边有一个登录页面,登录之后就会跳到这个首 ...

最新文章

  1. Scala 学习笔记(1)
  2. Linux系统的启动过程
  3. 主成分分析(PCA)和独立成分分析(ICA)相关资料
  4. oracle rman备份慢,诊断Oracle RMAN备份慢的原因
  5. python的numpy是什么_python中numpy是什么
  6. 数值分析方程求根实验matlab,基于matlab的数值分析( 非线性方程求根)上机实验报告1...
  7. ruby中文文档下载
  8. React第一天(尚硅谷视频)
  9. ASP.Net中控件的EnableViewState属性 (转)
  10. matlab newton插值法,Matlab程序Newton插值函数
  11. 2018年迎春杯复赛入围名单(五年级)
  12. BI数据分析师究竟是做什么的?
  13. 青龙面板+傻妞+JD(自用)
  14. STM32学习心得三十四:外部SRAM原理及实验代码解读
  15. 有服务器端源码和客户端源码,C# 远程控制软件源码(含服务器端和客户端源码)...
  16. vue设置页面title
  17. devmem读写物理内存
  18. PMP考试时间推迟了,如何办理退缓考?
  19. 真机测试出现INSTALL_FAILED_USER_RESTRICTED安装错误
  20. 学计算机的基础教程视频,新手学电脑全套视频教程(1-27集)

热门文章

  1. TDS (Tivoli Directory Server)学习指南
  2. Ansys专题仿真分析全套视频教程
  3. 五年平均增速用计算机怎么算,行测重要知识点:年均增长率的计算
  4. 玩转大学——大学新生入学告诫
  5. 【GANs学习笔记】(六)JS Divergence不是最好的Divergence
  6. UJN_DS实验和作业(仅供参考)
  7. WIN10 MDK Keil uVision5 cannot read project file 解决办法
  8. 有点无聊,来用Python制作代码雨
  9. Which Clustering Do You Want? Inducing Your Ideal Clustering with Minimal Feedback 论文翻译
  10. 20150218【改进Poll定时查询】IMX257实现GPIO-IRQ中断按键获取键值驱动程序