Advertisement
Guest User

Untitled

a guest
Aug 14th, 2017
315
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 8.27 KB | None | 0 0
  1. static void on_ble_evt(ble_evt_t * p_ble_evt)
  2. {
  3.     uint32_t err_code;
  4.     err_code = NRF_SUCCESS;
  5.     APP_ERROR_CHECK(err_code);
  6.     switch (p_ble_evt->header.evt_id)
  7.     {
  8.         case BLE_GAP_EVT_CONNECTED:
  9.             reconnect();
  10.             APP_ERROR_CHECK(err_code);
  11.             m_conn_handle = p_ble_evt->evt.gap_evt.conn_handle;
  12.             sd_ble_gap_rssi_start(p_ble_evt->evt.gap_evt.conn_handle, 1, 3);
  13.             break; // BLE_GAP_EVT_CONNECTED
  14.  
  15.         case BLE_GAP_EVT_DISCONNECTED:
  16.             disconnect();
  17.             m_conn_handle = BLE_CONN_HANDLE_INVALID;
  18. //            /*check if the last connected peer had not used MITM, if so, delete its bond information*/
  19. //            if (m_peer_to_be_deleted != PM_PEER_ID_INVALID)
  20. //            {
  21. //                ret_code_t ret_val = pm_peer_delete(m_peer_to_be_deleted);
  22. //                APP_ERROR_CHECK(ret_val);
  23. //                printf("Collector's bond deleted\r\n");
  24. //                m_peer_to_be_deleted = PM_PEER_ID_INVALID;
  25. //            }
  26.             break; // BLE_GAP_EVT_DISCONNECTED
  27.  
  28.         case BLE_GAP_EVT_SEC_PARAMS_REQUEST:
  29.             printf("BLE_GAP_EVT_SEC_PARAMS_REQUEST\r\n");
  30.             break; // BLE_GAP_EVT_SEC_PARAMS_REQUEST
  31.  
  32.         case BLE_GATTS_EVT_SYS_ATTR_MISSING:
  33.             // No system attributes have been stored.
  34. //            err_code = sd_ble_gatts_sys_attr_set(m_conn_handle, NULL, 0, 0);
  35. //            APP_ERROR_CHECK(err_code);
  36.             break; // BLE_GATTS_EVT_SYS_ATTR_MISSING
  37.  
  38.         case BLE_GATTC_EVT_TIMEOUT:
  39.             disconnect();
  40.             // Disconnect on GATT Client timeout event.
  41.             err_code = sd_ble_gap_disconnect(p_ble_evt->evt.gattc_evt.conn_handle,
  42.                                              BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION);
  43.             APP_ERROR_CHECK(err_code);
  44.             break; // BLE_GATTC_EVT_TIMEOUT
  45.  
  46.         case BLE_GATTS_EVT_TIMEOUT:
  47.             disconnect();
  48.             // Disconnect on GATT Server timeout event.
  49.             err_code = sd_ble_gap_disconnect(p_ble_evt->evt.gatts_evt.conn_handle,
  50.                                              BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION);
  51.             APP_ERROR_CHECK(err_code);
  52.             break; // BLE_GATTS_EVT_TIMEOUT
  53.  
  54.         case BLE_EVT_USER_MEM_REQUEST:
  55.             err_code = sd_ble_user_mem_reply(p_ble_evt->evt.gattc_evt.conn_handle, NULL);
  56.             APP_ERROR_CHECK(err_code);
  57.             break; // BLE_EVT_USER_MEM_REQUEST
  58.  
  59.         case BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST:
  60.         {
  61.             ble_gatts_evt_rw_authorize_request_t  req;
  62.             ble_gatts_rw_authorize_reply_params_t auth_reply;
  63.  
  64.             req = p_ble_evt->evt.gatts_evt.params.authorize_request;
  65.  
  66.             if (req.type != BLE_GATTS_AUTHORIZE_TYPE_INVALID)
  67.             {
  68.                 if ((req.request.write.op == BLE_GATTS_OP_PREP_WRITE_REQ)     ||
  69.                     (req.request.write.op == BLE_GATTS_OP_EXEC_WRITE_REQ_NOW) ||
  70.                     (req.request.write.op == BLE_GATTS_OP_EXEC_WRITE_REQ_CANCEL))
  71.                 {
  72.                     if (req.type == BLE_GATTS_AUTHORIZE_TYPE_WRITE)
  73.                     {
  74.                         auth_reply.type = BLE_GATTS_AUTHORIZE_TYPE_WRITE;
  75.                     }
  76.                     else
  77.                     {
  78.                         auth_reply.type = BLE_GATTS_AUTHORIZE_TYPE_READ;
  79.                     }
  80.                     auth_reply.params.write.gatt_status = APP_FEATURE_NOT_SUPPORTED;
  81.                     err_code = sd_ble_gatts_rw_authorize_reply(p_ble_evt->evt.gatts_evt.conn_handle,
  82.                                                                &auth_reply);
  83.                     APP_ERROR_CHECK(err_code);
  84.                 }
  85.             }
  86.         } break; // BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST
  87.  
  88. #if (NRF_SD_BLE_API_VERSION == 3)
  89.         case BLE_GATTS_EVT_EXCHANGE_MTU_REQUEST:
  90.             err_code = sd_ble_gatts_exchange_mtu_reply(p_ble_evt->evt.gatts_evt.conn_handle,
  91.                                                        NRF_BLE_MAX_MTU_SIZE);
  92.             APP_ERROR_CHECK(err_code);
  93.             break; // BLE_GATTS_EVT_EXCHANGE_MTU_REQUEST
  94. #endif
  95.  
  96.         default:
  97.             // No implementation needed.
  98.             break;
  99.     }
  100. }
  101.  
  102. static void pm_evt_handler(pm_evt_t const * p_evt)
  103. {
  104.     ret_code_t err_code;
  105.  
  106.     switch (p_evt->evt_id)
  107.     {
  108.         case PM_EVT_BONDED_PEER_CONNECTED:
  109.         {
  110.             printf("Connected to a previously bonded device.\r\n");
  111.             // Start Security Request timer.
  112. //            err_code = app_timer_start(m_sec_req_timer_id, SECURITY_REQUEST_DELAY, NULL);
  113. //            APP_ERROR_CHECK(err_code);
  114.         } break;
  115.  
  116.         case PM_EVT_CONN_SEC_SUCCEEDED:
  117.         {
  118.                 printf("Link secured. Role: %d. conn_handle: %d, Procedure: %d\r\n",
  119.                              ble_conn_state_role(p_evt->conn_handle),
  120.                              p_evt->conn_handle,
  121.                              p_evt->params.conn_sec_succeeded.procedure);
  122.  
  123.                 m_peer_id = p_evt->peer_id;
  124.         } break;
  125.  
  126.         case PM_EVT_CONN_SEC_FAILED:
  127.         {
  128.             printf("Failed to secure connection. Disconnecting.\r\n");
  129.             m_conn_handle = BLE_CONN_HANDLE_INVALID;
  130.             err_code = sd_ble_gap_disconnect(m_conn_handle,
  131.                                              BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION);
  132.             APP_ERROR_CHECK(err_code);
  133.         } break;
  134.  
  135.         case PM_EVT_CONN_SEC_CONFIG_REQ:
  136.         {
  137.             // Reject pairing request from an already bonded peer.
  138.             pm_conn_sec_config_t conn_sec_config = {.allow_repairing = false};
  139.             pm_conn_sec_config_reply(p_evt->conn_handle, &conn_sec_config);
  140.         } break;
  141.  
  142.         case PM_EVT_STORAGE_FULL:
  143.         {
  144.             // Run garbage collection on the flash.
  145.             err_code = fds_gc();
  146.             if (err_code == FDS_ERR_BUSY || err_code == FDS_ERR_NO_SPACE_IN_QUEUES)
  147.             {
  148.                 // Retry.
  149.             }
  150.             else
  151.             {
  152.                 APP_ERROR_CHECK(err_code);
  153.             }
  154.         } break;
  155.  
  156.         case PM_EVT_PEERS_DELETE_SUCCEEDED:
  157.         {
  158.           ble_advertising_start(BLE_ADV_MODE_FAST);
  159.         } break;
  160.  
  161.         case PM_EVT_LOCAL_DB_CACHE_APPLY_FAILED:
  162.         {
  163.             // The local database has likely changed, send service changed indications.
  164.             pm_local_database_has_changed();
  165.         } break;
  166.  
  167.         case PM_EVT_PEER_DATA_UPDATE_FAILED:
  168.         {
  169.             // Assert.
  170.             APP_ERROR_CHECK(p_evt->params.peer_data_update_failed.error);
  171.         } break;
  172.  
  173.         case PM_EVT_PEER_DELETE_FAILED:
  174.         {
  175.             // Assert.
  176.             APP_ERROR_CHECK(p_evt->params.peer_delete_failed.error);
  177.         } break;
  178.  
  179.         case PM_EVT_PEERS_DELETE_FAILED:
  180.         {
  181.             // Assert.
  182.             APP_ERROR_CHECK(p_evt->params.peers_delete_failed_evt.error);
  183.         } break;
  184.  
  185.         case PM_EVT_ERROR_UNEXPECTED:
  186.         {
  187.             // Assert.
  188.             APP_ERROR_CHECK(p_evt->params.error_unexpected.error);
  189.         } break;
  190.  
  191.         case PM_EVT_CONN_SEC_START:
  192.         case PM_EVT_PEER_DATA_UPDATE_SUCCEEDED:
  193.         case PM_EVT_LOCAL_DB_CACHE_APPLIED:
  194.         case PM_EVT_SERVICE_CHANGED_IND_SENT:
  195.         case PM_EVT_SERVICE_CHANGED_IND_CONFIRMED:
  196.         default:
  197.             break;
  198.     }
  199. }
  200.  
  201. static void peer_manager_init(bool erase_bonds)
  202. {
  203.     ble_gap_sec_params_t sec_param;
  204.     ret_code_t err_code;
  205.  
  206.     err_code = pm_init();
  207.     APP_ERROR_CHECK(err_code);
  208.  
  209.     if (erase_bonds)
  210.     {
  211.         pm_peers_delete();
  212.     }
  213.  
  214.     memset(&sec_param, 0, sizeof(ble_gap_sec_params_t));
  215.  
  216.     // Security parameters to be used for all security procedures.
  217.     sec_param.bond = true;
  218.     sec_param.mitm = false;
  219.     sec_param.lesc = 0;
  220.     sec_param.keypress = 0;
  221.     sec_param.io_caps = BLE_GAP_IO_CAPS_NONE; //BLE_GAP_IO_CAPS_DISPLAY_ONLY;
  222.     sec_param.oob = false;
  223.     sec_param.min_key_size = 7;
  224.     sec_param.max_key_size = 16;
  225.     sec_param.kdist_own.enc = 1;
  226.     sec_param.kdist_own.id = 1;
  227.     sec_param.kdist_peer.enc = 1;
  228.     sec_param.kdist_peer.id = 1;
  229.  
  230.     err_code = pm_sec_params_set(&sec_param);
  231.     APP_ERROR_CHECK(err_code);
  232.  
  233.     err_code = pm_register(pm_evt_handler);
  234.     APP_ERROR_CHECK(err_code);
  235. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement