第09节-使用BTStack编写蓝牙程序

Bluetooth LE Exploer(微软提供的)能够读取BLE蓝牙设备,能够读写它的值。本篇博客将使用BTStack写出一个精简版的Bluetooth LE Exploer。windows

涉及文件:数组

btstack-master\example\le_data_channel_client.c函数

btstack-master\example\Makefile.inc测试

注意:在PC上使用软件Bluetooth LE Exploer来操做蓝牙模块时,使用系统自带的驱动;spa

      使用btstack来操做蓝牙模块时,使用winusb驱动(使用zadig-2.4.exe安装此驱动)设计

在手机上使用蓝牙时,过程以下:ip

1. 扫描周边的蓝牙设备ci

2. 选择某个设备,链接它get

3. 使用该设备回调函数

1、程序效果:

咱们写的蓝牙程序也包含这3个过程,我设计出4个菜单:

1.主菜单:

********* Main Menu *********

[s] show scan menu

[c] show connect menu

[t] show test menu

能够在主菜单中:

输入s进入“Scan Menu”,

输入c进入“Connect Menu”,

输入t进入“Test Menu”。

2. 扫描菜单:

********* Scan Menu *********

[s] scan ble devices

[t] stop scan ble devices

[l] list ble devices

[q] Back to main menu

能够在扫描菜单中:

输入s开始扫描周边设备,扫描结果会打印出来,并在程序中保存起来;

输入t中止扫描;

输入l列出扫描到的设备;

输入q退回到主菜单。

3. 链接菜单:

********* Connect Menu *********

List devices have beenn scanned

[0] 100ASK

[1] Mi Band 2

[?] Enter the device's number to connect

[d] Disconnet

[q] Back to main menu

在链接菜单的前面,会首先列出以前扫描到的设备。

在链接菜单中,

输入所列设备的序号,就会链接它;

输入d则断开链接;

输入q退回到主菜单。

4. 测试菜单:

********* Test Menu *********

[r] read att handle 42

[w] write att handle 42

[q] back to main menu

在测试菜单中,

输入r则会读取handle等于42的属性的值;

输入w则写handle等于42的属性的值;

输入q退回到主菜单。

注意

之因此固定读写handle 42是为了简化程序,

42这个值是事先使用软件Bluetooth LE Explorer链接设备后肯定的,你的设备可能有所不一样。

2、程序演示:

启动MSYS2 MinGW 64-bit,进入btstack-master/port/windows-winusb目录:

1. 执行 make 命令编译程序

2. 执行如下命令启动程序:

winpty  ./le_data_channel_client.exe

注意:在MSYS2下Windows的stdin没法使用,必须经过winpty来启动程序。

3. 在主菜单中:输入s进入扫描菜单

4. 在扫描菜单中:输入s开始扫描设备

在手机上,启动“Bluetooth LE Peripheral”,选择“100ASK”,点击“START”按钮。

这时在MSYS2中能够看到不断打印以下信息(这表示不断收到手机发来的广播信号):

advertisement_report_gets_name get 100ASK

 

5. 在扫描菜单中:输入t中止扫描设备

6. 在扫描菜单中:输入q退回到主菜单

7. 在主菜单中:输入c进入链接菜单

8. 在链接菜单中:输入0表示链接第扫描到的第0个设备

9. 在链接菜单中:输入q退回到主菜单

10. 在主菜单中:输入t进入测试菜单

11. 在测试菜单中:输入w写数值

观察手机上“Bluetooth LE Peripheral”的Service-1中收到的值。

不断输入w,能够观察到手机上收到的值不断加1。

12. 在测试菜单中:输入r读取数值

13. 在测试菜单中:输入q退回到主菜单

14. 在主菜单中:输入c进入链接菜单

15. 在链接菜单中:输入d断开链接

3、主要函数:

本程序主要源文件是btstack-master\example\le_data_channel_client.c,我在上面作了大量的修改。

1.要用键盘来控制程序,须要给程序增长一个“数据源”,即btstack_data_source_t结构体。

这个数据源从stdin得到数据,根据这些数据进行菜单操做。

使用以下代码增长数据源:

btstack_stdin_setup(stdin_process);

stdin_process是咱们编写的处理函数。

2. 启动扫描:

printf("Start scanning!\n");

state = TC_W4_SCAN_RESULT;

gap_set_scan_parameters(0,0x0030, 0x0030);

gap_start_scan();

3. 记录打描结果:

扫描到的设备会上报3种信息:MAC地址、地址类型、名。咱们要从上报的信息中取出这些信息,记录起来。

使用函数gap_event_advertising_report_get_address得到地址;

使用函数gap_event_advertising_report_get_address_type得到地址类型;

使用函数advertisement_report_gets_name得到名字(这函数是我从advertisement_report_contains_name改出来的)。

这3个信息会保存在ble_devs结构体数组中。

4. 链接设备:

gap_connect(ble_devs[i].le_data_channel_addr, ble_devs[i].le_data_channel_addr_type);

gap_connect函数只须要2个参数:MAC地址、地址类型。

链接成功后会返回一个hci_con_handle_t,也就是一个16位的整数。

一个中央设备能够链接多个外设,每个链接都用一个hci_con_handle_t来分辨。

5. 断开链接:

gap_disconnect(connection_handle);

6. 写数据:

gatt_client_write_value_of_characteristic_without_response(connection_handle, 42, 1, &g_value);

第1个参数表示要写哪个设备,用connection_handle 来表示(哪个链接对应的设备);

第2个参数表示要写哪个属性,每个属性也都有一个标号即handle;

第3个参数表示要写多少字节的数据;

第4个参数表示数据的buffer。

7. 读数据:

gatt_client_read_value_of_characteristic_using_value_handle(handle_gatt_client_event,connection_handle, 42);

第2个参数表示要写哪个设备,用connection_handle 来表示(哪个链接对应的设备);

第3个参数表示要写哪个属性,每个属性也都有一个标号即handle;

第1个参数比较特殊:读数据时,要先向外设备发出无线信号,过一会收到对方发回到信号后,才能够解析出数据。因此读函数不可能马上返回结果,咱们须要提供一个回调函数。第1个参数就是一个回调函数。

在回调函数中,咱们去解析数据,从中取出咱们关注的数值。

回调函数handle_gatt_client_event源自btstack-master\test\pts\Ble_central_test.c,我作了一些精简。

相关文章
相关标签/搜索