手机蓝牙编程简介
Android 手机应用开发-Android蓝牙通信

发现,握手,验证,连接
基本环境准备
表现层
业务层
Android 平台
表现层UI设计
基本环境准备
表现层
业务层
Android 平台
业务层-扫描已配对的蓝牙设备
业务层编码主要是调用平台的API。
① 获得BluetoothAdapter对象。 ② 判断当前设备中是否拥有蓝牙设备。 ③ 判断当前设备中蓝牙是否打开。 ④ 得到已经配对的蓝牙设备对象。
Android 手机应用开发 第九章 Android蓝牙操作(一)
3G软件学院
讲师: 刘彬 讲师:
复习上节课内容
① 如何实现Android 应用程序的国际化。
② 建立常驻程序的完成步骤。
第九章:
学习目标:
Android 蓝牙通信(一)
什么是蓝牙。 了解 Android 蓝牙通讯的基本结构。 掌握 Android 蓝牙通信的权限。 建立 蓝牙通讯协议配置步骤。 实例 Android扫描周围已配对的蓝牙 设备。
第四步: Android Framework 管理蓝牙连接
基本环境准备
表现层
业务层
Android 平台
第一步:设置蓝牙通信
使用 BluetoothAdapter 类,获得 BluetoothAdapter 对象与启动蓝牙通信。 1)取得 BluetoothAdapter 类
2) 启动蓝牙通信
基本环境准备
1 . 服务端连接 2. 客户端连接
基本环境准备
表现层
业务层
Android 平台
第四步:管理蓝牙连接
当成功连接一个或多个蓝牙设备时,每一个蓝牙设备都 有一条连接BluetoothSocket, 此时蓝牙设备彼此间可以传递数据。
成功实现手机蓝牙控制智能小车机器人!视频+程序源代码(Android)

上次成功实现了通过笔记本电脑蓝牙来控制智能小车机器人的运动,但是通过电脑控制毕竟不方便,于是乎~本人打算将控制程序移植到手机上。
目前主流的手机操作系统有塞班、安卓(Android)、Windows Mobile,对比了一下,首先,塞班是用C++写的,这么多门语言我唯独看到C++就头大···,放弃了···,Windows Moblie 其实和之前发的电脑端程序基本是一样的,也就没什么意思了,最后决定选择目前正火的Android手机作为控制平台。
Android是个开源的应用,使用Java语言对其编程。
于是这次的开发我选用Eclipse作为开发工具,用Java语言开发手机端的控制程序,由于之前对Android的蓝牙通信这块涉及不多,一开始感觉有点小茫然,而网上也少有这方面的例程,有少数人做出了类似的东西,但是只传了个视频装X!雪特····经过几天的研究,最终确定了手机蓝牙通信其实就是Socket编程,再经过一番编写和调试,昨晚终于大功告成!这是视频:下面开始介绍Android手机端控制程序的编写:首先打开Eclipse,当然之前的Java开发环境和安卓开发工具自己得先配置好,这里就不多说了,网上教程一大摞。
然后新建一个Android项目,修改布局文件main.xml,代码如下:<?xml version="1.0" encoding="utf-8"?><AbsoluteLayoutandroid:id="@+id/widget0"android:layout_width="fill_parent"android:layout_height="fill_parent"xmlns:android="/apk/res/android"><Buttonandroid:id="@+id/btnF"android:layout_width="100px"android:layout_height="60px"android:text="前进"android:layout_x="130px"android:layout_y="62px"></Button><Buttonandroid:id="@+id/btnL"android:layout_width="100px"android:layout_height="60px"android:text="左转"android:layout_x="20px"android:layout_y="152px"></Button><Buttonandroid:id="@+id/btnR"android:layout_width="100px"android:layout_height="60px"android:text="右转"android:layout_x="240px"android:layout_y="152px"></Button><Buttonandroid:id="@+id/btnB"android:layout_width="100px"android:layout_height="60px"android:text="后退"android:layout_x="130px"android:layout_y="242px"></Button><Buttonandroid:id="@+id/btnS"android:layout_width="100px"android:layout_height="60px"android:text="停止"android:layout_x="130px"android:layout_y="152px"></Button></AbsoluteLayout>这个布局文件的效果就是如视频中所示的手机操作界面。
蓝牙bluez的编程CC++

蓝⽛bluez的编程CC++蓝⽛ bluez 的编程 C C++简介bluez⽬录有⼀个libbluetooth.a⽂件有⼀个⽬录 lib⽬录⾥⾯存储这⽹络连接的部分代码基于库的代码编程.在linux下如果⾃带了蓝⽛,可以通过gcc **.c -lbluetooth 直接编出⼀个可执⾏⽂件.参考⽂献下⾯的连接提供了⼀个测试代码.另外,关于 ble 使⽤库的⽅式⼀直出现失败的情况,是因为,没有设置ble的相关参数,具体可以参考中的enable_advertising函数int device_id = hci_get_route(NULL);int device_handle = 0;if ((device_handle = hci_open_dev(device_id)) < 0) {perror("Could not open device");exit(1);}le_set_advertising_parameters_cp adv_params_cp = { 0 };adv_params_cp.min_interval = htobs(advertising_interval);adv_params_cp.max_interval = htobs(advertising_interval);adv_params_cp.chan_map = 7;uint8_t status;struct hci_request rq = { 0 };rq.ogf = OGF_LE_CTL;rq.ocf = OCF_LE_SET_ADVERTISING_PARAMETERS;rq.cparam = &adv_params_cp;rq.clen = LE_SET_ADVERTISING_PARAMETERS_CP_SIZE;rq.rparam = &status;rq.rlen = 1;int ret = hci_send_req(device_handle, &rq, 1000);if (ret < 0) {hci_close_dev(device_handle);fprintf(stderr, "Can't send request %s (%d)\n", strerror(errno), errno);return (1);}le_set_advertise_enable_cp advertise_cp = { 0 };advertise_cp.enable = 0x01;memset(&rq, 0, sizeof(rq));rq.ogf = OGF_LE_CTL;rq.ocf = OCF_LE_SET_ADVERTISE_ENABLE;rq.cparam = &advertise_cp;rq.clen = LE_SET_ADVERTISE_ENABLE_CP_SIZE;rq.rparam = &status;rq.rlen = 1;ret = hci_send_req(device_handle, &rq, 1000);if (ret < 0) {hci_close_dev(device_handle);fprintf(stderr, "Can't send request %s (%d)\n", strerror(errno), errno);return (1);}。
蓝牙模块c语言代码

蓝牙模块的C语言代码取决于你使用的蓝牙模块型号以及你的具体需求。
不同的蓝牙模块可能使用不同的硬件接口和通信协议。
下面是一个简单的示例,展示了如何使用蓝牙模块进行数据传输。
请注意,这只是一个基本的示例,你需要根据你的具体硬件和需求进行修改。
首先,你需要包含必要的头文件和定义一些常量:c#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <fcntl.h>#include <termios.h>#define BLUETOOTH_DEVICE "/dev/rfcomm0" // 蓝牙设备文件路径#define BAUDRATE B9600 // 波特率接下来,你可以编写一个函数来初始化蓝牙设备:cint initialize_bluetooth() {int fd;struct termios options;// 打开蓝牙设备文件fd = open(BLUETOOTH_DEVICE, O_RDWR | O_NOCTTY | O_NDELAY);if (fd == -1) {perror("open_port: Unable to open /dev/rfcomm0");return -1;}// 配置蓝牙设备fcntl(fd, F_SETFL, 0);// 获取当前配置tcgetattr(fd, &options);// 设置波特率cfsetispeed(&options, BAUDRATE);cfsetospeed(&options, BAUDRATE);// 设置数据位、停止位和校验位options.c_cflag |= (CLOCAL | CREAD);options.c_cflag &= ~PARENB;options.c_cflag &= ~CSTOPB;options.c_cflag &= ~CSIZE;options.c_cflag |= CS8;// 设置流控制options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);// 设置输入模式options.c_iflag &= ~(IXON | IXOFF | IXANY);// 设置输出模式options.c_oflag &= ~OPOST;// 应用配置tcsetattr(fd, TCSANOW, &options);return fd;}然后,你可以编写一个函数来发送数据:cint send_data(int fd, const char *data) {int bytes_written = write(fd, data, strlen(data));if (bytes_written < 0) {perror("send_data: Error writing to socket");return -1;}return 0;}最后,你可以编写一个函数来接收数据:cint receive_data(int fd, char *buffer, int buffer_size) { int bytes_read = read(fd, buffer, buffer_size - 1);if (bytes_read < 0) {perror("receive_data: Error reading from socket");return -1;}buffer[bytes_read] = '\0'; // 添加字符串结束符return bytes_read;}现在,你可以在main函数中使用这些函数:cint main() {int fd;char buffer[256];// 初始化蓝牙设备fd = initialize_bluetooth();if (fd == -1) {printf("Failed to initialize bluetooth\n");return 1;}// 发送数据if (send_data(fd, "Hello, bluetooth!") == -1) {printf("Failed to send data\n");close(fd);return 1;}// 接收数据if (receive_data(fd, buffer, sizeof(buffer)) == -1) {printf("Failed to receive data\n");close(fd);return 1;}printf("Received data: %s\n", buffer);// 关闭蓝牙设备close(fd);return 0;}这个示例展示了如何使用蓝牙模块进行简单的数据传输。
Android之Bluetooth(蓝牙)编程实现

//HEXCheckBox = (CheckBox) findViewById(R.id.radioMale); /*****************************************************************/ /*****************************************************************/ /*****************************************************************/ breakButton = (Button) findViewById(R.id.button_break); // 得到当地的蓝牙适配器 mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); /*****************************************************************/ /*****************************************************************/ /*****************************************************************/ // 初始化 CheckBox //checkBox_sixteen = (CheckBox) findViewById(R.id.checkBox_sixteen); /*****************************************************************/ /*****************************************************************/ /*****************************************************************/
ble5.0编程实例 -回复

ble5.0编程实例-回复BLE 5.0编程实例:使用BLE 5.0技术实现智能家居控制系统在本篇文章中,我们将介绍如何使用BLE 5.0技术来构建一个智能家居控制系统。
我们将一步一步教你如何建立一个连接、发送和接收数据,并实现对家居设备的控制。
让我们开始吧!第一步:建立连接在BLE 5.0编程实例中,首先我们需要建立蓝牙连接。
在这个例子中,我们将以智能手机作为中央设备,家居设备作为外设,通过蓝牙连接进行通信。
1. 确保你的智能手机和家居设备都支持BLE 5.0技术。
2. 在你的智能手机上下载一个蓝牙调试工具,例如LightBlue或nRF Connect。
3. 在家居设备上实现GATT服务和特征,以便手机可以与设备进行通信。
确保为每个服务和特征设置正确的UUID。
4. 在智能手机应用程序中实现扫描和连接功能。
扫描之后,通过设备的UUID进行连接。
5. 一旦连接建立,你已经完成了第一步!你现在可以开始发送和接收数据。
第二步:发送和接收数据在建立连接之后,我们将向家居设备发送控制指令,并接收来自设备的数据。
本实例中,我们将模拟一个灯光控制系统。
1. 在家居设备中实现一个灯光服务。
这个服务应该包含两个特征:一个用于控制灯光状态(开或关),另一个用于调节亮度。
2. 在智能手机应用程序中实现控制页面,包括一个按钮用于开关灯光,以及一个滑块用于调节亮度。
3. 当用户在应用程序中进行操作时,我们将通过蓝牙连接向家居设备发送相应的数据。
我们可以使用GATT特征来发送指令并调整亮度值。
4. 家居设备接收到指令后,会相应地开关灯光或者调节亮度。
反过来,当设备的状态发生变化时,它可以通过蓝牙连接将更新的状态数据发送回智能手机。
第三步:实现家居设备控制逻辑在我们的智能家居控制系统中,家居设备是外设,它需要根据接收到的指令来控制灯光的开关和亮度调节。
在这一步中,我们将在家居设备上实现这个控制逻辑。
1. 在设备的主控芯片上实现蓝牙通信功能。
使用React Native进行蓝牙通信开发

使用React Native进行蓝牙通信开发一、介绍React Native是一个基于JavaScript的开源框架,可用于跨平台移动应用程序的开发。
蓝牙通信是一种无线通信技术,可以在设备之间进行数据传输。
本文将介绍如何使用React Native进行蓝牙通信开发。
二、准备工作在开始开发之前,需要进行一些准备工作。
首先,确保已经安装了Node.js和React Native的开发环境。
其次,确保你的设备支持蓝牙功能,并且已经打开了蓝牙。
三、创建React Native项目首先,打开终端或命令提示符窗口,进入你想要创建项目的目录。
然后运行以下命令来创建一个新的React Native项目:```npx react-native init BluetoothApp```这将在目录中创建一个名为BluetoothApp的新项目。
四、安装依赖进入项目目录后,运行以下命令来安装蓝牙相关的依赖:```cd BluetoothAppnpm install react-native-ble-managernpm install react-native-ble-plx```这将安装React Native蓝牙管理器和蓝牙插件的依赖。
五、配置Android项目对于Android平台,需要进行一些配置。
首先,打开`android/app/src/main/AndroidManifest.xml`文件,并添加以下权限:```xml<uses-permission android:name="android.permission.BLUETOOTH" /><uses-permissionandroid:name="android.permission.BLUETOOTH_ADMIN" /> ```然后,打开`android/app/build.gradle`文件,并添加以下内容:```gradleimplementation project(':react-native-ble-manager')implementation project(':react-native-ble-plx')```最后,在`android/settings.gradle`文件中添加以下内容:```gradleinclude ':react-native-ble-manager'project(':react-native-ble-manager').projectDir = newFile(rootProject.projectDir, '../node_modules/react-native-ble-manager/android')include ':react-native-ble-plx'project(':react-native-ble-plx').projectDir = newFile(rootProject.projectDir, '../node_modules/react-native-ble-plx/android') ```六、编写蓝牙通信代码首先,打开`App.js`文件并导入所需的模块和组件:```jsximport React, { useEffect } from 'react';import { BleManager } from 'react-native-ble-manager';import { View, Text, Button } from 'react-native';```然后,在函数组件中初始化蓝牙管理器:```jsxconst App = () => {useEffect(() => {BleManager.start({ showAlert: false });}, []);return (<View><Text>蓝牙通信开发</Text>{/* 在这里添加你的蓝牙通信代码 */}</View>);};```接下来,我们可以在`return`语句中添加需要的蓝牙通信代码。
蓝牙键盘夜曲编程说明书

蓝牙键盘夜曲编程说明书随着技术的不断进步和智能设备的普及,蓝牙键盘已成为很多人工作和娱乐的必备工具。
而夜曲编程则是一种越来越流行的技术趋势,它允许程序员在安静的夜晚专注于编写代码。
本篇文章将向大家介绍如何使用蓝牙键盘进行夜曲编程。
蓝牙键盘是一种可以通过蓝牙技术连接到其他设备的无线键盘。
它具有轻巧、便携和高效的特点,可以连接到大多数智能手机、平板电脑和计算机等设备上。
使用蓝牙键盘进行夜曲编程可以提高工作效率,并让你在安静的夜晚享受编程的乐趣。
首先,使用蓝牙键盘进行夜曲编程需要确保你的设备支持蓝牙功能。
如果你的设备没有内置蓝牙模块,你可以购买一个外置的蓝牙适配器,并将其插入到 USB接口上。
一旦你的设备连接到蓝牙键盘,你就可以开始夜曲编程了。
为了更好地使用蓝牙键盘进行夜曲编程,有几个方面需要注意。
首先,确保你的键盘配对成功并连接到设备。
一般情况下,你只需要在设备的蓝牙设置中搜索并选中你的键盘,然后按照提示进行配对即可。
确保键盘的电量充足也是很重要的,以免在编程过程中出现断连或电量不足的情况。
其次,蓝牙键盘夜曲编程的另一个关键是选择合适的工作环境。
夜曲编程需要一个安静、舒适且充满灵感的环境。
适当的灯光和温度可以提高你的工作效率,保护你的眼睛和健康。
另外,为了提高工作效率,可以通过调整键盘的倾斜和高度,找到最适合自己手指的位置。
当你开始夜曲编程后,请确保尽量减少外界干扰。
关闭手机的通知和社交媒体程序,确保你的注意力完全集中在编程上。
良好的时间管理也很重要,为自己设定一个合理的工作时间和休息时间。
过长时间的连续工作会使你感到疲劳,降低工作效率。
适时休息并活动一下身体,可以让你更好地保持注意力和专注力。
此外,为了进一步提升编程的体验,你可以使用一些编程工具和软件。
例如,你可以选择一个适合你的代码编辑器,一款舒适的电脑椅子和一个良好的音乐播放器。
选择合适的音乐可以帮助你调整心情,激发创造力。
总的来说,蓝牙键盘夜曲编程是一种高效且愉悦的编程方式。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
手机蓝牙编程简介分类:JavaME2010-06-04 13:55 931人阅读评论(3) 收藏举报手机蓝牙编程简介一、什么是蓝牙技术蓝牙是一种低成本、短距离的无线通信技术。
对于那些希望创建个人局域网(PANs )的人们来说,蓝牙技术已经越来越流行了。
每个个人局域网都在独立设备的周围被动态地创建,并且为蜂窝式电话和PDA 等设备提供了自动连接和即时共享数据的能力。
为了在Java 平台上开发支持蓝牙技术的软件,JCP 定义了JSR82 标准--Java蓝牙无线技术APIs(JABWT) 。
当蓝牙设备互相连接时,他们将组成一个微微网(piconet ),即以一个主设备和最大7 个从设备的形式动态创建网络。
蓝牙也支持piconet 网之间的连接:当一个piconet 中的主设备成为另一个piconet 的从设备时,piconet 与piconet 间将形成桥接。
二、蓝牙协议栈蓝牙协议栈允许采用多种方法,包括 RFCOMM 和 Object Exchange (OBEX ),在设备之间发送和接收文件。
如果想发送和接收流数据(而且想采用传统的串口应用程序,并给它加上蓝牙支持),那么 RFCOMM 更好。
反过来,如果想发送对象数据以及关于负载的上下文和元数据,则 OBEX 最好。
图 1 显示了协议栈的细节。
图1 蓝牙协议栈,如下:∙栈的最底层是 HCI ,即主机控制器接口(Host Controller Interface )。
这一层顾名思义就是主机(计算机)和控制器(蓝牙设备)之间的接口。
可以看到,其他所有的层都要经过 HCI 。
∙HCI 上面的一层是L2CAP ,即逻辑链接控制器适配协议(Logical Link Controller Adaptation Protocol )。
这一层充当其他所有层的数据多路复用器。
∙接下来一层是 BNEP ,即蓝牙网络封装协议(Bluetooth Network Encapsulation Protocol )。
使用BNEP ,可以在蓝牙上运行其他网络协议,例如 IP 、TCP 和 UDP 。
∙RFCOMM 称作虚拟串口协议(virtual serial port protocol ),因为它允许蓝牙设备模拟串口的功能。
∙OBEX 协议层是在RFCOMM 层上面实现的,如果想把数据以对象(例如文件)的形式传输,那么OBEX 很有用。
∙SDP 是服务发现协议(Service Discovery Protocol )层,用于在远程蓝牙设备上寻找服务。
∙最后两层是 AVCTP 和 AVDTP ,用于蓝牙上音频和视频的控制和发布。
AVCTP 和 AVDTP 是蓝牙协议中增加的相对较新的层;如果想控制媒体播放器的功能或者想以立体声播放音频流,则要使用它们。
三、蓝牙规范用例初始化-- 所有具备蓝牙功能的应用程序必须先要初始化蓝牙栈。
服务器:建立一个服务,然后等待一个客户端来连接。
客户端:搜索服务,然后尝试与服务器建立连接。
图2 一个蓝牙规范用例图,如下:四、用例中参与活动的图表图3 蓝牙应用程序活动图,如下:五、JSR-82 API 简介JSR-82 是用于蓝牙无线技术的官方Java API 。
可使用这个API 创建可执行以下功能的应用程序:∙判断和检测自己的蓝牙设备的属性∙发现设备通信范围内的蓝牙设备∙在远程蓝牙设备上搜索服务∙创建可以与远程蓝牙服务器通信的蓝牙客户机应用程序∙创建能够为蓝牙客户机的请求提供服务的蓝牙服务器应用程序JSR-82 包含两个包,即javax.bluetooth 和javax.obex 。
图4 显示了在MIDlet 中一个典型蓝牙功能应用程序中的一些元素,如下:1、本地设备类:图5 :LocalDevice 类本地设备提供了方法来返回关于本地设备的信息,并且能够进入 Bluetooth manager : .getBluetoothAddress() 返回蓝牙设备地址。
.getDeviceClass() 返回设备类。
.getFriendlyName() 返回设备友好名称,蓝牙设备名通常是用户在蓝牙控制中心为其设置的我们将会在后面看到。
.getRecord() 返回一个指定蓝牙连接的服务记录。
.updateRecord() 方法用来为指定的ServiceRecord 更新SDDB 服务记录。
.getDiscoverable() 返回设备的可发现状态。
.setDiscoverable() 设置设备的可发现状态。
.getDiscoveryAgent() 返回一个参考给发现代理。
.getProperty() 返回一个设备的蓝牙属性通过调用getProperty() 方法你可以得到的属性包括:.bluetooth.api.version ,蓝牙API 版本.bluetooth.sd.attr.retrievable.max ,一次性能够被获得的服务记录属性的最大值 .bluetooth.connected.devices.max ,支持的连接设备的最大值.bluetooth.sd.trans.max ,同时发生的服务发现处理的最大值.bluetooth.l2cap.receiveMTU.max ,L2CAP 最大发射单元你可以在Javadoc 文档中或是规范中学习更多的有关蓝牙属性的内容。
2、远端设备类:图6 :RemoteDevice 类远端设备(RemoteDevice )提供的方法中,有些很类似于本地设备(LocalDevice )里提供的方法:.getBluetoothAddress() 返回蓝牙地址。
.getFriendlyName() 返回蓝牙设备名。
.getRemoteDevice() 返回相应的被指定蓝牙连接的远端设备。
.authenticate() 尝试识别验证远端设备。
.authorize() 为指定的蓝牙连接去尝试批准远端设备访问本地设备。
.encrypt() 尝试为指定的蓝牙连接开启或关闭加密。
.isAuthenticated() 测试是否远端设备可以被验证。
.isAuthorized() 测试是否远端设备已经被蓝牙控制中心授权访问本地设备以进行蓝牙连接。
.isEncrypted() 测试是否本地设备和远端设备之间的通信被加密。
.isTrustedDevice() 测试是否远端设备被蓝牙控制中心指定为可信任的。
3、DeviceClass 类一个DeviceClass 对象代表一个设备的设备类(CoD ),例如一个打印机或者一部电话。
CoD 包括一个主类,一个辅的类,和服务类型或服务类。
DeviceClass 提供了如下方法:.getMajorDeviceClass() 方法获取设备的主类。
.getMinorDeviceClass() 方法获取设备的辅类。
.getServiceClasses() 获取设备的服务类。
当一个设备被发现,同时他的类也会被发现;当发现代理调用deviceDiscovered() 时,其中一个参数就是DeviceClass 。
你可以通过它的getDeviceClass() 方法找到本地设备的CoD 。
4、DiscoveryAgent 类是个有帮助的类,它让您可以发现附近的远程蓝牙设备,并为区域内的每个蓝牙设备返回一个 RemoteDevice 。
也可以使用javax.bluetooth.DiscoveryAgent 在已经发现的远程设备上搜索服务。
如果想在发生发现事件的时候得到通知,则需要实现DiscoveryListener 接口的方法。
见图7 DiscoveryAgent类和DiscoveryListener 接口,如下:5、设备发现API你使用DiscoveryAgent 类的" 设备发现" 方法来开始和取消设备发现:.retrieveDevices() 重新获得已经发现或者附近的已知设备.startInquiry() 启动发现附近设备,也叫inquiry.cancelInquiry() 取消当前进行的任何请求蓝牙发现代理在请求阶段的不同时候会分别调用DiscoveryListener (发现监听器)不同的回调方法:.deviceDiscovered() 指出是否有设备被发现。
.inquiryCompleted() 指出是否请求已经成功、触发一个错误或已被取消。
在图8 中的状态图表阐明了设备发现的状态改变结束于相应的回调方法的返回。
图 8: 设备发现状态表设备发现以调用startInquiry() 函数开始。
在请求进行时,蓝牙发现代理会在适当的时候调用回调方法DeviceDiscovered() 和 inquiryCompleted() 。
6、服务发现API你可以使用发现代理的服务发现方法来开始或取消服务发现:. selectService() 启动服务发现搜索。
(根据API 手册应为尝试定位一个服务). searchServices() 启动服务发现搜索。
. cancelServiceSearch() 取消在正在进行中的任何的服务发现搜索操作。
蓝牙发现代理在服务发现阶段的不同时候会分别调用 DiscoveryListener 的服务发现回调方法:. servicesDiscovered() 表示是否服务已被发现。
. serviceSearchCompleted() 表示服务发现是否已经完成。
图9 阐明了服务发现的状态改变结束于DiscoveryListener 的回调方法的返回。
图 9: 服务发现状态图表服务发现开始于对searchServices() 的调用。
当服务搜索进行时,蓝牙发现代理会在适当的时候回调servicesDiscovered() 和 serviceSearchCompleted() 方法。
除了DiscoveryAgent 和DiscoveryListener 了,你在服务发现过程中还要使用到的类有UUID ,ServiceRecord以及DataElement 等。
7、UUID 类在蓝牙中,每个服务和服务属性都唯一地由" 全球唯一标识符" (UUID )来校验。
正如它的名字所暗示的,每一个这样的标识符都要在时空上保证唯一。
UUID 类可表现为短整形(16 或32 位)和长整形(128位)UUID 。
他提供了分别利用String 和16 位或32 位数值来创建类的构造函数,提供了一个可以比较两个UUID(如果两个都是128 位)的方法,还有一个可以转换一个UUID 为一个字符串的方法。
UUID 实例是不可改变的(immutable ),只有被UUID 标示的服务可以被发现。
在Linux 下你用一个命令uuidgen -t 可以生成一个UUID 值;在Windows 下则执行命令uuidgen 。