低功耗蓝牙是服务器和客户机架构吗

低功耗蓝牙是服务器和客户机架构吗,第1张

nRF51822 (128kB) 将带来同样业内第一的多协议无线能力和专为超低功耗无线应用优化的32位 ARM Cortex-M0 处理器,为蓝牙低功耗模式带来 -925dB RX 的敏感度,为所有模式带来最高达 +4dBm 的输出功率,让链路预算最多较原先业内领先的一代Nordic 芯片提升 95dBm,并为3V 电池带来低于 10mA 的峰值电流,使电池寿命延续数月或数年(依应用情况而定)。和现有的 nRF51822 一样,新的 nRF51822 128kB 也能百之分百地与 Nordic 现有的 nRF24L系列 IC(集成电路或芯片)空中兼容。
以上都是官方的说法但给我的惊喜是:它据然把蓝牙协议变成BIN格式,烧写到了芯片里。
用户使时就下载BLE SoftDevice 用里边的API调用相应的功能就可以啦。
谢谢,望采纳。

在上一篇中有介绍了Wifi与网络连接处理
Android开发之WiFi与网络连接处理
下面,来继续说说Android中蓝牙的基本使用。

Bluetooth是目前使用的最广泛的无线通讯协议之一,主要针对短距离设备通讯(10米),常用于连接耳机、鼠标和移动通讯设备等。

值得一提的是:
android42新增了部分新功能,但是对于Bluetooth熟悉的人或许开始头疼了,那就是Android42引入了一个新的蓝牙协议栈针BLE。谷歌和Broadcom之间的合作,开发新的蓝牙协议栈,取代了基于堆栈的Bluez。因此市场上出现了老设备的兼容问题,很多蓝牙设备在android42手机上不能正常使用。

BluetoothAdapter简单点来说就是代表了本设备(手机、电脑等)的蓝牙适配器对象。

first:we need permission
要 *** 作蓝牙,先要在AndroidManifestxml里加入权限

下面来看看如何使用蓝牙。 ↓↓↓
Demo已就绪:

返回值:如果设备具备蓝牙功能,返回BluetoothAdapter 实例;否则,返回null对象。

打开蓝牙设备的方式:
1直接调用函数enable()去打开蓝牙设备 ;
2系统API去打开蓝牙设备,该方式会d出一个对话框样式的Activity供用户选择是否打开蓝牙设备。

注意: 1如果蓝牙已经开启,不会d出该Activity界面。2在目前大多数Android手机中,是不支持在飞行模式下开启蓝牙的。如果蓝牙已经开启,那么蓝牙的开关 ,状态会随着飞行模式的状态而发生改变。

1 搜索蓝牙设备
使用BluetoothAdapter的startDiscovery()方法来搜索蓝牙设备
startDiscovery()方法是一个异步方法,调用后会立即返回。该方法会进行对其他蓝牙设备的搜索,该过程会持续12秒。该方法调用后,搜索过程实际上是在一个System Service中进行的,所以可以调用cancelDiscovery()方法来停止搜索(该方法可以在未执行discovery请求时调用)。

系统开始搜索蓝牙设备
^(  ̄(oo) ̄ ) ^ 系统会发送以下三个广播:

2扫描设备

3定义广播接收器接收搜索结果

4注册广播

获取附近的蓝牙设备

第一步建立连接:首先Android sdk(20以上版本)支持的蓝牙连接是通过BluetoothSocket建立连接,服务端BluetoothServerSocket和客户端(BluetoothSocket)需指定同样的UUID,才能建立连接,因为建立连接的方法会阻塞线程,所以服务器端和客户端都应启动新线程连接。

(这里的服务端和客户端是相对来说的)
两个蓝牙设备之间的连接,则必须实现服务端与客户端的机制。
当两个设备在同一个RFCOMM channel下分别拥有一个连接的BluetoothSocket,这两个设备才可以说是建立了连接。

服务端设备与客户端设备获取BluetoothSocket的途径是不同的。
1,服务端设备是通过accepted一个incoming connection来获取的,
2,客户端设备则是通过打开一个到服务端的RFCOMM channel来获取的。

服务端
通过调用BluetoothAdapter的listenUsingRfcommWithServiceRecord(String, UUID)方法来获取BluetoothServerSocket(UUID用于客户端与服务端之间的配对)

客户端
调用BluetoothService的createRfcommSocketToServiceRecord(UUID)方法获取BluetoothSocket(该UUID应该同于服务端的UUID)。
调用BluetoothSocket的connect()方法(该方法为block方法),如果UUID同服务端的UUID匹配,并且连接被服务端accept,则connect()方法返回。

数据传递,通过以上 *** 作,就已经建立的BluetoothSocket连接了,数据传递无非是通过流的形式
获取流

该类就是关于远程蓝牙设备的一个描述。通过它可以和本地蓝牙设备---BluetoothAdapter连接通信。

好多东西我也不知道怎么描述,下面给出Demo:
刚好有刚学习的小伙伴问我ListView怎么用,那我就用ListView。

源码:
RairDemo
GitHub: >这个功能据我所知,一般就是拿手机当猫或者路由器的时候有用。具体如下:在中国,GPRS有2个节点:cmwap 和 cmnet 。cmwap 是仅限于手机浏览WAP网站而用的,cmnet 可以随时将手机当作
Modem,用电脑接入互联网,但是 cmnet 并没有包月服务。千万别使用 cmnet 接入点连接,除非你很有钱。
下边以我的Nokia-N70手机连接PC为例:
A,蓝牙连接方式:
用蓝牙方式连接通过手机让PC上网并不需要使用诺基亚PC套件。
1购入一个USB的蓝牙适配器,安装最新的破解蓝牙驱动IVT_BlueSoleil_6222710_for_32bit_OS(如果没有经过破解系统将限制蓝牙的使用,每次只能传输2M的数据)。
2将手机和笔记本通过蓝牙进行配对连接。
3打开:控制面板-电话和调制解调器选项-调制解调器-Bluetooth DUN Mdoem-属性-高级-额外的初始化命令中填入
at+cgdcont=1,"IP","cmwap"
在填入额外的初始化命令后点击确定,再次打开其-属性-高级“诊断”--“查询调制解调器”,以确认电脑和手机的蓝牙MODEM正常连接。
4新建一个拨号连接:控制面板-网络连接-创建一个新的连接,网络连接类型选择“连接到Internet”下一步,“手动设置我的链接”下一步,完成,Modem 要选择“Bluetooth链路上的标准调制解调器”,拨号号码为 99# ,用户名、密码都为空。
5系统自动d出链接窗口,因为前面已经设置好,这里一路下一步即可用注意户名和密码为空,拨号为99#,完成后,提示连接成功,速度115K这时并不会通过手机进行拨号,不用担心电话费的问题。
6在手机上打开“连接管理”,查看当前的连接详细信息,确认名称是 cmwap ,这点很重要,如果不是那可能要花冤枉钱了。
B,数据线连接方式:
1安装最新的诺基亚PC套件,新版套件都自带手机驱动程序。
2安装好后依提示将手机与电脑连接,由于诺基亚PC套件连接并不稳定,如果电脑提示为“无法识别的设备”,在数据线连接的状态下重新启动手机一般会解决问题,连接成功后,系统提示找到N70,并自动安装驱动和相关程序。
3打开:控制面板-电话和调制解调器选项-调制解调器-NOKIA N70 USB Modem-属性-高级-额外的初始化命令中填入
at+cgdcont=1,"IP","cmwap"
在填入额外的初始化命令后点击确定,再次打开其-属性-高级“诊断”--“查询调制解调器”,以确认电脑和手机的蓝牙MODEM正常连接。
4新建一个拨号连接:控制面板-网络连接-创建一个新的连接,网络连接类型选择“连接到Internet”下一步,“手动设置我的链接”下一步,完成,Modem 要选择“Bluetooth链路上的标准调制解调器”,拨号号码为 99# ,用户名、密码都为空。
5系统自动d出链接窗口,因为前面已经设置好,这里一路下一步即可用注意户名和密码为空,拨号为99#,完成后,提示连接成功,速度115K这时并不会通过手机进行拨号,不用担心电话费的问题。
6在手机上打开“连接管理”,查看当前的连接详细信息,确认名称是 cmwap ,这点很重要,如果不是那可能要花冤枉钱了。
C,对电脑进行一些简单的设置:
打开IE浏览器,工具-Internet ,选项-连接,选择刚才你建立的拨号连接,然后点击“设置”按钮,在代理服务器里填写:
1000172,端口号:80,确定退出。
此时你的浏览器可能还不能正常打开网站页面。打开记事本,粘贴以下文本:
Windows Registry Editor Version 500
[HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionInternet
Settings50User Agent]
@="OpenWave"
[HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionInternet
Settings50User AgentPost Platform]
"NET CLR 114322"=""
"OpenWave"=""
然后保存为 reg 格式的文件,双击导入注册表,就可以上网了。
如何使用QQ?
打开QQ的系统设置-代理设置-使用自定义的网络设置-类型->Android平台支持蓝牙网络协议栈,实现蓝牙设备之间数据的无线传输。本文档描述了怎样利用android平台提供的蓝牙API去实现蓝压设备之间的通信。蓝牙具有point-to-point 和 multipoint两种连接功能。使用蓝牙API,可以做到: 搜索蓝牙设备 从本地的Bluetooth adapter中查询已经配对的设备 建立RFCOMM通道 通过service discovery连接到其它设备 在设备之间传输数据 管理多个连接 基础知识本文档介绍了如何使用Android的蓝牙API来完成的四个必要的主要任务,使用蓝牙进行设备通信,主要包含四个部分:蓝牙设置、搜索设备(配对的或可见的)、连接、传输数据。所有的蓝牙API在androidbluetooth包中。实现这些功能主要需要下面这几个类和接口: BluetoothAdapter 代表本地蓝牙适配器(蓝牙发射器),是所有蓝牙交互的入口。通过它可以搜索其它蓝牙设备,查询已经配对的设备列表,通过已知的MAC地址创建BluetoothDevice,创建BluetoothServerSocket监听来自其它设备的通信。 BluetoothDevice 代表了一个远端的蓝牙设备, 使用它请求远端蓝牙设备连接或者获取 远端蓝牙设备的名称、地址、种类和绑定状态。 (其信息是封装在 bluetoothsocket 中) 。 BluetoothSocket 代表了一个蓝牙套接字的接口(类似于 tcp 中的套接字) ,他是应用程 序通过输入、输出流与其他蓝牙设备通信的连接点。 BluetoothServerSocket 代表打开服务连接来监听可能到来的连接请求 (属于 server 端) , 为了连接两个蓝牙设备必须有一个设备作为服务器打开一个服务套接字。 当远端设备发起连 接连接请求的时候,并且已经连接到了的时候,Blueboothserversocket 类将会返回一个 bluetoothsocket。 BluetoothClass 描述了一个设备的特性(profile)或该设备上的蓝牙大致可以提供哪些服务(service),但不可信。比如,设备是一个电话、计算机或手持设备;设备可以提供audio/telephony服务等。可以用它来进行一些UI上的提示。 BluetoothProfile BluetoothHeadset 提供手机使用蓝牙耳机的支持。这既包括蓝牙耳机和免提(V15)模式。 BluetoothA2dp 定义高品质的音频,可以从一个设备传输到另一个蓝牙连接。 “A2DP的”代表高级音频分配模式。 BluetoothHealth 代表了医疗设备配置代理控制的蓝牙服务 BluetoothHealthCallback 一个抽象类,使用实现BluetoothHealth回调。你必须扩展这个类并实现回调方法接收更新应用程序的注册状态和蓝牙通道状态的变化。 BluetoothHealthAppConfiguration 代表一个应用程序的配置,蓝牙医疗第三方应用注册与远程蓝牙医疗设备交流。 BluetoothProfileServiceListener 当他们已经连接到或从服务断开时通知BluetoothProfile IPX的客户时一个接口(即运行一个特定的配置文件,内部服务)。 蓝牙权限为了在你的应用中使用蓝牙功能,至少要在AndroidManifestxml中声明两个权限:BLUETOOTH(任何蓝牙相关API都要使用这个权限) 和 BLUETOOTH_ADMIN(设备搜索、蓝牙设置等)。 为了执行蓝牙通信,例如连接请求,接收连接和传送数据都必须有BLUETOOTH权限。 必须要求BLUETOOTH_ADMIN的权限来启动设备发现或 *** 纵蓝牙设置。大多数应用程序都需要这个权限能力,发现当地的蓝牙设备。此权限授予其他的能力不应该使用,除非应用程序是一个“电源管理”,将根据用户要求修改的蓝牙设置 注释:要请求BLUETOOTH_ADMIN的话,必须要先有BLUETOOTH。 在你的应用manifest 文件中声明蓝牙权限。例如: 通过查看资料来声明应用权限获取更多的信息。 蓝牙设置在你的应用通过蓝牙进行通信之前,你需要确认设备是否支持蓝牙,如果支持,确信它被打开。 如果不支持,则不能使用蓝牙功能。如果支持蓝牙,但不能够使用,你刚要在你的应用中请求使用蓝牙。这个要两步完成,使用BluetoothAdapter。 1获取BluetoothAdapter 所有的蓝牙活动请求BluetoothAdapter,为了获取BluetoothAdapter,呼叫静态方法getDefaultAdapter() 。这个会返回一个BluetoothAdapter,代表设备自己的蓝牙适配器(蓝牙无线电)。这个蓝牙适配器应用于整个系统中,你的应用可以通过这个对象进行交互。如果getDefaultAdapter()返回null,则这个设备不支持蓝牙。例如: BluetoothAdapter mBluetoothAdapter = BluetoothAdaptergetDefaultAdapter(); if (mBluetoothAdapter == null) { // Device does not support Bluetooth } 2打开蓝牙 其次。你需要确定蓝牙能够使用。通过isEnabled()来检查蓝牙当前是否可用。如果这个方法返回false,则蓝牙不能够使用。为了请求蓝牙使用,呼叫startActivityForResult()与的ACTION_REQUEST_ENABLE动作意图。通过系统设置中启用蓝牙将发出一个请求(不停止蓝牙应用)。例如: if (mBluetoothAdapterisEnabled()) { Intent enableBtIntent = new Intent(BluetoothAdapterACTION_REQUEST_ENABLE); startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT); } 对话框中显示请求使用蓝牙权限。如果响应"Yes",这个进程完成(或失败)后你的应用将能够使用蓝牙。 REQUEST_ENABLE_BT常量作为一个整型传到startActivityForResult()中(值必须大于0),该系统传回给你,在你onActivityResult()作为实现的requestCode参数。 如果调用蓝牙成功,你的Activity就会在onActivityResult()中收到RESULT_OK结果,如果蓝牙不能使用由于错误(或用户响应“NO”那么结果返回RESULT_CANCELED。 除了通过onActivityResult(),还可以通过监听ACTION_STATE_CHANGED这个broadcast Intent来知道蓝牙状态是否改变。这个Intent包含EXTRA_STATE,EXTRA_PREVIOUS_STATE两个字段,分别代表新旧状态。可能的值是STATE_TURNING_ON, STATE_ON, STATE_TURNING_OFF, 还有STATE_OFF。 小贴: Enabling discoverability 将自动启用蓝牙。如果您计划执行蓝牙活动之前,始终使设备可发现,你可以跳过上面的步骤2。参阅enabling discoverability。 搜索设备使用BluetoothAdapter可以通过设备搜索或查询配对设备找到远程Bluetooth设备。 Device discovery(设备搜索)是一个扫描搜索本地已使能Bluetooth设备并且从搜索到的设备请求一些信息的过程(有时候会收到类似“discovering”,“inquiring”或“scanning”)。但是,搜索到的本地Bluetooth设备只有在打开被发现功能后才会响应一个discovery请求,响应的信息包括设备名,类,唯一的MAC地址。发起搜寻的设备可以使用这些信息来初始化跟被发现的设备的连接。一旦与远程设备的第一次连接被建立,一个pairing请求就会自动提交给用户。如果设备已配对,配对设备的基本信息(名称,类,MAC地址)就被保存下来了,能够使用Bluetooth API来读取这些信息。使用已知的远程设备的MAC地址,连接可以在任何时候初始化而不必先完成搜索(当然这是假设远程设备是在可连接的空间范围内)。 需要记住,配对和连接是两个不同的概念: 配对意思是两个设备相互意识到对方的存在,共享一个用来鉴别身份的链路键(link-key),能够与对方建立一个加密的连接。 连接意思是两个设备现在共享一个RFCOMM信道,能够相互传输数据。 目前Android Bluetooth API's要求设备在建立RFCOMM信道前必须配对(配对是在使用Bluetooth API初始化一个加密连接时自动完成的)。 下面描述如何查询已配对设备,搜索新设备。 注意:Android的电源设备默认是不能被发现的。用户可以通过系统设置让它在有限的时间内可以被发现,或者可以在应用程序中要求用户使能被发现功能。 查找匹配设备在搜索设备前,查询配对设备看需要的设备是否已经是已经存在是很值得的,可以调用getBondedDevices()来做到,该函数会返回一个描述配对设备BluetoothDevice的结果集。例如,可以使用ArrayAdapter查询所有配对设备然后显示所有设备名给用户: Set pairedDevices = mBluetoothAdaptergetBondedDevices(); // If there are paired devices if (pairedDevicessize() > 0) { // Loop through paired devices for (BluetoothDevice device : pairedDevices) { // Add the name and address to an array adapter to show in a ListView mArrayAdapteradd(devicegetName() + "n" + devicegetAddress()); } }; BluetoothDevice对象中需要用来初始化一个连接唯一需要用到的信息就是MAC地址。 扫描设备要开始搜索设备,只需简单的调用startDiscovery() 。该函数时异步的,调用后立即返回,返回值表示搜索是否成功开始。搜索处理通常包括一个12秒钟的查询扫描,然后跟随一个页面显示搜索到设备Bluetooth名称。 应用中可以注册一个带ACTION_FOUND Intent的BroadcastReceiver,搜索到每一个设备时都接收到消息。对于每一个设备,系统都会广播ACTION_FOUND Intent,该Intent携带着而外的字段信息EXTRA_DEVICE和EXTRA_CLASS,分别包含一个BluetoothDevice和一个BluetoothClass。 下面的示例显示如何注册和处理设备被发现后发出的广播: 代码如下: // Create a BroadcastReceiver for ACTION_FOUND private final BroadcastReceiver mReceiver = new BroadcastReceiver() { public void onReceive(Context context, Intent intent) { String action = intentgetAction(); // When discovery finds a device if (BluetoothDeviceACTION_FOUNDequals(action)) { // Get the BluetoothDevice object from the Intent BluetoothDevice device = intentgetParcelableExtra(BluetoothDeviceEXTRA_DEVICE); // Add the name and address to an array adapter to show in a ListView mArrayAdapteradd(devicegetName() + "n" + devicegetAddress()); } } }; // Register the BroadcastReceiver IntentFilter filter = new IntentFilter(BluetoothDeviceACTION_FOUND); registerReceiver(mReceiver, filter); // Don't forget to unregister during onDestroy 警告:完成设备搜索对于Bluetooth适配器来说是一个重量级的处理,要消耗大量它的资源。一旦你已经找到一个设备来连接,请确保你在尝试连接前使用了cancelDiscovery()来停止搜索。同样,如果已经保持了一个连接的时候,同时执行搜索设备将会显著的降低连接的带宽,所以在连接的时候不应该执行搜索发现。 使能被发现如果想让本地设备被其他设备发现,可以带ACTION_REQUEST_DISCOVERABLE action Intent调用startActivityForResult(Intent, int) 方法。该方法会提交一个请求通过系统刚设置使设备出于可以被发现的模式(而不影响应用程序)。默认情况下,设备在120秒后变为可以被发现的。可以通过额外增加EXTRA_DISCOVERABLE_DURATION Intent自定义一个值,最大值是3600秒,0表示设备总是可以被发现的(小于0或者大于3600则会被自动设置为120秒)。下面示例设置时间为300: Intent discoverableIntent = new Intent(BluetoothAdapterACTION_REQUEST_DISCOVERABLE); discoverableIntentputExtra(BluetoothAdapterEXTRA_DISCOVERABLE_DURATION, 300); startActivity(discoverableIntent); ! 询问用户是否允许打开设备可以被发现功能时会显示一个对话框。如果用户选择“Yes”,设备会在指定时间过后变为可以被发现的。Activity的onActivityResult()回调函数被调用,结果码等于设备变为可以被发现所需时长。如果用户选择“No”或者有错误发生,结果码会是ActivityRESULT_CANCELLED。 提示:如果Bluetooth没有启用,启用Bluetooth可被发现功能能够自动开启Bluetooth。 在规定的时间内,设备会静静的保持可以被发现模式。如果想在可以被发现模式被更改时受到通知,可以用ACTION_SCAN_MODE_CHANGED Intent注册一个BroadcastReceiver,包含额外的字段信息EXTRA_SCAN_MODE和EXTRA_PREVIOUS_SCAN_MODE分别表示新旧扫描模式,其可能的值为SCAN_MODE_CONNECTABLE_DISCOVERABLE(discoverable mode),SCAN_MODE_CONNECTABLE(not in discoverable mode but still able to receive connections),SCAN_MODE_NONE(not in discoverable mode and unable to receive connections)。如果只需要连接远程设备就不需要打开设备的可以被发现功能。只在应用作为一个服务器socket的宿主用来接收进来的连接时才需要使能可以被发现功能,因为远程设备在初始化连接前必须先发现了你的设备。 连接设备为了在两台设备上创建一个连接,你必须在软件上实现服务器端和客户端的机制,因为一个设备必须必须打开一个server socket,而另一个必须初始化这个连接(使用服务器端设备的MAC地址进行初始化)。当服务器端和客户端在同一个RFCOMM信道上都有一个BluetoothSocket时,就可以认为它们之间建立了一个连接。在这个时刻,每个设备能获得一个输出流和一个输入流,也能够开始数据传输。本节介绍如何在两个设备之间初始化一个连接。服务器端和客户端获得BluetoothSocket的方法是不同的,服务器端是当一个进入的连接被接受时才产生一个BluetoothSocket,客户端是在打开一个到服务器端的RFCOMM信道时获得BluetoothSocket的。 一种实现技术是,每一个设备都自动作为一个服务器,所以每个设备都有一个server socket并监听连接。然后每个设备都能作为客户端建立一个到另一台设备的连接。另外一种代替方法是,一个设备按需打开一个server socket,另外一个设备仅初始化一个到这个设备的连接。 Note: 如果两个设备在建立连接之前并没有配对,那么在建立连接的过程中,Android框架将自动显示一个配对请求的notification或者一个对话框,如Figure 3所示。所以,在尝试连接设备时,你的应用程序无需确保设备之间已经进行了配对。你的RFCOMM连接将会在用户确认配对之后继续进行,或者用户拒绝或者超时之后失败。 作为服务器连接如果要连接两个设备,其中一个必须充当服务器,通过持有一个打开的BluetoothServerSocket对象。服务器socket的作用是侦听进来的连接,如果一个连接被接受,提供一个连接好的BluetoothSocket对象。从BluetoothServerSocket获取到BluetoothSocket对象之后,BluetoothServerSocket就可以(也应该)丢弃了,除非你还要用它来接收更多的连接。 下面是建立服务器socket和接收一个连接的基本步骤: 1通过调用listenUsingRfcommWithServiceRecord(String, UUID)得到一个BluetoothServerSocket对象。 该字符串为服务的识别名称,系统将自动写入到一个新的服务发现协议(SDP)数据库接入口到设备上的(名字是任意的,可以简单地是应用程序的名称)项。 UUID也包括在SDP接入口中,将是客户端设备连接协议的基础。也就是说,当客户端试图连接本设备,它将携带一个UUID用来唯一标识它要连接的服务,UUID必须匹配,连接才会被接受。 2通过调用accept()来侦听连接请求。 这是一个阻塞的调用,知道有连接进来或者产生异常才会返回。只有远程设备发送一个连接请求,并且携带的UUID与侦听它socket注册的UUID匹配,连接请求才会被接受。如果成功,accept()将返回一个连接好的BluetoothSocket对象。 3除非需要再接收另外的连接,否则的话调用close() 。 close()释放server socket和它的资源,但不会关闭连接accept()返回的连接好的BluetoothSocket对象。与TCP/IP不同,RFCOMM同一时刻一个信道只允许一个客户端连接,因此大多数情况下意味着在BluetoothServerSocket接受一个连接请求后应该立即调用close()。 accept()调用不应该在主Activity UI线程中进行,因为这是个阻塞的调用,会妨碍其他的交互。经常是在在一个新线程中做BluetoothServerSocket或BluetoothSocket的所有工作来避免UI线程阻塞。注意所有BluetoothServerSocket或BluetoothSocket的方法都是线程安全的。 下面是一个简单的接受连接的服务器组件代码示例: private class AcceptThread extends Thread { private final BluetoothServerSocket mmServerSocket; public AcceptThread() { // Use a temporary object that is later assigned to mmServerSocket, // because mmServerSocket is final BluetoothServerSocket tmp = null; try { // MY_UUID is the app's UUID string, also used by the client code tmp = mBluetoothAdapterlistenUsingRfcommWithServiceRecord(NAME, MY_UUID); } catch (IOException e) { } mmServerSocket = tmp; } public void run() { BluetoothSocket socket = null; // Keep listening until exception occurs or a socket is returned while (true) { try { socket = mmServerSocketaccept(); } catch (IOException e) { break; } // If a connection was accepted if (socket != null) { // Do work to manage the connection (in a separate thread) manageConnectedSocket(socket); mmServerSocketclose(); break; } } } / Will cancel the listening socket, and cause the thread to finish / public void cancel() { try { mmServerSocketclose(); } catch (IOException e) { } }


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zz/13418430.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-08-01
下一篇 2023-08-01

发表评论

登录后才能评论

评论列表(0条)

保存