Android实现蓝牙串口通讯

本文实例为大家分享了Android实现蓝牙串口通讯的具体代码,供大家参考,具体内容如下

最近在弄蓝牙串口,参考了不少网上的大佬,加上自己早期对C#的学习,写一个给自己的备忘录,如果有大佬看到还请多多指教。

1.简介

Android设备中提供了一整套蓝牙的API,我这边只取了其中需要的部分。

初期权限

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

1.BluetoothAdapter

BluetoothAdapter是本地蓝牙适配器的对象,是所有蓝牙交互操作的入口。

import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
 
 
private BluetoothAdapter mBluetoothAdapter = null;
public ArrayList<BluetoothDevice> deviceList = new ArrayList<BluetoothDevice>();
 
 
// 初始化蓝牙
private void BlueInit()
{
    // 获取蓝牙适配器
    mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
    // 请求开启蓝牙
    if (!mBluetoothAdapter.isEnabled()) 
    {
        Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
        ((Activity)_context).startActivityForResult(enableBtIntent, 1);
    }
}

这里我只获取了已经匹配好的蓝牙模块,Android本身自带搜索匹配蓝牙设备功能。太麻烦了,还有匹配,还要输PIN码。

直接搜索已经匹配的蓝牙模块。

2.BluetoothDevice

表示远程的蓝牙设备可进行远程蓝牙设备的连接请求,以及查询该蓝牙设备的信息,例如名称,地址等。

protected void onResume() 
{
    // 将已配对的设备添加到列表中
    Set<BluetoothDevice> pairedDevices = mBluetoothAdapter.getBondedDevices();
    deviceList.clear();
    if (pairedDevices.size() > 0) 
    {
        String[] nameList = new String[pairedDevices.size()];
        int i=0;
        for (BluetoothDevice device : pairedDevices)
        {
               deviceList.add(device);
            nameList[i] = device.getName() + "\n" + device.getAddress();
            i++;
     }
        //创建一个ArrayAdapter
        ArrayAdapter<?> adapter=new ArrayAdapter<Object>((Activity)_context,android.R.layout.simple_expandable_list_item_1,nameList);
        DeviceView.setAdapter(adapter);
        //注册一个元素单击事件监听方法
        DeviceView.setOnItemClickListener(new DeviceClick());
    }
}

然后直接返回给主窗体

//事件按钮触发
public class DeviceClick implements AdapterView.OnItemClickListener 
{
    @Override
    public void onItemClick(AdapterView<?> arg0, View view, int position, long id) 
    {
        onConfirmListener.confirm(deviceList.get(position));
    }
         
}
public interface OnConfirmListener 
{
    public void confirm(BluetoothDevice device);
}

这里其实用了一个Activity的作为一个Dialog。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="bluetoothtoserial.DeviceActivity" >
 
    <ListView
        android:id="@+id/DeviceView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true" >
    </ListView>
</RelativeLayout>

也是方便后面调用

package bluetoothtoserial;
 
import java.util.ArrayList;
import java.util.Set;
import android.app.Activity;
import android.app.Dialog;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
 
public class DeviceActivity extends Dialog 
{
    Context _context;
    public OnConfirmListener onConfirmListener;
    private ListView DeviceView;
    private BluetoothAdapter mBluetoothAdapter = null;
    public ArrayList<BluetoothDevice> deviceList = new ArrayList<BluetoothDevice>();
 
    public DeviceActivity(Context context) 
    {
        super(context);
        this._context = context;
        // TODO Auto-generated constructor stub
    }
    @Override
    protected void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_device);
        DeviceView = (ListView)findViewById(R.id.DeviceView);
        BlueInit();
        onResume();
    }
    // 初始化蓝牙
    private void BlueInit()
    {
        // 获取蓝牙适配器
        mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
        // 请求开启蓝牙
        if (!mBluetoothAdapter.isEnabled()) 
        {
            Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
            ((Activity)_context).startActivityForResult(enableBtIntent, 1);
        }
    }
    protected void onResume() 
    {
        // 将已配对的设备添加到列表中
        Set<BluetoothDevice> pairedDevices = mBluetoothAdapter.getBondedDevices();
        deviceList.clear();
        if (pairedDevices.size() > 0) 
        {
            String[] nameList = new String[pairedDevices.size()];
            int i=0;
            for (BluetoothDevice device : pairedDevices)
            {
                deviceList.add(device);
                nameList[i] = device.getName() + "\n" + device.getAddress();
                i++;
            }
            //创建一个ArrayAdapter
            ArrayAdapter<?> adapter=new ArrayAdapter<Object>((Activity)_context,android.R.layout.simple_expandable_list_item_1,nameList);
            DeviceView.setAdapter(adapter);
            //注册一个元素单击事件监听方法
            DeviceView.setOnItemClickListener(new DeviceClick());
        }
    }
    //事件按钮触发
      public class DeviceClick implements AdapterView.OnItemClickListener 
      {
        @Override
        public void onItemClick(AdapterView<?> arg0, View view, int position, long id) 
        {
            onConfirmListener.confirm(deviceList.get(position));
        }
          
      }
      public interface OnConfirmListener 
    {
        public void confirm(BluetoothDevice device);
    }
}

3.BluetoothSocket

BluetoothSocket 蓝牙的socket接口,与TCP Socket类似,设备添加完成可以开始连接设备。

这里我直接写了一个Session通讯类

package Channel;
 
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.util.UUID;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;
import android.os.Handler;
import android.os.Message;
 
public class Session extends Thread 
{
    private BluetoothDevice _device = null;
    private BluetoothSocket _socket = null;
    private OutputStream _outStream;
    private InputStream _inStream = null; 
    public boolean IsConnect = false;
    public String Name="";
    public String Address="";
    Handler _handler;
    public Session(BluetoothDevice _device,Handler _handler)
    {
        this._handler = _handler;
        this._device = _device;
        this.Name = this._device.getName();
        this.Address = this._device.getAddress();
        IsConnect = false;
        try 
          {
              // 蓝牙串口服务对应的UUID。如使用的是其它蓝牙服务,需更改下面的字符串
            // UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
              _socket = _device.createRfcommSocketToServiceRecord(UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"));
          } catch (Exception e) 
          {
              return;
          }
    }
    public void connect()
    {
        try 
        {
            _socket.connect();
            _outStream = _socket.getOutputStream();
            _inStream = _socket.getInputStream();
            IsConnect = true;
        }
        catch (IOException e) 
        {
            IsConnect = false;
            try {
                _socket.close();
            } catch (IOException e1) 
            {
            }
              return;
        }
    }
    @Override
    public void run() 
    {  
        byte [] buffer = new byte [1024];
        int len = 0;
        while(true) 
        {
             //从InputStream读取
            try 
            {
                len = _inStream.read(buffer);
            } catch (IOException e) 
            {
                continue;
            }
            if(len> 0)
            { 
                Message msg = _handler.obtainMessage();
                msg.what = 0; 
                try 
                {
                    msg.obj=new String(buffer,"UTF-8");
                } catch (UnsupportedEncodingException e) 
                {
                }
                _handler.sendMessage(msg);
            }
        }
    }
    public void Send(String _value) throws IOException
    {
        _outStream.write(_value.getBytes());
    }
    public void Close() throws IOException
    {
        IsConnect = false;
        _socket.close();
    }
}

接下来就是使用,弹窗选择设备。

public void btnDevice_Click(View v)//选择设备
{
    final DeviceActivity _deviceDialog = new DeviceActivity(this);
    _deviceDialog.onConfirmListener = new  OnConfirmListener() 
    {
        @Override
        public void confirm(BluetoothDevice device)
        {
            _device = device;
            txtDevice.setText(device.getName()+"\n"+device.getAddress());
            _deviceDialog.dismiss();
            btnConnect.setText("连接设备");
            btnConnect.setVisibility(View.VISIBLE);
            btnSend.setVisibility(View.INVISIBLE);
        }
    };
    _deviceDialog.show();
}

选择完设备,建立Session连接设备。

public void btnConnect_Click(View v)//连接设备
{
      _session = new Session(_device,_handler);
      setTitle(_session.Name);
      _session.connect();
      if (_session.IsConnect)
      {
          _session.start();
          btnConnect.setVisibility(View.INVISIBLE);
          btnSend.setVisibility(View.VISIBLE);
          btnSend.setText("发送消息");
    }
      else
      {
          Toast.makeText(MainActivity.this,
                  "连接失败",
                  Toast.LENGTH_LONG).show();
          btnSend.setVisibility(View.INVISIBLE);
    }
}

建立回调函数。

Handler _handler=new Handler(Looper.getMainLooper())
{
    @Override
    public void handleMessage(Message msg)
    {
        super.handleMessage(msg);
        edxMessage.setText(edxMessage.getText()+"\n"+msg.obj);
    }
};

发送消息。

public void btnSend_Click(View v)//发送消息
{
      try
      {
        _session.Send(edxContent.getText().toString());
    } catch (IOException e) 
      {
        Toast.makeText(MainActivity.this,
                  "发送失败",
                  Toast.LENGTH_LONG).show();
    }
}

基本上操作就这些。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 详解Android USB转串口通信开发基本流程

    好久没有写文章了,年前公司新开了一个项目,是和usb转串口通信相关的,需求是用安卓平板通过usb转接后与好几个外设进行通信,一直忙到最近,才慢慢闲下来,趁着这个周末不忙,记录下usb转串口通信开发的基本流程. 我们开发使用的是usb主机模式,即:安卓平板作为主机,usb外设作为从机进行数据通信.整个开发流程可以总结为以下几点: 1.发现设备 UsbManager usbManager = (UsbManager) context.getSystemService(Context.USB_SERV

  • Android串口通信apk源码详解(附完整源码)

    1.SerialPortHelper「Android串口通信」介绍 原项目地址 https://github.com/freyskill/SerialPortHelper Android串口通讯助手可以用于需要使用串口通信的Android外设,该库有如下特点: 1.串口通信部分使用C++实现,在笔者接触的部分设备上实测,使用C++实现与Google官方提供的Demo的方式要快: 2.支持且必须设置串口接收最大数据长度,初始化库时填入该参数,这样设置的原因是考虑在实际使用中,规定的串口通信协议格式

  • Android串口通信之串口读写实例

    在Android串口通信:基本知识梳理的基础上,我结合我项目中使用串口的实例,进行总结: Android使用jni直接进行串口设备的读写网上已经有开源项目了,本文是基于网上的开源项目在实际项目中的使用做的调整和优化: Google串口开源项目 下面是我项目中的相关代码及介绍: 1.SerialPort.cpp /* * Copyright 2009 Cedric Priscal * * Licensed under the Apache License, Version 2.0 (the "Li

  • Android串口通信封装之OkUSB的示例代码

    本文介绍了Android串口通信封装之OkUSB的示例代码,分享给大家.具体如下: Github传送门:OkUSB OkUSB 一个简洁的Android串口通信框架. 功能简介 支持设置波特率 支持设置数据位 支持设置停止位 支持设置校验位 支持DTS和RTS 支持串口连接状态监听 用法简介 Gradle allprojects { repositories { ... maven { url 'https://jitpack.io' } } } dependencies { compile '

  • Android USB转串口通信开发实例详解

     Android USB转串口通信开发实例详解 好久没有写文章了,年前公司新开了一个项目,是和usb转串口通信相关的,需求是用安卓平板通过usb转接后与好几个外设进行通信,一直忙到最近,才慢慢闲下来,趁着这个周末不忙,记录下usb转串口通信开发的基本流程. 我们开发使用的是usb主机模式,即:安卓平板作为主机,usb外设作为从机进行数据通信.整个开发流程可以总结为以下几点: 1.发现设备 UsbManager usbManager = (UsbManager) context.getSystem

  • android串口开发入门之搭建ndk开发环境及第一个jni调用程序

    前言 这几天专门研究了下JNI编程,在网上找了好多资料,不过好多都是以前的,没有更新,而且有的还是错误的,让人不得不吐槽一把.所以觉得自己来一篇,本文将详细介绍关于android搭建ndk开发环境及第一个jni调用程序的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 一:ndk环境搭建 1:开发环境 我使用的是android studio 2.3.3版本,搭建ndk开发环境比较简单,打开File----Settings----Appearance&Behavior--

  • Android 串口通信编程及串口协议分析

    Android 串口通信编程:嵌入式编程和可穿戴设备及智能设备都会用到串口,这里就带大家分析下, 一,android串口通信 串口通信采用一个第三方开源项目,实现串口数据收发. 1. 使用了http://code.google.com/p/android-serialport-api/的项目的serialport api和jni: 2. 支持4串口同时收发,有定时自动发送功能,收发模式可选Txt或Hex模式: 3.  n,8,1,没得选: 4. 为减轻界面卡顿的情况,接收区的刷新采用单独的线程进

  • Android开发之串口编程原理和实现方式

    提到串口编程,就不得不提到JNI,不得不提到JavaAPI中的文件描述符类:FileDescriptor.下面我分别对JNI.FileDescriptor以及串口的一些知识点和实现的源码进行分析说明.这里主要是参考了开源项目android-serialport-api. 串口编程需要了解的基本知识点:对于串口编程,我们只需对串口进行一系列的设置,然后打开串口,这些操作我们可以参考串口调试助手的源码进行学习.在Java中如果要实现串口的读写功能只需操作文件设备类:FileDescriptor即可,

  • Android串口操作方法实例

    1.首先下载一个libserial_port.so,新建目录libs/armeabi,将so文件放到该目录下. 2.定义串口类,在类的构建函数中修改权限,打开设备,创建输入流和输出流,通过native接口访问串口打开关闭函数 复制代码 代码如下: public class SerialPort {  /*Do not remove or rename the field mFd: it is used by native method close();*/  public SerialPort(

  • Android串口开发之使用JNI实现ANDROID和串口通信详解

    一:串口通信简介 前段时间因为工作需要研究了一下android的串口通信,网上有很多讲串口通信的文章,我在做的时候也参考了很多文章,现在就将我学习过程中的一些心得分享给大家,由于串口开发涉及到jni,所以开发环境需要支持ndk开发,如果未配置ndk配置的朋友,或者对jni不熟悉的朋友,请查看上一篇文章,android 串口开发第一篇:搭建ndk开发环境以及第一个jni调用程序 ,串口通信和java操作io类似,先打开串口,然后向串口发送或者读取数据,最后关闭串口,所以基本思路就是: 1.对串口文

随机推荐