android中的蓝牙通信协议,android 蓝牙SPP协议通信
准备
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协议通信相关推荐
- android spp协议,Android蓝牙开发SPP协议通信
最近项目中使用到蓝牙SPP协议通信,然后在网上看了很多资料,进行学习使用,为了加深印象,做个简单的整理. 1.使用蓝牙权限< uses-permission android:name=" ...
- spp协议 android,android 蓝牙SPP协议通信
准备 1.蓝牙串行端口基于SPP协议(Serial Port Profile),能在蓝牙设备之间创建串口进行数据传输 2.SPP的UUID:00001101-0000-1000-8000-00805F ...
- android 断开蓝牙连接,如何在android中连接和断开扬声器蓝牙
我尝试在android中连接speakerBluetooth(我使用UE BOOM Speaker),该设备已配对,然后我将此设备连接到我的Android手机,通过蓝牙播放音乐 . 但我失败了,这段代 ...
- android中怎么网络判断,Android中判断网络是否连接实例详解
Android中判断网络是否连接实例详解 在android中,如何监测网络的状态呢,这个有的时候也是十分重要的,方法如下: public class ConnectionDetector { priv ...
- android中edittext设置密码格式,Android 自定义EditText(带清理、密码可见、不可见)...
实际开发中经常会遇到输入框,各种不同的需求,在一般情况下,清除内容,以及密码可见与不可见基本很常见,那么不废话直接上代码! 在res\values\attrs.xml中 .java import an ...
- android中自适应布局教程,Android自适应布局设计技巧
由于目前在做的一款app需要适配手机和平板,所以我在研究怎么构建可适应所有屏幕尺寸的布局方法. 在web的自适应布局上我有很多经验,比如使用网格流,CSS3中的media queries属性等等,这些 ...
- 【Android 安装包优化】Android 中使用 SVG 图片 ( Android 5.0 以下的矢量图方案 | 矢量图生成为 PNG 图片 )
文章目录 一.Android 5.0 以下的矢量图方案 二.矢量图生成为 PNG 图片 三.完整的 build.gradle 构建脚本 四.编译效果 五.参考资料 一.Android 5.0 以下的矢 ...
- 【译】Android中的安全数据— Android中的加密(第2部分)
目录 锁屏 选择一个钥匙 密钥存储 密钥生成 密钥管理 加密与解密 使用范例 下一步是什么 安全提示 锁屏 如果要保护数据,请保护设备. 为了更加安全,在提供对任何应用程序功能的访问权限之前,我们可以 ...
- 【译】Android中的安全数据— Android中的加密(第1部分)
目录 Java密码体系结构 Android Key Store 样例项目 下一步是什么 安全提示 Java密码体系结构 Android建立在Java密码体系结构(JCA)的基础上,该体系结构提供了用于 ...
最新文章
- MATLAB 画图时插入图例
- [微信小程序直播平台开发]___(一)介绍与流程
- tiny4412的烧录工具minitool安装【学习笔记】
- java线程运行无限次_java程序运行时到底有多少个活跃线程
- centos php imap,centos 5.5 64 php 添加imap 模块记录
- 一行代码搞定 GitHub 访问徽章
- EPPlus导出Excel感觉很不错~~~
- 一文简述npm和cnpm和yarn的区别
- python selenium headless chrome chromedriver 等安装
- mac下ssh免密登陆远程服务器(linux)
- 读写Word的组件DocX介绍与入门
- macos下刻录系统盘
- 思科网络学习笔记 | 路由概念
- 电脑只有.exe文件不显示后缀名
- python apply函数的用法_python apply函数
- 单目标跟踪——常用数据集和指标
- 用计算机画有常数的函数图像,函数图像
- 计算机专业b区大学,b区考研学校,b区考研学校排名。
- 【理论恒叨】【立体匹配系列】经典SGM:(1)匹配代价计算之互信息(MI)
- jquery input的value赋值
热门文章
- COM组件浅析(三)- 使用C/C++操作Adobe Illustrator
- 屌丝的逆袭——手把手教你用100大洋打造1000大洋SSD固态硬盘的系统提速效果
- 【论文阅读】研究生论文学习技巧
- 计算机着火处理方法,电脑着火怎么办?
- 海运整柜出口操作流程有哪些注意事项?
- 关键链 (项目管理方法)
- matlab对曲线等距取点,请问如何在matlab曲线图里面取点
- 嵌入式linux设计报告,[嵌入式linux课程设计报告.doc
- 基于51单片机的水箱水位监测控制系统proteus仿真原理图PCB
- 剑侠情缘修改服务器列表名字,剑侠情缘家族个性后缀怎么改好听