Bluetooth之BluetoothSocket

1.结构

继承关系

public static class Gallery.LayoutParams extends ViewGroup.LayoutParams

java.lang.Object

android.view. ViewGroup.LayoutParams

android.widget.Gallery.LayoutParams

2.类概述

         已连接或连接到蓝牙套接字(socket)。

         蓝牙端口监听接口和TCP端口类似:Socket和ServerSocket类。在服务器端,使用BluetoothServerSocket类来创建一个 监听服务端口。当一个连接被BluetoothServerSocket所接受,它会返回一个新的BluetoothSocket来管理该连接在客户 端,使用一个单独的BluetoothSocket类去初始化一个外接连接和管理该连接。

最通常使用的蓝牙端口是RFCOMM,它是被Android API支持的类型。RFCOMM是一个面向连接,通过蓝牙模块进行的数据流传输方式,它也被称为串行端口规范(Serial Port Profile,SPP)。

为了创建一个BluetoothSocket去连接到一个已知设备,使用方法 BluetoothDevice.createRfcommSocketToServiceRecord()然后调用connect()方法去尝试一个 面向远程设备的连接。这个调用将被阻塞指导一个连接已经建立或者该链接失效。

为了创建一个BluetoothSocket作为服务端(或者“主机”),查看BluetoothServerSocket文档。

每当该端口连接成功,无论它初始化为客户端,或者被接受作为服务器端,通过getInputStream()和getOutputStream()来打开IO流,从而获得各自的InputStream和OutputStream对象

BluetoothSocket类线程安全。特别的,close()方法总会马上放弃外界操作并关闭服务器端口。

注意:需要BLUETOOTH权限。

小结:

服务器端 : 使用BluetoothServerSocket对象可以创建一个BluetoothSocket对象, 调用BluetoothServerSocket的accept()方法就可以获取该对象;

客户端 : 调用BluetoothDevice的createRfcommSocketToServiceRecord()可以获取该对象; 

在服务器端BluetoothServerSocket进行accept()阻塞, 在客户端BluetoothSocket调用connect()连接服务器, 如果连接成功, 服务器端的accept()方法就会返回BluetoothSocket对象, 同时客户端的BluetoothSocket也成功连接服务器, 此时服务器端和客户端的BluetoothSocket对象就可以获取输入输出流, 对数据进行操作;

常见的连接 : 最常见的BluetoothSocket连接是RFCOMM连接, 这是一个面向连接的数据交互, 先建立连接, 在进行数据交互, 类似于打电话.(面向连接对应无连接, 打电话时面向连接的; 网络上发送数据是无连接的).

线程安全 : BluetoothSocket是线程安全的, close()方法会终止BluetoothSocket进行的一切操作, 并且同时会关闭连接;

3. API详解

常用方法介绍 : 

(1)关闭连接
      public void close ()  

马上关闭该端口并且释放所有相关的资源。在其它线程的该端口中引起阻塞,从而使系统马上抛出一个IO异常。

   异常

   IOException

(2)尝试连接
      public void connect ()  

尝试连接到远程设备。该方法将阻塞,指导一个连接建立或者失效。如果该方法没有返回异常值,则该端口现在已经建立。当设备查找正在进行的时候,创建对远程蓝牙设备的新连接不可被尝试。在蓝牙适配器上,设备查找是一个重量级过程,并且肯定会降低一个设备的连接。使用cancelDiscovery()方法去取消一个外界的查询。查询并不由活动所管理,而作为一个系统服务来运行,所以即使它不能直接请求一个查询,应用 程序也总会调用cancelDiscovery()方法。

close()方法可以用来放弃从另一线程而来的调用。

异常

IOException     一个错误,例如连接失败。

BluetoothAdapter的cancelDiscovery()方法;

(3)获取输入流
     public InputStream getInputStream ()  

通过连接的端口获得输入数据流,即使该端口未连接,该输入数据流也会返回。不过在该数据流上的操作将抛出异常,直到相关的连接已经建立。

返回值

    输入流

异常

   IOException

(4)获取输出流
      public OutputStream getOutputStream ()  

通过连接的端口获得输出数据流,即使该端口未连接,该输出数据流也会返回。不过在该数据流上的操作将抛出异常,直到相关的连接已经建立。

返回值

    输出流

异常

   IOException

(5)获取远程设备
     public BluetoothDevice getRemoteDevice ()  
作用 : 如果BluetoothSocket处于连接中, 那么返回连接的远程设备, 如果没有连接, 那么返回null;
(6)是否连接
      public boolean isConnected ()  
作用 : 获取这个BluetoothSocket是否连接;
  • 6
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Android Bluetooth HID中,可以使用BluetoothSocket类提供的输入输出流进行数据传输。以下是传输Bluetooth HID数据的步骤: 1. 建立蓝牙连接:通过BluetoothHidDevice或BluetoothHidHost类中的connect()方法建立蓝牙连接。建立连接后,会返回一个BluetoothSocket对象,该对象可以用于数据传输。 2. 获取输入输出流:通过BluetoothSocket对象的getInputStream()和getOutputStream()方法获取输入输出流。输入流用于接收HID设备发送的数据,输出流用于向HID设备发送数据。 3. 发送HID报文:通过输出流向HID设备发送HID报文。HID报文是指HID设备发送给主机的数据包,或者主机发送给HID设备的控制指令。在发送报文前,需要将报文数据写入输出流中。 示例代码如下: ```java BluetoothSocket socket = ... // 连接建立后返回的BluetoothSocket对象 OutputStream outputStream = socket.getOutputStream(); byte[] reportData = ... // 要发送的HID报文数据 outputStream.write(reportData); ``` 4. 接收HID报文:通过输入流接收HID设备发送的数据。在接收数据时,需要先判断输入流中是否有数据可读,然后再读取数据。 示例代码如下: ```java BluetoothSocket socket = ... // 连接建立后返回的BluetoothSocket对象 InputStream inputStream = socket.getInputStream(); byte[] buffer = new byte[1024]; int bytes; while ((bytes = inputStream.read(buffer)) > 0) { // 处理接收到的数据 } ``` 需要注意的是,在进行数据传输时,需要先了解HID设备的通信协议和数据格式,以正确地发送和接收HID报文。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值