http://www.vxzsk.com/142.html这个网站的教程相当详细,本文只是自己测试总结一些相关内容。
- 平台接入流程
http://iot.weixin.qq.com/wiki/new/index.html?page=3-1 官网有详细截图说的哦。官网的看不明白只能找客服人员了。
- 设备授权
调用 设备授权新接口 ,获取deviceid和二维码,然后利用获取到的deviceid更新设备属性(如mac地址,connect_protocol等)。
获取到的二维码即为一个硬件一个,设备厂商利用二维码生成器把获取到的二维码串生成为二维码,用户扫描该二维码后,关注厂商公众号,即可绑定设备。
注意:设备授权时必须填上product_id。
- 获取设备deviceid和二维码URL
使用的是新接口不需要厂商提供deviceid
http://iot.weixin.qq.com/wiki/document-2_11.html官网的接口介绍请仔细自行查看
接口需要产品ID在公众号平台查看
接下来就是用调用接口生成deviceid 和二维码 url
- Java版本的方法
/** * 微信蓝牙授权新接口 */ public final static String DeviceUrl_new = "https://api.weixin.qq.com/device/getqrcode?access_token=ACCESS_TOKEN&product_id=PRODUCT_ID"; public static String getDeviceNew(String appid, String appsecret,String productid){ AccessToken token = new AccessToken(); token = WeixinUtil.getAccessToken(appid, appsecret); String requestUrl = DeviceUrl_new.replace("ACCESS_TOKEN",token.getToken()).replace("PRODUCT_ID", productid); JSONObject jsonObject =WeixinUtil.httpRequest(requestUrl, "GET",null); if(jsonObject.getString("deviceid")!=null){ System.out.println(jsonObject.toString()); }else{ System.out.println("错误信息"+jsonObject.getString("errcode") +"\n "+jsonObject.getString("errmsg")); log.error("error"); } return jsonObject.toString(); }
- 获取AccessToken的接口
// 获取access_token的接口地址(GET) 限200(次/天) public final static String access_token_url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET"; /** * 获取access_token * @param appid 凭证 * @param appsecret 密钥 * @return */ public static AccessToken getAccessToken(String appid, String appsecret) { AccessToken accessToken = null; String requestUrl = access_token_url.replace("APPID", appid).replace("APPSECRET", appsecret); JSONObject jsonObject = httpRequest(requestUrl, "GET", null); // 如果请求成功 if (null != jsonObject) { try { accessToken = new AccessToken(); accessToken.setToken(jsonObject.getString("access_token")); accessToken.setExpiresIn(jsonObject.getInt("expires_in")); Constants.setAccessToken(accessToken); } catch (JSONException e) { // 获取token失败 log.error("获取token失败 errcode:{} errmsg:{}", jsonObject.getInt("errcode"), jsonObject.getString("errmsg")); } } return accessToken; }
- 正确返回的JSON数据中包含了deviceid 和 二维码URL(qrticket)
{resp_msg:{"ret_code":0," error_info":"ok"},"deviceid":"gh_d50b0b739699_8888888888888888","qrticket":"http://we.qq.com/d/AQDZUo2O9Mu6Bt9__kwMIiMCHiSTzrXqPc1npqXX"}
- 通过百度搜索相关生成二维码工具生成
- 对蓝牙设备授权
- Java版本对蓝牙设备授权绑定deviceid
/** * deviceid更新到设备上 */ public final static String DeviceUrl = "https://api.weixin.qq.com/device/authorize_device?access_token=ACCESS_TOKEN"; public static String getDevice(String appid, String appsecret,String devices){ AccessToken token = new AccessToken(); token = WeixinUtil.getAccessToken(appid, appsecret); String requestUrl = DeviceUrl.replace("ACCESS_TOKEN",token.getToken()); JSONObject jsonObject =WeixinUtil.httpRequest(requestUrl, "POST", devices); if(jsonObject.getString("errcode").equals("0")){ }else{ System.out.println("错误信息"+jsonObject.getString("errcode") +"\n "+jsonObject.getString("errmsg")); log.error("error"); } return jsonObject.toString(); }
- 对接口要求的JSON格式进行javabean封装
1.Bluetooth public class Bluetooth implements Serializable{ private String device_num;// 设备id的个数 private List
device_list; //设备id的列表,json的array格式,其size必须等于device_num private String op_type;// 请求操作的类型,限定取值为:0:设备授权(缺省值为0) 1:设备更新(更新已授权设备的各属性值) }2.DeviceList public class DeviceList { private String id; //设备的deviceid private String mac; // 设备的mac地址 格式采用16进制串的方式(长度为12字节) private String connect_protocol; // android classic bluetooth – 1 ios classic bluetooth – 2 ble – 3 wifi -- 4 private String auth_key; // auth及通信的加密key,第三方需要将key烧制在设备上(128bit),格式采用16进制串的方式(长度为32字节),不需要0X前缀,如: 1234567890ABCDEF1234567890ABCDEF private String close_strategy; //断开策略,目前支持: 1:退出公众号页面时即断开连接 2:退出公众号之后保持连接不断开 private String conn_strategy; //连接策略,32位整型,按bit位置位,目前仅第1bit和第3bit位有效(bit置0为无效,1为有效;第2bit已被废弃),且bit位可以按或置位(如1|4=5),各bit置位含义说明如下:// 1:(第1bit置位)在公众号对话页面,不停的尝试连接设备 // 4:(第3bit置位)处于非公众号页面(如主界面等),微信自动连接。当用户切换微信到前台时,可能尝试去连接设备,连上后一定时间会断开 private String crypt_method; //auth加密方法,目前支持两种取值: 0:不加密 1:AES加密(CBC模式,PKCS7填充方式) private String auth_ver; // auth version,设备和微信进行auth时,会根据该版本号来确认auth buf和auth key的格式(各version对应的auth buf及key的具体格式可以参看“客户端蓝牙外设协议”),该字段目前支持取值: 0:不加密的version 1:version 1 private String manu_mac_pos; // 表示mac地址在厂商广播manufature data里含有mac地址的偏移,取值如下: -1:在尾部、 -2:表示不包含mac地址 其他:非法偏移 private String ser_mac_pos; //表示mac地址在厂商serial number里含有mac地址的偏移,取值如下: -1:表示在尾部 -2:表示不包含mac地址 其他:非法偏移 private String ble_simple_protocol; //精简协议类型,取值如下:计步设备精简协议:1 (若该字段填1,connect_protocol 必须包括3。非精简协议设备切勿填写该字段)set/get省略 - 返回的数据JSON
2.deviceid绑定到设备上 Bluetooth bluetooth = new Bluetooth(); bluetooth.setDevice_num("1"); bluetooth.setOp_type("1"); List
list = new ArrayList (); DeviceList deviceList = new DeviceList(); deviceList.setId("gh_d50b0b739699_88888888888888"); deviceList.setMac("MAC地址 就是蓝牙设备的地址"); deviceList.setConnect_protocol("3"); deviceList.setAuth_key(""); deviceList.setClose_strategy("1"); deviceList.setConn_strategy("1"); deviceList.setCrypt_method("0"); deviceList.setAuth_ver("0"); deviceList.setManu_mac_pos("-1"); deviceList.setSer_mac_pos("-2"); deviceList.setBle_simple_protocol("0"); list.add(deviceList); bluetooth.setDevice_list(list); JSONObject jsonObject = new JSONObject(); JSONObject object = JSONObject.fromObject(bluetooth); JSONArray object2 = object.getJSONArray("device_list"); String device = jsonObject.fromObject(bluetooth).toString(); String str = WeixinUtil.getDevice(Constants.appId, Constants.appSecret, device); [{"base_info":{"device_type":"gh_d9999999999","device_id":"gh_d50b0b739699_88888888888"},"errmsg":"ok","errcode":0}]}
- 通过微信扫一扫进行绑定 第一次扫描会显示绑定设备
1.点击绑定并进入公众号 后台会收到相关的事件 博主没有做处理只是一个简单的获取
2.在公众号里面会显示链接状态 显示已连接一个设备
3.写个H5 通过jsapi获取相关事件 推送到服务器 进行处理哦(只做了一部分)
- 页面的代码
<%@page language="java" contentType="text/html; charset=UTF-8"%> <%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";session.setAttribute("basePath",basePath);%>
测试蓝牙 搜索蓝牙停止搜索获取设备信息连接蓝牙发送数据 - servlet跳转到页面的代码
public class BlueServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { WeixinUtil util = new WeixinUtil(); JsapiTicket jt = util.getJsapiTicket(Constants.appId,Constants.appSecret); String ticket = jt.getTicket(); StringBuffer url = request.getRequestURL(); System.out.println("jssdk=" + ticket); System.out.println("获取的路径==" + url); Map
t = Sign.sign(ticket, url.toString()); request.setAttribute("sign", t); request.getRequestDispatcher("/blue.jsp").forward(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); }}
是否打开蓝牙都会有提示 开始扫描就会扫描到没有链接但是属于当前公众号的设备 这块就可以进行扫描到的设备进行读取信息 处理信息了。这块博主还在测试中。根据以上内容 对一个蓝牙设备连接绑定是没有问题的。具体有官网文档仔细说明。建议相关术语查询官网文档。有大神也可以指导博主的问题哦。大家共同进步。喷子请走开。