-
2021-10-28 10:23:31
本文章主要介绍物联网短距离无线通信的技术之一低功耗蓝牙技术BLE,主要应用领域为智能穿戴设备,一般情况下需要手机端实现BLE上位机(主机、客户端)。以下介绍基于HC05/BT05蓝牙串口透传模块+MCU(STM32F103VET6),当然对于TI的CC2541、乐鑫的ESP32,本工程同样适用!
首先介绍两个重要概念,ServiceUUID(服务UUID)与CharacteristicUUID(特征UUID),ServiceUUID我们可以理解为一个班级,这个班级主要负责数据传输的工作,当然班级内部有许多学生,有的学生负责接收数据(特征值的通知功能),有的学生负责发送数据(写特征值),所以BLE进行一次数据传输时,我们需要指定一个班级(ServiceUUID)和若干学生(CharacteristicUUID),对于HC05/BT05蓝牙串口透传模块,由于其已经输入固件,所以CharacteristicUUID通常是一个人(也就是说接收数据与发送数据的是同一个同学);而对于CC2541、ESP32等我们可以直接编程的芯片通过需要指定两个CharacteristicUUID(特征值通知、写特征值)
1、设置HC05/BT05
通过串口调试助手或者MCU的串口配置HC05/BT05处于从机模式,设备名称任意设置,ServiceUUID为FFF0,CharacteristicUUID为FFF6
2、 Android代码中作相应的替换
3、接收数据
此处我通过STM32采集的温湿度数据,通过串口发送给HC05/BT05,所以接收数据时,要严格按照STM32中的数据进行。Android中程序如下:
public void onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) { byte[] desData = characteristic.getValue(); String temp_str, humi_str; temp_str = getStringSensorData(desData[0])+"."+getStringSensorData(desData[1])+" ℃"; humi_str = getStringSensorData(desData[2])+"."+getStringSensorData(desData[3])+" %"; Log.i(TAG, " >>>>>温度为:" + temp_str); Log.i(TAG, " >>>>>湿度为:" + humi_str); temp.setText(temp_str); humi.setText(humi_str); }
STM32中透传程序如下:
void BLE_Printf() { u8 sendbuf[4]; sendbuf[0] = (int)temp_int; sendbuf[1] = (int)temp_deci; sendbuf[2] = (int)humi_int; sendbuf[3] = (int)humi_deci; if(BLE_State()==1) { SendSensorData(sendbuf ,4); } else { } }
4、 发送数据(控制指令)
此处我通过手机端发送控制指令控制STM32连接的LED灯,Android中代码如下:
public void KeyEvent() { swh_led.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (swh_led.isChecked()) { String data = "LEDON"; sendLeData(data.getBytes()); } else { String data = "LEDOFF"; sendLeData(data.getBytes()); } } }); btn_ble.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if (mConnectionState) { cancelDialog.show(); cancelDialog.setMessage(getString(list_disconnecting_ble)); mHandler.postDelayed(new Runnable() { @Override public void run() { cancelDialog.dismiss(); } }, 1000); mConnectionState = false; //btn_ble.setText(getString(R.string.list_connect_ble)); if (mBluetoothGatt != null) { mBluetoothGatt.disconnect(); } } else { scanLeDevice(true); } } }); }
STM32中的程序如下:
void LED_Control(void) { if(ReceiveState == 1) { RxCounter=0; ReceiveState=0; if(FindStr((char*)aRxBuffer,"LEDON")==1) { //printf("Receive Data:%s\n",aRxBuffer); LED2(1); LED3(1); LED4(1); } else if(FindStr((char*)aRxBuffer,"LEDOFF")==1) { //printf("Receive Data:%s\n",aRxBuffer); LED2(0); LED3(0); LED4(0); } else { } memset(aRxBuffer,'\0', sizeof(aRxBuffer)); } }
以上就是BLE模块与手机蓝牙进行双向通信的简单过程,有兴趣的可以下载Android工程的完整代码如下https://download.csdn.net/download/baidu_40311265/35088959
更多相关内容 -
DA14580 BLE 主机(client)和从机(server)状态机
2022-04-28 13:40:22 -
RW007 高速 WiFi 模块使用BLE主机功能连接 BLE 从机设备示例
2021-04-15 00:24:51RW007 高速 WiFi 模块使用BLE主机功能连接 BLE 从机设备示例 在本文档中将会从零开始说明如何使用 RW007 的 BLE 主机功能去连接一个BLE串口透传设备,实现数据交互的功能。 硬件准备 1.STM32F411-NUCLEO 开发板...RW007 高速 WiFi 模块使用BLE主机功能连接 BLE 从机设备示例
在本文档中将会从零开始说明如何使用
RW007
的BLE
主机功能去连接一个BLE
串口透传设备,实现数据交互的功能。硬件准备
-
1.
STM32F411-NUCLEO
开发板,RW007 EVB
模块 -
2.
PC
电脑 -
3.
USB
数据线 -
4.
BLE
数据透传模块(如HC-08
模块、KT6368A
蓝牙模块等) -
5.
USB-TTL
模块(如CH340
等) -
6.杜邦线若干条
软件准备
-
1.
RT-Thread Studio IDE
软件 -
2.串口调试软件(
xshell
、SSCOM
等)
步骤一:串口配置
KT6368A蓝牙模块
在这里主要使用
RW007
高速WIFI BLE
模块,主要使用BLE
的主机功能,所以需要一个BLE
的从机设备(如HC-08
模块、KT6368A
蓝牙模块等都可以),因为手上刚好有KT6368A
蓝牙BLE
模块,所以这里简单说说怎样通过串口配置KT6368A
蓝牙模块,下图是KT6368A
蓝牙模块的控制指令说明.-
操作1:设置 BLE 蓝牙模块的名称
AT+BMBLE_TEST
输入上述命令后,会正常返回
OK
表示设置成功。 说明:这里设置 BLE 模块的名称为BLE_TEST
-
操作2:设置 BLE 蓝牙模块的 MAC 地址
AT+BNAACCEEFFDDEE
输入上述命令后,会正常返回
OK
表示设置成功。 说明:这里设置 BLE 蓝牙模块的 MAC 地址为AACCEEFFDDEE
-
操作3:设置芯片复位
AT+CZ
输入上述命令后,模块会正常重启,并打印下面的信息,说明配置成功了。
郃T+VER1.6-20210114\0 TM+BLE_TEST \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 TN+AACCEEFFDDEE TD+KT6368A-SPP-04\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 TS+123456
-
操作4:手机通过
BLE调试助手
扫描附近的蓝牙设备 手机上需要自行安装BLE调试助手
等蓝牙工具软件。
从手机扫描的结果可以看到,前面步骤设置的
BLE_TEST
蓝牙设备,并且可以发现MAC
地址并不是设置的AACCEEFFDDEE
,关于这个问题,在蓝牙模块的说明手册上有提示,具体原因可以百度。-
操作5:手机通过
BLE调试助手
连接蓝牙设备进行通信 通过手机与蓝牙设备进行通信,验证蓝牙设备通信功能。
到此,验证
BLE
从机设备通信功能,此时只需要把蓝牙设备的串口接在需要透传的设备上即可透传数据。步骤二:使用
STM32F411-NUCLEO
通过RW007
BLE 功能测试BLE
蓝牙模块数据传输功能可以分为以下 3 个步骤:
-
步骤(1):参考相关文档创建使用RT-Thread Studio IDE 工程
-
步骤(2):替换
RW007
软件驱动包 -
步骤(3):通过
BLE
测试命令与BLE
设备进行通信
步骤(1):参考相关文档创建使用RT-Thread Studio IDE 工程
由于使用
RT-Thread Studio IDE
如何创建使用RW007
模块的工程,官方的文档中心有提供比较详细的文档,可以参考此文档进行创建,或可以直接使用官方提供的工程,在此进行详细的描述。步骤(2):替换
RW007
软件驱动包可以把提供的
RW007
软件驱动包,替换到创建的RT-Thread Studio
工程目录下。步骤(3):通过
BLE
测试命令与BLE
设备进行通信当前面两个步骤完成后,可以在
STM32F411-NUCLEO
的调试串口上看到对应的BLE
测试命令,此时BLE
设备(这里使用KT6368A
蓝牙模块进行演示)通过USB-TTL
串口与PC 进行连接。(1)查看
RW007
BLE 相关命令msh />rw rw007_ble msh />rw007_ble [rw007_ble command] rw007_ble help rw007_ble init central/peripheral Note: init ble mode rw007_ble get_addr Note: get ble address rw007_ble update_params Note: update connect parameters(no support) rw007_ble scan Note: scan ble slave rw007_ble stop_scan Note: stop scan rw007_ble connect xx:xx:xx:xx:xx:xx Note: use slave addr to connect rw007_ble disconnect [conn_handle] Note: disconnect slave rw007_ble get_server Note: discover all server(no support) rw007_ble get_char Note: discover all description(no support) rw007_ble get_disc Note: discover all characteristic(no support) rw007_ble mtu_exch Note: ble mtu exchange(no support) rw007_ble notify Note: enable ble notify(no support) rw007_ble write Note: ble write data(no support) rw007_ble read Note: ble read data(no support) rw007_ble notify_change [conn_handle] [char_value] [UUID] Note: ble notify configure by uuid rw007_ble write_uuid [conn_handle] [UUID] [data] Note: ble write data by uuid rw007_ble read_uuid Note: ble read data by uuid(no support) msh />
(2)
RW007
BLE 功能初始化 输入命令:rw007_ble init central
测试示例:
msh />rw007_ble init central 263 - ble_cmd_init start ble central
注意:目前仅支持
central
主机模式(3)
RW007
扫描附近的BLE
设备 输入命令:rw007_ble scan
测试示例:
msh />rw007_ble scan 318 - ble_cmd_scan resp_type: 1, len: 59 RW007_BLE_NTF_TYPE_DISCOVER received advertisement; event_type=0 rssi=-46 addr_type=0 addr=ee:dd:ff:ee:cc:aa mfg_data = 02 01 06 03 03 f0 ff resp_type: 1, len: 83 RW007_BLE_NTF_TYPE_DISCOVER received advertisement; event_type=4 rssi=-47 addr_type=0 addr=ee:dd:ff:ee:cc:aa mfg_data = 1e 09 42 4c 45 5f 54 45 53 54 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
可以从扫描结果中看到
mac
地址为ee:dd:ff:ee:cc:aa
的设备,这个设备为前面通过串口设置BLE
模块的MAC
地址,后面将以这个地址进行连接设备。(4)
RW007
连接BLE
蓝牙设备 通过rw007_ble connect
命令连接BLE
设备 输入命令:rw007_ble connect ee:dd:ff:ee:cc:aa
测试示例:
msh />rw007_ble connect ee:dd:ff:ee:cc:aa 341 - ble_cmd_connect str_addr: ee:dd:ff:ee:cc:aa mac addr: aa:cc:ee:ff:dd:ee msh />resp_type: 1, len: 52 RW007_BLE_NTF_TYPE_CONNECT type: 0, status: 0, conn_handle: 1 resp_type: 1, len: 44 RW007_BLE_NTF_TYPE_CONNECT_DESC our_id_addr: c9:47:8c:42:00:48 peer_id_addr: aa:cc:ee:ff:dd:ee
(5)
RW007
向蓝牙设备发送数据 由于目前大部分BLE
设备通过UUID
进行数据的收发. 从上面的UUID
说明可知,特征 1 的UUID
为“FFF1”
,特征是“WRITE”
、“NOTIFY”
,这里可以直接使用FFF1
作为测试的UUID
. 输入命令:rw007_ble write_uuid 1 fff1 Hello,BLE_TEST
测试示例:
msh />rw007_ble write_uuid 1 fff1 Hello,BLE_TEST 434 - ble_cmd_gattc_write_by_uuid write conn_hanle:1 uuid:fff1 data:Hello,BLE_TEST write rc:0 msh />
(6)
RW007
接收蓝牙设备的数据 输入命令:rw007_ble notify_change 1 1 0xfff1
测试示例:
msh />rw007_ble notify_change 1 1 0xfff1 415 - ble_cmd_gatt_notify_change_by_uuid
到此,使用
STM32F411-NUCLEO
通过RW007
BLE 功能测试BLE
蓝牙模块数据传输功能完成。 -
-
用电脑串口AT命令控制蓝牙BLE主机.rar
2021-04-16 21:19:48用电脑串口AT命令控制蓝牙BLE主机 -
BLE主机端通过点击Characterstic “read”,从机端发送消息原理及方法介绍
2022-02-20 14:41:37** 前言: ** 1.主机端通过NRF Connect App连接蓝牙设备 ...主机read是在SD(softdevice)中获取数据的,而在APP层,是通过函数库sd_ble_gatts_value_set() 这个函数更新信息到SD的,read的动作并没有在APP**
前言:
**
1.主机端通过NRF Connect App连接蓝牙设备
2.芯片为NRF52840
3.程序为Nordic官方提供程序1.问题描述:手机(主机)连接蓝牙从机后,需要读取从机的信息,在自定义服务/标准服务下,通过操作Characterstic 下“read”按键,读取从机端的信息。
2.原理介绍:
主机read是在SD(softdevice)中获取数据的,而在APP层,是通过函数库sd_ble_gatts_value_set()
这个函数更新信息到SD的,read的动作并没有在APP层上报信息/发生事件,
所以在APP层找不到相关主机请求数据的事件。
3.应用:
1).将不需要改变的值(例如硬件/软件版本号等)可以通过在初始化Characterstic的时候将其写入SD中,具体的操作示例如下:
将APK版本号写到SD中
在初始化Characterstic时赋值即可
#define CONFIG_APK_REVISION "2.9.0"
ble_add_char_params_t addCharParams;
2).需要读取从机实时的值给主机
通过调用APIsd_ble_gatts_value_set()
将值写到SD中
现象:读取到写入的值为08
-
BLE主机控制器接口层(HCI)数据结构
2021-12-20 10:16:21HCI上传输的5种数据: HCI Command packet : Host层发送给Controller的命令,只能由Host发出。...HCI Event packet: 发送给对端BLE的数据,双向的。Host和Controller都可以发出。 HCI ISO Data packe. -
BLE 主机 获取不到 从机 NOTIFY属性的特征值的问题
2021-05-21 15:17:32最近使用CC2541做主机来连接CH573做测试,发现获取不到CH573的notify属性的特征值,后面发现,通过 GATT_ReadUsingCharUUID() 是搜索不到的,而通过 GATT_DiscCharsByUUID() 是可以搜索到的。 二、需要注意的点 ... -
BLE主机之ATT和GATT
2017-12-07 09:58:00属性协议定义了访问对端设备上的数据的一组规则,数据存储在属性服务器的属性里面,供属性客户端执行读写操作。...客户端可以使用这些请求在服务器上找到所有的属性并且读写这些属性。 属性协议定义了六种类型的消息:... -
BLE主机之L2CAP层
2017-12-07 09:48:00低功耗信令信道用于主机层级的信令。 信令信道传输的为 L2CAP 命令数据包。数据包结构在前面 L2CAP 数据报文部分已经描述。 下面通过不同命令数据包的用途分析来了解低功耗信令信道的用途。 不同的命令操作码... -
【RW007系列连载1】RW007-BLE主机通信使用学习示例与综合Demo
2021-05-14 00:57:29本期文章将分为5篇连载,前2篇将围绕模块功能详解展开,其后3篇将为大家讲解基于RW007相关DEMO的实现,文章目录如下: 步骤1:更新 “RW007” 模块的固件 由于默认RW007模块的固件不支持BLE主机功能,所以需要使用... -
BLE主机或从机绑定信息丢失问题
2019-07-04 15:32:00在Nordic产品开发中,有遇到主机和从机之间建立绑定,以及当某一方(主/从机)的绑定信息丢失后出现连接失败问题,有以下几种应用场景。针对不同的场景需修改或添加部分代码,以下代码是基于nRF5_SDK_15.3.0_59ac345... -
ESP32 BLE Client(主机扫描)
2021-08-10 10:53:08ESP32作为主机进行扫描并连接ble server,参考文章,此文章的内容是需要四个设备,一个作为主机进行搜索其他设备做ble server等待连接,连接之后设置MTU,本文将修改成只需要两个设备进行连接通讯。 实施程序 GATT ... -
BLE蓝牙主机和从机的区别
2019-05-16 10:27:43BLE蓝牙的角色有以下几种:广播者(Advertise)、扫描者(Scanner)、从设备(Slave)、主设备(Master)、发起者(Initiator),其中主设备是由发起者、扫描者转化而来,从设备则是由广播者转化而来;蓝牙模块通信是... -
BLE主机主动扫描和被动扫描
2017-07-19 11:57:59在实际中如果需要获得扫描响应,需要主机设置为主动扫描。如果仅仅是需要广播数据则设置为被动扫描。主动扫描和被动扫描的区别在于:主动扫描可以获得广播数据和扫描回应数据。而被动扫描只能获得广播数据不能获得... -
BLE主机之SM层
2017-12-07 09:51:00安全管理器定义了一个简单的配对和密钥分发协议,配对是一个获取对方设备信任的过程,通常采取认证的方式实现,配对之后,接着是链路加密和密钥分发过程。在密钥分发过程中从设备把密钥共享给主设备。... -
RTL8762DK 主从模式,电池服务读取示例
2022-03-22 18:59:17RTL8762DK 主从模式,电池服务读取示例 -
nrf52832/nrf52840 ble 做主机代码
2020-07-01 11:31:381、这个代码是在ble_app_uart 的基础上改的, 改动很小,基本上就是把nus 服务改成自己项目的scp 服务,很多只是改了下名字。 2、其他无关代码可以忽略,懒得改了 3、附带一个其他作者的资料,新的sdk不能照着改,... -
ESP32-C3学习笔记(4)——BLE GAP主机端连接(uuid128)
2022-04-19 14:11:59esp32例程 esp32蓝牙做主机https://github.com/espressif/esp-idf/blob/8e3e65a/examples/bluetooth/bluedroid/ble/gatt_client/tutorial/Gatt_Client_Example_Walkthrough.md ESP32 GATTC修改UUID 16bit和32bit ... -
物联网BLE应用程序开发 -- (2)掌握BLE从机设备广播
2020-09-29 15:22:10所谓从机设备广播,就是BLE从机设备角色,以一定的时间间隔(即广播间隔),向空中发送特定格式的广播数据包,以便对端设备(通常是主机角色或扫描者角色)能够发现从机的存在。 从机设备通常有四种广播方式:... -
BLE 低功耗蓝牙 主机层相关协议
2020-03-14 16:01:04复习一遍加深对整体的记忆。 1. PHY 层(Physicallayer 物理层)。PHY 层用来指定 BLE 所用的无线频段,调制解调方式和方法...LL 层是整个 BLE 协议栈的核心,也是 BLE 协议栈的难点和重点。LL 层要做的事情非常多... -
详解BLE的数据传输过程
2021-12-25 15:31:05我们从BLE的本质出发,搞清楚它是如何实现数据交互的,也就真正搞清楚了BLE的工作原理。 下面从3个方面,逐步讲解BLE的数据收发过程。 本文结合nordic的代码和蓝牙核心规范5.2来进行介绍。本文认为你对BLE协议栈的... -
BLE手机做从机nrf51822做主机通信实验
2017-06-15 00:20:44压缩包含有BLE手机作为从机,nrf51822做主机通信实验的文档,内附实验代码(基于SDK10.0) -
ble功耗优化——连接参数更新
2021-10-27 15:16:34为什么要更新连接参数? 从设备一般是电池供电的,要想让从设备的电池使用寿命更长,就可以更新连接,减少...可以看出:由从机发起连接参数更新请求(Connection Parameter Update Request)(L2CAP层),主机返回连 -
BLE连接简介
2021-10-13 20:14:15如果广播设备接收了连接, 两个设备会进入连接状态, 发起方会称为 Master(主机),而广播方会称为 Slave(从机)。 七、BLE 连接参数 通道映射, 指示连接使用的频道。 调频增量, 一个 5~16 之间的随机,... -
BLE流程概述
2021-10-25 11:47:54对讲机在与手机蓝牙的连接过程中,对讲机充当从机,手机充当主机,对讲机每10s发起一次广播, 如果手机开启扫描,并且扫描在对讲机广播时对应的通道扫描到对讲机,手机发起连接请求,对讲机端确认连接或者拒绝连接... -
【BLE】CC2541之主机端读取特征值
2018-04-07 20:02:00else if ( simpleBLEDiscState == BLE_DISC_STATE_CHAR ) { // Characteristic found, store handle if ( pMsg->method == ATT_READ_BY_TYPE_RSP && pMsg->msg.readByTypeRsp.numPairs > 0 ) { ... -
深入理解蓝牙BLE之“多主多从”
2022-04-23 22:36:15前言: 在蓝牙4.2协议中是有5个链路层状态机的,而蓝牙5.2协议里面是有7个状态机(为ble audio扩展了两个状态机),ble audio不是本文介绍的重点,因此仍然以4.2的5个状态机为基础进行介绍。 4.2 Core Spec协议的5个... -
BLE技术知识点大全
2020-12-07 13:12:53BLE是低功耗蓝牙的英文缩写(Bluetooth Low Energy),是蓝牙4.0版本起开始支持的新的、低功耗版本的蓝牙技术规范。 蓝牙技术联盟(Bluetooth SIG)在2010年发布了跨时代的蓝牙4.0,它并不是蓝牙3.0的简单升级版本...