学习蓝牙【一】

本文讲述了作者学习蓝牙技术的起因,包括使用蓝牙进行电路检测的需求,以及在实践中遇到的问题。重点介绍了使用ESP32进行蓝牙串口通信的两个示例(SerialToSerialBT和BT-SPP-ACCEPTOR),并提到电脑与手机连接蓝牙的不同表现。作者计划通过项目实践和加入学习小组来提高学习效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

缘由

检修板子的时候,需要查看某些电路通电有没有数据,最简单方式就是用一个带串口设备,将探针放在电路上接受数据。
那么从串口设备到显示设备用蓝牙通信就是一个非常不错主意,这就是学习蓝牙的原因。

学习经历

搜索脑中记忆,蓝牙这方面只有接触过将蓝牙连接虚拟化HID设备,当键盘使用。
搜索百度,在众多的资料中看到一个蓝牙串口协议:SPP(Serial Port Profile)
寻找带有蓝牙串口的例程,此处挺痛苦,耗时耗力

  1. 手上有ESP32和ESP32S3两块设备,查询现在大部分蓝牙串口都是基于ESP32
  2. Arduino架构上有例程SerialToSerialBT
  3. FreeRTOS架构上有例程BT-SPP-ACCEPTOR

##代码展示
1.SerialToSerialBT

BluetoothSerial SerialBT;
void setup() {
  SerialBT.begin(device_name); //Bluetooth device name
}

Arduino的代码还是一贯的简单,只需要定义一个蓝牙串口变量,然后begin一下,蓝牙连接部分就完成了。

2.BT-SPP-ACCEPTOR

ESP_ERROR_CHECK(esp_bt_controller_mem_release(ESP_BT_MODE_BLE));

    esp_bt_controller_config_t bt_cfg = BT_CONTROLLER_INIT_CONFIG_DEFAULT();//这个是真好用,不用自己写那个多奇怪的配置
    if ((ret = esp_bt_controller_init(&bt_cfg)) != ESP_OK) {
        ESP_LOGE(SPP_TAG, "%s initialize controller failed: %s\n", __func__, esp_err_to_name(ret));
        return;
    }

    if ((ret = esp_bt_controller_enable(ESP_BT_MODE_CLASSIC_BT)) != ESP_OK) {
        ESP_LOGE(SPP_TAG, "%s enable controller failed: %s\n", __func__, esp_err_to_name(ret));
        return;
    }

    if ((ret = esp_bluedroid_init()) != ESP_OK) {
        ESP_LOGE(SPP_TAG, "%s initialize bluedroid failed: %s\n", __func__, esp_err_to_name(ret));
        return;
    }

    if ((ret = esp_bluedroid_enable()) != ESP_OK) {
        ESP_LOGE(SPP_TAG, "%s enable bluedroid failed: %s\n", __func__, esp_err_to_name(ret));
        return;
    }

    if ((ret = esp_bt_gap_register_callback(esp_bt_gap_cb)) != ESP_OK) {
        ESP_LOGE(SPP_TAG, "%s gap register failed: %s\n", __func__, esp_err_to_name(ret));
        return;
    }

    if ((ret = esp_spp_register_callback(esp_spp_cb)) != ESP_OK) {
        ESP_LOGE(SPP_TAG, "%s spp register failed: %s\n", __func__, esp_err_to_name(ret));
        return;
    }

    esp_spp_cfg_t bt_spp_cfg = {
        .mode = esp_spp_mode,
        .enable_l2cap_ertm = esp_spp_enable_l2cap_ertm,
        .tx_buffer_size = 0, /* Only used for ESP_SPP_MODE_VFS mode */
    };
    if ((ret = esp_spp_enhanced_init(&bt_spp_cfg)) != ESP_OK) {
        ESP_LOGE(SPP_TAG, "%s spp init failed: %s\n", __func__, esp_err_to_name(ret));
        return;
    }

#if (CONFIG_BT_SSP_ENABLED == true)
    /* Set default parameters for Secure Simple Pairing */
    esp_bt_sp_param_t param_type = ESP_BT_SP_IOCAP_MODE;
    esp_bt_io_cap_t iocap = ESP_BT_IO_CAP_IO;
    esp_bt_gap_set_security_param(param_type, &iocap, sizeof(uint8_t));
#endif

    /*
     * Set default parameters for Legacy Pairing
     * Use variable pin, input pin code when pairing
     */
    esp_bt_pin_type_t pin_type = ESP_BT_PIN_TYPE_VARIABLE;
    esp_bt_pin_code_t pin_code;
    esp_bt_gap_set_pin(pin_type, 0, pin_code);//这可能跟协议有关

FreeRTOS连接蓝牙的代码相对就复杂多了,此处适合更加深层次探究蓝牙构造的人

两个例子都有问题,用电脑蓝牙连接后,马上就断开,手机蓝牙倒是可以长连,为找出问题特意去学习蓝牙的构成【资料

学习一星期,能回忆出的一些东西

  • 蓝牙是工作在2.G的无线通信技术

  • 蓝牙使用跳频技术传输数据

  • 蓝牙协议总的有3000多页

  • 基本的蓝牙由host和controller两部分组成,中间是HCI接口

  • 蓝牙设备可以用一主多从形式组成piconet(微微网)

  • 蓝牙设备由5种通道:
    basic piconet channel
    adapted piconet channel
    inquiry scan channel
    page scan channel
    synchronization scan physical channel

  • 物理通道由物理频率,调频序列,访问码 三个部分组成(好像有问题)

  • 微微网和分散网

  • BD/EDR(经典蓝牙)和LE(低功耗),拥有一个叫单模蓝牙,拥有两个叫双模蓝牙

  • 经典蓝牙速率和低功耗蓝牙速率

  • LMP协议和L2CAP协议

  • 物理信道的时间单位slot,一般为625us

后面如何安排

学习资料看了近一星期,说真的有点难以再看下去了,我觉得只是自己一个人在看,效率太低了。想想应该有两个方向可以继续学习
一个是找一些项目例子,学习里面的蓝牙应用知识,这个可以更加快的了解实地应用,缺点是可能刚学理解不够透彻。还有一个是找
一个学习的群,找一帮道友,集思广益,这样学习起来更加全面。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值