blufi_example_main.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351
  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. static esp_err_t example_net_event_handler(void *ctx, system_event_t *event)
  79. {
  80. wifi_mode_t mode;
  81. switch (event->event_id) {
  82. case SYSTEM_EVENT_STA_START:
  83. esp_wifi_connect();
  84. break;
  85. case SYSTEM_EVENT_STA_GOT_IP: {
  86. esp_blufi_extra_info_t info;
  87. xEventGroupSetBits(wifi_event_group, CONNECTED_BIT);
  88. esp_wifi_get_mode(&mode);
  89. memset(&info, 0, sizeof(esp_blufi_extra_info_t));
  90. memcpy(info.sta_bssid, gl_sta_bssid, 6);
  91. info.sta_bssid_set = true;
  92. info.sta_ssid = gl_sta_ssid;
  93. info.sta_ssid_len = gl_sta_ssid_len;
  94. esp_blufi_send_wifi_conn_report(mode, ESP_BLUFI_STA_CONN_SUCCESS, 0, &info);
  95. break;
  96. }
  97. case SYSTEM_EVENT_STA_CONNECTED:
  98. gl_sta_connected = true;
  99. memcpy(gl_sta_bssid, event->event_info.connected.bssid, 6);
  100. memcpy(gl_sta_ssid, event->event_info.connected.ssid, event->event_info.connected.ssid_len);
  101. gl_sta_ssid_len = event->event_info.connected.ssid_len;
  102. break;
  103. case SYSTEM_EVENT_STA_DISCONNECTED:
  104. /* This is a workaround as ESP32 WiFi libs don't currently
  105. auto-reassociate. */
  106. gl_sta_connected = false;
  107. memset(gl_sta_ssid, 0, 32);
  108. memset(gl_sta_bssid, 0, 6);
  109. gl_sta_ssid_len = 0;
  110. esp_wifi_connect();
  111. xEventGroupClearBits(wifi_event_group, CONNECTED_BIT);
  112. break;
  113. case SYSTEM_EVENT_AP_START:
  114. esp_wifi_get_mode(&mode);
  115. /* TODO: get config or information of softap, then set to report extra_info */
  116. if (gl_sta_connected) {
  117. esp_blufi_send_wifi_conn_report(mode, ESP_BLUFI_STA_CONN_SUCCESS, 0, NULL);
  118. } else {
  119. esp_blufi_send_wifi_conn_report(mode, ESP_BLUFI_STA_CONN_FAIL, 0, NULL);
  120. }
  121. break;
  122. default:
  123. break;
  124. }
  125. return ESP_OK;
  126. }
  127. static void initialise_wifi(void)
  128. {
  129. tcpip_adapter_init();
  130. wifi_event_group = xEventGroupCreate();
  131. ESP_ERROR_CHECK( esp_event_loop_init(example_net_event_handler, NULL) );
  132. wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
  133. ESP_ERROR_CHECK( esp_wifi_init(&cfg) );
  134. ESP_ERROR_CHECK( esp_wifi_set_storage(WIFI_STORAGE_RAM) );
  135. ESP_ERROR_CHECK( esp_wifi_set_mode(WIFI_MODE_STA) );
  136. ESP_ERROR_CHECK( esp_wifi_start() );
  137. }
  138. static esp_blufi_callbacks_t example_callbacks = {
  139. .event_cb = example_event_callback,
  140. .negotiate_data_handler = blufi_dh_negotiate_data_handler,
  141. .encrypt_func = blufi_aes_encrypt,
  142. .decrypt_func = blufi_aes_decrypt,
  143. .checksum_func = blufi_crc_checksum,
  144. };
  145. static void example_event_callback(esp_blufi_cb_event_t event, esp_blufi_cb_param_t *param)
  146. {
  147. /* actually, should post to blufi_task handle the procedure,
  148. * now, as a example, we do it more simply */
  149. switch (event) {
  150. case ESP_BLUFI_EVENT_INIT_FINISH:
  151. BLUFI_INFO("BLUFI init finish\n");
  152. esp_ble_gap_set_device_name(BLUFI_DEVICE_NAME);
  153. esp_ble_gap_config_adv_data(&example_adv_data);
  154. break;
  155. case ESP_BLUFI_EVENT_DEINIT_FINISH:
  156. BLUFI_INFO("BLUFI init finish\n");
  157. break;
  158. case ESP_BLUFI_EVENT_BLE_CONNECT:
  159. BLUFI_INFO("BLUFI ble connect\n");
  160. esp_ble_gap_stop_advertising();
  161. blufi_security_deinit();
  162. blufi_security_init();
  163. break;
  164. case ESP_BLUFI_EVENT_BLE_DISCONNECT:
  165. BLUFI_INFO("BLUFI ble disconnect\n");
  166. esp_ble_gap_start_advertising(&example_adv_params);
  167. break;
  168. case ESP_BLUFI_EVENT_SET_WIFI_OPMODE:
  169. BLUFI_INFO("BLUFI Set WIFI opmode %d\n", param->wifi_mode.op_mode);
  170. ESP_ERROR_CHECK( esp_wifi_set_mode(param->wifi_mode.op_mode) );
  171. break;
  172. case ESP_BLUFI_EVENT_REQ_CONNECT_TO_AP:
  173. BLUFI_INFO("BLUFI requset wifi connect to AP\n");
  174. esp_wifi_connect();
  175. break;
  176. case ESP_BLUFI_EVENT_REQ_DISCONNECT_FROM_AP:
  177. BLUFI_INFO("BLUFI requset wifi disconnect from AP\n");
  178. esp_wifi_disconnect();
  179. break;
  180. case ESP_BLUFI_EVENT_GET_WIFI_STATUS: {
  181. wifi_mode_t mode;
  182. esp_blufi_extra_info_t info;
  183. esp_wifi_get_mode(&mode);
  184. if (gl_sta_connected ) {
  185. memset(&info, 0, sizeof(esp_blufi_extra_info_t));
  186. memcpy(info.sta_bssid, gl_sta_bssid, 6);
  187. info.sta_bssid_set = true;
  188. info.sta_ssid = gl_sta_ssid;
  189. info.sta_ssid_len = gl_sta_ssid_len;
  190. esp_blufi_send_wifi_conn_report(mode, ESP_BLUFI_STA_CONN_SUCCESS, 0, &info);
  191. } else {
  192. esp_blufi_send_wifi_conn_report(mode, ESP_BLUFI_STA_CONN_FAIL, 0, NULL);
  193. }
  194. BLUFI_INFO("BLUFI get wifi status from AP\n");
  195. break;
  196. }
  197. case ESP_BLUFI_EVENT_DEAUTHENTICATE_STA:
  198. /* TODO */
  199. break;
  200. case ESP_BLUFI_EVENT_RECV_STA_BSSID:
  201. memcpy(sta_config.sta.bssid, param->sta_bssid.bssid, 6);
  202. sta_config.sta.bssid_set = 1;
  203. esp_wifi_set_config(WIFI_IF_STA, &sta_config);
  204. BLUFI_INFO("Recv STA BSSID %s\n", sta_config.sta.ssid);
  205. break;
  206. case ESP_BLUFI_EVENT_RECV_STA_SSID:
  207. strncpy((char *)sta_config.sta.ssid, (char *)param->sta_ssid.ssid, param->sta_ssid.ssid_len);
  208. sta_config.sta.ssid[param->sta_ssid.ssid_len] = '\0';
  209. esp_wifi_set_config(WIFI_IF_STA, &sta_config);
  210. BLUFI_INFO("Recv STA SSID %s\n", sta_config.sta.ssid);
  211. break;
  212. case ESP_BLUFI_EVENT_RECV_STA_PASSWD:
  213. strncpy((char *)sta_config.sta.password, (char *)param->sta_passwd.passwd, param->sta_passwd.passwd_len);
  214. sta_config.sta.password[param->sta_passwd.passwd_len] = '\0';
  215. esp_wifi_set_config(WIFI_IF_STA, &sta_config);
  216. BLUFI_INFO("Recv STA PASSWORD %s\n", sta_config.sta.password);
  217. break;
  218. case ESP_BLUFI_EVENT_RECV_SOFTAP_SSID:
  219. strncpy((char *)ap_config.ap.ssid, (char *)param->softap_ssid.ssid, param->softap_ssid.ssid_len);
  220. ap_config.ap.ssid_len = param->softap_ssid.ssid_len;
  221. esp_wifi_set_config(WIFI_IF_AP, &ap_config);
  222. BLUFI_INFO("Recv SOFTAP SSID %s, ssid len %d\n", ap_config.ap.ssid, ap_config.ap.ssid_len);
  223. break;
  224. case ESP_BLUFI_EVENT_RECV_SOFTAP_PASSWD:
  225. strncpy((char *)ap_config.ap.password, (char *)param->softap_passwd.passwd, param->softap_passwd.passwd_len);
  226. esp_wifi_set_config(WIFI_IF_AP, &ap_config);
  227. BLUFI_INFO("Recv SOFTAP PASSWORD %s\n", ap_config.ap.password);
  228. break;
  229. case ESP_BLUFI_EVENT_RECV_SOFTAP_MAX_CONN_NUM:
  230. if (param->softap_max_conn_num.max_conn_num > 4) {
  231. return;
  232. }
  233. ap_config.ap.max_connection = param->softap_max_conn_num.max_conn_num;
  234. esp_wifi_set_config(WIFI_IF_AP, &ap_config);
  235. BLUFI_INFO("Recv SOFTAP MAX CONN NUM %d\n", ap_config.ap.max_connection);
  236. break;
  237. case ESP_BLUFI_EVENT_RECV_SOFTAP_AUTH_MODE:
  238. if (param->softap_auth_mode.auth_mode >= WIFI_AUTH_MAX) {
  239. return;
  240. }
  241. ap_config.ap.authmode = param->softap_auth_mode.auth_mode;
  242. esp_wifi_set_config(WIFI_IF_AP, &ap_config);
  243. BLUFI_INFO("Recv SOFTAP AUTH MODE %d\n", ap_config.ap.authmode);
  244. break;
  245. case ESP_BLUFI_EVENT_RECV_SOFTAP_CHANNEL:
  246. if (param->softap_channel.channel > 13) {
  247. return;
  248. }
  249. ap_config.ap.channel = param->softap_channel.channel;
  250. esp_wifi_set_config(WIFI_IF_AP, &ap_config);
  251. BLUFI_INFO("Recv SOFTAP CHANNEL %d\n", ap_config.ap.channel);
  252. break;
  253. case ESP_BLUFI_EVENT_RECV_USERNAME:
  254. /* Not handle currently */
  255. break;
  256. case ESP_BLUFI_EVENT_RECV_CA_CERT:
  257. /* Not handle currently */
  258. break;
  259. case ESP_BLUFI_EVENT_RECV_CLIENT_CERT:
  260. /* Not handle currently */
  261. break;
  262. case ESP_BLUFI_EVENT_RECV_SERVER_CERT:
  263. /* Not handle currently */
  264. break;
  265. case ESP_BLUFI_EVENT_RECV_CLIENT_PRIV_KEY:
  266. /* Not handle currently */
  267. break;;
  268. case ESP_BLUFI_EVENT_RECV_SERVER_PRIV_KEY:
  269. /* Not handle currently */
  270. break;
  271. default:
  272. break;
  273. }
  274. }
  275. static void example_gap_event_handler(esp_gap_ble_cb_event_t event, esp_ble_gap_cb_param_t *param)
  276. {
  277. switch (event) {
  278. case ESP_GAP_BLE_ADV_DATA_SET_COMPLETE_EVT:
  279. esp_ble_gap_start_advertising(&example_adv_params);
  280. break;
  281. default:
  282. break;
  283. }
  284. }
  285. void app_main()
  286. {
  287. esp_err_t ret;
  288. ESP_ERROR_CHECK( nvs_flash_init() );
  289. initialise_wifi();
  290. esp_bt_controller_config_t bt_cfg = BT_CONTROLLER_INIT_CONFIG_DEFAULT();
  291. ret = esp_bt_controller_init(&bt_cfg);
  292. if (ret) {
  293. BLUFI_ERROR("%s initialize bt controller failed\n", __func__);
  294. }
  295. ret = esp_bt_controller_enable(ESP_BT_MODE_BTDM);
  296. if (ret) {
  297. BLUFI_ERROR("%s enable bt controller failed\n", __func__);
  298. return;
  299. }
  300. ret = esp_bluedroid_init();
  301. if (ret) {
  302. BLUFI_ERROR("%s init bluedroid failed\n", __func__);
  303. return;
  304. }
  305. ret = esp_bluedroid_enable();
  306. if (ret) {
  307. BLUFI_ERROR("%s init bluedroid failed\n", __func__);
  308. return;
  309. }
  310. BLUFI_INFO("BD ADDR: "ESP_BD_ADDR_STR"\n", ESP_BD_ADDR_HEX(esp_bt_dev_get_address()));
  311. BLUFI_INFO("BLUFI VERSION %04x\n", esp_blufi_get_version());
  312. blufi_security_init();
  313. esp_ble_gap_register_callback(example_gap_event_handler);
  314. esp_blufi_register_callbacks(&example_callbacks);
  315. esp_blufi_profile_init();
  316. }