Connection Handover messages and records

Connection Handover records and the corresponding messages are used to negotiate and activate an alternative communication carrier. The negotiated communication carrier can then be used to perform certain activities between the two devices, such as Bluetooth® pairing.

Connection Handover records

The Connection Handover library provides functions for creating and encoding the following Connection Handover records:

  • Handover Request record

  • Handover Select record

  • Handover Mediation record

  • Handover Initiate record

  • Handover Carrier record

  • Local records:

    • Alternative Carrier record

    • Collision Resolution record

Connection Handover messages

The Connection Handover message library provides functions for encoding the following messages:

  • Bluetooth LE OOB message

  • Handover Select message

  • Handover Request message

  • Handover Mediation message

  • Handover Initiate message

The following code sample from the Bluetooth: NFC pairing sample demonstrates how to create a Handover Select message with one Alternative Carrier record that has a reference to the Bluetooth LE OOB record:

static int pairing_msg_generate(uint32_t *len)
{
	int err;
	struct nfc_ndef_le_oob_rec_payload_desc rec_payload = {0};
	struct nfc_ndef_ch_msg_records ch_records;
	uint32_t ndef_size = nfc_t4t_ndef_file_msg_size_get(*len);

	NFC_NDEF_MSG_DEF(hs_msg, 2);

	rec_payload.addr = &oob_local->addr;
	rec_payload.le_sc_data = oob_local;
	rec_payload.tk_value = tk_value;
	rec_payload.local_name = device_name;
	rec_payload.le_role = NFC_NDEF_LE_OOB_REC_LE_ROLE(
		NFC_NDEF_LE_OOB_REC_LE_ROLE_PERIPH_ONLY);
	rec_payload.flags = NFC_NDEF_LE_OOB_REC_FLAGS(BLE_GAP_ADV_FLAG_BR_EDR_NOT_SUPPORTED);

	NFC_NDEF_LE_OOB_RECORD_DESC_DEF(oob_rec, '0', &rec_payload);
	NFC_NDEF_CH_AC_RECORD_DESC_DEF(oob_ac, NFC_AC_CPS_ACTIVE, 1, "0", 0);
	NFC_NDEF_CH_HS_RECORD_DESC_DEF(hs_rec, NFC_NDEF_CH_MSG_MAJOR_VER,
				       NFC_NDEF_CH_MSG_MINOR_VER, 1);

	ch_records.ac = &NFC_NDEF_CH_AC_RECORD_DESC(oob_ac);
	ch_records.carrier = &NFC_NDEF_LE_OOB_RECORD_DESC(oob_rec);
	ch_records.cnt = 1;

	err = nfc_ndef_ch_msg_hs_create(&NFC_NDEF_MSG(hs_msg),
					&NFC_NDEF_CH_RECORD_DESC(hs_rec),
					&ch_records);
	if (err) {
		return err;
	}

	err = nfc_ndef_msg_encode(&NFC_NDEF_MSG(hs_msg),
				  nfc_t4t_ndef_file_msg_get(ndef_msg_buf),
				  &ndef_size);
	if (err) {
		return err;
	}

	err = nfc_t4t_ndef_file_encode(ndef_msg_buf, &ndef_size);
	if (err) {
		return err;
	}

	*len = ndef_size;

	return 0;
}

API documentation

Connection Handover records

Header file: bm/nfc/ndef/ch.h
Source file: subsys/nfc/ndef/ch.c

Connection Handover records

Connection Handover messages

Header file: bm/nfc/ndef/ch_msg.h
Source file: subsys/nfc/ndef/ch_msg.c

Connection Handover messages