About NUS connection

I have implemented NUS on device A and confirmed that it can be connected from a PC by making it the advertising sender.

Device B can scan device A's advertisements and obtain values ​​from the advertisement data.

I would like to add an NUS function to device B so that device B can search for a specific Bluetooth ID from the advertisement and set it on device A via an NUS connection.

I am currently adding NUS_C to device B and trying to run it, but ble_nus_c_init() returns 14.

Please tell me what to do.

Parents
  • I solved the above post myself, but a new problem has arisen.

    I am trying to perform a BLE scan, find the specified Bluetooth ID, and perform an NUS connection.

    When I execute sd_ble_gap_connect, it returns 8, so I added sd_ble_gap_scan_stop before sd_ble_gap_connect, but sd_ble_gap_scan_stop also returns 8.

    The Scan event function is as follows.

    void scan_evt_handler(scan_evt_t const * p_scan_evt)
    {
        switch (p_scan_evt->scan_evt_id)
        {
            case NRF_BLE_SCAN_EVT_SCAN_TIMEOUT:
                NRF_LOG_INFO("Scan timeout.");
                break;
    
            case NRF_BLE_SCAN_EVT_CONNECTING_ERROR:
                NRF_LOG_ERROR("Connection error.");
                break;
    
            case NRF_BLE_SCAN_EVT_CONNECTED:
                NRF_LOG_INFO("Connected to device.");
                break;
    
            case NRF_BLE_SCAN_EVT_FILTER_MATCH:
            {
                // アドバタイジングレポートを取得
                ble_gap_evt_adv_report_t const * p_adv_report = p_scan_evt->params.filter_match.p_adv_report;
    
                // アドバタイジングデータを取得
                const uint8_t * p_data = p_adv_report->data.p_data; // ble_data_t から p_data を取得
                uint16_t data_len = p_adv_report->data.len; // ble_data_t からデータ長を取得
    
                // デバイス名の取得
                char device_name[BLE_GAP_DEVNAME_MAX_LEN + 1]; // デバイス名用のバッファ
                memset(device_name, 0, sizeof(device_name)); // バッファをクリア
    
                // アドバタイジングデータからデバイス名を探す
                uint8_t * p_name_data = ble_advdata_parse((uint8_t *)p_data, data_len, BLE_GAP_AD_TYPE_COMPLETE_LOCAL_NAME);
                if (p_name_data != NULL)
                {
                    // デバイス名の長さを取得
                    uint8_t name_len = strlen((const char *)p_name_data);
    //                if(name_len > 6)
    //                {
    //                    break;
    //                }
    //                if (name_len > BLE_GAP_DEVNAME_MAX_LEN) {
    //                    name_len = BLE_GAP_DEVNAME_MAX_LEN; // 長さが最大を超えないようにする
    //                }
                    strncpy(device_name, (char *)p_name_data, name_len);
                    device_name[name_len] = '\0'; // NULL で終端
                    device_name[6] = '\0';
                    // デバイス名が一致する場合、接続を開始
                    if (strcmp(device_name, TARGET_DEVICE_NAME) == 0)
                    {
                        // 接続先デバイスのアドレスを設定
                        ble_gap_addr_t addr;
                        addr.addr_id_peer = 0; // プライベートアドレスでない場合は0
                        addr.addr_type = p_adv_report->peer_addr.addr_type; // アドレスのタイプを設定
                        memcpy(addr.addr, p_adv_report->peer_addr.addr, BLE_GAP_ADDR_LEN); // アドレスをコピー
    
                        // スキャンパラメータの初期化
                        ble_gap_scan_params_t scan_params;
                        memset(&scan_params, 0, sizeof(scan_params)); // ゼロ初期化
                        scan_params.extended = 0; // 拡張スキャンを使用しない場合は0
                        scan_params.active = 1; // アクティブスキャンを有効にする
                        scan_params.report_incomplete_evts = 0; // 不完全なイベントを報告しない
                        scan_params.scan_phys = BLE_GAP_PHY_1MBPS; // スキャンするPHYを設定
                        scan_params.interval = MSEC_TO_UNITS(100, UNIT_1_25_MS); // スキャン間隔を設定
                        scan_params.window = MSEC_TO_UNITS(50, UNIT_1_25_MS); // スキャンウィンドウを設定
                        scan_params.timeout = 0; // タイムアウトなし
    
                        // 接続パラメータの初期化
                        ble_gap_conn_params_t conn_params;
                        memset(&conn_params, 0, sizeof(conn_params)); // ゼロ初期化
                        conn_params.min_conn_interval = MIN_CONN_INTERVAL; // 最小接続間隔
                        conn_params.max_conn_interval = MAX_CONN_INTERVAL; // 最大接続間隔
                        conn_params.slave_latency = SLAVE_LATENCY; // スレーブレイテンシ
                        conn_params.conn_sup_timeout = CONN_SUP_TIMEOUT; // 接続スーパーバイスタイムアウト
    
                        // スキャンを停止
                        uint32_t err_code = sd_ble_gap_scan_stop();
                        if (err_code != NRF_SUCCESS){
    
                            // スキャン停止のエラーハンドリング
                            break;
                        }
                        // 接続を開始
                        err_code = sd_ble_gap_connect(&addr, &scan_params, &conn_params, con_cfg_tag);
                        device_name[6] = '\0';
                        if (err_code != NRF_SUCCESS) 
                        {
                            // エラーハンドリング
                        }
                    }
                }
                break;
            }
            default:
                break;
        }
    }

Reply
  • I solved the above post myself, but a new problem has arisen.

    I am trying to perform a BLE scan, find the specified Bluetooth ID, and perform an NUS connection.

    When I execute sd_ble_gap_connect, it returns 8, so I added sd_ble_gap_scan_stop before sd_ble_gap_connect, but sd_ble_gap_scan_stop also returns 8.

    The Scan event function is as follows.

    void scan_evt_handler(scan_evt_t const * p_scan_evt)
    {
        switch (p_scan_evt->scan_evt_id)
        {
            case NRF_BLE_SCAN_EVT_SCAN_TIMEOUT:
                NRF_LOG_INFO("Scan timeout.");
                break;
    
            case NRF_BLE_SCAN_EVT_CONNECTING_ERROR:
                NRF_LOG_ERROR("Connection error.");
                break;
    
            case NRF_BLE_SCAN_EVT_CONNECTED:
                NRF_LOG_INFO("Connected to device.");
                break;
    
            case NRF_BLE_SCAN_EVT_FILTER_MATCH:
            {
                // アドバタイジングレポートを取得
                ble_gap_evt_adv_report_t const * p_adv_report = p_scan_evt->params.filter_match.p_adv_report;
    
                // アドバタイジングデータを取得
                const uint8_t * p_data = p_adv_report->data.p_data; // ble_data_t から p_data を取得
                uint16_t data_len = p_adv_report->data.len; // ble_data_t からデータ長を取得
    
                // デバイス名の取得
                char device_name[BLE_GAP_DEVNAME_MAX_LEN + 1]; // デバイス名用のバッファ
                memset(device_name, 0, sizeof(device_name)); // バッファをクリア
    
                // アドバタイジングデータからデバイス名を探す
                uint8_t * p_name_data = ble_advdata_parse((uint8_t *)p_data, data_len, BLE_GAP_AD_TYPE_COMPLETE_LOCAL_NAME);
                if (p_name_data != NULL)
                {
                    // デバイス名の長さを取得
                    uint8_t name_len = strlen((const char *)p_name_data);
    //                if(name_len > 6)
    //                {
    //                    break;
    //                }
    //                if (name_len > BLE_GAP_DEVNAME_MAX_LEN) {
    //                    name_len = BLE_GAP_DEVNAME_MAX_LEN; // 長さが最大を超えないようにする
    //                }
                    strncpy(device_name, (char *)p_name_data, name_len);
                    device_name[name_len] = '\0'; // NULL で終端
                    device_name[6] = '\0';
                    // デバイス名が一致する場合、接続を開始
                    if (strcmp(device_name, TARGET_DEVICE_NAME) == 0)
                    {
                        // 接続先デバイスのアドレスを設定
                        ble_gap_addr_t addr;
                        addr.addr_id_peer = 0; // プライベートアドレスでない場合は0
                        addr.addr_type = p_adv_report->peer_addr.addr_type; // アドレスのタイプを設定
                        memcpy(addr.addr, p_adv_report->peer_addr.addr, BLE_GAP_ADDR_LEN); // アドレスをコピー
    
                        // スキャンパラメータの初期化
                        ble_gap_scan_params_t scan_params;
                        memset(&scan_params, 0, sizeof(scan_params)); // ゼロ初期化
                        scan_params.extended = 0; // 拡張スキャンを使用しない場合は0
                        scan_params.active = 1; // アクティブスキャンを有効にする
                        scan_params.report_incomplete_evts = 0; // 不完全なイベントを報告しない
                        scan_params.scan_phys = BLE_GAP_PHY_1MBPS; // スキャンするPHYを設定
                        scan_params.interval = MSEC_TO_UNITS(100, UNIT_1_25_MS); // スキャン間隔を設定
                        scan_params.window = MSEC_TO_UNITS(50, UNIT_1_25_MS); // スキャンウィンドウを設定
                        scan_params.timeout = 0; // タイムアウトなし
    
                        // 接続パラメータの初期化
                        ble_gap_conn_params_t conn_params;
                        memset(&conn_params, 0, sizeof(conn_params)); // ゼロ初期化
                        conn_params.min_conn_interval = MIN_CONN_INTERVAL; // 最小接続間隔
                        conn_params.max_conn_interval = MAX_CONN_INTERVAL; // 最大接続間隔
                        conn_params.slave_latency = SLAVE_LATENCY; // スレーブレイテンシ
                        conn_params.conn_sup_timeout = CONN_SUP_TIMEOUT; // 接続スーパーバイスタイムアウト
    
                        // スキャンを停止
                        uint32_t err_code = sd_ble_gap_scan_stop();
                        if (err_code != NRF_SUCCESS){
    
                            // スキャン停止のエラーハンドリング
                            break;
                        }
                        // 接続を開始
                        err_code = sd_ble_gap_connect(&addr, &scan_params, &conn_params, con_cfg_tag);
                        device_name[6] = '\0';
                        if (err_code != NRF_SUCCESS) 
                        {
                            // エラーハンドリング
                        }
                    }
                }
                break;
            }
            default:
                break;
        }
    }

Children
No Data
Related