Android 蓝牙串口调试程序开发

前言:本次项目需要为智能设备开发一个 App 于是就开始学习 Android 的蓝牙串口通信方面的知识,现在 App 已经写完了,当初学的时候走了不少弯路和尝试,现作为一名初学者和大家分享一下经验,以及总结我该部分的学习。

〇、蓝牙串口开发的流程

Created with Raphaël 2.2.0 开始 获取权限 检测设备 打开蓝牙 连接设备 收发数据 单片机串口蓝牙 结束 yes no yes no

一、添加需要用到的权限

在 Android 项目中,打开 AndroidManif.xml 文件 添加对蓝牙操作的权限。

    <uses-permission android:name="android.permission.BLUETOOTH" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

二、检测和打开蓝牙设备

1.检测蓝牙设备

如果要通过蓝牙进行串口通信,必须得保证蓝牙设备正常工作,首先要检测蓝牙设备是否正常。通常情况下这一步也可以省略,或在打开蓝牙设备的时候检测。

//获取默认蓝牙设备
mADAPTER_BLUETOOTH = BluetoothAdapter.getDefaultAdapter();
//判断是否有蓝牙设备
if (mADAPTER_BLUETOOTH == null){
	Toast.makeText(MainActivity.this, "未找到蓝牙功能", LENGTH_SHORT).show();
}else {
	Toast.makeText(MainActivity.this, "蓝牙功能正常", LENGTH_SHORT).show();

通过 BluetoothAdapter 来获取默认蓝牙设备,值为 null 说明蓝牙功能缺失,反之则反。

2.打开蓝牙设备

打开蓝牙设备的方式一共有两种,一种是直接通过使能蓝牙打开,另一种是弹出对话框让用户确认打开。一般不使用第一种,而使用有交互的第二种。因为如果我们打开蓝牙,不打开蓝牙可见的话,别人就发现不了我们的设备,对我们的项目没有任何意义,所以在打开蓝牙的同时会打开可见。

  • 直接使能蓝牙的方式
mADAPTER_BLUETOOTH = BluetoothAdapter.getDefaultAdapter();
mADAPTER_BLUETOOTH.enable();
  • 具有人机交互的方式

    构建一个打开蓝牙的方法,可以把对蓝牙操作的方法,写在一个类里面,方便调用。

//打开蓝牙的方法
public void TurnOnBlueTooth(){
    //获取默认蓝牙设备
    mADAPTER_BLUETOOTH = BluetoothAdapter.getDefaultAdapter();
    //判断是否有蓝牙设备
    if (mADAPTER_BLUETOOTH == null){
        Toast.makeText(MainActivity.this, "未找到蓝牙功能", LENGTH_SHORT).show();
    }else {
        Toast.makeText(MainActivity.this, "蓝牙功能正常", LENGTH_SHORT).show();
        if (!mADAPTER_BLUETOOTH.isEnabled()){
            //如果蓝牙设备正常 蓝牙没打开 请求打开并可见
            Intent TurnOn = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
            startActivityForResult(TurnOn,1);
        }else {
            Toast.makeText(MainActivity.this, "蓝牙已打开 请勿重复打开", LENGTH_SHORT).show();
        }
    }
}
  • 蓝牙状态的广播接收者

    通过注册一个蓝牙状态的广播接收者,来接收蓝牙状态改变,给用户提供一个跟友好的人机交互。

    注册广播接收者

//蓝牙状态改变的广播 //注册和绑定广播接收者和广播
IntentFilter mBROADCAST_BLUETOOTH_STATE = new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED);
registerReceiver(RECEIVER_BLUETOOTH_STATE,mBROADCAST_BLUETOOTH_STATE);

写蓝牙状态改变的广播接收者

//蓝牙打开状态的广播接收
private BroadcastReceiver RECEIVER_BLUETOOTH_STATE = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        int state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE,-1);
        switch (state){
            case BluetoothAdapter.STATE_OFF:
                Toast.makeText(MainActivity.this, "蓝牙已关闭", LENGTH_SHORT).show();
                break;
            case BluetoothAdapter.STATE_ON:
                Toast.makeText(MainActivity.this, "蓝牙已打开", LENGTH_SHORT).show();
                break;
            case BluetoothAdapter.STATE_TURNING_OFF:
                Toast.makeText(MainActivity.this, "蓝牙正在关闭", LENGTH_SHORT).show();
                break;
            case BluetoothAdapter.STATE_TURNING_ON:
                Toast.makeText(MainActivity.this, "蓝牙正在打开", LENGTH_SHORT).show();
                break;
        }
    }
};

通过接受蓝牙状态改变的广播,来给用户相应的提示,形成良好的人机交互。

三、搜索并连接蓝牙设备

1.搜索蓝牙设备

搜索蓝牙设备操作直接调用 BluetoothAdapter 的 startDiscovery 方法即可。同样的,我们可以写一个搜索蓝牙的方法,把这个方法写在 对蓝牙操作的 类里面,方便我们去调用。

public void DiscoveryBlueTooth() {
    //获取默认的蓝牙设备
    mADAPTER_BLUETOOTH = BluetoothAdapter.getDefaultAdapter();
    //判断是否在搜索
    if (mADAPTER_BLUETOOTH.isDiscovering()) {
        mADAPTER_BLUETOOTH.cancelDiscovery();
    }
    //开始搜索
    mADAPTER_BLUETOOTH.startDiscovery();
    Toast.makeText(MainActivity.this, "蓝牙设备正在搜索中", LENGTH_SHORT).show();
}

这只是开启搜索,我们搜索的结果该怎么反馈给我们呢?我们需要一个容器来存放我们刚刚搜索到的设备。

  • ListView 和 ListAdapter
    我们在布局文件中,加入一个Listview控件,来显示我们搜索到的蓝牙设备。写好布局后,给 Listview 的 item 写一个布局样式。
<TextView
    android:id="@+id/TV_BLUETOOTH_DEVICE"
    android:layout_width="match_parent"
    android:layout_height="50dp"
    android:textSize="13sp"
    android:textColor="@color/colorWhite"
    android:background="@drawable/button_selector"/>

我这里只用了一个 Textview
写好了 Listview 我们需要一个东西,把搜索到的设备信息和 Listview 的内容绑定起来。这里我用的是 ArrayList ,通过 ArrayAdapter 绑定设备信息和 Listview的内容。

//ArrayAdapter声明
private ArrayAdapter mADAPTER_ARRAY;
//ArrayList定义:存放蓝牙名称和地址
private List<String> BLUETOOTH_DEViCE = new ArrayList<>();
/*
*通过 ArrayAdapter 绑定 ListView控件和ArrayList里的数据
*/
//通过ArrayAdapter绑定数据
mADAPTER_ARRAY = new ArrayAdapter<String>(this,R.layout.list_view_item,R.id.TV_BLUETOOTH_DEVICE,BLUETOOTH_DEViCE);
//给ListView使用这个 adapter
mLV_DEVICE.setAdapter(mADAPTER_ARRAY);

到这里,我们的准备工作就完成了,接下来就是把搜索到的设备信息添加进去。

  • 接收搜索结果的广播
    在接受搜索设备的广播之前,先注册搜索设备的广播,将接收者和广播绑定。
//蓝牙状态改变的广播 //注册和绑定广播接收者和广播
IntentFilter mBROADCAST_BLUETOOTH_STATE = new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED);
registerReceiver(RECEIVER_BLUETOOTH_STATE,mBROADCAST_BLUETOOTH_STATE);

然后写搜索蓝牙设备的广播接收者

private BroadcastReceiver RECEIVER_BLUETOOTH_FOUND = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            if (BluetoothDevice.ACTION_FOUND.equals(action)) {
                BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
                BLUETOOTH_DEViCE.add("  NAME:"+device.getName()+"(待连接)"+"\n"+"  *MAC:"+device.getAddress());
                mADAPTER_ARRAY.notifyDataSetChanged();
            }
        }
    };

将搜索到的设备添加到 ArrayList 里,然后就会在 Listview 上显示。

2.连接蓝牙设备

在完成了搜索设备之后,我们就需要与蓝牙设备进行连接。与单片机上蓝牙串口连接,我们需要蓝牙串口服务的 UUID 00001101-0000-1000-8000-00805F9B34FB
需要一个 Sokect 来连接蓝牙串口。

//设定本机的UUID->通用唯一识别码 //串口UUID
private final UUID mUUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
//定义BluetoothSocket
public static BluetoothSocket mBLUETOOTH_SOCKET;

我们给 Listview 的 item 设立一个点击事件,好让我们点击一个设备的时候,可以连接该设备。在点击事件中,我们通过 ArrayAdapter 的 getItem 方法,来获取保存在 Array List里面的设备信息。然后通过 “*” 定位我们需要的地址的起始位置,来获取地址。通过 BluetoothDevice 的 GetRemoteDevice 方法,获取该地址的的设备。用我们写的 ConnectThread 的方法进行连接设备。

//LV_DEVICE 的 item 被点击:
mLV_DEVICE.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        //BluetoothDevice mBTD =
        //获取item的内容 //解析出内容里的地址
        String s = (String) mADAPTER_ARRAY.getItem(position);
        if (mADAPTER_BLUETOOTH.isDiscovering())
        {
            mADAPTER_BLUETOOTH.cancelDiscovery();
        }
        if (s != null){
        //在这里我们通过*来定位地址的起始字符然后保存在 address里
            String address = s.substring(s.indexOf("*")+5).trim();
            Toast.makeText(MainActivity.this,"MAC:"+address,Toast.LENGTH_LONG).show();
            BluetoothDevice device = mADAPTER_BLUETOOTH.getRemoteDevice(address);
            ConnectThread(device);
        }


    }
});

ConnectThread 方法
进行连接后,我们就开始数据接收服务

public void ConnectThread(BluetoothDevice device) {
    try {
        mBLUETOOTH_SOCKET = device.createRfcommSocketToServiceRecord(mUUID);
        mADAPTER_BLUETOOTH.cancelDiscovery();
        mBLUETOOTH_SOCKET.connect();
        Toast.makeText(MainActivity.this, "连接成功", Toast.LENGTH_LONG).show();
        // 接收数据进程
        ReceiveData receiveThread = new ReceiveData();
        // 连接成功后开启接收数据服务
        receiveThread.start();
    } catch (IOException e) {
        Toast.makeText(MainActivity.this, "连接失败", Toast.LENGTH_SHORT)
                .show();
        try {
            mBLUETOOTH_SOCKET.close();
        } catch (IOException e2) {
            e.printStackTrace();
        }
    }
}

既然要连接我们就要有一个取消连接的方法。关闭 Socket 来释放资源。

    // 取消链接的方法
    public void CancelConnect() {
        try {
            mBLUETOOTH_SOCKET.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

在以上过程中,我们可以自己设立一个 Boolean 型的变量,来表示与设备的连接状态,通过判断该变量的值来做出相应的人机交互。

四、发送并接受串口数据

到这一步,我们的项目基本成型了,只剩下最后也是最关键的与 串口蓝牙进行通信。我这里采用的是发送 字符数据 和 接受 字符数据 进行交互。在发送的时候,会将字符数据转化成字节流的形式发送。

1.发送数据部分

发送数据数据和接受数据,我们需要 输入流 和 输出流。

    //定义输出流//定义输入流
    public static OutputStream OS;
    public static InputStream  IS;

然后写一个 write 的方法来调用 OutputStream 的 write 方法来写一个字节。

    //发送数据的方法
    public static void write(String str) {
        if (CONNECT_STATUS) {
            try {
                OS = mBLUETOOTH_SOCKET.getOutputStream();
                if (OS != null){
                    OS.write(str.getBytes("UTF-8"));
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

我们可以将 String 来源于 Edit Text 控件的内容,通过一个按钮来执行发送的操作。

2.接收数据部分

接受数据的服务我们已经在连接那一步打开了,里面用到的我们写的一个接收数据的方法 ReceiveData 。并且在调用前,我们开启了一个新的线程来做这件事情。

    // 读数据线程
    private class ReceiveData extends Thread {
        InputStream mmInStream;

        private ReceiveData() {
            try {
                mmInStream = mBLUETOOTH_SOCKET.getInputStream();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        @Override
        public void run() {

            int bytes = 0;
            byte[] buffer = new byte[256];
            while (true) {

                // 接收数据
                try {
                    bytes = mmInStream.read(buffer);
                    final String readString = new String(buffer, 0, bytes);

                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            mTV_ACCEPT.append(readString + " ");
                        }
                    });
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

我们可以用一个 Textview 用来显示我们接收到的数据。

五、总结学习

本次项目的学习主要难点在搜索添加设备和,读写数据上,很多内容还需要多家理解,对该部分的知识还不够深刻,需要系统性的学习一下。

以下是 App 的实际效果。
App开始界面
App主界面
切换到调试模式
用户登录界面
用户信息输入界面

  • 16
    点赞
  • 63
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
### 回答1: Android蓝牙串口助手是一款应用程序,可以将Android设备的蓝牙功能和串口通信结合起来。它的主要功能是通过蓝牙与其他设备建立连接,并实现与这些设备的串口通信蓝牙串口助手的使用非常方便。用户只需在Android设备上安装该应用程序,并与目标设备建立蓝牙连接。然后,用户可以在应用程序中设置串口参数,如波特率、数据位、校验位等。一旦串口参数设置完成,用户就可以开始通过应用程序与目标设备进行串口通信。 该应用程序提供了一个简洁而直观的用户界面,用户可以轻松地发送和接收串口数据。用户可以编写自定义的串口指令,并通过应用程序将这些指令发送给目标设备。同时,应用程序还能够实时显示从目标设备接收到的串口数据,方便用户进行实时监测和调试。 Android蓝牙串口助手在很多实际应用中具有广泛的用途。例如,它可以用于与嵌入式设备进行通信,如单片机、传感器等。它也可以用于与蓝牙设备进行通信,如蓝牙打印机、蓝牙耳机等。通过蓝牙串口助手,用户可以在Android设备上实现与这些设备的便捷和高效的串口通信。 总结来说,Android蓝牙串口助手是一款实用的应用程序,它能够将Android设备的蓝牙功能和串口通信相结合,实现与各种设备的串口通信。无论是在嵌入式系统开发、传感器监测还是与蓝牙设备交互等方面,该应用程序都能够帮助用户实现便捷而高效的通信。 ### 回答2: Android蓝牙串口助手是一款在安卓平台上的应用程序,用于实现通过蓝牙无线通信来连接设备的串口通信功能。串口通信是一种基于物理接口的数据传输方式,通过该功能,用户可以与其他通过串口进行数据传输的设备进行通信。 Android蓝牙串口助手通常具备如下功能: 1. 蓝牙设备搜索和连接:可以搜索和选择附近可用的蓝牙设备,并与目标设备进行无线连接。 2. 串口参数设置:用户可以设置串口通信时的波特率、数据位数、校验位以及停止位等参数,以确保与目标设备的通信正常进行。 3. 数据收发:用户可以通过串口助手发送指令或数据给目标设备,同时也可以接收到目标设备发送的数据。 4. 数据解析:部分串口助手可以提供数据的解析功能,将接收到的数据进行解析并以可读的方式展示给用户。 5. 脚本命令:一些串口助手还支持自定义脚本命令,用户可以通过编写脚本实现对目标设备的一系列操作。 Android蓝牙串口助手通常适用于需要和其他设备进行串口通信的场景,比如与嵌入式开发板、传感器、无线模块等进行数据交互的需求。用户可以通过安装和使用Android蓝牙串口助手,通过蓝牙无线连接实现与这些设备的数据收发和控制,提高了设备之间的无线互联性和便利性。 ### 回答3: Android蓝牙串口助手是一款在Android系统上运行的应用程序,可以通过蓝牙技术实现与其他设备之间的串口通信。它可以作为一个中间层,将Android设备的蓝牙功能转换为串口通信的功能。 通过Android蓝牙串口助手,用户可以将Android设备与其他串口设备(例如传感器、控制器等)连接起来,实现数据的双向传输。用户可以通过应用程序的界面,设置串口的通信参数,例如波特率、数据位、停止位等等。 Android蓝牙串口助手不仅提供了串口通信的功能,还包括了一些其他的功能。例如,用户可以通过它来搜索附近的蓝牙设备,并且可以通过蓝牙设备与其他设备进行配对和连接。同时,它还提供了数据的收发功能,用户可以通过应用程序发送数据到其他设备,也可以接收其他设备发送过来的数据。 此外,Android蓝牙串口助手还支持数据的实时显示和保存。用户可以在应用程序界面上实时监测串口数据的发送和接收情况,并且可以将数据保存到设备的存储器中,方便后续的查看和分析。 总而言之,Android蓝牙串口助手是一款帮助用户实现Android设备与串口设备之间通信的应用程序。它提供了串口通信的设置与控制功能,支持蓝牙设备搜索、连接和配对,并且具备数据的实时显示和保存功能。通过使用这款助手,用户可以方便地实现Android设备与其他串口设备之间的数据传输和交互。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值