iBeacon使用蓝牙连接范围精确到1-3米

最近再写一个项目,需要自动签到。用的就是iBeacon,刚开始的时候比较懵比,不知道iBeacon是用来干啥的。因为iBeacon就是一个小盒盒,还是密封好的,就感觉自己懵了。然后上网查资料,才知道iBeacon就是一个小型的基站,手机打开蓝牙之后,如果你在这个基站的范围之内,会自动匹配上。你对iBeacon不需要做任何的操作,因为里面有电池,说是可以使用5年左右。

以上就是大概的情况,接下来介绍的是代码展示部分。

首先,在你的主清单中AndroidManifest.xml中添加权限:

<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />

权限添加完毕之后,接下来就是代码部分了

public class MainActivity extends Activity {

  private BluetoothAdapter bluetoothAdapter;
  private TextView textView;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   setContentView(R.layout.activity_main);
   textView = (TextView) findViewById(R.id.textView1);
   BluetoothManager manager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);

   bluetoothAdapter = manager.getAdapter();
   if (bluetoothAdapter == null || !bluetoothAdapter.isEnabled()) {
     Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
     startActivityForResult(intent, 1);
   }
   bluetoothAdapter.startLeScan(mLeScanCallback);

  }

  public void playVibator(Context context, long timeLong) {
   Vibrator vib = (Vibrator) context
      .getSystemService(Service.VIBRATOR_SERVICE);

   vib.vibrate(timeLong);
  }

  private BluetoothAdapter.LeScanCallback mLeScanCallback = new BluetoothAdapter.LeScanCallback() {

   public void onLeScan(final BluetoothDevice device, final int rssi,
           final byte[] scanRecord) {
     int startByte = 2;
     boolean patternFound = false;
     // 寻找ibeacon
     while (startByte <= 5) {
      if (((int) scanRecord[startByte + 2] & 0xff) == 0x02
         && ((int) scanRecord[startByte + 3] & 0xff) == 0x15) {
        patternFound = true;
        break;
      }
      startByte++;
     }
     // 如果找到了的话
     if (patternFound) {
      String ibeaconName = device.getName();
      int txPower = (scanRecord[startByte + 24]);
      if (ibeaconName.equals("E-Beacon_CE6D94")) {
        System.out.println(calculateAccuracy(txPower, rssi));
        if (calculateAccuracy(txPower, rssi) > 1) {//这里是指iBeacon超过1米之后,textView字体变化
         textView.setText("设备有危险!");
         playVibator(MainActivity.this, 1000);
        } else {
         textView.setText("设备正常!");//在1米范围内
        }
      }
     }
   }
  };

  protected static double calculateAccuracy(int txPower, double rssi) {
   if (rssi == 0) {
     return -1.0; // if we cannot determine accuracy, return -1.
   }
   double ratio = rssi * 1.0 / txPower;
   if (ratio < 1.0) {
     return Math.pow(ratio, 10);
   } else {
     double accuracy = (0.89976) * Math.pow(ratio, 7.7095) + 0.111;
     return accuracy;
   }
  }
}

以上就是全部代码展示,布局文件里面就是一个TextView,这里就不贴布局文件的代码了。

希望对大家的学习有所帮助,也希望大家多多支持我们。

时间: 2018-10-28

Android检测IBeacon热点的方法

IBeacon是BLE的一种,搜索iBeacon基站关键在于设备扫描到的scanRecord数组,识别是否有下面加粗斜体的02 15这两个数字.如果有,搜索到的蓝牙设备就是IBeacon. // AirLocate: // 02 01 1a 1a ff 4c 00 02 15 # Apple's fixed iBeacon advertising prefix // e2 c5 6d b5 df fb 48 d2 b0 60 d0 f5 a7 10 96 e0 # iBeacon profile

Android 蓝牙连接 ESC/POS 热敏打印机打印实例(ESC/POS指令篇)

上一篇 主要介绍了如何通过蓝牙连接到打印机.这一篇,我们就介绍如何向打印机发送打印指令,来打印字符和图片. 1. 构造输出流 首先要明确一点,就是蓝牙连接打印机这种场景下,手机是 Client 端,打印机是 Server 端. 在上一篇的最后,我们从 BluetoothSocket 得到了一个OutputStream.这里我们做一层包装,得到一个OutputStreamWriter 对象: OutputStreamWriter writer = new OutputStreamWriter(ou

Android手机通过蓝牙连接佳博打印机的实例代码

所使用的打印机为佳博打印机,支持蓝牙.wifi.usb我所使用的是通过蓝牙来连接. 在网上找到一个佳博官方针对安卓开发的App源码,但是各种的跳转,没有看太懂,所以又去问度娘,找到了一个不错的文章 Android对于蓝牙开发从2.0版本的sdk才开始支持,而且模拟器不支持,测试至少需要两部手机,所以制约了很多技术人员的开发. 1. 首先,要操作蓝牙,先要在AndroidManifest.xml里加入权限 // 管理蓝牙设备的权限 <uses-permissionandroid:name="

Android 扫描附近的蓝牙设备并连接蓝牙音响的示例

写了一个可以扫描附近蓝牙设备的小Demo,可以查看蓝牙设备的设备名和Mac地址 代码量不多,很容易看懂 /** * 作者:叶应是叶 * 时间:2017/9/8 20:13 * 描述: */ public class ScanDeviceActivity extends AppCompatActivity { private LoadingDialog loadingDialog; private DeviceAdapter deviceAdapter; private BluetoothAdap

Android 蓝牙连接 ESC/POS 热敏打印机打印实例(蓝牙连接篇)

公司的一个手机端的 CRM 项目最近要增加小票打印的功能,就是我们点外卖的时候经常会见到的那种小票.这里主要涉及到两大块的知识: 蓝牙连接及数据传输 ESC/POS 打印指令 蓝牙连接不用说了,太常见了,这篇主要介绍这部分的内容.但ESC/POS 打印指令是个什么鬼?简单说,我们常见的热敏小票打印机都支持这样一种指令,只要按照指令的格式向打印机发送指令,哪怕是不同型号品牌的打印机也会执行相同的动作.比如打印一行文本,换行,加粗等都有对应的指令,这部分内容放在下一篇介绍. 本篇主要基于官方文档,相

Android开发实现实时检测蓝牙连接状态的方法【附源码下载】

本文实例讲述了Android开发实现实时检测蓝牙连接状态的方法.分享给大家供大家参考,具体如下: 本程序能实时监听并检测Android蓝牙的连接状态,无论是通过界面上的switch按钮打开/关闭手机蓝牙,还是手动打开/关闭手机蓝牙,程序都能监听当前的状态. 一.软件界面 二.程序实现 ① switch开关--打开/关闭蓝牙 Switch switchTest = (Switch) findViewById(R.id.switch1); switchTest.setOnCheckedChangeL

Android提高之BLE开发Android手机搜索iBeacon基站

前面文章讲述了Android手机与BLE终端之间的通信,而最常见的BLE终端应该是苹果公司倡导的iBeacon基站.iBeacon技术基于BLE,它的特点是通过广播对外发送消息,手机不需要连上iBeacon基站也能获取它的信息,目前主要用来做室内定位和营销信息推送,在BLE发出的广播里带上带上特定的信息从而被识别为iBeacon.在iOS里面使用iBeacon要经过passbook注册iBeacon的UUID和对应的文字简介,而在Android上则无类似passbook这种系统级的后台蓝牙搜索服

android实现主动连接和被动连接的蓝牙聊天功能

在项目中经常用到蓝牙的应用,在这里特意写了一个demo.并且封装了代码,可以主动连接和被动连接一起使用,也可以分开使用.方便后面以后查询使用,也重新踩了部分坑. 项目地址:android实现蓝牙聊天功能 1.程序简单的界面 2.客户端,主动连接 package com.bluetooth.tool; import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothDevice; import android

android获取ibeacon列表的方法

android获取ibeacon列表,供大家参考,具体内容如下 最近公司有需要做ibeacon需求. 因为涉及扫码的时间.特意写一个service实现获取列表 可以根据扫描时间扫描出ibeacon列表 包含 uuid,设备名称,单位(米),电量等. 请根据自己的项目进行改造代码. 核心代码如下: /** * * <ibeaon服务> * * @author fulushan * @date 创建时间:2018年4月5日 下午11:34:04 */ public class IbeaconSer

Android系统中的蓝牙连接程序编写实例教程

Bluetooth结构 1.JAVA层 frameworks/base/core/java/android/bluetooth/ 包含了bluetooth的JAVA类. 2.JNI层 frameworks/base/core/jni/android_bluetooth_开头的文件 定义了bluez通过JNI到上层的接口. frameworks/base/core/jni/android_server_bluetoothservice.cpp 调用硬件适配层的接口system/bluetooth/

在Android系统中使用gzip进行数据传递实例代码

接下来,让我解说一下如何在Android系统中使用gzip进行数据传递 HTTP协议上的GZIP编码是一种用来改进WEB应用程序性能的技术.大流量的WEB站点常常使用GZIP压缩技术来减少文件大小,减少文件大小有两个明显的好处,一是可以减少存储空间,二是通过网络传输文件时,可以减少传输的时间.作者在写这篇博客时经过测试,4.4MB的文本数据经过Gzip传输到客户端之后变为392KB,压缩效率极高. 一.服务端 服务端有2种方式去压缩,一种可以自己压缩,但是更推荐第二种方式,用PrintWrite

微信小程序蓝牙连接小票打印机实例代码详解

1.连接蓝牙 (第一次发表博客) 第一步打开蓝牙并搜索附近打印机设备// startSearch: function() { var that = this wx.openBluetoothAdapter({ success: function(res) { wx.getBluetoothAdapterState({ success: function(res) { if (res.available) { if (res.discovering) { wx.stopBluetoothDevic

Android系统自带的VPN服务框架实例详解

Android系统自带的VPN服务框架 Android从4.0开始(API LEVEL 15),自己带了一个帮助在设备上建立VPN连接的解决方案,且不需要root权限,本文将对其做一个简单的介绍. 一.基本原理 在介绍如何使用这些新增的API之前,先来说说其基本的原理. android设备上,如果已经使用了VpnService框架,建立起了一条从设备到远端的VPN链接,那么数据包在设备上大致经历了如下四个过程的转换: 1)应用程序使用socket,将相应的数据包发送到真实的网络设备上.一般移动设

Ubuntu系统中部署Vagrant和VirtualBox的图文教程

一.前言 1.Vagrant是一个搭建完整的虚拟开发环境的工具 2.实验环境 在Win10中利用VMWare Workstation创建一台Ubuntu虚拟机,版本为64位Ubuntu Desktop 16.04,4核,4G内存:然后在Ubuntu中安装Vagrant和VirtualBox,所用到的Vagrant和VirtualBox版本都是截至2018/04/08时候的最新版. 之所以使用VMWare Workstation来创建Ubuntu的虚拟机而不是VirtualBox,跟下面即将说到的

Android MotionEvent中getX()和getRawX()的区别实例详解

Android MotionEvent中getX()和getRawX()的区别实例详解 实例代码: public class Res extends Activity implements View.OnTouchListener { Button btn = null; int x = 0; int y = 0; int rawx = 0; int rawy = 0; @Override public void onCreate(Bundle savedInstanceState) { sup

浅析Android系统中HTTPS通信的实现

前言 最近有一个跟HTTPS相关的问题需要解决,因此花时间学习了一下Android平台HTTPS的使用,同时也看了一些HTTPS的原理,这里分享一下学习心得. HTTPS原理 HTTPS(Hyper Text Transfer Protocol Secure),是一种基于SSL/TLS的HTTP,所有的HTTP数据都是在SSL/TLS协议封装之上进行传输的.HTTPS协议是在HTTP协议的基础上,添加了SSL/TLS握手以及数据加密传输,也属于应用层协议.所以,研究HTTPS协议原理,最终就是研

Android系统中使用shareuserid获取系统权限的教程

Android会为每个apk进程分配一个单独的空间(比如只能访问/data/data/自己包名下面的文件),一般情况下apk之间是禁止相互访问数据的.通过Shared User id,拥有同一个User id的多个APK可以配置成运行在同一个进程中.所以默认就是可以互相访问任意数据. 也可以配置成运行成不同的进程, 同时可以访问其他APK的数据目录下的数据库和文件.就像访问本程序的数据一样(使用IPC机制,不同进程之间,比如AIDL). 一.使用同一个shareuserid,多个apk运行到同一

探究Android系统中解析JSON数据的方式

前言 喜欢在前言里讲一下自己的现状,或许能有共鸣的同学,更多的是留给自己一个纪念,几个月或者几年再回来看的时候还是会很有感慨.今天说说语言,json这种数据格式之前我做服务器端的时候天天接触,天真的以为json的世界里只有php的json_encode和json_decode,今天当我做客户端的时候,竟然将近一个多小时才搞定json的解析.这里我不是抨击php好坏,只是想说多学点东西,看看你不熟悉的领域,方能开阔自己的视野,方能知道天外有天,方能知道当初你看不上的工作其实你也不一定能很好的完成,

详解Android应用中preference首选项的编写方法

最近学习android时发现,很多书上都介绍了preference首选项这个东西,但是大部分的书都是直接上来讲怎么用,对其的用途和来历都是只字不提,笔者本人对于这种做法是非常鄙视的. 这里,我将对其进行一点简单的描述,可能说法并不严谨,但是至少能帮助你理解到底什么事首选项: 首选项这个词是preference翻译过来的,至于它到底是什么,我用一句话概括下:preference是一种android为我们提供的方便的对数据进行存储的工具. 分析这句话: 首先,我们明确,preference是和数据存