原文链接:https://blog.csdn.net/qq_37936542/article/details/78912197

--注意:微信测试号不具备这个功能


步骤一:绑定域名   注意不要加http://

步骤二:引入js文件

--在需要调用JS接口的页面引入如下JS文件,(支持https):http://res.wx.qq.com/open/js/jweixin-1.2.0.js

  1. <script src="http://res.wx.qq.com/open/js/jweixin-1.2.0.js"></script>

步骤三:通过ajax获取参数,完成config接口注入权限验证配置

--ajax请求

  1. var url = location.href.split('#')[0];
  2. $.ajax({
  3. type:"GET",
  4. url:"signature.action?url=" + url,
  5. dataType:"json",
  6. success:function(data){
  7. if (data){
  8. wx.config({
  9. debug: false,
  10. appId: data.appid,
  11. timestamp: data.timestamp,
  12. nonceStr: data.nonceStr,
  13. signature: data.signature,
  14. jsApiList: [// 这个必须要配置,不然会报权限不足的错误
  15. 'checkJsApi',
  16. 'getNetworkType',//网络状态接口
  17. 'openLocation',//使用微信内置地图查看地理位置接口
  18. 'getLocation', //获取地理位置接口
  19. 'startSearchBeacons',//开启扫描周边设备
  20. 'stopSearchBeacons'//停止扫描
  21. ]
  22. });
  23. }
  24. }
  25. });

--后台代码

注:jsapi-ticket的获取在前一节中讲过,这里就带过

  1. @RequestMapping(value = "signature", method = RequestMethod.GET)
  2. @ResponseBody
  3. public Map<String, String> createSignature(@RequestParam String url)
  4. {
  5. System.out.println("RestFul of createSignature parameters url:"+url);
  6. return SignatureUtil.sign(tokenService.getJsapi_ticket(), url);
  7. }
  1. public static Map<String, String> sign(String jsapi_ticket, String url) {
  2. Map<String, String> ret = new HashMap<String, String>();
  3. String nonce_str = create_nonce_str();
  4. String timestamp = create_timestamp();
  5. String str;
  6. String signature = "";
  7. //注意这里参数名必须全部小写,且必须有序
  8. str = "jsapi_ticket=" + jsapi_ticket +
  9. "&noncestr=" + nonce_str +
  10. "×tamp=" + timestamp +
  11. "&url=" + url;
  12. try
  13. {
  14. MessageDigest crypt = MessageDigest.getInstance("SHA-1");
  15. crypt.reset();
  16. crypt.update(str.getBytes("UTF-8"));
  17. signature = byteToHex(crypt.digest());
  18. }
  19. catch (NoSuchAlgorithmException e)
  20. {
  21. e.printStackTrace();
  22. }
  23. catch (UnsupportedEncodingException e)
  24. {
  25. e.printStackTrace();
  26. }
  27. ret.put("url", url);
  28. ret.put("jsapi_ticket", jsapi_ticket);
  29. ret.put("nonceStr", nonce_str);
  30. ret.put("timestamp", timestamp);
  31. ret.put("signature", signature);
  32. ret.put("appid", WeChatInfo.WX_APPID);
  33. return ret;
  34. }
  35. private static String byteToHex(final byte[] hash) {
  36. Formatter formatter = new Formatter();
  37. for (byte b : hash)
  38. {
  39. formatter.format("%02x", b);
  40. }
  41. String result = formatter.toString();
  42. formatter.close();
  43. return result;
  44. }
  45. private static String create_nonce_str() {
  46. return UUID.randomUUID().toString();
  47. }
  48. private static String create_timestamp() {
  49. return Long.toString(System.currentTimeMillis() / 1000);
  50. }

步骤四:通过ready接口处理成功验证


  1. wx.ready(function(){
  2. // 蓝牙扫描接口
  3. wx.startSearchBeacons({
  4. ticket:"",  //摇周边的业务ticket, 系统自动添加在摇出来的页面链接后面
  5. success: function(res){
  6. wx.onSearchBeacons({
  7. complete:function(data){
  8. alert(JSON.stringify(data));
  9. showBeacon(data.beacons);//处理返回的beacon数组
  10. }
  11. });
  12. },
  13. fail:function(res){
  14. var errmsg = JSON.stringify(res.errMsg);
  15. var arr = errmsg.split(':');
  16. var errmsgBody = arr[1];
  17. if(errmsgBody.substr(0, 9) == "bluetooth"){
  18. alert("蓝牙未打开,请打开后重试!");
  19. } else if(errmsgBody.substr(0, 8) == "location"){
  20. alert("手机位置未打开,请打开后重试!");
  21. }else{
  22. alert(JSON.stringify(res));
  23. }
  24. }
  25. });
  26. });
  1. wx.error(function(res){//验证错误时执行的函数
  2. alert(JSON.stringify(res));
  3. });

函数详解:

1.开启查找周边ibeacon设备接口

wx.startSearchBeacons({
   ticket:"",
   complete:function(argv){
   //回调函数
   }
});

返回参数说明

打开成功返回:“startSearchBeacons:ok”;

打开后未stop再次打开 :“startSearchBeacons:already started”;

蓝牙未打开返回 :“startSearchBeacons:bluetooth power off”;

地理位置服务未打开返回: “startSearchBeacons:location service disable”;

系统不支持返回 :“startSearchBeacons:system unsupported”。

2. 关闭查找周边ibeacon设备接口

wx.stopSearchBeacons({
   complete:function(res){
   //回调函数
   }
});
返回说明

关闭成功返回“stopSearchBeacons:ok”;

3.监听周边ibeacon设备接口(这个函数写在startSearchBeacons的回调函数里面)

wx.onSearchBeacons({
   complete:function(argv){
   //回调函数
   }
});

返回数据为数组

onSearchBeacons:
{
   "beacons":[
               {
               "major":10008,
               "minor":57686,
               "uuid":"FDA50693-A4E2-4FB1-AFCF-C6EB07647825",
               "accuracy":"0.235344",
               "rssi":"-66",
               "proximity":"1",
               "heading":"288.1355"
               },
               {
               "major":10008,
               "minor":57687,
               "uuid":"FDA50693-A4E2-4FB1-AFCF-C6EB07647825",
               "accuracy":"0.349124",
               "rssi":"-49",
               "proximity":"2",
               "heading":"288.1355"
               }
               ]
}
参数说明

参数 说明
UUID、major、minor UUID、major、minor
accuracy 距离,单位为米
proximity 精度,0:CLProximityUnknown, 1:CLProximityImmediate, 2:CLProximityNear, 3:CLProximityFar
rssi 接收信号的强度指示

heading 接收信号时设备的方向(安卓设备返回有此字段,iOS无);iOS设备若需要获取方向,可以利用HTML5标准API获取, 查看示例

文末福利:

福利一:前端,Java,产品经理,微信小程序,Python等10G资源合集大放送:https://www.jianshu.com/p/e8197d4d9880

福利二:微信小程序入门与实战全套详细视频教程

【领取方法】

关注 【编程微刊】微信公众号:

回复【小程序demo】一键领取130个微信小程序源码demo资源。

回复【领取资源】一键领取前端,Java,产品经理,微信小程序,Python等资源合集10G资源大放送。



90后前端妹子,爱编程,爱运营,爱折腾。
坚持总结工作中遇到的技术问题,坚持记录工作中所所思所见,欢迎大家一起探讨交流。

微信开发之八 页面获取周围beacon设备的更多相关文章

  1. 基于Jquery WeUI的微信开发H5页面控件的经验总结(1)

    在微信开发H5页面的时候,往往借助于WeUI或者Jquery WeUI等基础上进行界面效果的开发,由于本人喜欢在Asp.net的Web界面上使用JQuery,因此比较倾向于使用 jQuery WeUI ...

  2. 基于Jquery WeUI的微信开发H5页面控件的经验总结(2)

    在微信开发H5页面的时候,往往借助于WeUI或者Jquery WeUI等基础上进行界面效果的开发,由于本人喜欢在Asp.net的Web界面上使用JQuery,因此比较倾向于使用 jQuery WeUI ...

  3. Java开发微信公众号(五)---微信开发中如何获取access_token以及缓存access_token

    获取access_token是微信api最重要的一个部分,因为调用其他api很多都需要用到access_token.比如自定义菜单接口.客服接口.获取用户信息接口.用户分组接口.群发接口等在请求的时候 ...

  4. 微信开发笔记:获取用户openid,以及用户头像昵称等信息

    微信开发的时候有一个很便利的途径来进行一个用户的一步注册登录,就是使用用户的微信信息来直接进行登陆,可以省去很多不必要的麻烦.那具体这些信息是如何来获取的呢? 首先呢,我们需要对微信进行一个授权,让微 ...

  5. 微信小程序中获取高度及设备的方法

    由于js中可以采用操纵dom的方法来获取页面元素的高度,可是在微信小程序中不能操纵dom,经过查找之后发现仅仅只有以下几个方法可以获取到高度 wx.getSystemInfoSync().window ...

  6. 转:微信开发获取地理位置实例(java,非常详细,附工程源码)

    微信开发获取地理位置实例(java,非常详细,附工程源码)   在本篇博客之前,博主已经写了4篇关于微信相关文章,其中三篇是本文基础: 1.微信开发之入门教程,该文章详细讲解了企业号体验号免费申请与一 ...

  7. 微信开发获取地理位置实例(java,非常详细,附工程源码)

    在本篇博客之前,博主已经写了4篇关于微信相关文章,其中三篇是本文基础: 1.微信开发之入门教程,该文章详细讲解了企业号体验号免费申请与一些必要的配置,以及如何调用微信接口. 2.微信开发之通过代理调试 ...

  8. 微信测试号开发之九 微信网页授权:页面获取用户openid

    原文链接:https://blog.csdn.net/qq_37936542/article/details/78981369 一:配置接口 注意:这里填写的是域名(是一个字符串),而不是URL,因此 ...

  9. [麦先生]TP3.2之微信开发那点事[基础篇](获取access_token)

    在微信文档中一共提供了两个access_token:一个是伪全局配置的Access_token;一个是在微信网页授权时的小Access_token 很多刚刚接触微信开发的人经常会混淆这两个的作用: 我 ...

随机推荐

  1. golang filepath.Walk遍历指定目录下的所有文件

    package main import ( "fmt" "os" "path/filepath" ) func walkFunc(path ...

  2. [NOI2008]假面舞会(DFS)

    Description 一年一度的假面舞会又开始了,栋栋也兴致勃勃的参加了今年的舞会.今年的面具都是主办方特别定制的.每个参加舞会的人都可以在入场时选择一 个自己喜欢的面具.每个面具都有一个编号,主办 ...

  3. 关于Django的登录系统

    首先需要明确的是登录的本质:登录就是服务器确认当前用户的身份,并将数据库中的记录提取匹配 默认的登录系统是用户名密码方式,这种方式很平常,也没什么特别的.这里主要说的是第三方验证登录 通常第三方验证登 ...

  4. JavaScript推断undefined的技巧

    两种方法: 处理变量为undefined的情况: v = v||null;    //假设v为undefined,则其值变为null 双感叹号:!!,把null/undifined/0转换为bolle ...

  5. invalid syntax 无效语法

    python用的是spyder编译器, 再出现上一行少了个括号的时候. 在下一行显示有错误.

  6. Monkey (压力测试)-移动端手机压力测试工具 monkey以及monkeyrunner

    4. Monkey (压力测试) 这个是Android提供的系统工具.它向系统发送伪随机的用户事件流(如按键输入.触摸屏输入.手势输入等),实现对正在开发的应用程序进行压力测试.Monkey测试是一种 ...

  7. 00103_死锁、Lock接口、等待唤醒机制

    1.死锁 (1)同步锁使用的弊端:当线程任务中出现了多个同步(多个锁)时,如果同步中嵌套了其他的同步.这时容易引发一种现象:程序出现无限等待,这种现象我们称为死锁.这种情况能避免就避免掉: synch ...

  8. jquery如何实现表单post方式提交

    jquery如何实现表单post方式提交 一.总结 一句话总结:即使js给form对象提供了submit()方法,那也不意为表单中可以不写提交按钮这个元素,即form表单依然需要五脏俱全才可以使用js ...

  9. (转)30 IMP-00019: row rejected due to ORACLE error 12899

    IMP: row rejected due IMP: ORACLE error encountered ORA: value too large , maximum: )导入日志报 IMP: 由于 O ...

  10. (转)alter database open resetlogs 的意义

    转自:http://blog.sina.com.cn/s/blog_63216bda0100zblr.html Oracle文档中提到,一旦用备份的控制文件进行数据库恢复,就需要使用resetlogs ...