最后更新:2022-06-13 09:42:00 手机定位技术交流文章
前节介绍了蓝牙Android搜索BLE模块方法,搜索到蓝牙模块后,我们可以在蓝牙和手机之间交流数据,这意味着Android手机终端与BLE模块之间的数据传输实现,介绍了手机端口和蓝牙端口程序的编程和交互。从代码和现象入手,逐渐了解BLE的使用.
官方的北欧法典已经在这里修改。
在此,我们将首先发布代码,确定代码将实现的功能,然后继续分析代码如何适应蓝牙协议。
首先,从主要函数中,它包含大量的初始化代码、初始化协议堆栈和与注册表相关的内容,我们不需要太多的注意,如图所示,我们首先看看这个服务初始化函数。

当我们需要添加一个功能到蓝牙模块时,我们需要在BLE模块中定义自己的服务并以某种方式初始化它。
其中之一,b_nus_init_t,是该服务提供的接口,它定义了该服务的基本功能要求,我们可以根据自己的要求实现不同的特定 nus_data_handler函数。
这里我们实现了自己的 nus_data_handler,从蓝牙接收的数据通过BLE直接传输到手机端部。
然后调用ble_nus_init函数登记我们的服务。
让我们看看ble_nus_t,存储我们服务中属性和方法的接口,这是服务的核心。
在 ble_nus_init 函数中,我们首先对这个结构的变量进行初始化.在初始化完成后,我们提供的协议堆栈函数sd_ble_uuid_vs_add可以用于注册服务。这里为服务指定Auid.
现在我们有了服务,我们需要为服务添加功能,我们需要使用BLE来与手机通信,所以基本的功能是接收和发送数据。
因此,服务的下一步是添加两个特性,分别是发送和接收。 我们需要为这两个特性指定相应的NUid。
下面是初始化代码
这完成了蓝牙服务的初始化,我们现在可以开始广播。
因此, BLE模块端的基本功能已经建立.
用直观的代码, 让我们看看芯片里面发生了什么.
广播与连接
当手机连接到BLE模块时,BLE模块会隔时发送广播数据包,每次发送数据包时,模块会等待连接信息,当手机接收数据包时,它会发送请求,请求更多的数据包,称为扫描响应。
手机端在请求间隔时向BLE模块请求数据,在这个请求间隔时,BLE模块会像手机端一样发送数据包,这些数据包的大小为20字节,换句话说,在传输过程中,每个缓冲器的内容不应超过20字节。
上述过程在Bluetooth的GAP中定义,这是通用访问规范。
数据传输
一旦手机连接到BLE模块,我们可以启动数据传输,这是在蓝牙GATT中定义的,称为一般属性配置文件。
这里我们主要讨论了上述服务和特点。
简言之,我们可以认为服务包含一系列特征,而特征是我们提供的数据,而我们发送的数据必须汇编成特征。
在此之上,一个配置文件将包含一系列服务,每个特性将包含一些属性。 属性可以定义为属性或描述性,描述性是一个人读取的信息。
这些GATT内容都有NUUID,所以当我们在Android设备上读取这些内容时,我们可以通过对这些NUUID进行层级分析来找到我们需要的东西。
上面的代码是为我们定义一个服务,在这项服务中,我们还定义了两个特征,一种用来阅读收到的数据,一种用于发送接收的数据。当我们接收数据并启动回调功能时,处理我们收到的数据,数据由协议堆的下调 sd_ble_gatts_hvx 函数发送。
当手机端发送数据时,它首先找到服务,然后通过UUID获取特征,将数据写入特征,使BLE模块能够接收数据。
通过分析上述实现BLE模块的原理,我们可能能够理解Android端需要做的一些具体工作,主要如下。
1.发送连接请求,连接BLE模块
2.寻找相应的服务和特点
基于UUID的特征书写
在前面的节里,我们了解了Android和BLE搜索,现在我们开始设计后端功能。
我们为BLE连接建立服务(注意,这是四个Android组件中的服务),该服务用于维护与BLE模块的连接及其数据传输以及一些有关的后端监控,同时在活动中创建一个需要BLE操作的广播接收器。该服务监测BLE状态的变化,并通过广播转达到我们的广播接收机,更改前端页面的状态。
下面的图示了该程序的基本结构
BLEActivityBLEActivityBLEService BLEService调用服务方法内部维护的BluetoothGatt对象与BLE模块进行交互广播,改变前端状态
下面是一些常见的蓝牙类型
BluetoothManager
官网解释
High level manager used to obtain an instance of an BluetoothAdapter and to conduct overall Bluetooth Management.
Use getSystemService(java.lang.String) with BLUETOOTH_SERVICE to create an BluetoothManager, then call getAdapter() to obtain the BluetoothAdapter.
Alternately, you can just call the static helper getDefaultAdapter().
可能用于获取蓝牙适配器。 让我们看看下面的蓝牙适配器。
BluetoothAdapter
仔细看一下,这不是前面的一个主要角色吗?具体操作请参阅以下链接:
http://blog.csdn.net/lidec/article/details/50631742
我们可以通过以下方法获得蓝牙
BluetoothGatt
从名字的角度来看,这个类包含Gat,这是我们前面提到的BLE数据传输的协议。
下面是官网的介绍
Public API for the Bluetooth GATT Profile.
This class provides Bluetooth GATT functionality to enable communication with Bluetooth Smart or Smart Ready devices.
To connect to a remote peripheral device, create a BluetoothGattCallback and call connectGatt(Context, boolean, BluetoothGattCallback) to get a instance of this class. GATT capable devices can be discovered using the Bluetooth device discovery or BLE scan process.
我们与BLE达成协议,允许我们直接使用该类包装方法,正如GATT所定义的。
该方法用于连接蓝牙设备,通过Mac地址从BluetoothAdapter获取BluetoothGatt对象,我们为Android应用程序定义的服务的主要功能是维护这个对象,并使用它提供的方法与BLE模块通信。
上述方法提供了GATT议定书的基本操作方法,通过UUID获取BLE服务,从BLE服务中获取写字特性,然后调用setValue方法,将值写入,如果写入成功,所以我们的BLE模块现在接收数据。
用书面方法, 我们如何读取数据?
当我们得到BluetoothGatt时,我们将它传递给GatCallback对象,它在接收数据时触发了 CharacteristicChanged 的回调函数。
参数的特征是变化的特征,我们可以得到它的N.O.I.D.对比一下,如果此 UUID与我们定义的BLE模块中传输数据的 UUID匹配,则说明收到了数据,我们可以接受这个价值。示例代码如下:
其他功能也由此得益。
这里是应用程序的源代码,其他与BLE相关的函数可以根据这个应用程序修改。
http://download.csdn.net/detail/lidec/9434509
本文汇编了51822BLE开发板与Android手机之间的通信方法,简要介绍了一些实用的蓝牙协议知识,并对蓝牙协议在开发板控制程序和应用程序中进行了分析。
本文由 在线网速测试 整理编辑,转载请注明出处。