学习蓝牙【一】
缘由
检修板子的时候,需要查看某些电路通电有没有数据,最简单方式就是用一个带串口设备,将探针放在电路上接受数据。
那么从串口设备到显示设备用蓝牙通信就是一个非常不错主意,这就是学习蓝牙的原因。
学习经历
搜索脑中记忆,蓝牙这方面只有接触过将蓝牙连接虚拟化HID设备,当键盘使用。
搜索百度,在众多的资料中看到一个蓝牙串口协议:SPP(Serial Port Profile)
寻找带有蓝牙串口的例程,此处挺痛苦,耗时耗力
- 手上有ESP32和ESP32S3两块设备,查询现在大部分蓝牙串口都是基于ESP32
- Arduino架构上有例程SerialToSerialBT
- 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
后面如何安排
学习资料看了近一星期,说真的有点难以再看下去了,我觉得只是自己一个人在看,效率太低了。想想应该有两个方向可以继续学习
一个是找一些项目例子,学习里面的蓝牙应用知识,这个可以更加快的了解实地应用,缺点是可能刚学理解不够透彻。还有一个是找
一个学习的群,找一帮道友,集思广益,这样学习起来更加全面。