博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
微信硬件平台对接--蓝牙
阅读量:6590 次
发布时间:2019-06-24

本文共 8156 字,大约阅读时间需要 27 分钟。

hot3.png

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

  1. 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();	}

     

  2. 获取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;	}

     

  3. 正确返回的JSON数据中包含了deviceid 和 二维码URL(qrticket)
    {resp_msg:{"ret_code":0," error_info":"ok"},"deviceid":"gh_d50b0b739699_8888888888888888","qrticket":"http://we.qq.com/d/AQDZUo2O9Mu6Bt9__kwMIiMCHiSTzrXqPc1npqXX"}

     

  4. 通过百度搜索相关生成二维码工具生成
  • 对蓝牙设备授权
  1. 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();	}

     

  2.  对接口要求的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省略

     

  3. 返回的数据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); }}

     

是否打开蓝牙都会有提示  开始扫描就会扫描到没有链接但是属于当前公众号的设备 这块就可以进行扫描到的设备进行读取信息 处理信息了。这块博主还在测试中。根据以上内容 对一个蓝牙设备连接绑定是没有问题的。具体有官网文档仔细说明。建议相关术语查询官网文档。有大神也可以指导博主的问题哦。大家共同进步。喷子请走开。

 

 

 

转载于:https://my.oschina.net/xshuai/blog/794191

你可能感兴趣的文章
绕开“陷阱“,阿里专家带你深入理解C++对象模型的特殊之处
查看>>
ElasticSearch
查看>>
9-51单片机ESP8266学习-AT指令(测试TCP服务器--51单片机程序配置8266,C#TCP客户端发信息给单片机控制小灯的亮灭)...
查看>>
香港设计师带来仿生机器人,其身体 70% 构造均由3D打印完成
查看>>
不规则物体形状匹配综述
查看>>
自动化设计-框架介绍 TestCase
查看>>
CJ看showgirl已经out!VR体验才是王道
查看>>
Vue+Webpack常见问题(持续更新)
查看>>
Manually Summarizing EIGRP Routes
查看>>
spring boot 1.5.4 整合webService(十五)
查看>>
modsecurity(尚不完善)
查看>>
获取.propertys文件获取文件内容
查看>>
Redis3.0.5配置文件详解
查看>>
Know about Oracle RAC Heartbeat
查看>>
JQuery——实现Ajax应用
查看>>
前端05.js入门之BOM对象与DOM对象。
查看>>
oracle kill所有plsql developer进程
查看>>
keepalived双机热备原理及实例部署LVS+keepalived
查看>>
曲线学习PyQt5方案一
查看>>
OpenCV学习】矩阵运算和操作2
查看>>