微信蓝牙设备开发教程之蓝牙设备授权(第四课)

2016年08月09日 13:22 | 5935次浏览 | 分类: 微信蓝牙开发 作者原创 版权保护

完整微信硬件接入案例源码:点我下载案例源码

设备授权:新接口,厂商不需要提供deviceid

为了简化第三方厂商的生产流程,降低接入微信的门槛,公众平台提供了新的设备授权接口。新接口中,deviceid由微信生成,作为设备在微信平台的唯一标识,第三方不需要在固件中烧入deviceid。deviceid和设备二维码在上一节已经讲过,不明白的读者可点击获取设备deviceid和设备二维码查看。

设备授权流程如下:

设备功能服务器设置:

这是微信硬件设备服务器设置,如果硬件设备类型返回到H5界面,可关闭此项功能。

连接硬件后交互数据的返回有两种,一种就是硬件通过蓝牙返回到服务器端,也就是上图中的URL地址上,另一种就是直接返回到操作的H5界面上,如果用户操作H5界面硬件无响应数据,那么极有可能微信通过硬件设备把数据返回到我们配置的URL上了。可要求硬件设备厂商修改硬件芯片程序,把程序改成返回H5界面类型。

java授权代码:

package com.wepayweb.weixin.util.device;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.URL;
import java.net.URLConnection;
/****
 * 
 * @author www.vxzsk.com V型知识库
 *
 */
public class DeviceAuthTest {
	/**
	 * V型知识库
	 * 模拟post方法
	 */
	 public static String sendPost(String requrl,String param){
		 URL url;
		  String sTotalString="";  
		try {
			url = new URL(requrl);
			 URLConnection connection = url.openConnection(); 
			 
			 connection.setRequestProperty("accept", "*/*");
			 connection.setRequestProperty("connection", "Keep-Alive");
			 connection.setRequestProperty("Content-Type", "text/xml");
			// connection.setRequestProperty("Content-Length", body.getBytes().length+"");
			 connection.setRequestProperty("User-Agent",
                     "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)");
			 
			 
		        connection.setDoOutput(true);  
		        OutputStreamWriter out = new OutputStreamWriter(connection.getOutputStream(), "utf-8");  
		        out.write(param); // 向页面传递数据。post的关键所在!  
		        out.flush();  
		        out.close();  
		        // 一旦发送成功,用以下方法就可以得到服务器的回应:  
		        String sCurrentLine;  
		      
		        sCurrentLine = "";  
		        sTotalString = "";  
		        InputStream l_urlStream;  
		        l_urlStream = connection.getInputStream();  
		        // 传说中的三层包装阿!  
		        BufferedReader l_reader = new BufferedReader(new InputStreamReader(  
		                l_urlStream));  
		        while ((sCurrentLine = l_reader.readLine()) != null) {  
		            sTotalString += sCurrentLine + "\r\n";  
		  
		        }  
		        
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}  
	       
	        System.out.println(sTotalString);  
	        return sTotalString;
	 }

	public static void main(String[] args) {
		String access_token="";//更换为自己的access_token
		String deviceId="";//调用生成二维码接口返回的设备id
		String mac="";//设备mac地址,可询问提供硬件设备的厂商人员
		String params="{\"device_num\":\"1\",\"device_list\":[{"
		           +"\"id\":\""+deviceId+"\","
		           +"\"mac\":\""+mac+"\","
		            +"\"connect_protocol\":\"3\","
		            +"\"auth_key\":\"\","
		            +"\"close_strategy\":\"1\","
		            +"\"conn_strategy\":\"1\","
		            +"\"crypt_method\":\"0\","
		            +"\"auth_ver\":\"0\","
		            +"\"manu_mac_pos\":\"-1\","
		            +"\"ser_mac_pos\":\"-2\","
		            +"\"ble_simple_protocol\": \"0\""
		            + "}],"
		            +"\"op_type\":\"1\""
		           + "}";
		  		
		  	String s=DeviceAuthTest.sendPost("https://api.weixin.qq.com/device/authorize_device?access_token="+access_token, params);
		  		System.out.println("返回:"+s);
	}

}

用户把上述代码复制到自己工程里,执行main方法即可。

在main方法中读者要填充几个参数,其中67行的access_token参数可在http://www.vxzsk.com/28.html地址参考。

68行的deviceid参数可参考获取设备id和二维码这节课程。

mac地址询问硬件设备提供商。

返回结果

成功:json方式返回授权成功的设备

{"resp":[
    {
    "base_info":
    {
    "device_type":"your_devcie_type",
    "device_id":"id"
    },
    "errcode":0,
    "errmsg":"ok"
    }
]}

错误的Json返回示例:{"errcode":42001,"errmsg":""}

接口入参:

1、 第三方调用该服务,需要拥有设备功能权限

2、 建议id字段为英文字母、下划线、数字三类字符的串或者组合,不带其他标点符号,以免json串解析失败

3、 connec_protocol为设备连接的协议类型,目前有四种连接方式(见字段说明),可以支持四种连接方式的任意组合,并且可以设置客户端优先选择的连接方式,客户端会优先选择该连接方式进行连接,若制定的优先协议无法连接成功,客户端回尝试指定的其他协议方式连接;其他类型可以后续再添加,请第三方同学确保值有效

4、 conn_strategy连接策略,按位进行定义取值(第2bit不能置位;所有bit均不置位也不支持,即取值为 0),譬如手环类产品,可能需要及时同步数据,可以填5,表示在公众号对话页面,不停的尝试连接设备(取值1),并且处于非公众号页面时,微信有机会去连接设备,保证数据能及时同步(取值4)

5、 crypt_method目前支持取值为0和1,对于计算能力弱的设备可以设置为0(不进行加密处理,此时auth_ver也需要为0),目前的加密方法只支持AES

6、 auth_ver目前只支持取值为0或1,不同的取值会影响“设备---微信---后台”的auth过程的数据包的格式,具体的取值请参看“客户端蓝牙外设协议”,并且,如果不需要加密,则crypt_method和auth_ver都需要为0,

7、 对于ios蓝牙2.0和4.0设备,微信客户端做了连接建立的弹框优化操作:对于ios蓝牙4.0协议,广播包必须带上mac地址,即:manu_mac_pos必须设置(且为-1,非ios蓝牙4.0设备才可以设置为-2);对于ios蓝牙2.0协议,iap的accessory Info的serial number可以不带mac地址,ser_mac_pos设置为-2,也可以在尾部带上mac地址,设置有效(-1),对于除以上两种协议以外的其他协议,该两个值的设置均无效,可以设置为0

此文章本站原创,地址 http://www.vxzsk.com/90.html   转载请注明出处!谢谢!

感觉本站内容不错,读后有收获?小额赞助,鼓励网站分享出更好的教程