forked from 1technophile/OpenMQTTGateway
-
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
6 changed files
with
540 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,25 @@ | ||
#pragma once | ||
|
||
#ifdef __cplusplus | ||
extern "C" { | ||
#endif | ||
|
||
#define BLUFI_EXAMPLE_TAG "BLUFI_EXAMPLE" | ||
#define BLUFI_INFO(fmt, ...) ESP_LOGE(BLUFI_EXAMPLE_TAG, fmt, ##__VA_ARGS__) | ||
#define BLUFI_ERROR(fmt, ...) ESP_LOGE(BLUFI_EXAMPLE_TAG, fmt, ##__VA_ARGS__) | ||
|
||
/*void blufi_dh_negotiate_data_handler(uint8_t *data, int len, uint8_t **output_data, int *output_len, bool *need_free); | ||
int blufi_aes_encrypt(uint8_t iv8, uint8_t *crypt_data, int crypt_len); | ||
int blufi_aes_decrypt(uint8_t iv8, uint8_t *crypt_data, int crypt_len); | ||
uint16_t blufi_crc_checksum(uint8_t iv8, uint8_t *data, int len); | ||
esp_err_t blufi_security_init(void); | ||
void blufi_security_deinit(void); | ||
int esp_blufi_gap_register_callback(void); | ||
esp_err_t esp_blufi_host_init(void); | ||
esp_err_t esp_blufi_host_and_cb_init(esp_blufi_callbacks_t *callbacks); | ||
esp_err_t esp_blufi_host_deinit(void);*/ | ||
|
||
#ifdef __cplusplus | ||
} | ||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,239 @@ | ||
#include <stdio.h> | ||
#include <stdlib.h> | ||
#include <string.h> | ||
#include "freertos/FreeRTOS.h" | ||
#include "freertos/task.h" | ||
#include "freertos/event_groups.h" | ||
#include "esp_system.h" | ||
#include "esp_mac.h" | ||
#include "esp_wifi.h" | ||
#include "esp_event.h" | ||
#include "esp_log.h" | ||
#include "nvs_flash.h" | ||
#include "esp_bt.h" | ||
|
||
#include "esp_blufi_api.h" | ||
#include "Zblufi.h" | ||
|
||
extern "C" { | ||
#include "esp_blufi.h" | ||
} | ||
#include "NimBLEDevice.h" | ||
|
||
#define EXAMPLE_WIFI_CONNECTION_MAXIMUM_RETRY 2 //CONFIG_EXAMPLE_WIFI_CONNECTION_MAXIMUM_RETRY | ||
#define EXAMPLE_INVALID_REASON 255 | ||
#define EXAMPLE_INVALID_RSSI -128 | ||
|
||
#define WIFI_LIST_NUM 10 | ||
|
||
/* FreeRTOS event group to signal when we are connected & ready to make a request */ | ||
static EventGroupHandle_t wifi_event_group; | ||
|
||
/* The event group allows multiple bits for each event, | ||
but we only care about one event - are we connected | ||
to the AP with an IP? */ | ||
const int CONNECTED_BIT = BIT0; | ||
|
||
static uint8_t example_wifi_retry = 0; | ||
|
||
/* store the station info for send back to phone */ | ||
static bool gl_sta_connected = false; | ||
static bool gl_sta_got_ip = false; | ||
static bool ble_is_connected = false; | ||
static uint8_t gl_sta_bssid[6]; | ||
static uint8_t gl_sta_ssid[32]; | ||
static uint8_t gl_sta_passwd[64]; | ||
static int gl_sta_ssid_len; | ||
static wifi_sta_list_t gl_sta_list; | ||
static bool gl_sta_is_connecting = false; | ||
static esp_blufi_extra_info_t gl_sta_conn_info; | ||
|
||
static void example_event_callback(esp_blufi_cb_event_t event, esp_blufi_cb_param_t *param); | ||
|
||
static void example_event_callback(esp_blufi_cb_event_t event, esp_blufi_cb_param_t *param) | ||
{ | ||
/* actually, should post to blufi_task handle the procedure, | ||
* now, as a example, we do it more simply */ | ||
switch (event) { | ||
case ESP_BLUFI_EVENT_INIT_FINISH: | ||
BLUFI_INFO("BLUFI init finish\n"); | ||
esp_blufi_adv_start(); | ||
break; | ||
case ESP_BLUFI_EVENT_DEINIT_FINISH: | ||
BLUFI_INFO("BLUFI deinit finish\n"); | ||
break; | ||
case ESP_BLUFI_EVENT_BLE_CONNECT: | ||
BLUFI_INFO("BLUFI ble connect\n"); | ||
ble_is_connected = true; | ||
esp_blufi_adv_stop(); | ||
blufi_security_init(); | ||
break; | ||
case ESP_BLUFI_EVENT_BLE_DISCONNECT: | ||
BLUFI_INFO("BLUFI ble disconnect\n"); | ||
ble_is_connected = false; | ||
blufi_security_deinit(); | ||
esp_blufi_adv_start(); | ||
break; | ||
case ESP_BLUFI_EVENT_REQ_CONNECT_TO_AP: | ||
BLUFI_INFO("BLUFI requset wifi connect to AP\n"); | ||
WiFi.begin((char *)gl_sta_ssid, (char *)gl_sta_passwd); | ||
break; | ||
case ESP_BLUFI_EVENT_REQ_DISCONNECT_FROM_AP: | ||
BLUFI_INFO("BLUFI requset wifi disconnect from AP\n"); | ||
WiFi.disconnect(); | ||
break; | ||
case ESP_BLUFI_EVENT_REPORT_ERROR: | ||
BLUFI_ERROR("BLUFI report error, error code %d\n", param->report_error.state); | ||
esp_blufi_send_error_info(param->report_error.state); | ||
break; | ||
case ESP_BLUFI_EVENT_GET_WIFI_STATUS: { | ||
wifi_mode_t mode; | ||
esp_blufi_extra_info_t info; | ||
|
||
esp_wifi_get_mode(&mode); | ||
|
||
if (gl_sta_connected) { | ||
memset(&info, 0, sizeof(esp_blufi_extra_info_t)); | ||
memcpy(info.sta_bssid, gl_sta_bssid, 6); | ||
info.sta_bssid_set = true; | ||
info.sta_ssid = gl_sta_ssid; | ||
info.sta_ssid_len = gl_sta_ssid_len; | ||
esp_blufi_send_wifi_conn_report(mode, gl_sta_got_ip ? ESP_BLUFI_STA_CONN_SUCCESS : ESP_BLUFI_STA_NO_IP, 0, &info); | ||
} else if (gl_sta_is_connecting) { | ||
esp_blufi_send_wifi_conn_report(mode, ESP_BLUFI_STA_CONNECTING, 0, &gl_sta_conn_info); | ||
} else { | ||
esp_blufi_send_wifi_conn_report(mode, ESP_BLUFI_STA_CONN_FAIL, 0, &gl_sta_conn_info); | ||
} | ||
BLUFI_INFO("BLUFI get wifi status from AP\n"); | ||
|
||
break; | ||
} | ||
case ESP_BLUFI_EVENT_RECV_SLAVE_DISCONNECT_BLE: | ||
BLUFI_INFO("blufi close a gatt connection"); | ||
esp_blufi_disconnect(); | ||
break; | ||
case ESP_BLUFI_EVENT_RECV_STA_SSID: | ||
strncpy((char *)gl_sta_ssid, (char *)param->sta_ssid.ssid, param->sta_ssid.ssid_len); | ||
gl_sta_ssid[param->sta_ssid.ssid_len] = '\0'; | ||
BLUFI_INFO("Recv STA SSID %s\n", gl_sta_ssid); | ||
break; | ||
case ESP_BLUFI_EVENT_RECV_STA_PASSWD: | ||
strncpy((char *)gl_sta_passwd, (char *)param->sta_passwd.passwd, param->sta_passwd.passwd_len); | ||
gl_sta_passwd[param->sta_passwd.passwd_len] = '\0'; | ||
BLUFI_INFO("Recv STA PASSWORD %s\n", gl_sta_passwd); | ||
break; | ||
case ESP_BLUFI_EVENT_GET_WIFI_LIST:{ | ||
WiFi.scanNetworks(false); | ||
break; | ||
} | ||
case ESP_BLUFI_EVENT_RECV_CUSTOM_DATA: | ||
BLUFI_INFO("Recv Custom Data %" PRIu32 "\n", param->custom_data.data_len); | ||
esp_log_buffer_hex("Custom Data", param->custom_data.data, param->custom_data.data_len); | ||
break; | ||
case ESP_BLUFI_EVENT_RECV_USERNAME: | ||
break; | ||
case ESP_BLUFI_EVENT_RECV_CA_CERT: | ||
break; | ||
case ESP_BLUFI_EVENT_RECV_CLIENT_CERT: | ||
break; | ||
case ESP_BLUFI_EVENT_RECV_SERVER_CERT: | ||
break; | ||
case ESP_BLUFI_EVENT_RECV_CLIENT_PRIV_KEY: | ||
break;; | ||
case ESP_BLUFI_EVENT_RECV_SERVER_PRIV_KEY: | ||
break; | ||
default: | ||
break; | ||
} | ||
} | ||
|
||
void wifi_event_handler(arduino_event_id_t event) | ||
{ | ||
switch (event) { | ||
case ARDUINO_EVENT_WIFI_STA_GOT_IP6: | ||
case ARDUINO_EVENT_WIFI_STA_GOT_IP: { | ||
esp_blufi_extra_info_t info; | ||
wifi_mode_t mode; | ||
esp_wifi_get_mode(&mode); | ||
memset(&info, 0, sizeof(esp_blufi_extra_info_t)); | ||
memcpy(info.sta_bssid, gl_sta_bssid, 6); | ||
info.sta_bssid_set = true; | ||
info.sta_ssid = gl_sta_ssid; | ||
info.sta_ssid_len = gl_sta_ssid_len; | ||
gl_sta_got_ip = true; | ||
if (ble_is_connected == true) { | ||
esp_blufi_send_wifi_conn_report(mode, ESP_BLUFI_STA_CONN_SUCCESS, 0, &info); | ||
} else { | ||
BLUFI_INFO("BLUFI BLE is not connected yet\n"); | ||
} | ||
break; | ||
} | ||
case ARDUINO_EVENT_WIFI_SCAN_DONE: { | ||
uint16_t apCount = 0; | ||
esp_wifi_scan_get_ap_num(&apCount); | ||
if (apCount == 0) { | ||
BLUFI_INFO("Nothing AP found"); | ||
break; | ||
} | ||
wifi_ap_record_t *ap_list = (wifi_ap_record_t *)malloc(sizeof(wifi_ap_record_t) * apCount); | ||
if (!ap_list) { | ||
BLUFI_ERROR("malloc error, ap_list is NULL"); | ||
break; | ||
} | ||
ESP_ERROR_CHECK(esp_wifi_scan_get_ap_records(&apCount, ap_list)); | ||
esp_blufi_ap_record_t * blufi_ap_list = (esp_blufi_ap_record_t *)malloc(apCount * sizeof(esp_blufi_ap_record_t)); | ||
if (!blufi_ap_list) { | ||
if (ap_list) { | ||
free(ap_list); | ||
} | ||
BLUFI_ERROR("malloc error, blufi_ap_list is NULL"); | ||
break; | ||
} | ||
for (int i = 0; i < apCount; ++i) | ||
{ | ||
blufi_ap_list[i].rssi = ap_list[i].rssi; | ||
memcpy(blufi_ap_list[i].ssid, ap_list[i].ssid, sizeof(ap_list[i].ssid)); | ||
} | ||
|
||
if (ble_is_connected == true) { | ||
esp_blufi_send_wifi_list(apCount, blufi_ap_list); | ||
} else { | ||
BLUFI_INFO("BLUFI BLE is not connected yet\n"); | ||
} | ||
|
||
esp_wifi_scan_stop(); | ||
free(ap_list); | ||
free(blufi_ap_list); | ||
break; | ||
} | ||
default: | ||
break; | ||
} | ||
return; | ||
} | ||
|
||
static esp_blufi_callbacks_t example_callbacks = { | ||
.event_cb = example_event_callback, | ||
.negotiate_data_handler = blufi_dh_negotiate_data_handler, | ||
.encrypt_func = blufi_aes_encrypt, | ||
.decrypt_func = blufi_aes_decrypt, | ||
.checksum_func = blufi_crc_checksum, | ||
}; | ||
|
||
bool startBluefi() | ||
{ | ||
esp_err_t ret = ESP_OK; | ||
WiFi.onEvent(wifi_event_handler); | ||
|
||
ret = esp_blufi_register_callbacks(&example_callbacks); | ||
if(ret){ | ||
BLUFI_ERROR("%s blufi register failed, error code = %x\n", __func__, ret); | ||
return false; | ||
} | ||
|
||
esp_blufi_btc_init(); | ||
NimBLEDevice::init("OMG_BLUFI"); | ||
esp_blufi_gatt_svr_init(); | ||
ble_gatts_start(); | ||
return esp_blufi_profile_init() == ESP_OK; | ||
} |
Oops, something went wrong.