blufi_example_main.c 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367
  1. // Copyright 2015-2016 Espressif Systems (Shanghai) PTE LTD
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. // http://www.apache.org/licenses/LICENSE-2.0
  7. //
  8. // Unless required by applicable law or agreed to in writing, software
  9. // distributed under the License is distributed on an "AS IS" BASIS,
  10. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  11. // See the License for the specific language governing permissions and
  12. // limitations under the License.
  13. #include <stdio.h>
  14. #include <stdlib.h>
  15. #include <string.h>
  16. #include "freertos/FreeRTOS.h"
  17. #include "freertos/task.h"
  18. #include "freertos/event_groups.h"
  19. #include "esp_system.h"
  20. #include "esp_wifi.h"
  21. #include "esp_event_loop.h"
  22. #include "esp_log.h"
  23. #include "nvs_flash.h"
  24. #include "bt.h"
  25. #include "esp_blufi_api.h"
  26. #include "esp_bt_defs.h"
  27. #include "esp_gap_ble_api.h"
  28. #include "esp_bt_main.h"
  29. #include "esp_bt_device.h"
  30. #include "blufi_example.h"
  31. static void example_event_callback(esp_blufi_cb_event_t event, esp_blufi_cb_param_t *param);
  32. #define BLUFI_DEVICE_NAME "BLUFI_DEVICE"
  33. static uint8_t example_service_uuid128[32] = {
  34. /* LSB <--------------------------------------------------------------------------------> MSB */
  35. //first uuid, 16bit, [12],[13] is the value
  36. 0xfb, 0x34, 0x9b, 0x5f, 0x80, 0x00, 0x00, 0x80, 0x00, 0x10, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
  37. };
  38. //static uint8_t test_manufacturer[TEST_MANUFACTURER_DATA_LEN] = {0x12, 0x23, 0x45, 0x56};
  39. static esp_ble_adv_data_t example_adv_data = {
  40. .set_scan_rsp = false,
  41. .include_name = true,
  42. .include_txpower = true,
  43. .min_interval = 0x100,
  44. .max_interval = 0x100,
  45. .appearance = 0x00,
  46. .manufacturer_len = 0,
  47. .p_manufacturer_data = NULL,
  48. .service_data_len = 0,
  49. .p_service_data = NULL,
  50. .service_uuid_len = 16,
  51. .p_service_uuid = example_service_uuid128,
  52. .flag = 0x6,
  53. };
  54. static esp_ble_adv_params_t example_adv_params = {
  55. .adv_int_min = 0x100,
  56. .adv_int_max = 0x100,
  57. .adv_type = ADV_TYPE_IND,
  58. .own_addr_type = BLE_ADDR_TYPE_PUBLIC,
  59. //.peer_addr =
  60. //.peer_addr_type =
  61. .channel_map = ADV_CHNL_ALL,
  62. .adv_filter_policy = ADV_FILTER_ALLOW_SCAN_ANY_CON_ANY,
  63. };
  64. #define WIFI_LIST_NUM 10
  65. static wifi_config_t sta_config;
  66. static wifi_config_t ap_config;
  67. /* FreeRTOS event group to signal when we are connected & ready to make a request */
  68. static EventGroupHandle_t wifi_event_group;
  69. /* The event group allows multiple bits for each event,
  70. but we only care about one event - are we connected
  71. to the AP with an IP? */
  72. const int CONNECTED_BIT = BIT0;
  73. /* store the station info for send back to phone */
  74. static bool gl_sta_connected = false;
  75. static uint8_t gl_sta_bssid[6];
  76. static uint8_t gl_sta_ssid[32];
  77. static int gl_sta_ssid_len;
  78. /* connect infor*/
  79. static uint8_t server_if;
  80. static uint16_t conn_id;
  81. static esp_err_t example_net_event_handler(void *ctx, system_event_t *event)
  82. {
  83. wifi_mode_t mode;
  84. switch (event->event_id) {
  85. case SYSTEM_EVENT_STA_START:
  86. esp_wifi_connect();
  87. break;
  88. case SYSTEM_EVENT_STA_GOT_IP: {
  89. esp_blufi_extra_info_t info;
  90. xEventGroupSetBits(wifi_event_group, CONNECTED_BIT);
  91. esp_wifi_get_mode(&mode);
  92. memset(&info, 0, sizeof(esp_blufi_extra_info_t));
  93. memcpy(info.sta_bssid, gl_sta_bssid, 6);
  94. info.sta_bssid_set = true;
  95. info.sta_ssid = gl_sta_ssid;
  96. info.sta_ssid_len = gl_sta_ssid_len;
  97. esp_blufi_send_wifi_conn_report(mode, ESP_BLUFI_STA_CONN_SUCCESS, 0, &info);
  98. break;
  99. }
  100. case SYSTEM_EVENT_STA_CONNECTED:
  101. gl_sta_connected = true;
  102. memcpy(gl_sta_bssid, event->event_info.connected.bssid, 6);
  103. memcpy(gl_sta_ssid, event->event_info.connected.ssid, event->event_info.connected.ssid_len);
  104. gl_sta_ssid_len = event->event_info.connected.ssid_len;
  105. break;
  106. case SYSTEM_EVENT_STA_DISCONNECTED:
  107. /* This is a workaround as ESP32 WiFi libs don't currently
  108. auto-reassociate. */
  109. gl_sta_connected = false;
  110. memset(gl_sta_ssid, 0, 32);
  111. memset(gl_sta_bssid, 0, 6);
  112. gl_sta_ssid_len = 0;
  113. esp_wifi_connect();
  114. xEventGroupClearBits(wifi_event_group, CONNECTED_BIT);
  115. break;
  116. case SYSTEM_EVENT_AP_START:
  117. esp_wifi_get_mode(&mode);
  118. /* TODO: get config or information of softap, then set to report extra_info */
  119. if (gl_sta_connected) {
  120. esp_blufi_send_wifi_conn_report(mode, ESP_BLUFI_STA_CONN_SUCCESS, 0, NULL);
  121. } else {
  122. esp_blufi_send_wifi_conn_report(mode, ESP_BLUFI_STA_CONN_FAIL, 0, NULL);
  123. }
  124. break;
  125. default:
  126. break;
  127. }
  128. return ESP_OK;
  129. }
  130. static void initialise_wifi(void)
  131. {
  132. tcpip_adapter_init();
  133. wifi_event_group = xEventGroupCreate();
  134. ESP_ERROR_CHECK( esp_event_loop_init(example_net_event_handler, NULL) );
  135. wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
  136. ESP_ERROR_CHECK( esp_wifi_init(&cfg) );
  137. ESP_ERROR_CHECK( esp_wifi_set_storage(WIFI_STORAGE_RAM) );
  138. ESP_ERROR_CHECK( esp_wifi_set_mode(WIFI_MODE_STA) );
  139. ESP_ERROR_CHECK( esp_wifi_start() );
  140. }
  141. static esp_blufi_callbacks_t example_callbacks = {
  142. .event_cb = example_event_callback,
  143. .negotiate_data_handler = blufi_dh_negotiate_data_handler,
  144. .encrypt_func = blufi_aes_encrypt,
  145. .decrypt_func = blufi_aes_decrypt,
  146. .checksum_func = blufi_crc_checksum,
  147. };
  148. static void example_event_callback(esp_blufi_cb_event_t event, esp_blufi_cb_param_t *param)
  149. {
  150. /* actually, should post to blufi_task handle the procedure,
  151. * now, as a example, we do it more simply */
  152. switch (event) {
  153. case ESP_BLUFI_EVENT_INIT_FINISH:
  154. BLUFI_INFO("BLUFI init finish\n");
  155. esp_ble_gap_set_device_name(BLUFI_DEVICE_NAME);
  156. esp_ble_gap_config_adv_data(&example_adv_data);
  157. break;
  158. case ESP_BLUFI_EVENT_DEINIT_FINISH:
  159. BLUFI_INFO("BLUFI deinit finish\n");
  160. break;
  161. case ESP_BLUFI_EVENT_BLE_CONNECT:
  162. BLUFI_INFO("BLUFI ble connect\n");
  163. server_if=param->connect.server_if;
  164. conn_id=param->connect.conn_id;
  165. esp_ble_gap_stop_advertising();
  166. blufi_security_init();
  167. break;
  168. case ESP_BLUFI_EVENT_BLE_DISCONNECT:
  169. BLUFI_INFO("BLUFI ble disconnect\n");
  170. blufi_security_deinit();
  171. esp_ble_gap_start_advertising(&example_adv_params);
  172. break;
  173. case ESP_BLUFI_EVENT_SET_WIFI_OPMODE:
  174. BLUFI_INFO("BLUFI Set WIFI opmode %d\n", param->wifi_mode.op_mode);
  175. ESP_ERROR_CHECK( esp_wifi_set_mode(param->wifi_mode.op_mode) );
  176. break;
  177. case ESP_BLUFI_EVENT_REQ_CONNECT_TO_AP:
  178. BLUFI_INFO("BLUFI requset wifi connect to AP\n");
  179. esp_wifi_connect();
  180. break;
  181. case ESP_BLUFI_EVENT_REQ_DISCONNECT_FROM_AP:
  182. BLUFI_INFO("BLUFI requset wifi disconnect from AP\n");
  183. esp_wifi_disconnect();
  184. break;
  185. case ESP_BLUFI_EVENT_GET_WIFI_STATUS: {
  186. wifi_mode_t mode;
  187. esp_blufi_extra_info_t info;
  188. esp_wifi_get_mode(&mode);
  189. if (gl_sta_connected ) {
  190. memset(&info, 0, sizeof(esp_blufi_extra_info_t));
  191. memcpy(info.sta_bssid, gl_sta_bssid, 6);
  192. info.sta_bssid_set = true;
  193. info.sta_ssid = gl_sta_ssid;
  194. info.sta_ssid_len = gl_sta_ssid_len;
  195. esp_blufi_send_wifi_conn_report(mode, ESP_BLUFI_STA_CONN_SUCCESS, 0, &info);
  196. } else {
  197. esp_blufi_send_wifi_conn_report(mode, ESP_BLUFI_STA_CONN_FAIL, 0, NULL);
  198. }
  199. BLUFI_INFO("BLUFI get wifi status from AP\n");
  200. break;
  201. }
  202. case ESP_BLUFI_EVENT_RECV_SLAVE_DISCONNECT_BLE:
  203. BLUFI_INFO("blufi close a gatt connection");
  204. esp_blufi_close(server_if,conn_id);
  205. break;
  206. case ESP_BLUFI_EVENT_DEAUTHENTICATE_STA:
  207. /* TODO */
  208. break;
  209. case ESP_BLUFI_EVENT_RECV_STA_BSSID:
  210. memcpy(sta_config.sta.bssid, param->sta_bssid.bssid, 6);
  211. sta_config.sta.bssid_set = 1;
  212. esp_wifi_set_config(WIFI_IF_STA, &sta_config);
  213. BLUFI_INFO("Recv STA BSSID %s\n", sta_config.sta.ssid);
  214. break;
  215. case ESP_BLUFI_EVENT_RECV_STA_SSID:
  216. strncpy((char *)sta_config.sta.ssid, (char *)param->sta_ssid.ssid, param->sta_ssid.ssid_len);
  217. sta_config.sta.ssid[param->sta_ssid.ssid_len] = '\0';
  218. esp_wifi_set_config(WIFI_IF_STA, &sta_config);
  219. BLUFI_INFO("Recv STA SSID %s\n", sta_config.sta.ssid);
  220. break;
  221. case ESP_BLUFI_EVENT_RECV_STA_PASSWD:
  222. strncpy((char *)sta_config.sta.password, (char *)param->sta_passwd.passwd, param->sta_passwd.passwd_len);
  223. sta_config.sta.password[param->sta_passwd.passwd_len] = '\0';
  224. esp_wifi_set_config(WIFI_IF_STA, &sta_config);
  225. BLUFI_INFO("Recv STA PASSWORD %s\n", sta_config.sta.password);
  226. break;
  227. case ESP_BLUFI_EVENT_RECV_SOFTAP_SSID:
  228. strncpy((char *)ap_config.ap.ssid, (char *)param->softap_ssid.ssid, param->softap_ssid.ssid_len);
  229. ap_config.ap.ssid_len = param->softap_ssid.ssid_len;
  230. esp_wifi_set_config(WIFI_IF_AP, &ap_config);
  231. BLUFI_INFO("Recv SOFTAP SSID %s, ssid len %d\n", ap_config.ap.ssid, ap_config.ap.ssid_len);
  232. break;
  233. case ESP_BLUFI_EVENT_RECV_SOFTAP_PASSWD:
  234. strncpy((char *)ap_config.ap.password, (char *)param->softap_passwd.passwd, param->softap_passwd.passwd_len);
  235. esp_wifi_set_config(WIFI_IF_AP, &ap_config);
  236. BLUFI_INFO("Recv SOFTAP PASSWORD %s\n", ap_config.ap.password);
  237. break;
  238. case ESP_BLUFI_EVENT_RECV_SOFTAP_MAX_CONN_NUM:
  239. if (param->softap_max_conn_num.max_conn_num > 4) {
  240. return;
  241. }
  242. ap_config.ap.max_connection = param->softap_max_conn_num.max_conn_num;
  243. esp_wifi_set_config(WIFI_IF_AP, &ap_config);
  244. BLUFI_INFO("Recv SOFTAP MAX CONN NUM %d\n", ap_config.ap.max_connection);
  245. break;
  246. case ESP_BLUFI_EVENT_RECV_SOFTAP_AUTH_MODE:
  247. if (param->softap_auth_mode.auth_mode >= WIFI_AUTH_MAX) {
  248. return;
  249. }
  250. ap_config.ap.authmode = param->softap_auth_mode.auth_mode;
  251. esp_wifi_set_config(WIFI_IF_AP, &ap_config);
  252. BLUFI_INFO("Recv SOFTAP AUTH MODE %d\n", ap_config.ap.authmode);
  253. break;
  254. case ESP_BLUFI_EVENT_RECV_SOFTAP_CHANNEL:
  255. if (param->softap_channel.channel > 13) {
  256. return;
  257. }
  258. ap_config.ap.channel = param->softap_channel.channel;
  259. esp_wifi_set_config(WIFI_IF_AP, &ap_config);
  260. BLUFI_INFO("Recv SOFTAP CHANNEL %d\n", ap_config.ap.channel);
  261. break;
  262. case ESP_BLUFI_EVENT_RECV_USERNAME:
  263. /* Not handle currently */
  264. break;
  265. case ESP_BLUFI_EVENT_RECV_CA_CERT:
  266. /* Not handle currently */
  267. break;
  268. case ESP_BLUFI_EVENT_RECV_CLIENT_CERT:
  269. /* Not handle currently */
  270. break;
  271. case ESP_BLUFI_EVENT_RECV_SERVER_CERT:
  272. /* Not handle currently */
  273. break;
  274. case ESP_BLUFI_EVENT_RECV_CLIENT_PRIV_KEY:
  275. /* Not handle currently */
  276. break;;
  277. case ESP_BLUFI_EVENT_RECV_SERVER_PRIV_KEY:
  278. /* Not handle currently */
  279. break;
  280. default:
  281. break;
  282. }
  283. }
  284. static void example_gap_event_handler(esp_gap_ble_cb_event_t event, esp_ble_gap_cb_param_t *param)
  285. {
  286. switch (event) {
  287. case ESP_GAP_BLE_ADV_DATA_SET_COMPLETE_EVT:
  288. esp_ble_gap_start_advertising(&example_adv_params);
  289. break;
  290. default:
  291. break;
  292. }
  293. }
  294. void app_main()
  295. {
  296. esp_err_t ret;
  297. // Initialize NVS
  298. ret = nvs_flash_init();
  299. if (ret == ESP_ERR_NVS_NO_FREE_PAGES) {
  300. ESP_ERROR_CHECK(nvs_flash_erase());
  301. ret = nvs_flash_init();
  302. }
  303. ESP_ERROR_CHECK( ret );
  304. initialise_wifi();
  305. esp_bt_controller_config_t bt_cfg = BT_CONTROLLER_INIT_CONFIG_DEFAULT();
  306. ret = esp_bt_controller_init(&bt_cfg);
  307. if (ret) {
  308. BLUFI_ERROR("%s initialize bt controller failed\n", __func__);
  309. }
  310. ret = esp_bt_controller_enable(ESP_BT_MODE_BTDM);
  311. if (ret) {
  312. BLUFI_ERROR("%s enable bt controller failed\n", __func__);
  313. return;
  314. }
  315. ret = esp_bluedroid_init();
  316. if (ret) {
  317. BLUFI_ERROR("%s init bluedroid failed\n", __func__);
  318. return;
  319. }
  320. ret = esp_bluedroid_enable();
  321. if (ret) {
  322. BLUFI_ERROR("%s init bluedroid failed\n", __func__);
  323. return;
  324. }
  325. BLUFI_INFO("BD ADDR: "ESP_BD_ADDR_STR"\n", ESP_BD_ADDR_HEX(esp_bt_dev_get_address()));
  326. BLUFI_INFO("BLUFI VERSION %04x\n", esp_blufi_get_version());
  327. blufi_security_init();
  328. esp_ble_gap_register_callback(example_gap_event_handler);
  329. esp_blufi_register_callbacks(&example_callbacks);
  330. esp_blufi_profile_init();
  331. }