zoukankan      html  css  js  c++  java
  • 第09节-使用BTStack编写蓝牙程序

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

    涉及文件:

    btstack-masterexamplele_data_channel_client.c

    btstack-masterexampleMakefile.inc

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

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

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

    1. 扫描周边的蓝牙设备

    2. 选择某个设备,连接它

    3. 使用该设备

    一、程序效果:

    我们写的蓝牙程序也包含这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连接设备后确定的,你的设备可能有所不同。

    二、程序演示:

    启动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断开连接

    三、主要函数:

    本程序主要源文件是btstack-masterexamplele_data_channel_client.c,我在上面做了大量的修改。

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

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

    使用如下代码增加数据源:

    btstack_stdin_setup(stdin_process);

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

    2. 启动扫描:

    printf("Start scanning! ");

    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 estptsBle_central_test.c,我做了一些精简。

  • 相关阅读:
    usaco 1.11
    当数组时全局变量时。。。怎样进行循环初始化
    hdu 1097 用到了位的移动
    hdu 1006
    HNOI2008]神奇的国度
    App测试基本流程详解(汇总整理)
    IOS测试Fastmonkey
    pytest+allure2+jenkins环境部署
    如何在cmd查看文件内容的md5值
    软件测试学习linux基础
  • 原文地址:https://www.cnblogs.com/-glb/p/11617676.html
Copyright © 2011-2022 走看看