ESP 32S做BLE透傳模組日誌

2021-09-05 10:42:14 字數 4053 閱讀 4435

本次專案是用esp_32s做乙個低功耗藍芽ble的透傳模組,模組將掃瞄到的藍芽名稱以及裝置位址通過usb口(串列埠)傳出,上位機通過串列埠輸入要連線的藍芽名稱後,模組進行連線配對,配對成功後就將usb口收到的資料通過藍芽傳送到配對端。

硬體:esp-32s模組,以及必要的外圍電路。

軟體系統:freertos,介面**採用樂鑫提供的esp32模組bsp包

1、串列埠初始化

static void uart_init(void)

; //set uart parameters

uart_param_config(uart_num_0, &uart_config);

//set uart pins

uart_set_pin(uart_num_0, uart_pin_no_change, uart_pin_no_change, uart_pin_no_change, uart_pin_no_change);

//install uart driver, and get the queue.

uart_driver_install(uart_num_0, 4096, 8192, 10,&spp_uart_queue,0);

xtaskcreate(uart_task, "utask", 2048, (void*)uart_num_0, 8, null);

}

2、藍芽功能初始化

//register the callback function to the gattc module

if ((status = esp_ble_gattc_register_callback(esp_gattc_cb)) != esp_ok)

esp_err_t local_mtu_ret = esp_ble_gatt_set_local_mtu(200); //設定mtu最大為200

if (local_mtu_ret)

cmd_reg_queue = xqueuecreate(10, sizeof(uint32_t));

xtaskcreate(spp_client_reg_task, "spp_client_reg_task", 2048, null, 10, null);

}void ble_init()

ret = esp_bt_controller_enable(esp_bt_mode_ble);

if (ret)

esp_logi(gattc_tag, "%s init bluetooth\n", __func__);

ret = esp_bluedroid_init();

if (ret)

ret = esp_bluedroid_enable();

if (ret)

} 3、啟動掃瞄

呼叫esp介面 esp_ble_gap_start_scanning(0xff);

掃瞄到藍芽裝置後會觸發事件 esp_gap_ble_scan_result_evt,在事件觸發時,回去掃瞄到的裝置名稱以及位址資訊,通過串列埠將裝置資訊輸出,

adv_name = esp_ble_resolve_adv_data(scan_result->scan_rst.ble_adv, esp_ble_ad_type_name_cmpl, &adv_name_len);

if(adv_name==null)

adv_name = esp_ble_resolve_adv_data(scan_result->scan_rst.ble_adv, esp_ble_ad_type_name_short, &adv_name_len);

uart_send_scandevinfo(scan_result->scan_rst.bda,adv_name,adv_name_len);

4、收到上位機通過串列埠輸入連線裝置名稱後,將掃瞄到的裝置名稱與目標名稱進行對比,如果相符就停止掃瞄

if (adv_name != null) 

}

停止掃瞄後會觸發 esp_gap_ble_scan_stop_complete_evt事件,在事件觸發時啟動連線

5、連線成功後會觸發gattc_profile_event_handler()中的 esp_gattc_connect_evt事件。

連線事件處理:設定資料長度

is_connect = true;

esp_err_t mtu_ret = esp_ble_gattc_send_mtu_req(gattc_if, spp_conn_id);

if (mtu_ret)

6、設定成功後觸發esp_gattc_cfg_mtu_evt事件。在此事件中獲取裝置資訊

if(p_data->cfg_mtu.status != esp_ok)

esp_logi(gattc_tag,"+mtu:%d\n", p_data->cfg_mtu.mtu);

spp_mtu_size = p_data->cfg_mtu.mtu;

spp_conn_id = p_data->connect.conn_id;

spp_gattc_if = gattc_if;

esp_ble_gattc_search_service(spp_gattc_if, spp_conn_id, &spp_service_uuid);

7、獲取成功後觸發esp_gattc_search_res_evt事件,然後設定通訊需要的佇列、資料通道等,就可以進行通訊了,

8、當串列埠收到資料後,呼叫

esp_ble_gattc_write_char( spp_gattc_if,spp_conn_id,

(db+spp_idx_spp_data_recv_val)->attribute_handle,

event.size,

pbuf,

esp_gatt_write_type_rsp,

esp_gatt_auth_req_none);

將資料傳輸給ble服務端。

9、當模組收到ble服務端的資料,會觸發通知事件:esp_gattc_notify_evt,在該事件出發時,呼叫

notify_event_handler(p_data);將資料通過串列埠傳送出去

static void notify_event_handler(esp_ble_gattc_cb_param_t * p_data)

else

handle = p_data->notify.handle;

if(handle == db[spp_idx_spp_data_nty_val].attribute_handle)

notify_value_count = 0;

notify_value_p = null;

notify_value_offset = 0;

esp_loge(gattc_tag,"notify value count is not continuous,%s\n",__func__);

return;

}if(p_data->notify.value[3] == 1)

memcpy((notify_value_p + notify_value_offset),(p_data->notify.value + 4),(p_data->notify.value_len - 4));

if(p_data->notify.value[2] == p_data->notify.value[3])

notify_value_offset += (p_data->notify.value_len - 4);

}else if(p_data->notify.value[3] <= p_data->notify.value[2])

notify_value_offset += (p_data->notify.value_len - 4);

}}else

}else if(handle == ((db+spp_idx_spp_status_val)->attribute_handle))else

}

大體流程就是這樣的,具體資料細節處理業務就不細述了。

ESP32S 入手攻略 開發指南

先看看實圖 正面 能清晰的看見2個按鈕,上面帶有兩個led 乙個是電源燈,乙個接了io口的,搞忘記是那個io口的了 反面io 個人數了一下一共38個腳,但是有5個是電源 gnd 3,3v3,5v 這個5v可以到時候測試一下能否直接帶動5v繼電器的模組,這樣就可以很方便的控制開關了!由於換了工作,和開...

僅ESP32和ESP32S2 驅動程式AT命令

at drvadc 讀取adc通道值。at drvpwminit 初始化pwm驅動器 at drvpwmduty 更改pwm占空比 at drvpwmfade 更改pwm梯度 at drvi2cinit 初始化i2c主驅動程式 at drvi2crd 讀取i2c資料 at drvi2cwrdata ...

esp32 io速度 ESP32快速入門指南

在本篇文章中,您將了解到esp32 wi fi和藍芽模組以及如何進行設定。什麼是esp32?esp8266 wi fi模組是過去幾年中最受歡迎和最實用的模組之一。市場上有這種模組的各種版本。esp32模組是esp8266的公升級版本。除了wi fi模組,該模組還包含藍芽4.0模組。雙核cpu工作頻率...