准备

1.蓝牙串行端口基于SPP协议(Serial Port Profile),能在蓝牙设备之间创建串口进行数据传输

2.SPP的UUID:00001101-0000-1000-8000-00805F9B34FB

3.Android手机一般以客户端的角色主动连接SPP协议设备

连接流程

1.检测蓝牙状态

若蓝牙未打开,则打开蓝牙~bluetoothAdapter =BluetoothAdapter.getDefaultAdapter();

@Overrideprotected voidonResume() {super.onResume();if (!bluetoothAdapter.isEnabled()) {//open blueTooth

Intent enableBtIntent = newIntent( BluetoothAdapter.ACTION_REQUEST_ENABLE);

startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);

}

}

@Overrideprotected void onActivityResult(int requestCode, intresultCode, Intent data) {if (requestCode == REQUEST_ENABLE_BT && resultCode ==Activity.RESULT_CANCELED) {

finish();return;

}

}

2.注册设备搜索广播信息

使用registerReceiver注册broadcastReceiver来获取搜索设备等消息IntentFilter intentFilter = newIntentFilter();

intentFilter.addAction(BluetoothDevice.ACTION_FOUND);

intentFilter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);

registerReceiver(receiver, intentFilter);//receiver

private final BroadcastReceiver receiver = newBroadcastReceiver(){

@Overridepublic voidonReceive(Context context, Intent intent) {

String action=intent.getAction();if(BluetoothDevice.ACTION_FOUND.equals(action)) {//find a device

BluetoothDevice device =intent .getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);if (device.getBondState() !=BluetoothDevice.BOND_BONDED) {//未配对设备

newDeviceArrayAdapter.add(device.getName() + "\n" +device.getAddress());

}else{//已经配对过的设备

TextView tvPaired =(TextView)findViewById(R.id.tv_paired);

tvPaired.setVisibility(View.VISIBLE);

lvPairedDevices.setVisibility(View.VISIBLE);

pairedDeviceArrayAdapter.add(device.getName()+ "\n" +device.getAddress());

}

Log.i(TAG,"name:" + device.getName() + " address"+device.getAddress());

}else if(BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action){//search finish

Log.i(TAG, "search finish!");

}

}

};

3.使用BlueAdatper搜索

使用bluetoothAdapter搜索设备,bluetoothAdapter.startDiscovery()在搜索过程中,系统会发出三个广播信息:

ACTION_DISCOVERY_START:开始搜索

ACTION_DISCOVERY_FINISHED:搜索结束

ACTION_FOUND:找到设备@Overridepublic voidonClick(View v) {if(bluetoothAdapter.isDiscovering()) {

bluetoothAdapter.cancelDiscovery();

}

bluetoothAdapter.startDiscovery();

}

4.获取搜索到的蓝牙设备信息

在BroadcastReceiver的onReceive()里取得搜索到的蓝牙设备信息(如名称,MAC,RSSI)

5.通过蓝牙设备的MAC地址来建立一个BluetoothDevice对象:BluetoothDevice romoteDevice = bluetoothAdapter.getRemoteDevice(mDeviceAddress);

6.由BluetoothDevice衍生BluetoothSocket

通过BluetoothSocket的createRfcommSocketToServiceRecord()方法来选择连接的协议/服务,这里用的是SPP(UUID:00001101-0000-1000-8000-00805F9B34FB)try{

bluetoothSocket=romoteDevice.createRfcommSocketToServiceRecord(UUID.fromString(SPP_UUID));

}catch(IOException e) {

e.printStackTrace();

Toast.makeText(this, "socket init failed", Toast.LENGTH_SHORT).show();

}

7.使用BluetoothSocket来连接、读写蓝牙设备

读写可以归到一个独立线程去实现~try{

bluetoothSocket.connect();

Toast.makeText(this, "connect success", Toast.LENGTH_SHORT).show();

}catch(IOException e2) {

e2.printStackTrace();

Toast.makeText(this, "connect failed", Toast.LENGTH_SHORT).show();try{

bluetoothSocket.close();

bluetoothSocket= null;

}catch(IOException e) {

e.printStackTrace();

Toast.makeText(this, "socket close failed", Toast.LENGTH_SHORT).show();

}return;

}try{

inputStream=bluetoothSocket.getInputStream();

}catch(IOException e2) {

e2.printStackTrace();

Toast.makeText(this, "get inputstream failed", Toast.LENGTH_SHORT).show();return;

}try{

OutputStream os=bluetoothSocket.getOutputStream();byte[] osBytes =etInput.getText().toString().getBytes();for (int i = 0; i < osBytes.length; i++) {if (osBytes[i] == 0x0a)

n++;

}byte[] osBytesNew = new byte[osBytes.length+n];

n= 0;for (int i = 0; i < osBytesNew.length; i++) {//mobile "\n"is 0a,modify 0d 0a then send

if (osBytesNew[i] == 0x0a) {

osBytesNew[n]= 0x0d;

n++;

osBytesNew[n]= 0x0a;

}else{

osBytesNew[n]=osBytes[i];

}

n++;

}

os.write(osBytesNew);

}catch(Exception e) {

e.printStackTrace();

}

android中的蓝牙通信协议,android 蓝牙SPP协议通信相关推荐

  1. android spp协议,Android蓝牙开发SPP协议通信

    最近项目中使用到蓝牙SPP协议通信,然后在网上看了很多资料,进行学习使用,为了加深印象,做个简单的整理. 1.使用蓝牙权限< uses-permission android:name=" ...

  2. spp协议 android,android 蓝牙SPP协议通信

    准备 1.蓝牙串行端口基于SPP协议(Serial Port Profile),能在蓝牙设备之间创建串口进行数据传输 2.SPP的UUID:00001101-0000-1000-8000-00805F ...

  3. android 断开蓝牙连接,如何在android中连接和断开扬声器蓝牙

    我尝试在android中连接speakerBluetooth(我使用UE BOOM Speaker),该设备已配对,然后我将此设备连接到我的Android手机,通过蓝牙播放音乐 . 但我失败了,这段代 ...

  4. android中怎么网络判断,Android中判断网络是否连接实例详解

    Android中判断网络是否连接实例详解 在android中,如何监测网络的状态呢,这个有的时候也是十分重要的,方法如下: public class ConnectionDetector { priv ...

  5. android中edittext设置密码格式,Android 自定义EditText(带清理、密码可见、不可见)...

    实际开发中经常会遇到输入框,各种不同的需求,在一般情况下,清除内容,以及密码可见与不可见基本很常见,那么不废话直接上代码! 在res\values\attrs.xml中 .java import an ...

  6. android中自适应布局教程,Android自适应布局设计技巧

    由于目前在做的一款app需要适配手机和平板,所以我在研究怎么构建可适应所有屏幕尺寸的布局方法. 在web的自适应布局上我有很多经验,比如使用网格流,CSS3中的media queries属性等等,这些 ...

  7. 【Android 安装包优化】Android 中使用 SVG 图片 ( Android 5.0 以下的矢量图方案 | 矢量图生成为 PNG 图片 )

    文章目录 一.Android 5.0 以下的矢量图方案 二.矢量图生成为 PNG 图片 三.完整的 build.gradle 构建脚本 四.编译效果 五.参考资料 一.Android 5.0 以下的矢 ...

  8. 【译】Android中的安全数据— Android中的加密(第2部分)

    目录 锁屏 选择一个钥匙 密钥存储 密钥生成 密钥管理 加密与解密 使用范例 下一步是什么 安全提示 锁屏 如果要保护数据,请保护设备. 为了更加安全,在提供对任何应用程序功能的访问权限之前,我们可以 ...

  9. 【译】Android中的安全数据— Android中的加密(第1部分)

    目录 Java密码体系结构 Android Key Store 样例项目 下一步是什么 安全提示 Java密码体系结构 Android建立在Java密码体系结构(JCA)的基础上,该体系结构提供了用于 ...

最新文章

  1. MATLAB 画图时插入图例
  2. [微信小程序直播平台开发]___(一)介绍与流程
  3. tiny4412的烧录工具minitool安装【学习笔记】
  4. java线程运行无限次_java程序运行时到底有多少个活跃线程
  5. centos php imap,centos 5.5 64 php 添加imap 模块记录
  6. 一行代码搞定 GitHub 访问徽章
  7. EPPlus导出Excel感觉很不错~~~
  8. 一文简述npm和cnpm和yarn的区别
  9. python selenium headless chrome chromedriver 等安装
  10. mac下ssh免密登陆远程服务器(linux)
  11. 读写Word的组件DocX介绍与入门
  12. macos下刻录系统盘
  13. 思科网络学习笔记 | 路由概念
  14. 电脑只有.exe文件不显示后缀名
  15. python apply函数的用法_python apply函数
  16. 单目标跟踪——常用数据集和指标
  17. 用计算机画有常数的函数图像,函数图像
  18. 计算机专业b区大学,b区考研学校,b区考研学校排名。
  19. 【理论恒叨】【立体匹配系列】经典SGM:(1)匹配代价计算之互信息(MI)
  20. jquery input的value赋值

热门文章

  1. COM组件浅析(三)- 使用C/C++操作Adobe Illustrator
  2. 屌丝的逆袭——手把手教你用100大洋打造1000大洋SSD固态硬盘的系统提速效果
  3. 【论文阅读】研究生论文学习技巧
  4. 计算机着火处理方法,电脑着火怎么办?
  5. 海运整柜出口操作流程有哪些注意事项?
  6. 关键链 (项目管理方法)
  7. matlab对曲线等距取点,请问如何在matlab曲线图里面取点
  8. 嵌入式linux设计报告,[嵌入式linux课程设计报告.doc
  9. 基于51单片机的水箱水位监测控制系统proteus仿真原理图PCB
  10. 剑侠情缘修改服务器列表名字,剑侠情缘家族个性后缀怎么改好听