android 蓝牙SPP协议通信

原创 2016年05月31日 15:45:37

准备

1.蓝牙串行端口基于SPP协议(Serial Port Profile),能在蓝牙设备之间创建串口进行数据传输
2.SPP的UUID:00001101-0000-1000-8000-00805F9B34FB
3.Android手机一般以客户端的角色主动连接SPP协议设备

连接流程

1.检测蓝牙状态
若蓝牙未打开,则打开蓝牙~

bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
@Override
protected void onResume() {
    super.onResume();
    if (!bluetoothAdapter.isEnabled()) {
        // open blueTooth
        Intent enableBtIntent = new Intent( BluetoothAdapter.ACTION_REQUEST_ENABLE);
        startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
    }
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == REQUEST_ENABLE_BT && resultCode == Activity.RESULT_CANCELED) {
        finish();
        return;
    }
}

2.注册设备搜索广播信息
使用registerReceiver注册broadcastReceiver来获取搜索设备等消息

IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(BluetoothDevice.ACTION_FOUND);
intentFilter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
registerReceiver(receiver, intentFilter);
// receiver
private final BroadcastReceiver receiver = new BroadcastReceiver(){
    @Override
    public void onReceive(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:找到设备

@Override
public void onClick(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();
}

Demo下载地址:BTDemo

版权声明:本文为博主原创文章,未经博主允许不得转载。

Android的蓝牙串口(Bluetooth SPP)使用

while(1) {     GPIOB_ODR &= 0xFFFFFFF0;     Delay_Ms(500);     USART1_Send_String("Hel...
  • phenixyf
  • phenixyf
  • 2016年05月23日 11:26
  • 5549

Android与蓝牙串口模块通信

由于项目的需要Android与蓝牙模块通信,发了时间学习了下,实现了Android与蓝牙模块的通信 1.蓝牙串口模块使用SPP-CA模块 蓝牙串口模块就是使用单片机的TX ,RX与蓝牙模块通信,单片机...
  • cwcwj3069
  • cwcwj3069
  • 2015年05月14日 17:37
  • 35864

android BluetoothSPP 蓝牙串口源码

  • 2014年07月27日 15:54
  • 193KB
  • 下载

关于Android蓝牙串口通信那点破事

Android蓝牙串口通讯 闲着无聊玩起了Android蓝牙模块与单片机蓝牙模块的通信,简单思路就是要手机通过蓝牙发送控制指令给单片机,并作简单的控制应用。单片机的蓝牙模块连接与程序暂且略过,此...
  • phenixyf
  • phenixyf
  • 2016年05月23日 11:18
  • 6011

Android蓝牙连接之SPP协议

蓝牙协议分为两种,SPP协议和BLE(Bluetooth low energy),Android4.3以上加入了低功耗蓝牙即BLE蓝牙协议,本篇文章我主要介绍下spp蓝牙协议的一些特性(BLE协议后期...
  • paul_zzq
  • paul_zzq
  • 2017年04月23日 17:49
  • 1626

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

使用设备 基本概念 基本流程本文意在介绍蓝牙开发的主要流程,学习使用蓝牙开发一个星期了,写写一个星期以来遇到的一些小问题,还有介绍下流程。开发具有基本的通信功能,本项目主要是用于与蓝牙模块的串口读写功...
  • wzhworld
  • wzhworld
  • 2017年07月28日 00:21
  • 1765

Android蓝牙开发SPP协议通信

最近项目中使用到蓝牙SPP协议通信,然后在网上看了很多资料,进行学习使用,为了加深印象,做个简单的整理。 1、使用蓝牙权限     2、蓝牙核心类BluetoothAdapter      代表...
  • yangshuangyue
  • yangshuangyue
  • 2016年04月19日 22:27
  • 6361

蓝牙核心技术了解(蓝牙协议、架构、硬件和软件笔记)

https://developer.apple.com/hardwaredrivers/BluetoothDesignGuidelines.pdf 声明:这篇文章是楼主beaut...
  • mirkerson
  • mirkerson
  • 2015年10月21日 15:47
  • 12192

蓝牙 SPP协议文档

  • 2010年11月05日 11:48
  • 251KB
  • 下载

蓝牙SPP协议

  • 2008年04月18日 21:38
  • 251KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:android 蓝牙SPP协议通信
举报原因:
原因补充:

(最多只允许输入30个字)