Android 蓝牙通信开发(二) 创建蓝牙连接

Android 蓝牙开发(一)蓝牙通信 随着可穿戴设备的流行,研究蓝牙是必不可少的一门技术了。 总结了下蓝牙开发使用的一些东西分享一下。 首先需要AndroidManifest.xml文件中添加操作蓝牙的权限。 <uses-permissionandroid:name="android.permission.BLUETOOTH" /> 允许程序连接到已配对的蓝牙设备。 <uses-permissionandro 阅读详情

蓝牙通信是我们日常生活中比较方便的一种通信技术,Android从2.0版本的SDK就开始支持蓝牙。对开发人员来说,应用程序中蓝牙还是一种用来创建点对点连接通信的简单而高效的方式。

之前讨论过蓝牙设备搜索的解决方案,今天在这个基础上进行蓝牙设备搜索之后创建连接的学习。

Android模拟器还不支持蓝牙,因此要测试使用蓝牙功能,必须使用至少两台Android设备。

(1)关于UUID

要创建蓝牙连接,首先要确保客户端程序的UUID和服务器端的UUID相同才能进行连接。但是UUID并不是蓝牙技术的特有标准,UUID含义是通用唯一识别码 (Universally Unique Identifier),这是一个软件建构的标准。以下给出常用的蓝牙服务对应的UUID码:

  • 蓝牙串口服务 00001101-0000-1000-8000-00805F9B34FB
  • 拨号网络服务 00001103-0000-1000-8000-00805F9B34FB
  • 信息同步服务 00001104-0000-1000-8000-00805F9B34FB
  • 文件传输服务 00001106-0000-1000-8000-00805F9B34FB
  • 个人局域网服务 00001115-0000-1000-8000-00805F9B34FB

用于测试或个人使用的蓝牙服务,可到Online UUID Generator进行申请,直接打开网页即可获得一个UUID码。

(2)建立连接

确保服务器端和客户端所指定的UUID码相同之后,即可开始建立连接。Android创建蓝牙连接是通过BluetoothSocket来进行,这个过程要使用的类有两个,BluetoothServerSocket和BluetoothSocket。

  • BluetoothServerSocket

    蓝牙通信服务器端类,蓝牙通信过程类似于Socket,当两台蓝牙设备连接配对之后,服务器端通过accept()方法来建立BluetoothSocket。

  • BluetoothSocket

    这是服务器和客户端通信的通道,常用的方法有:
    close() 关闭
    connect() 连接
    getInptuStream() 获取输入流
    getOutputStream() 获取输出流
    getRemoteDevice() 获取远程设备,这里指的是获取bluetoothSocket指定连接的那个远程蓝牙设备

需要注意的是,服务器端进行监听客户端连接(BluetoothServerSocket.accept())和客户端进行对服务器的连接(BluetoothSocket.connect())都会阻塞线程,因此都应使用新的线程进行。

服务器端蓝牙连接步骤:

  • 启动服务器
private static final UUID UUID_SERVER = UUID.fromString("2b21619a-e2d4-4108-aab5-b64c48906552");

BluetoothAdapter bAdapter = BluetoothAdapter.getDefaultAdapter();
BluetoothServerSocket serverSocket = bAdapter.listenUsingRfcommWithServiceRecord("Server", UUID_SERVER);
  • 服务器监听客户端连接
serverSocket.accept();

因为线程阻塞,所以要使用新线程进行蓝牙连接。

private static final UUID UUID_SERVER = UUID.fromString("2b21619a-e2d4-4108-aab5-b64c48906552");

private BluetoothAdapter bAdapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
    //...

    new ServerStart().start();  //开启蓝牙服务器
}

class ServerStart extends Thread {

    @Override
    public void run() {
        try {
            BluetoothServerSocket serverSocket = bAdapter.listenUsingRfcommWithServiceRecord("Server", UUID_SERVER);

            //服务器打开成功
            //...

            while (true) {
                serverSocket.accept();      //服务器等待客户端访问,线程阻塞

                //客户端接入访问成功
                //...
            }

        } catch (Exception e) {

        }
    }
}

客户端蓝牙连接步骤:

  • 获取服务器端蓝牙设备的BluetoothDevice

  • 客户端进行对服务器的连接

private static final UUID UUID_CLIENT = UUID.fromString("2b21619a-e2d4-4108-aab5-b64c48906552");

BluetoothSocket socket = device.createRfcommSocketToServiceRecord(UUID_CLIENT);
socket.connect();

因为线程阻塞,所以要使用新线程进行蓝牙连接。

private static final UUID UUID_CLIENT = UUID.fromString("2b21619a-e2d4-4108-aab5-b64c48906552");

List<BluetoothDevice> devices = new ArrayList<>();

private BroadcastReceiver searchReceiver = new BroadcastReceiver() {
   @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();

        //搜索到设备
        if(BluetoothDevice.ACTION_FOUND.equals(action)) {
            BluetoothDevice dev = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);  //获取蓝牙设备信息
            devices.add(dev);
        }
        //搜索完成
        else if(BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) {
            //搜索结果列表,对话框呈现
            AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
            builder.setTitle("搜索到的蓝牙设备列表");
            final String[] item = new String[devices.size()];
            int n = item.length;
            //遍历搜索结果
            for(int i = 0; i < n; i ++) {
                item[i] = devices.get(i).getName()+"\t:\t"+devices.get(i).getAddress();
            }
            builder.setItems(item, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {                     
                    new ClientConnect(devices.get(which)).start();      //启动蓝牙连接线程
                }
            });
            builder.create().show();
        }
    }
};

class ClientConnect extends Thread {

    BluetoothDevice device;

    public ClientConnect(BluetoothDevice dev) {
        device = dev;
    }

    @Override
    public void run() {
        try {
            BluetoothSocket socket = device.createRfcommSocketToServiceRecord(UUID_CLIENT);
            socket.connect();   //线程阻塞

            //连接成功
            //...
        } catch (Exception e) {
            //连接失败
            //...
        }
    }
}

(3)运行结果

服务器启动:

客户端搜索服务器:

客户端发起蓝牙连接:

客户端连接到服务器&服务器接收到服务器请求:


BluetoothConnectDemo下载

使用说明|蓝牙MAC地址二维码打印解决方案详解 基于蓝牙技术的包含软件、硬件在内的一整套蓝牙MAC地址二维码打印解决方案在很大程度上简化了蓝牙设备的蓝牙MAC地址存在录入流程,提高了蓝牙设备的出厂效率。通过PL2303串口驱动调整“信号阀值”,以调整有效的探测距离,建议不要太小,否则较远距离也能探测到,就不正确了。扫描完成后,打印工具显示MAC地址,通过点击连接打印机,即可通过打印机打印出蓝牙MAC地址的二维码标签。通过串口手动将蓝牙MAC地址读取设备连接到电脑上,再将打印机连接到电脑上,开启电脑与打印机。把蓝牙设备和蓝牙MAC地址读取设备。 阅读详情

相关推荐

Android蓝牙开发—经典蓝牙详细开发流程

https://blog.youkuaiyun.com/zqf_888/article/details/81060606

Errol's Blog 1万+

蓝牙连接的建立过程

物理信道(physical channel)是蓝牙系统的最底层结构,它以一伪随机跳频序列、特定的发送时槽定时、接入码及帧头编码来表征。蓝牙定义了一系列物理信道用于不同的应用,包括用于匹克网内设备通信的匹克网物理信道,用于查找设备的查找扫描物理信道和用于寻呼设备的寻呼扫描物理信道。两台设备必须采用相同的物理信道才能进行通信。主从设备建立连接的过程就是建立相同的匹克网信道的过程,这样主从设备才能以同样

夜影轩的专栏 8425

安卓经典蓝牙开发,包括自动连接开发板蓝牙并通信

安卓经典蓝牙开发,包括自动连接开发板蓝牙并通信蓝牙开发首先弄清楚两点:手机蓝牙连接手机蓝牙与手机蓝牙连接外设蓝牙(比如开发板上的蓝牙),这两者连接方式要区分开来,前者需要两个手机同时安装开发的APP,APP里面的代码指定了唯一的UUID用于通信,而后者只能在手机APP里面通过反射的方式获取外设蓝牙的UUID,然后连接通信。本文是使用后者。第二是要知道经典蓝牙开发与低功耗蓝牙开发(即Ble)二者是不...

Crook的专栏 4428

Android App创建Ble服务

先写一个Ble服务AdvertiserService 代码如下 /** * Created by lxy on 2021/09/14. */ public class AdvertiserService extends Service { // private RecvDelegate delegate; private static final String TAG="AdvertiserService"; String CHANNEL_ONE_ID = "com....

iOS野狼的专栏 2908

Android基于Modbus RTU协议通过蓝牙与蓝牙串口开发板通信

Android基于ModbusRtu协议通过蓝牙与蓝牙串口通信实现开发板读写前言实现原理代码实现 前言 最近接到一位老师的项目,他们公司要求利用Android基于ModbusRtu协议通过蓝牙与蓝牙串口通信实现开发板读写,然后通过开发板控制硬件设备从而实现Android移动设备与硬件交互。所以今天我给大家分享下Android基于ModbusRtu协议的蓝牙通信。当然Android也可以直接通过串口利用ModbusRtu协议与开发板通信,或者基于Modbus TCP通信。至于非蓝牙非Modbus协议通信,大家

weixin_42644340的博客 7359

Android 蓝牙通信及WiFi开发

在我们正常的Android蓝牙功能开发步骤中,一般要经过系统权限和蓝牙开关状态监测、设备扫描、设备连接、蓝牙数据通信这几个过程。 在Android 4.3系统之后,我们可以使用蓝牙4.0(低功耗蓝牙),它最主要的特点是低功耗,普及率高。现在所说的蓝牙设备,大部分都是在说4.0设备,ble也特指4.0设备。 在4.0之前重要的版本有2.1版本-基本速率/增强数据率(BR/EDR)和3.0 高速蓝牙版

Bug不知所起,一往而深。 5565

【Android】蓝牙开发—— 经典蓝牙连接方法

一、官方API Android官方API给出的经典蓝牙连接方法有2个 createRfcommSocketToServiceRecord 该方法建立的是一种安全的连接。意思就是,与蓝牙设备建立连接时,如果与蓝牙设备没有建立过配对关系,那么连接时会先去建立配对关系,然后再执行连接;如果与蓝牙设备已建立了配对关系,那么就会直接执行连接。 调用的结果是,连接成功的同时也配对成功了。 //建立安全的蓝...

好记性不如烂笔头,用文档记录技术,方便自己和他人。 5181

Android BLE设备蓝牙通信框架BluetoothKit

这个框架源于目前一个智能家居APP项目,是蓝牙部分基础模块,用于蓝牙设备扫描、连接、通知等。由于目前接入的蓝牙设备大多为低功耗蓝牙设备,所以本框架暂不支持经典蓝牙的连接。项目地址: https://github.com/dingjikerbo/BluetoothKit先介绍本框架的特点: 一、支持经典蓝牙和BLE蓝牙混合扫描,支持自定义扫描策略 作为智能家居平台,接入的设备包括经典蓝牙和BLE,

风语的专栏 2万+

Android 蓝牙开发之搜索、配对、连接、通信大全

蓝牙( Bluetooth®):是一种无线技术标准,可实现固定设备、移动设备和楼宇个人域网之间的短距离数据交换(使用2.4—2.485GHz的ISM波段的UHF无线电波)。蓝牙设备最多可以同时和7个其它蓝牙设备建立连接,进行通信,当然并不是每一个蓝牙都可以达到最大值。下面,我们从蓝牙的基本概念开始,一步一步开始了解蓝牙。(尊重劳动成果,转载请注明出处http://blog....

weixin_33686714的博客 5972

android之蓝牙通信(二)(蓝牙连接,数据传递)

上次写了android之蓝牙通信(一)(基础之检测蓝牙、开启蓝牙、扫描附近蓝牙设备) ,大致介绍了开启蓝牙,搜索附近蓝牙设备功能,下面接下来写下搜索到蓝牙设备后进行连接,传递数据的操作,连接蓝牙设备有两种,一种是单向,一种是双向。单向是它发数据,你接受就行;双向是它发数据,你接收,你也发数据,它接收,双向的最佳例子就是蓝牙聊天。单向跟双向的做法差不多,单向只需要做个接收就行,而双向比单向多一个

gsw333的博客 1万+

Android 低功耗蓝牙BLE连接通信

简介 蓝牙(Bluetooth®):是一种无线技术标准,可实现固定设备、移动设备和楼宇个人域网之间的短距离数据交换(使用2.4—2.485GHz的ISM波段的UHF无线电波)。蓝牙技术最初由电信巨头爱立信公司于1994年创制,当时是作为RS232数据线的替代方案。蓝牙可连接多个设备,克服了数据同步的难题。 蓝牙 4.0 蓝牙技术联盟于2010年6月30日正式推出蓝牙核心规格4.0 。它包...

hwx865的专栏 3160

Android开发之蓝牙(二)——基于BLE协议蓝牙模块通信

介绍 基本概念 Android蓝牙开发流程 app是ble与spp选择连接蓝牙模块,关于spp的可以看 介绍摘要:蓝牙4.0——BLE是近年来应用比较广泛的profile,与传统蓝牙相比,其低功耗的特征最为显著,在蓝牙模块中(CC2540),一块纽扣电池可供电半年到一年之间。

zh1豪的博客 9538

Android实现蓝牙的搜索,配对(不需要输入PIN,自动匹配),连接,通信

目录 目录 一、蓝牙设置权限 二、蓝牙搜索 1.首先需要获得蓝牙适配器。 2.判断蓝牙是否打开,然后请求打开蓝牙 3.搜索蓝牙 三、蓝牙配对 1.动态注册广播接收器 2.判断蓝牙设备是否为目标设备,并且创建绑定 3.利用ClsUtils和事先获得的pin进行配对 4.将绑定状态返回给activity,通知其绑定成功,可以进行蓝牙连接 四、蓝牙连接和通信 1.初始...

lzg13663472636的博客 1万+

Android 蓝牙连接

一、概述 蓝牙是一种无线技术标准,可实现固定设备、移动设备和楼宇个人域网之间的短距离数据交换。最多可以同时和7个其它蓝牙设备建立连接,进行通信。蓝牙可分为两大类:传统蓝牙(蓝牙3.0规范之前),低功耗蓝牙(蓝牙4.0规范之后)。 Android 从4.3版本(API Level 18)开始支持低功耗蓝牙Bluetooth Low Energy(BLE)通信。Android提供了相应的 API,...

KWMax 1万+

安卓蓝牙BLE设备开发

前段时间做了一个有关于安卓蓝牙BLE设备的开发项目,主要的功能包括了搜索蓝牙ble设备和ble设备的数据读写等等,本篇博客用于记录安卓蓝牙ble设备的通信的细节。  其实关于BLE设备的通信在API中已经讲地比较清楚了,这里只是做一个总结,如果要进行BLE设备的开发,首先可以阅读API. BLE有关APIBLE设备的定义和特点 BLE-维基百科  对于BLE设备的定义,我们只需要看维基百科的说

maowei117的博客 2691

C#连接蓝牙并生成QR二维码

查找蓝牙,并且进行连接。并且可以生成QR二维码,并进行打印。初学者可以学习一下,开发环境为VS2005,C#

上一篇: Android 蓝牙通信开发(一) 搜索蓝牙设备
下一篇: Android 蓝牙通信开发(三) 蓝牙通信
magic__Coder
博客等级 码龄11年 41粉丝 25原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值