esp_gap_ble_api.c 11 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 <string.h>
  14. #include "esp_bt_device.h"
  15. #include "esp_bt_main.h"
  16. #include "esp_gap_ble_api.h"
  17. #include "bta_api.h"
  18. #include "bt_trace.h"
  19. #include "btc_manage.h"
  20. #include "btc_gap_ble.h"
  21. esp_err_t esp_ble_gap_register_callback(esp_gap_ble_cb_t callback)
  22. {
  23. if (esp_bluedroid_get_status() == ESP_BLUEDROID_STATUS_UNINITIALIZED) {
  24. return ESP_ERR_INVALID_STATE;
  25. }
  26. return (btc_profile_cb_set(BTC_PID_GAP_BLE, callback) == 0 ? ESP_OK : ESP_FAIL);
  27. }
  28. esp_err_t esp_ble_gap_config_adv_data(esp_ble_adv_data_t *adv_data)
  29. {
  30. btc_msg_t msg;
  31. btc_ble_gap_args_t arg;
  32. if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
  33. return ESP_ERR_INVALID_STATE;
  34. }
  35. if (adv_data == NULL) {
  36. return ESP_ERR_INVALID_ARG;
  37. }
  38. if (adv_data->service_uuid_len & 0xf) { //not 16*n
  39. return ESP_ERR_INVALID_ARG;
  40. }
  41. msg.sig = BTC_SIG_API_CALL;
  42. msg.pid = BTC_PID_GAP_BLE;
  43. msg.act = BTC_GAP_BLE_ACT_CFG_ADV_DATA;
  44. memcpy(&arg.cfg_adv_data.adv_data, adv_data, sizeof(esp_ble_adv_data_t));
  45. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gap_args_t), btc_gap_ble_arg_deep_copy) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  46. }
  47. esp_err_t esp_ble_gap_set_scan_params(esp_ble_scan_params_t *scan_params)
  48. {
  49. btc_msg_t msg;
  50. btc_ble_gap_args_t arg;
  51. if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
  52. return ESP_ERR_INVALID_STATE;
  53. }
  54. if (scan_params == NULL) {
  55. return ESP_ERR_INVALID_ARG;
  56. }
  57. msg.sig = BTC_SIG_API_CALL;
  58. msg.pid = BTC_PID_GAP_BLE;
  59. msg.act = BTC_GAP_BLE_ACT_SET_SCAN_PARAM;
  60. memcpy(&arg.set_scan_param.scan_params, scan_params, sizeof(esp_ble_scan_params_t));
  61. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gap_args_t), NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  62. }
  63. esp_err_t esp_ble_gap_start_scanning(uint32_t duration)
  64. {
  65. btc_msg_t msg;
  66. btc_ble_gap_args_t arg;
  67. if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
  68. return ESP_ERR_INVALID_STATE;
  69. }
  70. msg.sig = BTC_SIG_API_CALL;
  71. msg.pid = BTC_PID_GAP_BLE;
  72. msg.act = BTC_GAP_BLE_ACT_START_SCAN;
  73. arg.start_scan.duration = duration;
  74. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gap_args_t), NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  75. }
  76. esp_err_t esp_ble_gap_stop_scanning(void)
  77. {
  78. btc_msg_t msg;
  79. if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
  80. return ESP_ERR_INVALID_STATE;
  81. }
  82. msg.sig = BTC_SIG_API_CALL;
  83. msg.pid = BTC_PID_GAP_BLE;
  84. msg.act = BTC_GAP_BLE_ACT_STOP_SCAN;
  85. return (btc_transfer_context(&msg, NULL, 0, NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  86. }
  87. esp_err_t esp_ble_gap_start_advertising(esp_ble_adv_params_t *adv_params)
  88. {
  89. btc_msg_t msg;
  90. btc_ble_gap_args_t arg;
  91. if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
  92. return ESP_ERR_INVALID_STATE;
  93. }
  94. msg.sig = BTC_SIG_API_CALL;
  95. msg.pid = BTC_PID_GAP_BLE;
  96. msg.act = BTC_GAP_BLE_ACT_START_ADV;
  97. memcpy(&arg.start_adv.adv_params, adv_params, sizeof(esp_ble_adv_params_t));
  98. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gap_args_t), NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  99. }
  100. esp_err_t esp_ble_gap_stop_advertising(void)
  101. {
  102. btc_msg_t msg;
  103. if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
  104. return ESP_ERR_INVALID_STATE;
  105. }
  106. msg.sig = BTC_SIG_API_CALL;
  107. msg.pid = BTC_PID_GAP_BLE;
  108. msg.act = BTC_GAP_BLE_ACT_STOP_ADV;
  109. return (btc_transfer_context(&msg, NULL, 0, NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  110. }
  111. esp_err_t esp_ble_gap_update_conn_params(esp_ble_conn_update_params_t *params)
  112. {
  113. btc_msg_t msg;
  114. btc_ble_gap_args_t arg;
  115. if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
  116. return ESP_ERR_INVALID_STATE;
  117. }
  118. msg.sig = BTC_SIG_API_CALL;
  119. msg.pid = BTC_PID_GAP_BLE;
  120. msg.act = BTC_GAP_BLE_ACT_UPDATE_CONN_PARAM;
  121. memcpy(&arg.conn_update_params.conn_params, params, sizeof(esp_ble_conn_update_params_t));
  122. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gap_args_t), NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  123. }
  124. esp_err_t esp_ble_gap_set_pkt_data_len(esp_bd_addr_t remote_device, uint16_t tx_data_length)
  125. {
  126. btc_msg_t msg;
  127. btc_ble_gap_args_t arg;
  128. if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
  129. return ESP_ERR_INVALID_STATE;
  130. }
  131. msg.sig = BTC_SIG_API_CALL;
  132. msg.pid = BTC_PID_GAP_BLE;
  133. msg.act = BTC_GAP_BLE_ACT_SET_PKT_DATA_LEN;
  134. arg.set_pkt_data_len.tx_data_length = tx_data_length;
  135. memcpy(arg.set_pkt_data_len.remote_device, remote_device, ESP_BD_ADDR_LEN);
  136. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gap_args_t), NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  137. }
  138. esp_err_t esp_ble_gap_set_rand_addr(esp_bd_addr_t rand_addr)
  139. {
  140. btc_msg_t msg;
  141. btc_ble_gap_args_t arg;
  142. if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
  143. return ESP_ERR_INVALID_STATE;
  144. }
  145. msg.sig = BTC_SIG_API_CALL;
  146. msg.pid = BTC_PID_GAP_BLE;
  147. msg.act = BTC_GAP_BLE_ACT_SET_RAND_ADDRESS;
  148. memcpy(arg.set_rand_addr.rand_addr, rand_addr, ESP_BD_ADDR_LEN);
  149. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gap_args_t), NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  150. }
  151. esp_err_t esp_ble_gap_config_local_privacy (bool privacy_enable)
  152. {
  153. btc_msg_t msg;
  154. btc_ble_gap_args_t arg;
  155. if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
  156. return ESP_ERR_INVALID_STATE;
  157. }
  158. msg.sig = BTC_SIG_API_CALL;
  159. msg.pid = BTC_PID_GAP_BLE;
  160. msg.act = BTC_GAP_BLE_ACT_CONFIG_LOCAL_PRIVACY;
  161. arg.cfg_local_privacy.privacy_enable = privacy_enable;
  162. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gap_args_t), NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  163. }
  164. esp_err_t esp_ble_gap_set_device_name(const char *name)
  165. {
  166. return esp_bt_dev_set_device_name(name);
  167. }
  168. uint8_t *esp_ble_resolve_adv_data( uint8_t *adv_data, uint8_t type, uint8_t *length)
  169. {
  170. if (((type < ESP_BLE_AD_TYPE_FLAG) || (type > ESP_BLE_AD_TYPE_128SERVICE_DATA)) &&
  171. (type != ESP_BLE_AD_MANUFACTURER_SPECIFIC_TYPE)) {
  172. LOG_ERROR("the eir type not define, type = %x\n", type);
  173. return NULL;
  174. }
  175. if (adv_data == NULL) {
  176. LOG_ERROR("Invalid p_eir data.\n");
  177. return NULL;
  178. }
  179. return (BTM_CheckAdvData( adv_data, type, length));
  180. }
  181. esp_err_t esp_ble_gap_config_adv_data_raw(uint8_t *raw_data, uint32_t raw_data_len)
  182. {
  183. btc_msg_t msg;
  184. btc_ble_gap_args_t arg;
  185. if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
  186. return ESP_ERR_INVALID_STATE;
  187. }
  188. if (raw_data == NULL
  189. || (raw_data_len <= 0 || raw_data_len > ESP_BLE_ADV_DATA_LEN_MAX)) {
  190. return ESP_ERR_INVALID_ARG;
  191. }
  192. msg.sig = BTC_SIG_API_CALL;
  193. msg.pid = BTC_PID_GAP_BLE;
  194. msg.act = BTC_GAP_BLE_ACT_CFG_ADV_DATA_RAW;
  195. arg.cfg_adv_data_raw.raw_adv = raw_data;
  196. arg.cfg_adv_data_raw.raw_adv_len = raw_data_len;
  197. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gap_args_t), btc_gap_ble_arg_deep_copy) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  198. }
  199. esp_err_t esp_ble_gap_config_scan_rsp_data_raw(uint8_t *raw_data, uint32_t raw_data_len)
  200. {
  201. btc_msg_t msg;
  202. btc_ble_gap_args_t arg;
  203. if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
  204. return ESP_ERR_INVALID_STATE;
  205. }
  206. if (raw_data == NULL
  207. || (raw_data_len <= 0 || raw_data_len > ESP_BLE_SCAN_RSP_DATA_LEN_MAX)) {
  208. return ESP_ERR_INVALID_ARG;
  209. }
  210. msg.sig = BTC_SIG_API_CALL;
  211. msg.pid = BTC_PID_GAP_BLE;
  212. msg.act = BTC_GAP_BLE_ACT_CFG_SCAN_RSP_DATA_RAW;
  213. arg.cfg_scan_rsp_data_raw.raw_scan_rsp = raw_data;
  214. arg.cfg_scan_rsp_data_raw.raw_scan_rsp_len = raw_data_len;
  215. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gap_args_t), btc_gap_ble_arg_deep_copy) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  216. }
  217. esp_err_t esp_ble_gap_set_security_param(esp_ble_sm_param_t param_type,
  218. void *value, uint8_t len)
  219. {
  220. btc_msg_t msg;
  221. btc_ble_gap_args_t arg;
  222. msg.sig = BTC_SIG_API_CALL;
  223. msg.pid = BTC_PID_GAP_BLE;
  224. msg.act = BTC_GAP_BLE_SET_SECURITY_PARAM_EVT;
  225. arg.set_security_param.param_type = param_type;
  226. arg.set_security_param.len = len;
  227. arg.set_security_param.value = value;
  228. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gap_args_t), btc_gap_ble_arg_deep_copy)
  229. == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  230. }
  231. esp_err_t esp_ble_set_encryption(esp_bd_addr_t bd_addr, esp_ble_sec_act_t sec_act)
  232. {
  233. btc_msg_t msg;
  234. btc_ble_gap_args_t arg;
  235. msg.sig = BTC_SIG_API_CALL;
  236. msg.pid = BTC_PID_GAP_BLE;
  237. msg.act = BTC_GAP_BLE_SET_ENCRYPTION_EVT;
  238. arg.set_encryption.sec_act = sec_act;
  239. memcpy(arg.set_encryption.bd_addr, bd_addr, ESP_BD_ADDR_LEN);
  240. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gap_args_t), NULL)
  241. == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  242. }
  243. esp_err_t esp_ble_gap_security_rsp(esp_bd_addr_t bd_addr, bool accept)
  244. {
  245. btc_msg_t msg;
  246. btc_ble_gap_args_t arg;
  247. msg.sig = BTC_SIG_API_CALL;
  248. msg.pid = BTC_PID_GAP_BLE;
  249. msg.act = BTC_GAP_BLE_SECURITY_RSP_EVT;
  250. arg.sec_rsp.accept = accept;
  251. memcpy(arg.sec_rsp.bd_addr, bd_addr, ESP_BD_ADDR_LEN);
  252. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gap_args_t), NULL)
  253. == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  254. }
  255. esp_err_t esp_ble_passkey_reply(esp_bd_addr_t bd_addr, bool accept, uint32_t passkey)
  256. {
  257. btc_msg_t msg;
  258. btc_ble_gap_args_t arg;
  259. msg.sig = BTC_SIG_API_CALL;
  260. msg.pid = BTC_PID_GAP_BLE;
  261. msg.act = BTC_GAP_BLE_PASSKEY_REPLY_EVT;
  262. arg.enc_passkey_replay.accept = accept;
  263. arg.enc_passkey_replay.passkey = passkey;
  264. memcpy(arg.enc_passkey_replay.bd_addr, bd_addr, ESP_BD_ADDR_LEN);
  265. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gap_args_t), NULL)
  266. == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  267. }
  268. esp_err_t esp_ble_confirm_reply(esp_bd_addr_t bd_addr, bool accept)
  269. {
  270. btc_msg_t msg;
  271. btc_ble_gap_args_t arg;
  272. msg.sig = BTC_SIG_API_CALL;
  273. msg.pid = BTC_PID_GAP_BLE;
  274. msg.act = BTC_GAP_BLE_CONFIRM_REPLY_EVT;
  275. arg.enc_comfirm_replay.accept = accept;
  276. memcpy(arg.enc_comfirm_replay.bd_addr, bd_addr, ESP_BD_ADDR_LEN);
  277. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gap_args_t), NULL)
  278. == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  279. }