Android蓝牙通讯【转】
本文转载自:http://blog.csdn.net/vnanyesheshou/article/details/51554852
随着可穿戴设备的流行,研究蓝牙是必不可少的一门技术了。
总结了下蓝牙开发使用的一些东西分享一下。
首先需要AndroidManifest.xml文件中添加操作蓝牙的权限。
<uses-permissionandroid:name="Android.permission.BLUETOOTH" />
允许程序连接到已配对的蓝牙设备。
<uses-permissionandroid:name="android.permission.BLUETOOTH_ADMIN" />
允许程序发现和配对蓝牙设备。
操作蓝牙主要用到的类 BluetoothAdapter类,使用时导包
import android.bluetooth.BluetoothAdapter;
源码具体位置frameworks/base/core/Java/android/bluetooth/BluetoothAdapter.java
BluetoothAdapter 代表本地设备的蓝牙适配器。该BluetoothAdapter可以执行基本的蓝牙任务,例如启
动设备发现,查询配对的设备列表,使用已知的MAC地址实例化一个BluetoothDevice类,并创建一个
BluetoothServerSocket监听来自其他设备的连接请求。
获取蓝牙适配器
- BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
开启蓝牙
- if(!mBluetoothAdapter.isEnabled()){
- //弹出对话框提示用户是后打开
- Intent enabler = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
- startActivityForResult(enabler, REQUEST_ENABLE);
- //不做提示,直接打开,不建议用下面的方法,有的手机会有问题。
- // mBluetoothAdapter.enable();
- }
获取本地蓝牙信息
- //获取本机蓝牙名称
- String name = mBluetoothAdapter.getName();
- //获取本机蓝牙地址
- String address = mBluetoothAdapter.getAddress();
- Log.d(TAG,"bluetooth name ="+name+" address ="+address);
- //获取已配对蓝牙设备
- Set<BluetoothDevice> devices = mBluetoothAdapter.getBondedDevices();
- Log.d(TAG, "bonded device size ="+devices.size());
- for(BluetoothDevice bonddevice:devices){
- Log.d(TAG, "bonded device name ="+bonddevice.getName()+" address"+bonddevice.getAddress());
- }
打印:
- D/MainActivity(16800): bluetooth name =Coolpad 8297 address =18:DC:56:D2:30:BD
- D/MainActivity(16800): bonded device size =1
- D/MainActivity(16800): bonded device name =小米手机 addressF8:A4:5F:02:B1:8F
搜索设备
mBluetoothAdapter.startDiscovery();
开始搜索设备,该过程是异步的,通过下面注册广播接受者,可以监听是否搜到设备。
- IntentFilter filter = new IntentFilter();
- //发现设备
- filter.addAction(BluetoothDevice.ACTION_FOUND);
- //设备连接状态改变
- filter.addAction(BluetoothDevice.ACTION_BOND_STATE_CHANGED);
- //蓝牙设备状态改变
- filter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED);
- registerReceiver(mBluetoothReceiver, filter);
监听扫描结果
- private BroadcastReceiver mBluetoothReceiver = new BroadcastReceiver(){
- @Override
- public void onReceive(Context context, Intent intent) {
- String action = intent.getAction();
- Log.d(TAG,"mBluetoothReceiver action ="+action);
- if(BluetoothDevice.ACTION_FOUND.equals(action)){//每扫描到一个设备,系统都会发送此广播。
- //获取蓝牙设备
- BluetoothDevice scanDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
- if(scanDevice == null || scanDevice.getName() == null) return;
- Log.d(TAG, "name="+scanDevice.getName()+"address="+scanDevice.getAddress());
- //蓝牙设备名称
- String name = scanDevice.getName();
- if(name != null && name.equals(VnApplication.BLUETOOTH_NAME)){
- mBluetoothAdapter.cancelDiscovery();
- //取消扫描
- mProgressDialog.setTitle(getResources().getString(R.string.progress_connecting)); //连接到设备。
- mBlthChatUtil.connect(scanDevice);
- }
- }else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)){
- }
- }
- };
mBlthChatUtil.connect(scanDevice)连接到设备,
此方法中主要是获取socket客户端,并连接。
BluetoothSocket mmSocket = device.createRfcommSocketToServiceRecord(MY_UUID);
mmSocket.connect();
当然有客户端就有服务端了,服务端应先开启,并一直等待客户端连接。直到连接成功。
- private class AcceptThread extends Thread {
- // serverSocket
- private final BluetoothServerSocket mServerSocket;
- public AcceptThread() {
- BluetoothServerSocket tmp = null;
- // 创建一个新的侦听服务器套接字
- try {
- tmp = mAdapter.listenUsingRfcommWithServiceRecord(NAME, MY_UUID);
- } catch (IOException e) {
- Log.e(TAG, "listen() failed", e);
- }
- mServerSocket = tmp;
- }
- public void run() {
- if (D) Log.d(TAG, "BEGIN mAcceptThread" + this);
- setName("AcceptThread");
- BluetoothSocket socket = null;
- // 循环,直到连接成功
- while (mState != STATE_CONNECTED) {
- try {
- // 这是一个阻塞调用和将只返回一个
- // 成功的连接或例外
- socket = mServerSocket.accept();
- } catch (IOException e) {
- Log.e(TAG, "accept() failed", e);
- break;
- }
- // 如果连接被接受
- if (socket != null) {
- synchronized (BluetoothChatUtil.this) {
- switch (mState) {
- case STATE_LISTEN:
- case STATE_CONNECTING:
- // 正常情况。启动连接螺纹。
- connected(socket, socket.getRemoteDevice());
- break;
- case STATE_NONE:
- case STATE_CONNECTED:
- // 没有准备或已连接。socket终止。
- try {
- socket.close();
- } catch (IOException e) {
- Log.e(TAG, "Could not close unwanted socket", e);
- }
- break;
- }
- }
- }
- }
- if (D) Log.i(TAG, "END mAcceptThread");
- }
- }
当连接成功后,connected(mmSocket, mmDevice); 获取输入输出流,从而进行通信。
private InputStream mmInStream = socket.getInputStream();
private OutputStream mmOutStream =socket.getOutputStream();
mmOutStream.write(buffer);发送信息。
mmInStream.read(buffer); 收到消息。
有时候扫描不到设备,需要设备蓝牙可见,这样才能被搜索到。
设置蓝牙可见性
- Intent discoveryIntent = new Intent(
- BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
- discoveryIntent.putExtra(
- BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300);//时间300s,
- startActivity(discoveryIntent);
Android蓝牙通讯【转】的更多相关文章
- android 蓝牙通讯编程 备忘
1.启动App后: 判断->蓝牙是否打开(所有功能必须在打牙打开的情况下才能用) 已打开: 启动代码中的蓝牙通讯Service 未打开: 发布 打开蓝牙意图(系统),根据Activity返回进场 ...
- android蓝牙通讯开发(详细)
新建一个工程之后,我们可以先看到界面左边的项目栏,我们可以看到,除了app目录以外,大多数的文件和目录都是自动生成的,我们也不需要对他们进行修改,而app目录之下的文件才是我们工作的重点.下面,我先对 ...
- Delphi XE5 android 蓝牙通讯传输
不多讲,直接上代码了. 代码来自网络 http://files.cnblogs.com/nywh2008/Bluetooth_LEDs_android.rar
- Android蓝牙串口通讯【转】
本文转载自:http://blog.sina.com.cn/s/blog_631e3f2601012ixi.html Android蓝牙串口通讯 闲着无聊玩起了Android蓝牙模块与单片机蓝牙模块的 ...
- Android学习——蓝牙通讯
蓝牙蓝牙,是一种支持设备短距离通信(一般10m内,且无阻隔媒介)的无线电技术.能在包括移动电话.PDA.无线耳机.笔记本电脑等众多设备之间进行无线信息交换.利用“蓝牙”技术,能够有效的简化移动通信终端 ...
- Android蓝牙开发教程(三)——蓝牙设备相互通讯
在上一篇中已经介绍如何连接我们搜索到的蓝牙设备,如果你还没阅读过,建议先看看上一篇文章Android蓝牙开发教程(二)——连接蓝牙设备 在上一篇文章中,无论是自动连接还是被动连接,连接成功后,都是将获 ...
- android 蓝牙4.0 开发介绍
最近一直在研究一个蓝牙功能 由于本人是菜鸟 学起来比较忙 一直搞了好久才弄懂 , 网上对蓝牙4.0也就是几个个dome 抄来抄去,全是英文注解 , 对英语不好的朋友来说 真是硬伤 , 一些没必要的描 ...
- 深入了解Android蓝牙Bluetooth——《基础篇》
什么是蓝牙? 也可以说是蓝牙技术.所谓蓝牙(Bluetooth)技术,实际上是一种短距离无线电技术,是由爱立信公司公司发明的.利用"蓝牙"技术,能够有效地简化掌上电脑.笔记本电 ...
- Android蓝牙学习笔记
一 Bluetooth基本概念 蓝牙是无线数据和语音传输的开放式标准,它将各种通信设备.计算机及其终端设备.各种数字数据系统.甚至家用电器采用无线方式联接起来.它的传输距离为10cm-10m,如果增加 ...
随机推荐
- windows核心编程 DLL技术 【转】
注:本文章转载于网络,源地址为:http://blog.csdn.net/ithzhang/article/details/7051558 本篇文章将介绍DLL显式链接的过程和模块基地址重定位及模块绑 ...
- 【FUN】——英文版面青年教育网站策划&GUI设计
写在前面:这个教育网页一共分为四个页面,首页.课程.活动.空间.是我在学习网页设计与策划的时候作为知识应用练习做的,主要使用Photoshop软件设计构图,其中图片素材与部分灵感来源于网络. 一.网站 ...
- 过滤器Filter_03_多个Filter的执行顺序
过滤器Filter_03_多个Filter的执行顺序 学习了:https://www.cnblogs.com/HigginCui/p/5772514.html 按照在web.xml中的顺序进行filt ...
- 导出excel文件工具类
package com.rrz.common.utils.excel; import java.io.IOException;import java.io.OutputStream;import ja ...
- google PLDA + 实现原理及源代码分析
LDA背景 LDA(隐含狄利克雷分布)是一个主题聚类模型,是当前主题聚类领域最火.最有力的模型之中的一个,它能通过多轮迭代把特征向量集合按主题分类. 眼下,广泛运用在文本主题聚类中. LDA的开源实现 ...
- css:html() text() val()
转http://www.jb51.net/article/35867.htm .html()用为读取和修改元素的HTML标签 对应js中的innerHTML .html()是用来读取元素的HTM ...
- JS函数库Underscore.js
http://underscorejs.org/ http://www.css88.com/doc/underscore/ http://www.bootcss.com/p/underscore/
- PyInstaller把.py转为.exe
http://www.pyinstaller.org/ http://blog.csdn.net/hmy1106/article/details/45151409 python pyinstaller ...
- html中图片上传预览的实现
本地图片预览 第一种方法 <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type& ...
- 把握linux内核设计思想(二):硬中断及中断处理
[版权声明:尊重原创.转载请保留出处:blog.csdn.net/shallnet,文章仅供学习交流,请勿用于商业用途] 操作系统负责管理硬件设备.为了使系统和硬件设备的协同工作不减少机器性能.系统和 ...