Android蓝牙通信
Android为蓝牙设备之间的通信封装好了一些调用接口,使得实现Android的蓝牙通信功能并不困难。可通过UUID使两个设备直接建立连接。
具体步骤:
1. 获取BluetoothAdapter实例,注册一个BroadcastReceiver监听蓝牙扫描过程中的状态变化
|
1
|
mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); |
|
1
2
|
IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);registerReceiver(mReceiver, filter); |
|
1
|
|
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
private final BroadcastReceiver mReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); // When discovery finds a device if (BluetoothDevice.ACTION_FOUND.equals(action)) { // Get the BluetoothDevice object from the Intent // 通过EXTRA_DEVICE附加域来得到一个BluetoothDevice设备 BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); // If it's already paired, skip it, because it's been listed already // 如果这个设备是不曾配对过的,添加到list列表 if (device.getBondState() != BluetoothDevice.BOND_BONDED) { list.add(new ChatMessage(device.getName() + "\n" + device.getAddress(), false)); clientAdapter.notifyDataSetChanged(); mListView.setSelection(list.size() - 1); } // When discovery is finished, change the Activity title } else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) { setProgressBarIndeterminateVisibility(false); if (mListView.getCount() == 0) { list.add(new ChatMessage("没有发现蓝牙设备", false)); clientAdapter.notifyDataSetChanged(); mListView.setSelection(list.size() - 1); } } } }; |
2. 打开蓝牙(enable),并设置蓝牙的可见性(可以被其它设备扫描到,客户端是主动发请求的,可不设置,服务端必须设置可见)。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
if (mBluetoothAdapter != null) { if (!mBluetoothAdapter.isEnabled()) { // 发送打开蓝牙的意图,系统会弹出一个提示对话框 Intent enableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); startActivityForResult(enableIntent, RESULT_FIRST_USER); // 设置蓝牙的可见性,最大值3600秒,默认120秒,0表示永远可见(作为客户端,可见性可以不设置,服务端必须要设置) Intent displayIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE); displayIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 0); startActivity(displayIntent); // 直接打开蓝牙 mBluetoothAdapter.enable(); }} |
3. 扫描,startDiscovery()方法是一个很耗性能的操作,在扫描之前可以先使用getBondedDevices()获取已经配对过的设备(可直接连接),避免不必要的消耗。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
private void scanDevice() { // TODO Auto-generated method stub if (mBluetoothAdapter.isDiscovering()) { mBluetoothAdapter.cancelDiscovery(); } else { // 每次扫描前都先判断一下是否存在已经配对过的设备 Set<bluetoothdevice> pairedDevices = mBluetoothAdapter.getBondedDevices(); if (pairedDevices.size() > 0) { for (BluetoothDevice device : pairedDevices) { list.add(new ChatMessage(device.getName() + "\n" + device.getAddress(), true)); } } else { list.add(new ChatMessage("No devices have been paired", true)); clientAdapter.notifyDataSetChanged(); mListView.setSelection(list.size() - 1); } /* 开始搜索 */ mBluetoothAdapter.startDiscovery(); }}</bluetoothdevice> |
4. 通过Mac地址发送连接请求,在这之前必须使用cancelDiscovery()方法停止扫描。
|
1
2
3
4
|
mBluetoothAdapter.cancelDiscovery();// 通过Mac地址去尝试连接一个设备BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(BluetoothMsg.BlueToothAddress); |
5. 通过UUID使两个设备之间建立连接。
客户端:主动发请求
|
1
2
3
4
|
BluetoothSocket socket = device.createRfcommSocketToServiceRecord(UUID.fromString("00001101-0000-1000-8000-00805F9B34FB")); // 通过socket连接服务器,这是一个阻塞过程,直到连接建立或者连接失效socket.connect(); |
服务端:接受一个请求
|
1
2
3
4
5
6
7
|
BluetoothServerSocket mServerSocket = mBluetoothAdapter.listenUsingRfcommWithServiceRecord(PROTOCOL_SCHEME_RFCOMM, UUID.fromString("00001101-0000-1000-8000-00805F9B34FB")); /* 接受客户端的连接请求 */// 这是一个阻塞过程,直到建立一个连接或者连接失效// 通过BluetoothServerSocket得到一个BluetoothSocket对象,管理这个连接BluetoothSocket socket = mServerSocket.accept(); |
6. 通过InputStream/outputStream读写数据流,已达到通信目的。
|
1
2
|
OutputStream os = socket.getOutputStream();os.write(msg.getBytes()); |
|
1
2
3
4
5
6
7
|
InputStream is = null;try { is = socket.getInputStream();} catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace();} |
7. 关闭所有线程以及socket,并关闭蓝牙设备(disable)。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
if (mClientThread != null) { mClientThread.interrupt(); mClientThread = null;}if (mReadThread != null) { mReadThread.interrupt(); mReadThread = null;}try { if (socket != null) { socket.close(); socket = null; }} catch (IOException e) { // TODO: handle exception} |
|
1
2
3
4
5
6
|
if (mBluetoothAdapter != null) { mBluetoothAdapter.cancelDiscovery(); // 关闭蓝牙 mBluetoothAdapter.disable();}unregisterReceiver(mReceiver); |
主要步骤就是这些,为了能够更好的理解,我将服务器端和客户端的代码分开来写了两个程序,下载地址:http://download.csdn.net/detail/visionliao/8417235
结伴旅游,一个免费的交友网站:www.jieberu.com
推推族,免费得门票,游景区:www.tuituizu.com
Android蓝牙通信的更多相关文章
- Android蓝牙通信总结
这篇文章要达到的目标: 1.介绍在Android系统上实现蓝牙通信的过程中涉及到的概念. 2.在android系统上实现蓝牙通信的步骤. 3.在代码实现上的考虑. 4.例子代码实现(手持设备和蓝牙串口 ...
- Qt on Android 蓝牙通信开发
版权声明:本文为MULTIBEANS ORG研发跟随文章,未经MLT ORG允许不得转载. 最近做项目,需要开发安卓应用,实现串口的收发,目测CH340G在安卓手机上非常麻烦,而且驱动都是Java版本 ...
- Android蓝牙通信具体解释
蓝牙通信的大概过程例如以下: 1.首先开启蓝牙 2,搜索可用设备 3,创建蓝牙socket.获取输入输出流 4,读取和写入数据 5.断开连接关闭蓝牙 还要发送配对码发送进行推断! 以下是全部的源码:不 ...
- (转)android 蓝牙通信编程
转自:http://blog.csdn.net/pwei007/article/details/6015907 Android平台支持蓝牙网络协议栈,实现蓝牙设备之间数据的无线传输. 本文档描述了怎样 ...
- Android蓝牙通信功能开发
1. 概述 Bluetooth 是几乎现在每部手机标准配备的功能,多用于耳机 mic 等设备与手机的连接,除此之外,还可以多部手机之间建立 bluetooth 通信,本文就通过 SDK 中带的一个聊天 ...
- android 蓝牙通信编程讲解
以下是开发中的几个关键步骤: 1,首先开启蓝牙 2,搜索可用设备 3,创建蓝牙socket,获取输入输出流 4,读取和写入数据 5,断开连接关闭蓝牙 下面是一个demo 效果图: SearchDevi ...
- android 蓝牙 通信 bluetooth
此例子基于 android demo Android的蓝牙开发,虽然不多用,但有时还是会用到, Android对于蓝牙开发从2.0版本的sdk才开始支持,而且模拟器不支持,测试需要两部手机: ...
- Android 蓝牙通信——AndroidBluetoothManager
转载请说明出处! 作者:kqw攻城狮 出处:个人站 | CSDN To get a Git project into your build: Step 1. Add the JitPack repos ...
- Android BLE设备蓝牙通信框架BluetoothKit
BluetoothKit是一款功能强大的Android蓝牙通信框架,支持低功耗蓝牙设备的连接通信.蓝牙广播扫描及Beacon解析. 关于该项目的详细文档请关注:https://github.com/d ...
随机推荐
- java lesson13Homework
/** * 1. 字符串解析,现有字符串,“卡巴斯基#杀毒软件#免费版#俄罗斯#”,解析出每个元素. */ package String13Practice; public class String0 ...
- JS 正则验证字符串中是否含有数字
var test_text="abc123";//2. if (new RegExp("[0-9]").test(test_text)) { return fa ...
- Springboot Hikari Centos 首次连数据库很慢
前言: springboot项目默认使用了hikari作为数据库连接池,在开发机器上一切正常. 但是把程序部署到Centos7 x64上之后发现,每次首页登录的时候都要停顿几十秒. 于是,在程序启动后 ...
- Vue-----this.$nextTick()
Vue-----this.$nextTick() $nextTick Vue.nextTick()是在下次 DOM 更新循环结束之后执行延迟回调,在修改数据之后使用 $nextTick,则可以在回调中 ...
- jboss日志的自定义
最近由于想着每次调试socket接收数据情况都需要源码debug好麻烦,要是能把接收到的数据输出到一个单独的日志文件,那出问题的时候,查看问题就方便多了. log4j的日志是可以很方便自定义的,只是这 ...
- python3中OS模块
os模块 OS模块简单的来说它是一个Python的系统编程的操作模块,可以处理文件和目录这些我们日常手动需要做的操作. 可以查看OS模块的帮助文档: import os:#导入os模块 help(os ...
- windows 下Nginx 入门
验证配置是否正确: nginx -t 查看Nginx的版本号:nginx -V 启动Nginx:start nginx 快速停止或关闭Nginx:nginx -s stop 正常停止或关闭Nginx: ...
- 【异常】The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
1 详细异常信息 The last packet sent successfully to the server was milliseconds ago. The driver has not re ...
- 第十章· MySQL的主从复制
一.主从复制简介  2015年5月28日11时,12小时后恢复,损失:平均每小时106.48W$ 1)高可用 2)辅助备份 3)分担负载 复制是 MySQL 的一项功能,允许服务器将更改从一个实例复 ...
- C++ 批量打开写入文件
用到了C++17的filesystem 库 说明:这个函数主要是用来处理日志中不同Thread的日志,主要目的是将不同Thread的日志写到不同的文件中 int GetThreadTime(const ...