ble_peripheral.c 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959
  1. #include "ble_peripheral.h"
  2. #include "ble_conn_state.h"
  3. #include "peer_manager.h"
  4. #include "peer_manager_handler.h"
  5. //DFU需要引用的头文件
  6. #if NRF_MODULE_ENABLED(BLE_DFU)
  7. #include "nrf_power.h"
  8. #include "nrf_bootloader_info.h"
  9. #include "ble_dfu.h"
  10. #include "nrf_sdm.h"
  11. #include "nrf_dfu_ble_svci_bond_sharing.h"
  12. #include "nrf_svci_async_function.h"
  13. #include "nrf_svci_async_handler.h"
  14. static void ble_dfu_evt_handler(ble_dfu_buttonless_evt_type_t event);
  15. #endif
  16. #if NRF_MODULE_ENABLED(BLE_MY_UARTS)
  17. #include "my_ble_uarts.h"
  18. #endif
  19. BLE_ADVERTISING_DEF(m_advertising); /**< ************** Advertising module instance. **************/
  20. int8_t tx_power_level=NRF_BLE_ADVDATA_NOREG_TX_POWER; /**< *********************** ble发射功率 **********************/
  21. uint32_t ble_adv_interval=NRF_BLE_ADV_NOREG_INTERVAL; /**< *********************ble蓝牙广播时间 *********************/
  22. uint32_t ble_adv_duration=NRF_BLE_ADV_DURATION;
  23. static uint16_t m_conn_handle = BLE_CONN_HANDLE_INVALID; /**< ************ Handle of the current connection. ***********/
  24. static uint8_t m_enc_advdata[BLE_GAP_ADV_SET_DATA_SIZE_MAX]; /**< ****** Buffer for storing an encoded advertising set. ****/
  25. static uint8_t m_enc_scan_response_data[BLE_GAP_ADV_SET_DATA_SIZE_MAX]; /**< ********* Buffer for storing an encoded scan data. *******/
  26. bool ble_adv_stat=false;
  27. #if NRF_SEC_PARAM_BLE==1
  28. static ble_gap_sec_params_t m_sec_params;
  29. static ble_gap_sec_keyset_t m_sec_keyset;
  30. static ble_gap_enc_key_t m_own_enc_key;
  31. static ble_gap_enc_key_t m_peer_enc_key;
  32. static ble_gap_sec_params_t m_sec_params_auth;
  33. #endif
  34. #if NRF_BLE_ADVDATA_WHITELIST_ENABLE==1
  35. static pm_peer_id_t m_peer_id;
  36. static pm_peer_id_t m_whitelist_peers[NRF_BLE_ADVDATA_WHITELIST_MAX_COUNT]; /**< ******* List of peers currently in the whitelist. ********/
  37. static uint32_t m_whitelist_peer_cnt; /**< ****** Number of peers currently in the whitelist. *******/
  38. #endif
  39. extern uint8_t m_addl_adv_manuf_data[];
  40. static void advertising_start(void);
  41. /**@brief Struct that contains pointers to the encoded advertising data. */
  42. static ble_gap_adv_data_t m_adv_data =
  43. {
  44. .adv_data =
  45. {
  46. .p_data = m_enc_advdata,
  47. .len = BLE_GAP_ADV_SET_DATA_SIZE_MAX
  48. },
  49. .scan_rsp_data =
  50. {
  51. .p_data = m_enc_scan_response_data,
  52. .len = BLE_GAP_ADV_SET_DATA_SIZE_MAX
  53. }
  54. };
  55. static ble_peripheral_s ble_per_s=
  56. {
  57. .dfu_func=NULL,
  58. .dfu_stat=false,
  59. };
  60. // 添加私有服务时,需更改NRF_SDH_BLE_VS_UUID_COUNT
  61. static ble_uuid_t owned_adv_uuids[] = /**< ******** Universally unique service identifiers. *********/
  62. {
  63. #if WECHAT_SERVER_ENABLED==1
  64. {BLE_UUID_WECHAT_SERVICE, BLE_UUID_TYPE_BLE},
  65. #else
  66. #if OWNED_SERVER_ENABLED==1
  67. {BLE_UUID_OWNED_BASE, BLE_UUID_TYPE_BLE},
  68. #endif
  69. #endif
  70. #if NRF_MODULE_ENABLED(BLE_MY_UARTS)
  71. {BLE_UUID_UARTS_SERVICE, BLE_UUID_TYPE_VENDOR_BEGIN},
  72. #endif
  73. };
  74. /**@brief Function for the Noreg GAP initialization.
  75. *
  76. * @details This function sets up all the necessary GAP (Generic Access Profile) parameters of the
  77. * device including the device name, appearance, and the preferred connection parameters.
  78. */
  79. static void gap_params_init(void)
  80. {
  81. ret_code_t err_code;
  82. ble_gap_conn_params_t gap_conn_params;
  83. ble_gap_conn_sec_mode_t sec_mode;
  84. #if NRF_SEC_PARAM_BLE==1
  85. ble_opt_t passkey_opt;
  86. uint8_t passkey[] = "12345678";
  87. #endif
  88. BLE_GAP_CONN_SEC_MODE_SET_OPEN(&sec_mode);
  89. err_code = sd_ble_gap_device_name_set(&sec_mode,
  90. (const uint8_t *)BLE_DEVICE_NAME,
  91. strlen(BLE_DEVICE_NAME));
  92. APP_ERROR_CHECK(err_code);
  93. memset(&gap_conn_params, 0, sizeof(gap_conn_params));
  94. gap_conn_params.min_conn_interval = NRF_BLE_MIN_CONN_INTERVAL;
  95. gap_conn_params.max_conn_interval = NRF_BLE_MAX_CONN_INTERVAL;
  96. gap_conn_params.slave_latency = NRF_BLE_CONN_SLAVE_LATENCY;
  97. gap_conn_params.conn_sup_timeout = NRF_BLE_CONN_SUP_TIMEOUT;
  98. err_code = sd_ble_gap_ppcp_set(&gap_conn_params);
  99. APP_ERROR_CHECK(err_code);
  100. #if NRF_SEC_PARAM_BLE==1
  101. passkey_opt.gap_opt.passkey.p_passkey = passkey;
  102. err_code = sd_ble_opt_set(BLE_GAP_OPT_PASSKEY, &passkey_opt);
  103. APP_ERROR_CHECK(err_code);
  104. #endif
  105. }
  106. //ble_gap_addr_t whitelist_addrs_gap[1];
  107. /**@brief Function for handling Queued Write Module errors.
  108. *
  109. * @details A pointer to this function will be passed to each service which may need to inform the
  110. * application about an error.
  111. *
  112. * @param[in] nrf_error Error code containing information about what went wrong.
  113. */
  114. static void nrf_qwr_error_handler(uint32_t nrf_error)
  115. {
  116. APP_ERROR_HANDLER(nrf_error);
  117. }
  118. #if NRF_BLE_ADVDATA_WHITELIST_ENABLE==1
  119. /**@brief Function for setting filtered whitelist.
  120. *
  121. * @param[in] skip Filter passed to @ref pm_peer_id_list.
  122. */
  123. static void whitelist_set(pm_peer_id_list_skip_t skip)
  124. {
  125. pm_peer_id_t peer_ids[BLE_GAP_WHITELIST_ADDR_MAX_COUNT];
  126. uint32_t peer_id_count = BLE_GAP_WHITELIST_ADDR_MAX_COUNT;
  127. ret_code_t err_code = pm_peer_id_list(peer_ids, &peer_id_count, PM_PEER_ID_INVALID, skip);
  128. APP_ERROR_CHECK(err_code);
  129. NRF_LOG_INFO("\tm_whitelist_peer_cnt %d, MAX_PEERS_WLIST %d",
  130. peer_id_count + 1,
  131. BLE_GAP_WHITELIST_ADDR_MAX_COUNT);
  132. err_code = pm_whitelist_set(peer_ids, peer_id_count);
  133. APP_ERROR_CHECK(err_code);
  134. }
  135. #endif
  136. #if NRF_SEC_PARAM_BLE==1
  137. /**@brief Function for setting filtered device identities.
  138. *
  139. * @param[in] skip Filter passed to @ref pm_peer_id_list.
  140. */
  141. static void identities_set(pm_peer_id_list_skip_t skip)
  142. {
  143. pm_peer_id_t peer_ids[BLE_GAP_DEVICE_IDENTITIES_MAX_COUNT];
  144. uint32_t peer_id_count = BLE_GAP_DEVICE_IDENTITIES_MAX_COUNT;
  145. ret_code_t err_code = pm_peer_id_list(peer_ids, &peer_id_count, PM_PEER_ID_INVALID, skip);
  146. APP_ERROR_CHECK(err_code);
  147. err_code = pm_device_identities_list_set(peer_ids, peer_id_count);
  148. APP_ERROR_CHECK(err_code);
  149. }
  150. #endif
  151. /**@brief Function for handling advertising events.
  152. *
  153. * @details This function will be called for advertising events which are passed to the application.
  154. *
  155. * @param[in] ble_adv_evt Advertising event.
  156. */
  157. static void on_adv_evt(ble_adv_evt_t ble_adv_evt)
  158. {
  159. uint32_t err_code;
  160. switch (ble_adv_evt)
  161. {
  162. case BLE_ADV_EVT_FAST:
  163. NRF_LOG_INFO("Fast advertising");
  164. break;
  165. #if NRF_BLE_ADVDATA_WHITELIST_ENABLE==1
  166. case BLE_ADV_EVT_FAST_WHITELIST:
  167. NRF_LOG_INFO("Fast advertising with WhiteList");
  168. break;
  169. case BLE_ADV_EVT_SLOW_WHITELIST:
  170. NRF_LOG_INFO("Slow advertising with WhiteList");
  171. break;
  172. #endif
  173. case BLE_ADV_EVT_SLOW:
  174. NRF_LOG_INFO("Slow advertising");
  175. break;
  176. case BLE_ADV_EVT_IDLE:
  177. NRF_LOG_INFO("Enter BLE Idle");
  178. ble_adv_stat=false;
  179. break;
  180. #if NRF_BLE_ADVDATA_WHITELIST_ENABLE==1
  181. case BLE_ADV_EVT_WHITELIST_REQUEST:
  182. {
  183. ble_gap_addr_t whitelist_addrs[BLE_GAP_WHITELIST_ADDR_MAX_COUNT];
  184. ble_gap_irk_t whitelist_irks[BLE_GAP_WHITELIST_ADDR_MAX_COUNT];
  185. uint32_t addr_cnt = BLE_GAP_WHITELIST_ADDR_MAX_COUNT;
  186. uint32_t irk_cnt = BLE_GAP_WHITELIST_ADDR_MAX_COUNT;
  187. err_code = pm_whitelist_get(whitelist_addrs, &addr_cnt,
  188. whitelist_irks, &irk_cnt);
  189. APP_ERROR_CHECK(err_code);
  190. NRF_LOG_DEBUG("pm_whitelist_get returns %d addr in whitelist and %d irk whitelist",
  191. addr_cnt, irk_cnt);
  192. // Set the correct identities list (no excluding peers with no Central Address Resolution).
  193. identities_set(PM_PEER_ID_LIST_SKIP_NO_IRK);
  194. // Apply the whitelist.
  195. err_code = ble_advertising_whitelist_reply(&m_advertising,
  196. whitelist_addrs,
  197. addr_cnt,
  198. whitelist_irks,
  199. irk_cnt);
  200. APP_ERROR_CHECK(err_code);
  201. break;
  202. }
  203. #endif
  204. default:
  205. break;
  206. }
  207. }
  208. #if NRF_SEC_PARAM_BLE==1
  209. /**@brief Fetch the list of peer manager peer IDs.
  210. *
  211. * @param[inout] p_peers The buffer where to store the list of peer IDs.
  212. * @param[inout] p_size In: The size of the @p p_peers buffer.
  213. * Out: The number of peers copied in the buffer.
  214. */
  215. static void peer_list_get(pm_peer_id_t * p_peers, uint32_t * p_size)
  216. {
  217. pm_peer_id_t peer_id;
  218. uint32_t peers_to_copy;
  219. peers_to_copy = (*p_size < NRF_BLE_ADVDATA_WHITELIST_MAX_COUNT) ?
  220. *p_size : NRF_BLE_ADVDATA_WHITELIST_MAX_COUNT;
  221. peer_id = pm_next_peer_id_get(PM_PEER_ID_INVALID);
  222. *p_size = 0;
  223. while ((peer_id != PM_PEER_ID_INVALID) && (peers_to_copy--))
  224. {
  225. p_peers[(*p_size)++] = peer_id;
  226. peer_id = pm_next_peer_id_get(peer_id);
  227. }
  228. }
  229. /**@brief Clear bond information from persistent storage.
  230. */
  231. static void delete_bonds(void)
  232. {
  233. ret_code_t err_code;
  234. NRF_LOG_INFO("Erase bonds!");
  235. err_code = pm_peers_delete();
  236. APP_ERROR_CHECK(err_code);
  237. }
  238. /**@brief Function for handling Peer Manager events.
  239. *
  240. * @param[in] p_evt Peer Manager event.
  241. */
  242. static void pm_evt_handler(pm_evt_t const * p_evt)
  243. {
  244. ret_code_t err_code;
  245. pm_handler_on_pm_evt(p_evt);
  246. pm_handler_flash_clean(p_evt);
  247. switch (p_evt->evt_id)
  248. {
  249. case PM_EVT_CONN_SEC_SUCCEEDED:
  250. {
  251. m_peer_id = p_evt->peer_id;
  252. // Discover peer's services.
  253. err_code = ble_db_discovery_start(&m_ble_db_discovery, p_evt->conn_handle);
  254. APP_ERROR_CHECK(err_code);
  255. } break;
  256. case PM_EVT_PEERS_DELETE_SUCCEEDED:
  257. {
  258. advertising_start();
  259. } break;
  260. case PM_EVT_CONN_SEC_CONFIG_REQ:
  261. {
  262. pm_conn_sec_config_t pm_conn;
  263. pm_conn.allow_repairing=true;
  264. pm_conn_sec_config_reply(p_evt->conn_handle,&pm_conn);
  265. break;
  266. }
  267. case PM_EVT_PEER_DATA_UPDATE_SUCCEEDED:
  268. {
  269. // Note: You should check on what kind of white list policy your application should use.
  270. if ( p_evt->params.peer_data_update_succeeded.flash_changed
  271. && (p_evt->params.peer_data_update_succeeded.data_id == PM_PEER_DATA_ID_BONDING))
  272. {
  273. NRF_LOG_INFO("New Bond, add the peer to the whitelist if possible");
  274. // Note: You should check on what kind of white list policy your application should use.
  275. whitelist_set(PM_PEER_ID_LIST_SKIP_NO_ID_ADDR);
  276. }
  277. } break;
  278. default:
  279. break;
  280. }
  281. }
  282. #endif
  283. extern uint8_t bat_percent;//电池电量
  284. extern uint8_t dev_reg_stat;//设备激活状态
  285. #include "user_config.h"
  286. //广播初始化
  287. uint32_t advertising_init(void)
  288. {
  289. ret_code_t ret;
  290. ble_advdata_t advdata;
  291. ble_advdata_t srdata;
  292. uint8_t adv_server_count=0;
  293. memset(&advdata, 0, sizeof(advdata));
  294. memset(&srdata, 0, sizeof(srdata));
  295. //设备名称类型
  296. advdata.name_type = NRF_BLE_ADVDATA_NAME_TYPE;
  297. //是否包含外观
  298. advdata.include_appearance = NRF_BLE_ADVDATA_INCLUDE_APPEARANCE;
  299. //Flag:一般可发现模式,不支持BR/EDR
  300. advdata.flags = NRF_BLE_ADVDATA_FLAGS;
  301. //发射功率等级
  302. advdata.p_tx_power_level = &tx_power_level;
  303. ble_advdata_manuf_data_t manuf_data;
  304. //制造商ID,0x0059是Nordic的ID
  305. manuf_data.company_identifier = NRF_BLE_ADVDATA_COMPANY_ID;
  306. manuf_data.data.size = sizeof(ble_adv_manuf_data);
  307. //指向制造商自定义的数据
  308. ble_adv_manuf_data adv_manuf_data={
  309. .m_addr={0},
  310. .product_type=NRF_DEV_PRODUCT,
  311. .dev_version=(NRF_BLE_ADV_DEV_VERSION_MAIN<<4)| NRF_BLE_ADV_DEV_VERSION_SLAVE,
  312. .dev_reg_stat=(NRF_DEV_TYPE<<4) | dev_reg_stat,
  313. .bat_percent=bat_percent
  314. };
  315. //#ifdef user_config_param
  316. memcpy(adv_manuf_data.m_addr,m_addl_adv_manuf_data,BLE_GAP_ADDR_LEN);
  317. //#else
  318. // memcpy(adv_manuf_data.m_addr,m_addl_adv_manuf_data,BLE_GAP_ADDR_LEN);
  319. //#endif
  320. manuf_data.data.p_data = (uint8_t *)&adv_manuf_data;
  321. // manuf_data.data.size = BLE_GAP_ADDR_LEN;
  322. // manuf_data.data.p_data = m_addl_adv_manuf_data;
  323. NRF_LOG_INFO("mac addr.");
  324. NRF_LOG_HEXDUMP_INFO(manuf_data.data.p_data, manuf_data.data.size);
  325. advdata.p_manuf_specific_data=&manuf_data;
  326. // memcpy(&advdata.p_manuf_specific_data,&manuf_data,sizeof(ble_advdata_manuf_data_t));
  327. #if NRF_BLE_ADVDATA_INCLUDE_BAT == 1
  328. //定义服务数据结构体
  329. ble_advdata_service_data_t service_data;
  330. //电池电量服务UUID 0x180F
  331. service_data.service_uuid = BLE_UUID_BATTERY_SERVICE;
  332. service_data.data.size = sizeof(bat_percent);
  333. service_data.data.p_data = &bat_percent;
  334. //广播数据中加入服务数据
  335. advdata.p_service_data_array=&service_data;
  336. adv_server_count++;
  337. #endif
  338. //服务数据数量设置
  339. advdata.service_data_count = adv_server_count;
  340. srdata.uuids_complete.uuid_cnt = sizeof(owned_adv_uuids) / sizeof(owned_adv_uuids[0]);
  341. srdata.uuids_complete.p_uuids = owned_adv_uuids;
  342. #if NRF_BLE_ADVDATA_WHITELIST_ENABLE==1
  343. m_advertising.adv_modes_config.ble_adv_whitelist_enabled = true;
  344. #endif
  345. if(ble_adv_duration==0)
  346. {
  347. m_advertising.adv_modes_config.ble_adv_slow_interval = ble_adv_interval;
  348. m_advertising.adv_modes_config.ble_adv_slow_enabled = true;
  349. m_advertising.adv_modes_config.ble_adv_slow_timeout = ble_adv_duration;
  350. m_advertising.adv_modes_config.ble_adv_on_disconnect_disabled = false;
  351. }
  352. else{
  353. m_advertising.adv_modes_config.ble_adv_slow_enabled = true;
  354. m_advertising.adv_modes_config.ble_adv_slow_interval = ble_adv_interval;
  355. m_advertising.adv_modes_config.ble_adv_slow_timeout = ble_adv_duration;
  356. m_advertising.adv_modes_config.ble_adv_fast_enabled = true;
  357. m_advertising.adv_modes_config.ble_adv_fast_interval = ble_adv_interval;
  358. m_advertising.adv_modes_config.ble_adv_fast_timeout = ble_adv_duration;
  359. m_advertising.adv_modes_config.ble_adv_on_disconnect_disabled = true;
  360. }
  361. m_advertising.adv_mode_current = BLE_ADV_MODE_IDLE;
  362. m_advertising.conn_cfg_tag = BLE_CONN_CFG_TAG_DEFAULT;
  363. m_advertising.evt_handler = on_adv_evt;
  364. m_advertising.error_handler = nrf_qwr_error_handler;
  365. m_advertising.current_slave_link_conn_handle = BLE_CONN_HANDLE_INVALID;
  366. m_advertising.p_adv_data = &m_advertising.adv_data;
  367. memset(&m_advertising.peer_address, 0, sizeof(m_advertising.peer_address));
  368. // Copy advertising data.
  369. if (!m_advertising.initialized)
  370. {
  371. m_advertising.adv_handle = BLE_GAP_ADV_SET_HANDLE_NOT_SET;
  372. }
  373. m_advertising.adv_data.adv_data.p_data = m_advertising.enc_advdata;
  374. if (m_advertising.adv_modes_config.ble_adv_extended_enabled == true)
  375. {
  376. #ifdef BLE_GAP_ADV_SET_DATA_SIZE_EXTENDED_CONNECTABLE_MAX_SUPPORTED
  377. m_advertising.adv_data.adv_data.len = BLE_GAP_ADV_SET_DATA_SIZE_EXTENDED_CONNECTABLE_MAX_SUPPORTED;
  378. #else
  379. m_advertising.adv_data.adv_data.len = BLE_GAP_ADV_SET_DATA_SIZE_MAX;
  380. #endif // BLE_GAP_ADV_SET_DATA_SIZE_EXTENDED_CONNECTABLE_MAX_SUPPORTED
  381. }
  382. else
  383. {
  384. m_advertising.adv_data.adv_data.len = BLE_GAP_ADV_SET_DATA_SIZE_MAX;
  385. }
  386. ret = ble_advdata_encode(&advdata, m_advertising.enc_advdata, &m_advertising.adv_data.adv_data.len);
  387. VERIFY_SUCCESS(ret);
  388. m_advertising.adv_data.scan_rsp_data.p_data = m_advertising.enc_scan_rsp_data;
  389. if (m_advertising.adv_modes_config.ble_adv_extended_enabled == true)
  390. {
  391. #ifdef BLE_GAP_ADV_SET_DATA_SIZE_EXTENDED_CONNECTABLE_MAX_SUPPORTED
  392. m_advertising.adv_data.scan_rsp_data.len = BLE_GAP_ADV_SET_DATA_SIZE_EXTENDED_CONNECTABLE_MAX_SUPPORTED;
  393. #else
  394. m_advertising.adv_data.scan_rsp_data.len = BLE_GAP_ADV_SET_DATA_SIZE_MAX;
  395. #endif // BLE_GAP_ADV_SET_DATA_SIZE_EXTENDED_CONNECTABLE_MAX_SUPPORTED
  396. }
  397. else
  398. {
  399. m_advertising.adv_data.scan_rsp_data.len = BLE_GAP_ADV_SET_DATA_SIZE_MAX;
  400. }
  401. ret = ble_advdata_encode(&srdata,m_advertising.adv_data.scan_rsp_data.p_data,&m_advertising.adv_data.scan_rsp_data.len);
  402. VERIFY_SUCCESS(ret);
  403. // Configure a initial advertising configuration. The advertising data and and advertising
  404. // parameters will be changed later when we call @ref ble_advertising_start, but must be set
  405. // to legal values here to define an advertising handle.
  406. m_advertising.adv_params.primary_phy = BLE_GAP_PHY_1MBPS;
  407. m_advertising.adv_params.duration = ble_adv_duration;
  408. m_advertising.adv_params.properties.type = BLE_GAP_ADV_TYPE_CONNECTABLE_SCANNABLE_UNDIRECTED;
  409. m_advertising.adv_params.p_peer_addr = NULL;
  410. m_advertising.adv_params.filter_policy = BLE_GAP_ADV_FP_ANY;
  411. m_advertising.adv_params.interval = ble_adv_interval;
  412. ret = sd_ble_gap_adv_set_configure(&m_advertising.adv_handle, NULL, &m_advertising.adv_params);
  413. VERIFY_SUCCESS(ret);
  414. m_advertising.initialized = true;
  415. ble_advertising_conn_cfg_tag_set(&m_advertising, APP_BLE_CONN_CFG_TAG);
  416. return ret;
  417. }
  418. /**@brief Function for handling the Connection Parameters Module.
  419. *
  420. * @details This function will be called for all events in the Connection Parameters Module that
  421. * are passed to the application.
  422. *
  423. * @note All this function does is to disconnect. This could have been done by simply
  424. * setting the disconnect_on_fail config parameter, but instead we use the event
  425. * handler mechanism to demonstrate its use.
  426. *
  427. * @param[in] p_evt Event received from the Connection Parameters Module.
  428. */
  429. static void on_conn_params_evt(ble_conn_params_evt_t * p_evt)
  430. {
  431. ret_code_t err_code;
  432. if (p_evt->evt_type == BLE_CONN_PARAMS_EVT_FAILED)
  433. {
  434. err_code = sd_ble_gap_disconnect(m_conn_handle, BLE_HCI_CONN_INTERVAL_UNACCEPTABLE);
  435. APP_ERROR_CHECK(err_code);
  436. }
  437. }
  438. /**@brief Function for handling a Connection Parameters error.
  439. *
  440. * @param[in] nrf_error Error code containing information about what went wrong.
  441. */
  442. static void conn_params_error_handler(uint32_t nrf_error)
  443. {
  444. APP_ERROR_HANDLER(nrf_error);
  445. }
  446. //连接参数协商模块初始化
  447. static void conn_params_init(void)
  448. {
  449. ret_code_t err_code;
  450. //定义连接参数协商模块初始化结构体
  451. ble_conn_params_init_t cp_init;
  452. memset(&cp_init, 0, sizeof(cp_init));
  453. //设置为NULL,从主机获取连接参数
  454. cp_init.p_conn_params = NULL;
  455. //连接或启动通知到首次发起连接参数更新请求之间的时间设置为5秒
  456. cp_init.first_conn_params_update_delay = NRF_BLE_FIRST_CONN_PARAMS_UPDATE_DELAY;
  457. //每次调用sd_ble_gap_conn_param_update()函数发起连接参数更新请求的之间的间隔时间设置为:30秒
  458. cp_init.next_conn_params_update_delay = NRF_BLE_NEXT_CONN_PARAMS_UPDATE_DELAY;
  459. //放弃连接参数协商前尝试连接参数协商的最大次数设置为:3次
  460. cp_init.max_conn_params_update_count = NRF_BLE_MAX_CONN_PARAMS_UPDATE_COUNT;
  461. //连接参数更新从连接事件开始计时
  462. cp_init.start_on_notify_cccd_handle = BLE_GATT_HANDLE_INVALID;
  463. //连接参数更新失败断开连接
  464. cp_init.disconnect_on_fail = NRF_BLE_CONN_UPDATE_FAIL_DISCONNECT;
  465. //注册连接参数更新事件句柄
  466. cp_init.evt_handler = on_conn_params_evt;
  467. //注册连接参数更新错误事件句柄
  468. cp_init.error_handler = conn_params_error_handler;
  469. //调用库函数(以连接参数更新初始化结构体为输入参数)初始化连接参数协商模块
  470. err_code = ble_conn_params_init(&cp_init);
  471. APP_ERROR_CHECK(err_code);
  472. }
  473. /**@brief Function for starting advertising.
  474. */
  475. static void advertising_start(void)
  476. {
  477. ret_code_t err_code;
  478. #if NRF_BLE_ADVDATA_WHITELIST_ENABLE==1
  479. whitelist_set(PM_PEER_ID_LIST_SKIP_NO_ID_ADDR);
  480. #endif
  481. if(ble_adv_duration==NRF_BLE_ADV_DURATION)
  482. {
  483. err_code = ble_advertising_start(&m_advertising, BLE_ADV_MODE_SLOW);
  484. }
  485. else{
  486. err_code = ble_advertising_start(&m_advertising, BLE_ADV_MODE_FAST);
  487. }
  488. APP_ERROR_CHECK(err_code);
  489. err_code = sd_ble_gap_tx_power_set(BLE_GAP_TX_POWER_ROLE_ADV,m_advertising.adv_handle,tx_power_level);
  490. APP_ERROR_CHECK(err_code);
  491. }
  492. static void advertising_stop(void)
  493. {
  494. ret_code_t err_code;
  495. err_code = sd_ble_gap_adv_stop(m_advertising.adv_handle);
  496. if(err_code != NRF_SUCCESS && err_code != NRF_ERROR_INVALID_STATE)
  497. {
  498. APP_ERROR_CHECK(err_code);
  499. }
  500. }
  501. #if NRF_SEC_PARAM_BLE==1
  502. static void sec_params_init(void)
  503. {
  504. memset(&m_sec_params, 0, sizeof(ble_gap_sec_params_t));
  505. // Security parameters to be used for all security procedures.
  506. m_sec_params.bond = NRF_SEC_PARAM_BOND;
  507. m_sec_params.mitm = NRF_SEC_PARAM_MITM;
  508. m_sec_params.lesc = NRF_SEC_PARAM_LESC;
  509. m_sec_params.keypress = NRF_SEC_PARAM_KEYPRESS;
  510. m_sec_params.io_caps = NRF_SEC_PARAM_IO_CAPABILITIES;
  511. m_sec_params.oob = NRF_SEC_PARAM_OOB;
  512. m_sec_params.min_key_size = NRF_SEC_PARAM_MIN_KEY_SIZE;
  513. m_sec_params.max_key_size = NRF_SEC_PARAM_MAX_KEY_SIZE;
  514. m_sec_params.kdist_own.enc = 1;
  515. m_sec_params.kdist_own.id = 0;
  516. m_sec_params.kdist_own.sign = 0;
  517. m_sec_params.kdist_peer.enc = 1;
  518. m_sec_params.kdist_peer.id = 0;
  519. m_sec_params.kdist_peer.sign = 0;
  520. m_sec_keyset.keys_own.p_enc_key = &m_own_enc_key;
  521. m_sec_keyset.keys_own.p_id_key = NULL;
  522. m_sec_keyset.keys_own.p_pk = NULL;
  523. m_sec_keyset.keys_own.p_sign_key = NULL;
  524. m_sec_keyset.keys_peer.p_enc_key = &m_peer_enc_key;
  525. m_sec_keyset.keys_peer.p_id_key = NULL;
  526. m_sec_keyset.keys_peer.p_pk = NULL;
  527. m_sec_keyset.keys_peer.p_sign_key = NULL;
  528. }
  529. /**@brief Function for the Peer Manager initialization.
  530. */
  531. static void peer_manager_init(void)
  532. {
  533. ret_code_t err_code;
  534. err_code = pm_init();
  535. APP_ERROR_CHECK(err_code);
  536. sec_params_init();
  537. err_code = pm_sec_params_set(&m_sec_params);
  538. APP_ERROR_CHECK(err_code);
  539. err_code = pm_register(pm_evt_handler);
  540. APP_ERROR_CHECK(err_code);
  541. }
  542. #endif
  543. //蓝牙事件处理函数
  544. void ble_peripheral_on_ble_evt(ble_evt_t const * p_ble_evt, void * p_context)
  545. {
  546. ret_code_t err_code;
  547. ble_owned_t * p_owned = (ble_owned_t *)p_context;
  548. switch (p_ble_evt->header.evt_id)
  549. {
  550. case BLE_GAP_EVT_CONNECTED:
  551. NRF_LOG_INFO("maindev connected!");
  552. // ble_timers_start(30000);
  553. m_conn_handle = p_ble_evt->evt.gattc_evt.conn_handle;
  554. // err_code = nrf_ble_qwr_conn_handle_assign(&m_qwr, p_ble_evt->evt.gattc_evt.conn_handle);
  555. // APP_ERROR_CHECK(err_code);
  556. #if NRF_SEC_PARAM_BLE==1
  557. m_sec_params_auth.bond = 0;
  558. m_sec_params_auth.mitm = 1;
  559. sd_ble_gap_authenticate(m_conn_handle, &m_sec_params_auth);//向中心设备发送配对请求
  560. #endif
  561. break;
  562. case BLE_GAP_EVT_DISCONNECTED:
  563. NRF_LOG_INFO("maindev disconnected!");
  564. ble_adv_stat=false;
  565. if(ble_adv_duration==NRF_BLE_ADV_DURATION)
  566. {
  567. Peripheral_Start();
  568. }
  569. break;
  570. case BLE_GAP_EVT_PHY_UPDATE_REQUEST:
  571. {
  572. NRF_LOG_INFO("PHY update request.");
  573. ble_gap_phys_t const phys =
  574. {
  575. .rx_phys = BLE_GAP_PHY_AUTO,
  576. .tx_phys = BLE_GAP_PHY_AUTO,
  577. };
  578. err_code = sd_ble_gap_phy_update(p_ble_evt->evt.gap_evt.conn_handle, &phys);
  579. APP_ERROR_CHECK(err_code);
  580. } break;
  581. case BLE_GAP_EVT_ADV_SET_TERMINATED:
  582. NRF_LOG_INFO("adv timeout!");
  583. ble_adv_stat=false;
  584. if(ble_adv_duration == 0)
  585. {
  586. Peripheral_Start();
  587. }
  588. break;
  589. case BLE_GATTS_EVT_SYS_ATTR_MISSING:
  590. // No system attributes have been stored.
  591. err_code = sd_ble_gatts_sys_attr_set(m_conn_handle, NULL, 0, 0);
  592. APP_ERROR_CHECK(err_code);
  593. NRF_LOG_INFO("GATTS_EVT_SYS_ATTR_MISSING.");
  594. break;
  595. case BLE_GATTC_EVT_TIMEOUT:
  596. // Disconnect on GATT Client timeout event.
  597. NRF_LOG_INFO("GATT Client Timeout.");
  598. err_code = sd_ble_gap_disconnect(p_ble_evt->evt.gattc_evt.conn_handle,
  599. BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION);
  600. APP_ERROR_CHECK(err_code);
  601. break;
  602. case BLE_GATTS_EVT_TIMEOUT:
  603. // Disconnect on GATT Server timeout event.
  604. NRF_LOG_INFO("GATT Server Timeout.");
  605. err_code = sd_ble_gap_disconnect(p_ble_evt->evt.gatts_evt.conn_handle,
  606. BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION);
  607. APP_ERROR_CHECK(err_code);
  608. break;
  609. #if NRF_SEC_PARAM_BLE==1
  610. case BLE_GAP_EVT_SEC_PARAMS_REQUEST:
  611. sec_params_init();
  612. err_code = sd_ble_gap_sec_params_reply(m_conn_handle, BLE_GAP_SEC_STATUS_SUCCESS, &m_sec_params, &m_sec_keyset);
  613. APP_ERROR_CHECK(err_code);
  614. break;
  615. #endif
  616. case BLE_GAP_EVT_PASSKEY_DISPLAY:
  617. NRF_LOG_INFO("passkey: %s\n",p_ble_evt->evt.gap_evt.params.passkey_display.passkey);
  618. break;
  619. #if NRF_SEC_PARAM_BLE==1
  620. case BLE_GAP_EVT_SEC_INFO_REQUEST:
  621. sd_ble_gap_sec_info_reply(m_conn_handle, &(m_own_enc_key.enc_info), NULL, NULL);
  622. //  sec_params_display();
  623. NRF_LOG_INFO("BLE_GAP_EVT_SEC_INFO_REQUEST\n");
  624. break;
  625. case BLE_GAP_EVT_KEY_PRESSED:
  626. NRF_LOG_INFO("BLE_GAP_EVT_KEY_PRESSED\n");
  627. break;
  628. case BLE_GAP_EVT_AUTH_KEY_REQUEST:
  629. NRF_LOG_INFO("BLE_GAP_EVT_AUTH_KEY_REQUEST\n");
  630. break;
  631. case BLE_GAP_EVT_AUTH_STATUS:
  632. if(p_ble_evt->evt.gap_evt.params.auth_status.auth_status == BLE_GAP_SEC_STATUS_SUCCESS)
  633. {
  634. NRF_LOG_INFO("pair success\n");
  635. // sec_params_display();
  636. }
  637. else
  638. {
  639. NRF_LOG_INFO("pair error\n");
  640. err_code = sd_ble_gap_disconnect(p_ble_evt->evt.gattc_evt.conn_handle,
  641. BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION);
  642. APP_ERROR_CHECK(err_code);
  643. }
  644. break;
  645. #endif
  646. default:
  647. // No implementation needed.
  648. break;
  649. }
  650. }
  651. void Ble_Peripheral_Init(set_dfu_func func,uint16_t **conn_handle)
  652. {
  653. ret_code_t err_code;
  654. ble_per_s.dfu_func=func;
  655. *conn_handle=&m_conn_handle;
  656. gap_params_init();
  657. advertising_init();
  658. conn_params_init();
  659. #if NRF_SEC_PARAM_BLE==1
  660. peer_manager_init();
  661. #endif
  662. // Start execution.
  663. // NRF_LOG_INFO("Blinky example started.");
  664. advertising_start();
  665. }
  666. void set_ble_tx_power_level(int8_t rssi)
  667. {
  668. tx_power_level=rssi;
  669. }
  670. void set_ble_adv_interval(uint32_t time)
  671. {
  672. ble_adv_interval=time;
  673. }
  674. void Peripheral_Start(void)
  675. {
  676. // if(ble_per_s.dfu_stat==true)
  677. // {
  678. // return;
  679. // }
  680. advertising_stop();
  681. advertising_init();
  682. advertising_start();
  683. ble_adv_stat=true;
  684. }
  685. void Peripheral_Stop(void)
  686. {
  687. advertising_stop();
  688. ble_adv_stat=false;
  689. }
  690. void user_ble_advertising_modes_config_set(ble_adv_modes_config_t const * const p_adv_modes_config)
  691. {
  692. ble_advertising_modes_config_set(&m_advertising, p_adv_modes_config);
  693. }
  694. #if NRF_MODULE_ENABLED(BLE_DFU)
  695. /**@snippet [Handling the data received over BLE] */
  696. //检查是否准备好关机
  697. bool m_ready_for_reset=true;
  698. //关机准备处理程序。在关闭过程中,将以1秒的间隔调用此函数,直到函数返回true。当函数返回true时,表示应用程序已准备好复位为DFU模式
  699. static bool app_shutdown_handler(nrf_pwr_mgmt_evt_t event)
  700. {
  701. switch (event)
  702. {
  703. case NRF_PWR_MGMT_EVT_PREPARE_DFU:
  704. NRF_LOG_INFO("Power management wants to reset to DFU mode.");
  705. // YOUR_JOB: Get ready to reset into DFU mode
  706. //
  707. // If you aren't finished with any ongoing tasks, return "false" to
  708. // signal to the system that reset is impossible at this stage.
  709. //
  710. // Here is an example using a variable to delay resetting the device.
  711. //
  712. if (m_ready_for_reset==false)
  713. {
  714. return false;
  715. }
  716. // uint32_t err_code;
  717. // err_code = sd_softdevice_disable();
  718. // APP_ERROR_CHECK(err_code);
  719. // err_code = app_timer_stop_all();
  720. // APP_ERROR_CHECK(err_code);
  721. break;
  722. default:
  723. // YOUR_JOB: Implement any of the other events available from the power management module:
  724. // -NRF_PWR_MGMT_EVT_PREPARE_SYSOFF
  725. // -NRF_PWR_MGMT_EVT_PREPARE_WAKEUP
  726. // -NRF_PWR_MGMT_EVT_PREPARE_RESET
  727. return true;
  728. }
  729. NRF_LOG_INFO("Power management allowed to reset to DFU mode.");
  730. return true;
  731. }
  732. //注册优先级为0的应用程序关闭处理程序
  733. NRF_PWR_MGMT_HANDLER_REGISTER(app_shutdown_handler, 0);
  734. //SoftDevice状态监视者
  735. static void buttonless_dfu_sdh_state_observer(nrf_sdh_state_evt_t state, void * p_context)
  736. {
  737. if (state == NRF_SDH_EVT_STATE_DISABLED)
  738. {
  739. //表明Softdevice在复位之前已经禁用,告之bootloader启动时应跳过CRC
  740. nrf_power_gpregret2_set(BOOTLOADER_DFU_SKIP_CRC);
  741. //进入system off.
  742. nrf_pwr_mgmt_shutdown(NRF_PWR_MGMT_SHUTDOWN_GOTO_SYSOFF);
  743. }
  744. }
  745. //注册SoftDevice状态监视者,用于SoftDevice状态改变或者即将改变时接收SoftDevice事件
  746. NRF_SDH_STATE_OBSERVER(m_buttonless_dfu_state_obs, 0) =
  747. {
  748. .handler = buttonless_dfu_sdh_state_observer,
  749. };
  750. //获取广播模式、间隔和超时时间
  751. static void advertising_config_get(ble_adv_modes_config_t * p_config)
  752. {
  753. memset(p_config, 0, sizeof(ble_adv_modes_config_t));
  754. p_config->ble_adv_slow_enabled = false;
  755. p_config->ble_adv_slow_interval = NRF_BLE_ADV_INTERVAL;
  756. p_config->ble_adv_slow_timeout = NRF_BLE_ADV_DURATION;
  757. }
  758. //断开当前连接,设备准备进入bootloader之前,需要先断开连接
  759. static void disconnect(uint16_t conn_handle, void * p_context)
  760. {
  761. UNUSED_PARAMETER(p_context);
  762. //断开当前连接
  763. ret_code_t err_code = sd_ble_gap_disconnect(conn_handle, BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION);
  764. if (err_code != NRF_SUCCESS)
  765. {
  766. NRF_LOG_WARNING("Failed to disconnect connection. Connection handle: %d Error: %d", conn_handle, err_code);
  767. }
  768. else
  769. {
  770. NRF_LOG_DEBUG("Disconnected connection handle %d", conn_handle);
  771. }
  772. }
  773. //DFU事件处理函数。如果需要在DFU事件中执行操作,可以在相应的事件里面加入处理代码
  774. static void ble_dfu_evt_handler(ble_dfu_buttonless_evt_type_t event)
  775. {
  776. switch (event)
  777. {
  778. //该事件指示设备正在准备进入bootloader
  779. case BLE_DFU_EVT_BOOTLOADER_ENTER_PREPARE:
  780. {
  781. if(ble_per_s.dfu_func!=NULL)
  782. {
  783. ble_per_s.dfu_func(true);
  784. }
  785. // ble_per_s.dfu_stat=true;
  786. NRF_LOG_INFO("Device is preparing to enter bootloader mode.");
  787. //防止设备在断开连接时广播
  788. ble_adv_modes_config_t config;
  789. advertising_config_get(&config);
  790. //连接断开后设备不自动进行广播
  791. config.ble_adv_on_disconnect_disabled = true;
  792. //修改广播配置
  793. ble_advertising_modes_config_set(&m_advertising, &config);
  794. //断开当前已经连接的所有其他绑定设备。在设备固件更新成功(或中止)后,需要在启动时接收服务更改指示
  795. uint32_t conn_count = ble_conn_state_for_each_connected(disconnect, NULL);
  796. NRF_LOG_INFO("Disconnected %d links.", conn_count);
  797. break;
  798. }
  799. //该事件指示函数返回后设备即进入bootloader
  800. case BLE_DFU_EVT_BOOTLOADER_ENTER:
  801. //如果应用程序有数据需要保存到Flash,通过app_shutdown_handler返回flase以延迟复位,从而保证数据正确写入到Flash
  802. NRF_LOG_INFO("Device will enter bootloader mode.");
  803. break;
  804. //该事件指示进入bootloader失败
  805. case BLE_DFU_EVT_BOOTLOADER_ENTER_FAILED:
  806. //进入bootloader失败,应用程序需要采取纠正措施来处理问题
  807. NRF_LOG_ERROR("Request to enter bootloader mode failed asynchroneously.");
  808. if(ble_per_s.dfu_func!=NULL)
  809. {
  810. ble_per_s.dfu_func(true);
  811. }
  812. else{
  813. NVIC_SystemReset();
  814. }
  815. break;
  816. //该事件指示发送响应失败
  817. case BLE_DFU_EVT_RESPONSE_SEND_ERROR:
  818. NRF_LOG_ERROR("Request to send a response to client failed.");
  819. //发送响应失败,应用程序需要采取纠正措施来处理问题
  820. APP_ERROR_CHECK(false);
  821. break;
  822. default:
  823. NRF_LOG_ERROR("Unknown event from ble_dfu_buttonless.");
  824. break;
  825. }
  826. }
  827. void dfu_service_init(void)
  828. {
  829. ret_code_t err_code;
  830. #if NRF_MODULE_ENABLED(BLE_DFU)
  831. //初始化DFU服务
  832. //定义DFU服务初始化结构体
  833. ble_dfu_buttonless_init_t dfus_init = {0};
  834. // Initialize the async SVCI interface to bootloader before any interrupts are enabled.
  835. err_code = ble_dfu_buttonless_async_svci_init();
  836. APP_ERROR_CHECK(err_code);
  837. dfus_init.evt_handler = ble_dfu_evt_handler;
  838. err_code = ble_dfu_buttonless_init(&dfus_init);
  839. APP_ERROR_CHECK(err_code);
  840. #endif
  841. }
  842. #endif