微信公众号开发——3、硬件设备接入

关键参考文档:微信硬件平台


一、为设备添加产品

1、在认证过的服务号或订阅号下,在微信公众平台添加“设备功能”插件。公众测试号提供设备功能接口,供开发者测试使用。

2、在公众号平台的“测试号管理”下,选择“设备功能接口”并对其进行设置,进入“产品管理界面”并选择“添加产品”。

3、产品添加成功后,会为每一类型的产品提供一个产品编号,该产品编号在为设备授权时,以product_id字段为每个产品授权,默认分配100个测试产品。

重点参数:

每个产品唯一的二维码:微信硬件平台要求每一个注册设备都有唯一的设备编号,设备开发者可以调用微信 后台接口生成带设备编号的二维码,每个二维码需要与每台设备一一对应。用户购买产 品的同时拿到设备二维码,通过扫描设备二维码就可以在微信上直接绑定该设备

每种型号唯一的二维码:型号二维码是指一个二维码对应某一个类别/型号的产品,不包含某个具体设备的信息,因此在设备生产过程中,不需要二维码与设备进行一一对应。用户使用扫一扫,扫描品类二维码时,微信客户端会通过局域网发现技术搜索该类别/型号的设备,发现后再进行绑定。因此,使用型号二维码的设备必须支持微信AirKiss局域网发现(即AirKiss2.0)

微信配网:通过微信公众号使用AirKiss技术为硬件设备进行连网配置。

蓝牙配网:通过微信公众号使用AirSync技术为硬件设备进行连网配置。


二、获取设备二维码:

型号二维码(每种型号唯一的二维码):在添加产品时,若选择了产品二维码对应类型,在设备管理的产品详情,可以找到对应产品对应的二维码。

一机一码(每个产品唯一的二维码):每授权一个设备,产品对应授权配额将为减少减少一个。通过以下两种方式进行授权

方案一:第三方获取deviceid和设备二维码(由微信公众平台生成设备id,根据产品id和公众账号access_token随机授权一台设备,并生成deviceid),调用微信接口如下

	private void getqrcode(String token, String productid) throws Exception{
		String initUrl = "https://api.weixin.qq.com/device/getqrcode?access_token=" + token + "&product_id=" + productid;
		doGet(new URL(initUrl));
	}
	protected String doGet(URL url) throws Exception{
		HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
		StringBuffer sb = new StringBuffer();
		String line = "";
		BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
		if (connection.getResponseCode() == HttpsURLConnection.HTTP_OK) {
			while((line = reader.readLine()) != null){
				sb.append(line);
			}
		}
		reader.close();
		connection.disconnect();
		return sb.toString();
	}
返回结果格式如下:

{
	"base_resp":
	{
		"errcode":0,
		"errmsg":"ok"
	},
	"deviceid":"deviceid",
	"qrticket":"qrticket",
	"devicelicence":"devicelicence"
}

其中,deviceid表示每个设备对应的标识,qrticket是该设备对应的二维码链接,通过草料二维码即可生成相应二维码,devicelicence为设备证书,可提供给设备作为凭据。之后需要为设备进行授权,方可在网页中获取设备信息,并为设备配网。

该授权过程同方案2,但post数据格式不同,不需要productid为参数,op_type设为1,post数据格式如下

{
    "device_num":"1",
    "device_list":[
    {
        "id":"deviceid",
        "mac":"1cda27c12d69",
        "connect_protocol":"4",
        "auth_key":"Abcdef1234566543abcdef1234566544",
        "close_strategy":"2",
        "conn_strategy":"1",
        "crypt_method":"0",
        "auth_ver":"0",
        "manu_mac_pos":"-1",
        "ser_mac_pos":"-2",
        "ble_simple_protocol": "0"
    }
    ],
    "op_type":"1"
}
方案二:第三方公众账号将deviceid及其属性提交到公众平台,并进行授权,之后再调用微信接口获取对应设备的获取二维码(需要硬件设备提供deviceid及其他属性信息),post调用微信接口如下,其中本文post参数从文件中读取。

授权过程(如果deviceid已经被授权过,则不能重新授权):

	private void authorizeDevices(String token, String postFilePath ) throws Exception{
		URL url = new URL("https://api.weixin.qq.com/device/authorize_device?access_token=" + token);
		doPost(url, postFilePath);
	}
	protected void doPost(URL url, String postFilePath) throws Exception{
		HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
        connection.setConnectTimeout(5*1000);
        connection.setReadTimeout(5*1000);
        connection.setDoOutput(true);
        connection.setDoInput(true);
        connection.setUseCaches(false);
        connection.setRequestMethod("POST");
        connection.setRequestProperty("Charset","utf-8");
        connection.setRequestProperty("Content-Disposition","utf-8");
        String params = readfile(postFilePath);
        OutputStream os = connection.getOutputStream();
        os.write(params.getBytes());
        os.flush();
        os.close();
        if (connection.getResponseCode() == HttpsURLConnection.HTTP_OK){
            InputStream is = connection.getInputStream();
            StringBuilder sb = new StringBuilder();
            byte[] bytes = new byte[1024];
            int i = 0;
            while ((i = is.read(bytes)) != -1){
                sb.append(new String(bytes,0,i,"utf-8"));
            }
            is.close();
        }
        os.close();
        connection.disconnect();
	}
	private String readfile(String path) throws Exception{
		FileReader fileReader = new FileReader(path);
		BufferedReader reader = new BufferedReader(fileReader);
		StringBuffer sBuffer = new StringBuffer();
		String line = "";
		while((line = reader.readLine()) != null){
			sBuffer.append(line);
		}
		fileReader.close();
		reader.close();
		return sBuffer.toString();
	}
post文件格式如下,一次授权设备数量建议不超过5个。
{
    "device_num":"1",
    "device_list":[
    {
        "id":"test",
        "mac":"1cda27c12d69",
        "connect_protocol":"4",
        "auth_key":"Abcdef1234566543abcdef1234566544",
        "close_strategy":"2",
        "conn_strategy":"1",
        "crypt_method":"1",
        "auth_ver":"1",
        "manu_mac_pos":"-1",
        "ser_mac_pos":"-2",
        "ble_simple_protocol": "0"
    }
    ],
    "op_type":"0",
    "product_id": "40332"
}
微信服务器返回数据格式如下:

{
	"resp":
	[{
		"base_info":
			{
				"device_type":"gh_3ec41c424",
				"device_id":"test"
			},
		"errcode":0,"errmsg":"ok"
	}]
}
其中device_type表示微信公众号的原始id,device_id表示硬件设备所提供的唯一标识。

根据device_id生成二维码过程(建议获取二维码链接一次不超过5个):

	private void create_qrcode(String token, String postFilePath) throws Exception{
		URL url = new URL("https://api.weixin.qq.com/device/create_qrcode?access_token=" + token);
		doPost(url, postFilePath);
	}
发送post数据格式如下:

{
    "device_num":"1",
    "device_id_list":[
		"test"
		]
}
返回对应的二维码格式如下:

{
	"errcode":0,
	"errmsg":"ok",
	"device_num":1,
	"code_list":
	[{
		"device_id":"test",
		"ticket":"http://we.qq.com/d/AQA0CYHUzuT6DRPIo9pmjSA9yq2SPqcfv6z5"
	}]
}
通过草料二维码即可生成相应的二维码图片。


三、公众号绑定设备

1、使用型号二维码绑定设备:

微信扫码型号二维码:将首先进入网络配置模式,设备需要具备微信配网(Airkiss)或蓝牙配网(AirSync)的功能。微信将通过局域网发现功能区蓝牙发现功能搜索相应设备,并为设备进行网络配置。

2、使用一机一码绑定设备:

扫码绑定即可。

3、微信中查看绑定的设备:

路径:"我"->"设置"->"设备"。


四、在网页中获取设备信息

关键信息:用户openid,参考”微信网页开发“第三部分,两种方式获取openid。

	public String getBindDevicesByOpenId(String token, String open_id) throws Exception{
		String url = "https://api.weixin.qq.com/device/get_bind_device?access_token=" + token + "&openid=" + open_id;
		 String connect = doGet(new URL(url));
		 return connect;
	}
获取数据格式如下:

{
	"resp_msg":
	{
		"ret_code":0,
		"error_info":"ok"
	},
	"openid":"oNAmB1KA5ykfs09m02N0AhcUk",
	"device_list":
	[
		{
			"device_type":"gh_3154bc424",
			"device_id":"AA25799",
			"sub_device_list":[]
		},
		{
			"device_type":"gh_3154bc424",
			"device_id":"test",
			"sub_device_list":[]
		}
	]
}


五、为设备配置网络

1、型号二维码:

使用微信扫一扫型号二维码,按流程即可成功为已进入网络配置模式的设备进行配置网络。

2、一机一码:

在网页中调用JsApi接口为设备配置网络。在jsp网页配置如下:

注意事项:

1、注入js文件:

2、确保signature有效,保证网页有权调用接口,可设置bubug:true开启调试模式

你可能感兴趣的:(微信开发)