专栏首页jianhuicode蓝牙门禁Android客户端

蓝牙门禁Android客户端

 先来了解下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代码

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • [译]初识RxJava 2 for Android

    导语 :关于响应式编程在手Q中的应用,目前本人了解到至少有以下两种: (1)手Q部落实现的一套Stream框架。 (2)Qzone引入的RxJava 1.1....

    MelonTeam
  • 【译】Nodejs最好的ORM - TypeORM

    TypeORM github: https://github.com/typeorm/typeorm 这篇译文是从TypeORM github上的使用说明上翻...

    用户1147588
  • 【开源】LLMAnimator 60多种动画让你的应用动起来

    github:  https://github.com/brookshi/LLMAnimator ,欢迎star/fork 。之前做android的时候需要给应...

    用户1147588
  • Android之贝赛尔曲线及其应用场景

    导语 本文对贝赛尔曲线的公式及推导过程进行了深入学习,同时结合网上的资料,整理了一些其常用的应用场景。 Android之贝赛尔曲线及其应用场景 ...

    MelonTeam
  • UWP开源项目 LLQNotifier 页面间通信利器(移植EventBus)

    前言 EventBus是一个Android版本的页面间通信库,这个库让页面间的通信变得十分容易且大幅降低了页面之间的耦合。小弟之前玩Android的时候就用得十...

    用户1147588
  • Bitmap 源码阅读笔记

    导语: Android 系统上的图片的处理,跟Bitmap 这个类脱不了关系,我们有必要去深入阅读里面的源码,以便在工作中能更好的处理Bitmap相关的问题...

    MelonTeam
  • 基于移动平台的轻博客系统开发

    一.基于移动平台的轻博客系统设计目的及任务 在掌握Android技术和JavaEE的基础上,熟悉轻博客系统的原理,设计和实现包含移动端和服务器端的轻博客系统。移...

    用户1149268
  • Android旁门左道之动态替换应用程序

    导语 本文讲述如何通过替换应用程序类的方法,可以协助开发调试甚至应用于项目中。 作者: yarkeyzhang  2017.8.31 一,引子 继...

    MelonTeam
  • [译]Android Interpolator详解

    原文地址:<https://blog.mindorks.com/understanding-interpolators-in-android- ce4e8d1d...

    MelonTeam
  • Android动态权限

    导语 随机聊需求中出现几个涉及权限的bug,所以对动态权限机制做了一个简单的整理。 概述 Android应用程序通过请求权限来访问设备数据,例如联...

    MelonTeam

扫码关注云+社区

领取腾讯云代金券