2016-08-25 09:44:58 linfanhehe 阅读数 7019

已推出最新微信硬件jsapi学习笔记 地址 http://www.vxzsk.com/282.html

要想获取设备的deviceid和设备的二维码,必须满足1个条件,设备所属的产品号码product_id,产品的id在添加设备列表中查询,@V型知识库原创如下图:


红色圈箭头所指的就是产品号码product_id

java代码如下:

package com.wepayweb.weixin.util.device;
/***
 * V型知识库 www.vxzsk.com
 */
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
public class DeviceTest {
     
    public static String sendGet(String url, String charset, int timeout)
      {
        String result = "";
        try
        {
          URL u = new URL(url);
          try
          {
            URLConnection conn = u.openConnection();
            conn.connect();
            conn.setConnectTimeout(timeout);
            BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream(), charset));
            String line="";
            while ((line = in.readLine()) != null)
            {
             
              result = result + line;
            }
            in.close();
          } catch (IOException e) {
            return result;
          }
        }
        catch (MalformedURLException e)
        {
          return result;
        }
         
        return result;
      }
 
    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        String access_token="";//
        String product_id="";
        String data = DeviceTest.sendGet("https://api.weixin.qq.com/device/getqrcode?access_token="+access_token+"&product_id="+product_id, "utf-8", 30000);
        System.out.println("获取设备的deviceid和二维码:"+data);
    }
 
}
main方法中大概是49行acess_token参数请参考如何获取access_token章节。

第二个参数product_id已经在上面说过,还是不清楚的读者请看上面的图片所标示的。

执行main方法后,返回的数据大概结构如下:

正确的Json返回结果:

{"base_resp":{"errcode":0,"errmsg":"ok"},"deviceid":"gh_1755c346b0b9_004cb738ac631af0","qrticket":"http:\/\/we.qq.com\/d\/AQ2DBteOl389f6b19HSo_uPMm-7ubPTjFztb-iCSa"}
上面的json字符串是我给我自己的蓝牙设备产品生成了一个唯一的二维码,deviceid已经写的很清楚了,可能初学者很迷惑,二维码呢?在哪里在哪里?其实qrticket这个字段就是二维码,我们把qrticket的值复制出来,然后百度二维码生成器,把连接复制到生成器里点击生成即可生成图片样式的二维码,操作如下:



图示中的链接实际上有个小问题,就是"\"一定要去掉

错误的Json返回示例:

{resp_msg:{"ret_code":-1," error_info":"system error"}}

如果返回错误 请核查自己的product_id和access_token是否正确。

好了,到此我们已经获取到蓝牙设备的deviceid和二维码了,特别说明:我们这里生成的deviceid并不是硬件厂商给设备烧制的id而是微信公众平台自行给我们生成的设备id 和硬件厂商烧制的并不是同一个id。

提醒读者,生成设备的二维码图片不要急于打开微信和手机蓝牙,扫描绑定设备连接,因为我们只是生成了设备的二维码和id而已,即使绑定设备后,也是无法和设备的进行蓝牙连接的,因为我们还未给设备授权。下一节将会讲解设备授权,敬请期待!



 

2017-06-14 11:07:12 linfanhehe 阅读数 1764
2017-06-14 14:01:00 weixin_30296405 阅读数 7
2019-07-13 16:54:38 qq_41786458 阅读数 165

let deviceId = "asdasdas",//蓝牙设备id  如何获取见上一篇文章
    serviceId = "adasdsa";//蓝牙服务id
Page({
    onLoad: function (options) {
        var _this = this;
        _this.getBLEDeviceCharacteristics();//获取蓝牙特征值
    },
    getBLEDeviceCharacteristics: function () {//获取特征值
        var _this = this;
        wx.getBLEDeviceCharacteristics({
            deviceId: deviceId,
            serviceId: serviceId,
            success: function (res) {
                let charc4 = res.characteristics[4];//读取第五个特征值
                let cd100 = charc4.uuid;
                let read = charc4.properties.read;//该特征值是否支持 read 操作
                let write = charc4.properties.write;//该特征值是否支持 write 操作
                let notify = charc4.properties.notify;//该特征值是否支持 notify 操作
                if (!read||!write||!notify) { return; }
                setTimeout(function () {
                    _this.writeCmd(cd100);//开始写命令到特征值
                    wx.onBLECharacteristicValueChange(function (res) {//获取蓝牙特征值变化
                        var cmd = ab2hex(res.value);//获取到特征值
                        if (cmd == "13123") {
                            wx.closeBLEConnection({//断开连接
                                deviceId,
                                success(res) { }
                            })
                            wx.closeBluetoothAdapter({//关闭蓝牙模块
                                success(res) { }
                            })
                        }
                    })
                }, 200);
            }, fail: function (res) {
                console.log(res);
            }
        })
    },
    writeCmd: function (cd100) {
        var _this = this;
        let cmd = "13123";//写入蓝牙的指令 需转为buffer
        wx.writeBLECharacteristicValue({
            deviceId: deviceId,
            serviceId: serviceId,
            characteristicId: cd100,
            value: _this.string2buffer(cmd),
            success(res) {
                setTimeout(function () {
                    wx.readBLECharacteristicValue({//写入成功后读取该特征值
                        deviceId: deviceId,
                        serviceId: serviceId,
                        characteristicId: cd100,
                        success() { },
                        fail() { }
                    })
                    wx.notifyBLECharacteristicValueChange({//监听特征值变化
                        state: true,
                        deviceId: deviceId,
                        serviceId: serviceId,
                        characteristicId: cd100,
                        success(res) { }
                    })
                }, 200)
            }, fail(err) {
                _this.writeCmd(cd100);
            }
        })
    },
    ab2hex: function (buffer) {//buffer 转字符串
        let hexArr = Array.prototype.map.call(
            new Uint8Array(buffer),
            function (bit) {
                return (bit.toString(16)).slice(-2)
            }
        )
        return hexArr.join('');
    },
    string2buffer: function (str) {//将字符串转为16进制
        let val = ""
        for (let i = 0; i < str.length; i++) {
            if (val === '') {
                val = str.charCodeAt(i).toString(16)
            } else {
                val += ',' + str.charCodeAt(i).toString(16)
            }
        }
        return new Uint8Array(val.match(/[\da-f]{2}/gi).map(function (h) {
            return parseInt(h, 16)
        })).buffer;
    }
})
2016-08-19 11:49:05 nvzizhou 阅读数 7618

很多朋友私信我说通过我的方法没有得到解决,下面这个就是最佳的解决方案:

在输出 $echoStr之前加上header('content-type:text');就行。

在index.php中的加header('content-type:text');或者header('content-type:text/html; chartset=utf-8')


获取微信用户code,通过code,得到用户UserId或者是OpenId,因为返回结果如果是userId,就说明是企业的内部成员,如果获取的是openId,就证明不是内部成员,然后再跳转到其他页面。


下面是微信企业号官方提供的实例:

  • 返回结果

a)企业成员授权时返回示例如下:

{
   "UserId":"USERID",
   "DeviceId":"DEVICEID"
}
参数 说明
UserId 成员UserID
DeviceId 手机设备号(由微信在安装时随机生成,删除重装会改变,升级不受影响,同一设备上不同的登录账号生成的deviceid也不同)

b)非企业成员授权时返回示例如下:

{
   "OpenId":"OPENID",
   "DeviceId":"DEVICEID"
}
参数 说明
OpenId 非企业成员的标识,对当前企业号唯一
DeviceId 手机设备号(由微信在安装时随机生成,删除重装会改变,升级不受影响)

c)出错时返回示例如下:

{
   "errcode": "40029",
   "errmsg": "invalid code"
}


代码:

<?php  

$appid = "请输入您企业的appid";  
$secret = "请输入您企业的secreat";   
$code = $_GET["code"];  //获取登录进来的用户code
 
header('content-type:text/html;charset=utf-8');//一定要加上这段代码,一定一定切记切记

$get_token_url = 'https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid='.$appid.'&corpsecret='.$secret.'';
$access_token = json_decode(file_get_contents($get_token_url));  
$access_tokens = $access_token->access_token;  

//print_r( $access_tokens );

$get_Userid = 'https://qyapi.weixin.qq.com/cgi-bin/user/getuserinfo?access_token='.$access_tokens.'&code='.$code.'';
$userIds = json_decode(file_get_contents($get_Userid));  
$users = $userIds->UserId;  
 
if( $userIds->UserId){
    //print_r($users ); 
    $url = "http://www.baidu.com/";  
    echo '<script language="JavaScript">window.location.href="跳转的页面index.html?userId='.$users.'";</script>';
}else if( $userIds->OpenId){
    //print_r("error");
    echo '<script language="JavaScript">alter("您当前未授权,请联系管理员!");</script>';
}
 
/*
$openid = $access_token->openid;  
$get_user_info_url = 'https://api.weixin.qq.com/sns/userinfo?access_token='.$access_tokens.'&openid='.$openid.'&lang=zh_CN'; //获取用户信息的url  
$user_info = json_decode(file_get_contents($get_user_info_url));  

//print_r($user_info);

$_SESSION['user'] = $user_info;   
echo $user_info->nickname;//得到用户信息  
echo $user_info->headimgurl;  
*/

?>  




web版微信协议分析

阅读数 2629

没有更多推荐了,返回首页