广告位联系
返回顶部
分享到

Android实现蓝牙串口通讯的介绍

Android 来源:互联网 作者:F11站长开发者 发布时间:2022-08-15 17:28:51 人浏览
摘要

最近在弄蓝牙串口,参考了不少网上的大佬,加上自己早期对C#的学习,写一个给自己的备忘录,如果有大佬看到还请多多指教。 1.简介 Android设备中提供了一整套蓝牙的API,我这边只取

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

1.简介

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

初期权限

1

2

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

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

1.BluetoothAdapter

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

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

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

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());

    }

}

然后直接返回给主窗体

1

2

3

4

5

6

7

8

9

10

11

12

13

14

//事件按钮触发

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。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

<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>

也是方便后面调用

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

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通讯类

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

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();

    }

}

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

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连接设备。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

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);

    }

}

建立回调函数。

1

2

3

4

5

6

7

8

9

Handler _handler=new Handler(Looper.getMainLooper())

{

    @Override

    public void handleMessage(Message msg)

    {

        super.handleMessage(msg);

        edxMessage.setText(edxMessage.getText()+"\n"+msg.obj);

    }

};

发送消息。

1

2

3

4

5

6

7

8

9

10

11

12

public void btnSend_Click(View v)//发送消息

{

      try

      {

        _session.Send(edxContent.getText().toString());

    } catch (IOException e) 

      {

        Toast.makeText(MainActivity.this,

                  "发送失败",

                  Toast.LENGTH_LONG).show();

    }

}

基本上操作就这些。


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。
原文链接 : https://blog.csdn.net/fjyexu/article/details/120831832
相关文章
  • Kotlin的Collection与Sequence操作异同点介绍

    Kotlin的Collection与Sequence操作异同点介绍
    在Android开发中,集合是我们必备的容器,Kotlin的标准库中提供了很多处理集合的方法,而且还提供了两种基于容器的工作方式:Collection 和
  • 实现一个Kotlin函数类型方法

    实现一个Kotlin函数类型方法
    接口与函数类型 业务开发中,经常会有实现一个函数式接口(即接口只有一个方法需要实现)的场景,大家应该都会不假思索的写出如下代
  • Android10 App启动Activity源码分析
    ActivityThread的main方法 让我们把目光聚焦到ActivityThread的main方法上。 ActivityThread的源码路径为/frameworks/base/core/java/android/app/ActivityThread。 1 2
  • Android10客户端事务管理ClientLifecycleManager源码解析

    Android10客户端事务管理ClientLifecycleManager源码解析
    在Android 10 App启动分析之Activity启动篇(二)一文中,简单地介绍了Activity的生命周期管理器是如何调度Activity进入onCreate生命周期的流程。这
  • Kotlin对象的懒加载方式by lazy与lateinit异同介绍

    Kotlin对象的懒加载方式by lazy与lateinit异同介绍
    属性或对象的延时加载是我们相当常用的,一般我们都是使用 lateinit 和 by lazy 来实现。 他们两者都是延时初始化,那么在使用时那么他们两
  • Android类加载流程分析

    Android类加载流程分析
    本文分析的代码基于Android8.1.0源码。 流程分析 从loadClass开始,我们来看下Android中类加载的流程 /libcore/ojluni/src/main/java/java/lang/ClassLoader.ja
  • Android实现读写USB串口数据的代码

    Android实现读写USB串口数据的代码
    最近在研究USB方面的内容;先后做了关于Android读写HID、串口设备的DEMO。本文比较简单,主要介绍的是Android实现读取串口数据的功能 废话不
  • Epoxy - 在RecyclerView中构建复杂界面
    Diffing 对于复杂数据结构支持的多个视图类型展示在屏幕上, Epoxy此时是尤其有用的. 在这些场景中, 数据可能会被网络请求, 异步 Observable, 用
  • Android性能优化的详细介绍

    Android性能优化的详细介绍
    性能优化是一个app很重要的一部分,一个性能优良的app从被下载到启动到使用都能给用户到来很好的体验。自然我们做性能优化也是从被下
  • Android进阶宝典-插件化2(Hook启动插件中四大组件

    Android进阶宝典-插件化2(Hook启动插件中四大组件
    在上一节,我们主要介绍了如果通过反射来加载插件中的类,调用类中的方法;既然插件是一个apk,其实最重要的是启动插件中的Activity、
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计