先来了解下Android传统蓝牙连接的大致简单的流程:

其中涉及到几个类依次来介绍,废话不多说,下面是从Android4.4开发指南蓝牙所用到的类的截图:

第一个类BluetoothAdapter:

注意两点:

1这是一个继承子Object的final类,不能进行继承。

2在系统为4.2及以下可以调用静态方法getDefaultAdapter()获取设备本地适配器;在系统为4.3及以上版本调用BluetoothManager的getAdapter()

类中其他重要方法:获取已经配对的设备--BluetoothDevices的set集合,开始发现设备--bool,创建侦听的RFCOMM安全/非安全通道

第二个类为BluetoothDevice:

远程蓝牙设备,可以通过UUID创建出BluetoothSocket(蓝牙套接字接口)对象,可以进行连接操作。

详细说明下createRfcommSocketToServiceRecord方法:

创建一个RFCOMM蓝牙套接字准备开始一个安全的传出连接到远程设备。返回的是BluetoothSocket对象

注意点:如果连接蓝牙串行板,尝试使用著名的UUID-00001101-0000-1000-8000-00805F9B34FB(一般固定的)然而若是一个Android对等体请使用自己生成的UUID

第三,四个类BluetoothSocket与BluetoothServerSocket

首先看下BluetoothSocket介绍:

蓝牙套接字接口类似tcp套接字(Socket与ServerSocket);

在服务端方面,使用一个BluetoothServerSocket来创建一个侦听的服务端套接字。当一个连接被BluetoothServerSocket接受,它将返回一个新的BluetoothSocket来管理连接;在客户端,使用单个BluetoothSocket来启动传出连接和管理连接。

最常见的蓝牙套接字类型是RFCOMM,这是Android API支持的类型。 RFCOMM是面向连接的,通过蓝牙的流传输。 它也称为串行端口配置文件(SPP)。

使用 BluetoothDevice.createRfcommSocketToServiceRecord()去创建一个BluetoothSocket连接一个已知的设备,然后通过他回调connect()与远程设备建立一个连接。

一旦套接字已连接,无论是连接为客户端还是连接为服务端,通过调用getInputStream()与getOutputStream()来分别检索InputStream对象,这些对象分别自动连接到套接字。

BluetoothSocket是线程安全的,另外,close() 方法将立即终止正在进行的操作和关闭套接字。

再来看下BluetoothServerSocket类:

其中有两个重载方法,一个可设置超时连接,方法阻塞,直到建立连接

返回值为BluetoothSocket对象可以管理连接,数据共享交互

第五个类为BluetoothClass:描述蓝牙设备的一般特征和功能,暂时用不到。

下面来介绍下具体连接蓝牙功能的代码实现:

思路:如果将蓝牙连接与数据通信部分放在Activity中,那么假如退出Activity,套接字也会随着activity关闭,而且每打开一次Activity又  要原样来一遍,又不稳定。有没有一中可以一直在后台运行的东西,可控制性的去管理它呢?

通过服务与广播机制来实现Activity与Service通信,Service启动方式有两种,一种是通过bindService(),另一种是通过startService(),

这两种启动方式的区别大家去清楚,bindService方式的服务随着调用者消亡而死亡;startService方式创建一次就会存在,除非  stopself()方法或者进程死亡。两种方式都可以实现与Activity交互,显然采用第二种方式更稳定,Activity与Service的通信采用广播机制  清晰简单。

原理介绍下:

下面贴下Demo代码:

1需要声明权限,android:exported指的是能否与其他程序交互,不能被访问则为false.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.likego.gobackbluetooth"> <!--声明蓝牙权限!-->
<uses-permission android:name="android.permission.BLUETOOTH" /> <application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity> <service
android:name=".BlueToothService"
android:exported="false"></service>
</application> </manifest>

 2.界面代码

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="查找发现设备"
android:id="@+id/lookBtn"
android:layout_alignParentStart="true"
android:layout_alignParentEnd="true" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="发送数据"
android:id="@+id/sendBtn"
android:layout_below="@+id/lookBtn"
android:layout_alignParentStart="true"
android:layout_alignParentEnd="true" /> <Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="清空数据"
android:id="@+id/clearBtn"
android:layout_below="@+id/sendBtn"
android:layout_alignParentStart="true" android:layout_alignParentEnd="true" /> <EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:id="@+id/editText"
android:text="返回结果:"
android:singleLine="false"
android:scrollbars="vertical"
android:editable="false"
android:focusable="false"
android:layout_alignParentStart="true"
android:layout_alignParentEnd="true"
android:layout_below="@+id/clearBtn"
android:layout_alignParentBottom="true"
android:gravity="top" />
</RelativeLayout>

3.Activity代码-发现与查找设备,连接设备,发送数据等。

4.SerVice代码

蓝牙门禁Android客户端的更多相关文章

  1. 离线人脸识别门禁考勤——Android设备端APK及源码免费下载

    适用场景:门禁场景的应用,适合安装在Android系统的门口机.闸机头.Pad等设备上. 主要功能:人员注册.人脸识别开门.考勤打卡.门禁权限管理.识别记录查询等. 预览效果: PC端 设备端1 设备 ...

  2. 使用calabash测试开源中国Android客户端

    Calabash-android是支持android的UI自动化测试框架,前面已经介绍过<中文Win7下成功安装calabash-android步骤>,这篇博文尝试测试一个真实应用:开源中 ...

  3. 大华门禁SDK二次开发(二)-SignalR应用

    经过与大华技术支持的沟通,门禁服务程序已经开发好了,可以正常接收门禁开关事件,可以发送开门命令.基于项目实时性要求,这里使用SignalR实现门禁状态.控制命令的实时传送. 几种场景需求 根据Sign ...

  4. 【Arduino】开发入门【十】Arduino蓝牙模块与Android实现通信

    [Arduino]开发入门[十]蓝牙模块 首先show一下新入手的蓝牙模块 蓝牙参数特点 1.蓝牙核心模块使用HC-06从模块,引出接口包括VCC,GND,TXD,RXD,预留LED状态输出脚,单片机 ...

  5. 利用nexus5伪造一张门禁卡

    0×00 前言 我租住的杭州一个老小区一年前出现了所谓的“出租房杀人事件”,事件过后民警叔叔们给小区的每个单元都装上了门禁,所有住户都需要在物业处登记,物业的工作人员会让你提供身份证或者公交卡用来注册 ...

  6. Android客户端和服务器端数据交互

    网上有很多例子来演示Android客户端和服务器端数据如何实现交互不过这些例子大多比较繁杂,对于初学者来说这是不利的,现在介绍几种代码简单.逻辑清晰的交互例子,本篇博客介绍第四种: 一.服务器端: 代 ...

  7. appium 自动化测试之知乎Android客户端

    appium是一个开源框架,相对来说还不算很稳定.转载请注明出处!!!! 前些日子,配置好了appium测试环境,至于环境怎么搭建,参考:http://www.cnblogs.com/tobecraz ...

  8. 仿优酷Android客户端图片左右滑动(自动滑动)

    最终效果: 页面布局main.xml: <?xml version="1.0" encoding="utf-8"?> <LinearLayou ...

  9. 【原创】轻量级即时通讯技术MobileIMSDK:Android客户端开发指南

    申明:MobileIMSDK 目前为个人维护的原创开源工程,现陆续整理了一些资料,希望对需要的人有用.如需与作者交流,见文章底签名处,互相学习. MobileIMSDK开源工程的代码托管地址请进入 G ...

随机推荐

  1. HTML学习(八)列表和块

    无序列表无序列表是一个项目的列表,此列项目使用粗体圆点(典型的小黑圆圈)进行标记.无序列表始于 <ul> 标签.每个列表项始于 <li>.<ul type=“”> ...

  2. Salesforce开发者学习笔记之二:Salesforce开发平台应用场景

    Salesforce作为一个全方位的CRM系统可以应用于企业中的各个不同部门以取代手工的,耗时的以及低效的业务流程,例如 基于报表的数据管理和分析 基于电子邮件的协同合作 本地的文件共享 各种手工操作 ...

  3. 安装php扩展后,执行时找不到扩展 class xxx no found

    当编译安装一个新的php扩展,例如安装redis, 安装后 执行 new Redis(), 如果发现找不到class Redis,可以先检查redis.so文件是否在php的扩展目录下, 如果发现是, ...

  4. FFT初解(转)

    源:FFT初解 一.前言 首先申明俺不是一个算法工程师,俺是一个底层驱动工程师,有人会发问一个底层驱动工程师需要这个吗?但是我不幸的告诉你,确实是需要的,不过我们不要像算法工程师那样搞得很精通,但是还 ...

  5. CSS实现导航条Tab切换的三种方法

    前面的话   导航条Tab在页面中非常常见,本文说详细介绍CSS实现导航条Tab的三种方法 布局   根据上图所示,先规定几个定义,上图的模块整体叫做导航,由导航标题和导航内容组成.要实现上图所示的布 ...

  6. listview 去掉header和footer中的分割线

    在listView中加上android:headerDividersEnabled="false" android:footerDividersEnabled="fals ...

  7. 关于jquery的$each((Object, function(p1, p2)用法

    通过它,你可以遍历对象.数组的属性值并进行处理. 使用说明 each函数根据参数的类型实现的效果不完全一致: 1.遍历对象(有附加参数) $.each(Object, function(p1, p2) ...

  8. UVa 10382 - Watering Grass

    题目大意:有一条长为l,宽为w的草坪,在草坪上有n个洒水器,给出洒水器的位置和洒水半径,求能浇灌全部草坪范围的洒水器的最小个数. 经典贪心问题:区间覆盖.用计算几何对洒水器的覆盖范围简单处理一下即可得 ...

  9. 【T】并行调度

    /** * 并行调度相关处理 * * 按卫星*日期 ,将待处理的任务分解为 卫星+日期 粒度的子任务 添加到paramMapList列表中 */ List<Map<String, Obje ...

  10. robotium从入门到放弃 二 第一个实例

    1.导入被测试的源码 我们先下载加你计算器源码,下载地址: https://robotium.googlecode.com/files/AndroidCalculator.zip 如果地址被墙无法现在 ...