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
This library is used in the Bluetooth: NFC pairing sample.
The following code 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 tnep_initial_msg_encode(struct nfc_ndef_msg_desc *msg)
{
int err;
struct nfc_ndef_ch_msg_records ch_records;
static struct nfc_ndef_le_oob_rec_payload_desc rec_payload;
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);
memset(&rec_payload, 0, sizeof(rec_payload));
rec_payload.addr = &oob_local.addr;
rec_payload.le_sc_data = &oob_local.le_sc_data;
rec_payload.tk_value = tk_value;
rec_payload.local_name = bt_get_name();
rec_payload.le_role = NFC_NDEF_LE_OOB_REC_LE_ROLE(
NFC_NDEF_LE_OOB_REC_LE_ROLE_PERIPH_ONLY);
rec_payload.appearance = NFC_NDEF_LE_OOB_REC_APPEARANCE(
CONFIG_BT_DEVICE_APPEARANCE);
rec_payload.flags = NFC_NDEF_LE_OOB_REC_FLAGS(BT_LE_AD_NO_BREDR);
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(msg,
&NFC_NDEF_CH_RECORD_DESC(hs_rec),
&ch_records);
if (err) {
return err;
}
return nfc_tnep_initial_msg_encode(msg, NULL, 0);
}
API documentation
Connection Handover records
include/nfc/ndef/ch.h
subsys/nfc/ndef/ch.c
- group nfc_ndef_ch
Generation of NFC NDEF Connection Handover records for NDEF messages.
Defines
-
NFC_NDEF_CH_REC_TYPE_LENGTH
Size of the type field of the Connection Handover records. Record types are defined in the file
ch_rec.c
.
-
NFC_NDEF_CH_AC_CPS_MASK
Mask of Carrier Power State bits in a first ac record byte.
-
NFC_NDEF_CH_RECORD_DESC_DEF(_name, _rec_type_field, _major_version, _minor_version, _max_records)
Macro for creating and initializing an NFC NDEF record descriptor for the Connection Handover.
This macro creates and initializes an instance of type nfc_ndef_record_desc and an instance of type nfc_ndef_ch_rec, which together constitute an instance of a Connection Handover record.
Use the macro NFC_NDEF_CH_RECORD_DESC to access the NDEF Connection Handover record descriptor instance.
- Parameters
_name – [in] Name of the created record descriptor instance.
_rec_type_field – [in] The NFC Forum Well Known Type Connection Handover record type.
_major_version – [in] Major version number of the supported Connection Handover specification.
_minor_version – [in] Minor version number of the supported Connection Handover specification.
_max_records – [in] Maximum number of local records.
-
NFC_NDEF_CH_HS_RECORD_DESC_DEF(_name, _major_version, _minor_version, _max_records)
Macro for creating and initializing an NFC NDEF record descriptor for a Handover Select record.
This macro creates and initializes an instance of type nfc_ndef_record_desc and an instance of type nfc_ndef_ch_rec, which together constitute an instance of a Handover Select record.
Use the macro NFC_NDEF_CH_RECORD_DESC to access the NDEF Handover Select record descriptor instance.
- Parameters
_name – [in] Name of the created record descriptor instance.
_major_version – [in] Major version number of the supported Connection Handover specification.
_minor_version – [in] Minor version number of the supported Connection Handover specification.
_max_records – [in] Maximum number of local records struct (ac records plus optional err record).
-
NFC_NDEF_CH_HR_RECORD_DESC_DEF(_name, _major_version, _minor_version, _max_records)
Macro for creating and initializing an NFC NDEF record descriptor for a Handover Request record.
This macro creates and initializes an instance of type nfc_ndef_record_desc and an instance of type nfc_ndef_ch_rec, which together constitute an instance of a Handover Request record.
Use the macro NFC_NDEF_CH_RECORD_DESC to access the NDEF Handover Request record descriptor instance.
- Parameters
_name – [in] Name of the created record descriptor instance.
_major_version – [in] Major version number of the supported Connection Handover specification.
_minor_version – [in] Minor version number of the supported Connection Handover specification.
_max_records – [in] Maximum number of local records (cr record plus ac records).
-
NFC_NDEF_CH_HM_RECORD_DESC_DEF(_name, _major_version, _minor_version, _max_records)
Macro for creating and initializing an NFC NDEF record descriptor for a Handover Mediation record.
This macro creates and initializes an instance of type nfc_ndef_record_desc and an instance of type nfc_ndef_ch_rec, which together constitute an instance of a Handover Mediation record.
Use the macro NFC_NDEF_CH_RECORD_DESC to access the NDEF Handover Mediation record descriptor instance.
- Parameters
_name – [in] Name of the created record descriptor instance.
_major_version – [in] Major version number of the supported Connection Handover specification.
_minor_version – [in] Minor version number of the supported Connection Handover specification.
_max_records – [in] Maximum number of local records (ac records).
-
NFC_NDEF_CH_HI_RECORD_DESC_DEF(_name, _major_version, _minor_version, _max_records)
Macro for creating and initializing an NFC NDEF record descriptor for a Handover Initiate record.
This macro creates and initializes an instance of type nfc_ndef_record_desc.
Use the macro NFC_NDEF_CH_RECORD_DESC to access the NDEF Handover Initiate record descriptor instance.
- Parameters
_name – [in] Name of the created record descriptor instance.
_major_version – [in] Major version number of the supported Connection Handover specification.
_minor_version – [in] Minor version number of the supported Connection Handover specification.
_max_records – [in] Maximum number of local records (ac records).
-
NFC_NDEF_CH_RECORD_DESC(_name)
Macro for accessing the NFC NDEF Handover Select record descriptor instance that was created with NFC_NDEF_CH_HS_RECORD_DESC_DEF.
-
NFC_NDEF_CH_HC_RECORD_DESC_DEF(_name, _payload_id, _payload_id_length, _payload_desc)
Macro for creating and initializing an NFC NDEF record descriptor for the Handover Carrier record.
This macro creates and initializes an instance of type nfc_ndef_record_desc and an instance of type nfc_ndef_ch_rec, which together constitute an instance of a Connection Handover record.
Use the macro NFC_NDEF_CH_HC_RECORD_DESC to access the NDEF Connection Handover record descriptor instance.
- Parameters
_name – [in] Name of the created record descriptor instance.
_payload_id – [in] ID of the payload.
_payload_id_length – [in] Length of the payload.
_payload_desc – [in] Description of the payload.
-
NFC_NDEF_CH_HC_RECORD_DESC(_name)
Macro for accessing the NFC NDEF Handover Carrier record descriptor instance that was created with NFC_NDEF_CH_HC_GENERIC_RECORD_DESC_DEF.
-
NFC_NDEF_CH_AC_RECORD_DESC_DEF(_name, _cps, _carr_data_ref_len, _carr_data_ref, _max_aux_data_ref_cnt)
Macro for creating and initializing an NFC NDEF record descriptor for an Alternative Carrier record.
This macro creates and initializes an instance of type nfc_ndef_record_desc and an instance of type nfc_ndef_ch_ac_rec, which together constitute an instance of an Alternative Carrier record.
Use the macro NFC_NDEF_CH_AC_RECORD_DESC to access the NDEF Alternative Carrier record descriptor instance.
- Parameters
_name – [in] Name of the created record descriptor instance.
_cps – [in] Carrier Power State value.
_carr_data_ref_len – [in] Length of the Carrier Data Reference field.
_carr_data_ref – [in] Pointer to the Carrier Data Reference field.
_max_aux_data_ref_cnt – [in] Maximum number of Auxiliary Data Reference fields.
-
NFC_NDEF_CH_AC_RECORD_DESC(_name)
Macro for accessing the NFC NDEF Alternative Carrier record descriptor instance that was created with NFC_NDEF_AC_RECORD_DESC_DEF.
-
NFC_NDEF_CH_CR_RECORD_DESC_DEF(_name, _random_number)
Macro for creating and initializing an NFC NDEF record descriptor for an Collision Resolution record.
This macro creates and initializes an instance of type nfc_ndef_record_desc and an instance of type nfc_ndef_ch_cr_rec, which together constitute an instance of an Collision Resolution record.
Use the macro NFC_NDEF_CR_RECORD_DESC to access the NDEF Collision Resolution record descriptor instance.
- Parameters
_name – [in] Name of the created record descriptor instance.
_random_number – [in] Generated random number required to resolve a collision.
-
NFC_NDEF_CR_RECORD_DESC(_name)
Macro for accessing the NFC NDEF Alternative Carrier record descriptor instance that was created with NFC_NDEF_CH_CR_RECORD_DESC_DEF.
Enums
-
enum nfc_ndef_ch_ac_rec_cps
Carrier Power State.
Possible Carrier Power State field values in an Alternative Carrier record.
Values:
-
enumerator NFC_AC_CPS_INACTIVE
Alternative Carrier inactive.
-
enumerator NFC_AC_CPS_ACTIVE
Alternative Carrier active.
-
enumerator NFC_AC_CPS_ACTIVATING
Alternative Carrier activating.
-
enumerator NFC_AC_CPS_UNKNOWN
Alternative Carrier power status unknown.
-
enumerator NFC_AC_CPS_INACTIVE
Functions
-
int nfc_ndef_ch_rec_payload_encode(const struct nfc_ndef_ch_rec *ch_rec, uint8_t *buf, uint32_t *len)
Constructor for an NFC Connection Handover generic record payload.
- Parameters
ch_rec – [in] Pointer to the Connection Handover record description.
buf – [out] Pointer to the payload destination. If NULL, function will calculate the expected size of the Handover Connection record payload.
len – [inout] Size of the available memory to write as input. Size of the generated record payload as output.
- Return values
0 – If the operation was successful. Otherwise, a (negative) error code is returned.
-
void nfc_ndef_ch_rec_local_record_clear(struct nfc_ndef_record_desc *ch_rec)
Function for clearing local records in the NFC NDEF Connection Handover records.
This function clears local records of the Connection Handover records.
- Parameters
ch_rec – [inout] Pointer to the Connection Handover record descriptor.
- Return values
0 – If the operation was successful. Otherwise, a (negative) error code is returned.
-
int nfc_ndef_ch_rec_local_record_add(struct nfc_ndef_record_desc *ch_rec, const struct nfc_ndef_record_desc *local_rec)
Function for adding a local record to an NFC NDEF Handover Select record.
- Parameters
ch_rec – [inout] Pointer to a Connection Handover record.
local_rec – [in] Pointer to a local record to add.
- Return values
0 – If the operation was successful. Otherwise, a (negative) error code is returned.
-
int nfc_ndef_ch_hc_rec_payload_encode(const struct nfc_ndef_ch_hc_rec *hc_rec, uint8_t *buf, uint32_t *len)
Constructor for an NFC Connection Handover Carrier Record payload.
- Parameters
hc_rec – [in] Pointer to the Connection Handover Carrier record description.
buf – [out] Pointer to the payload destination. If NULL, function will calculate the expected size of the Handover Connection Carrier Record payload.
len – [inout] Size of the available memory to write as input. Size of the generated record payload as output.
- Return values
0 – If the operation was successful. Otherwise, a (negative) error code is returned.
-
int nfc_ndef_ch_ac_rec_payload_encode(const struct nfc_ndef_ch_ac_rec *nfc_rec_ac, uint8_t *buf, uint32_t *len)
Constructor for an NFC NDEF Alternative Carrier record payload.
- Parameters
nfc_rec_ac – [in] Pointer to the Alternative Carrier record description.
buf – [in] Pointer to the payload destination. If NULL, function will calculate the expected size of the Alternative Carrier record payload.
len – [inout] Size of the available memory to write as input. Size of the generated record payload as output.
- Return values
0 – If the operation was successful. Otherwise, a (negative) error code is returned.
-
void nfc_ndef_ch_ac_rec_auxiliary_data_ref_clear(struct nfc_ndef_record_desc *ac_rec)
Function for clearing an Auxiliary Data Reference in an NFC NDEF Alternative Carrier record.
This function clears the Auxiliary Data References from the Alternative Carrier record.
- Parameters
ac_rec – [inout] Pointer to the Alternative Carrier record descriptor.
-
int nfc_ndef_ch_ac_rec_auxiliary_data_ref_add(struct nfc_ndef_record_desc *ac_rec, const uint8_t *aux_data, uint8_t aux_length)
Function for adding an Auxiliary Data Reference to an NFC NDEF Alternative Carrier record.
- Parameters
ac_rec – [inout] Pointer to an ac record.
aux_data – [in] Pointer to the Auxiliary Data Reference data buffer.
aux_length – [in] Length of the Auxiliary Data Reference data.
- Return values
0 – If the operation was successful. Otherwise, a (negative) error code is returned.
-
int nfc_ndef_ch_cr_rec_payload_encode(const struct nfc_ndef_ch_cr_rec *nfc_rec_cr, uint8_t *buf, uint32_t *len)
Constructor for an NFC NDEF Collision Resolution record payload.
- Parameters
nfc_rec_cr – [in] Pointer to the Collision Resolution record description.
buf – [out] Pointer to the payload destination. If NULL, function will calculate the expected size of the Collision Resolution record payload.
len – [inout] Size of the available memory to write as input. Size of the generated record payload as output.
- Return values
0 – If the operation was successful. Otherwise, a (negative) error code is returned.
-
struct nfc_ndef_ch_hc_rec
- #include <ch.h>
Handover Carrier record payload descriptor.
Public Members
-
enum nfc_ndef_record_tnf ctf
Carrier Type Format, it has the same semantics like TNF. Supported TNF:
NFC Forum Well Known Type
Media Type
Absolute URI
NFC Forum external type
-
uint8_t type_len
Carrier type field length.
-
const uint8_t *type
A unique identification od the alternative carrier. It shall follow the structure, encoding, and format implied by the value of the CTF field.
-
uint8_t data_len
Optional data length.
-
uint8_t *data
Optional information about alternative carrier. It length can be calculated using following formula: (NDEF Record Payload length - carrier type length) - 2
-
struct nfc_ndef_ch_hc_rec.[anonymous] carrier
Carrier description.
-
enum nfc_ndef_record_tnf ctf
-
struct nfc_ndef_ch_ac_rec_ref
- #include <ch.h>
Carrier Data Reference and Auxiliary Data Reference descriptor.
-
struct nfc_ndef_ch_ac_rec
- #include <ch.h>
Alternative Carrier record payload descriptor.
Public Members
-
enum nfc_ndef_ch_ac_rec_cps cps
Carrier Power State value.
-
struct nfc_ndef_ch_ac_rec_ref carrier_data_ref
Carrier Data Reference.
-
const uint8_t max_aux_data_ref_cnt
Maximum number of Auxiliary Data Reference fields.
-
uint8_t aux_data_ref_cnt
Number of Auxiliary Data Reference fields.
-
struct nfc_ndef_ch_ac_rec_ref *aux_data_ref
Pointer to the Auxiliary Data Reference fields.
-
enum nfc_ndef_ch_ac_rec_cps cps
-
struct nfc_ndef_ch_cr_rec
- #include <ch.h>
Collision Resolution record payload descriptor.
Public Members
-
uint16_t random
Randomly generated number.
-
uint16_t random
-
struct nfc_ndef_ch_rec
- #include <ch.h>
Handover Select record payload descriptor.
Public Members
-
uint8_t major_version
Major version number of the supported Connection Handover specification.
-
uint8_t minor_version
Minor version number of the supported Connection Handover specification.
-
struct nfc_ndef_msg_desc *local_records
Pointer to a message encapsulating local records.
-
uint8_t major_version
-
NFC_NDEF_CH_REC_TYPE_LENGTH
Connection Handover messages
include/nfc/ndef/ch_msg.h
subsys/nfc/ndef/ch_msg.c
- group nfc_ndef_ch_msg
Generation of The Connection Handover NDEF messages.
Functions
-
int nfc_ndef_ch_msg_le_oob_encode(const struct nfc_ndef_le_oob_rec_payload_desc *oob, uint8_t *buf, size_t *len)
Encode an NFC NDEF LE OOB message.
This function encodes an NFC NDEF message into a buffer.
- Parameters
oob – [in] Pointer to the LE OOB Record payload descriptor.
buf – [out] Pointer to the buffer for the message.
len – [inout] Size of the available memory for the message as input. Size of the generated message as output.
- Return values
0 – If the operation was successful. Otherwise, a (negative) error code is returned.
-
int nfc_ndef_ch_msg_hs_create(struct nfc_ndef_msg_desc *msg, struct nfc_ndef_record_desc *hs_rec, const struct nfc_ndef_ch_msg_records *records)
Create an NFC NDEF Handover Select message.
This function create an NFC NDEF message. It create a nested NDEF message with the Alternative Carrier Records. Next the Records with the Carrier data are added into the main Connection Hanover Select message. Number of the Alternative Carrier Records must be equal to the number of the Carrier Records.
- Parameters
msg – [inout] Pointer to NDEF message. This message is initialized with Connection Handover Record. The message must be able to keep at least count of the Alternative Carrier Records + 1 records.
hs_rec – [out] Pointer to the Handover Select Record.
records – [in] Pointer to structure which contains the Alternative Carrier Records and the Carrier Records
- Return values
0 – If the operation was successful. Otherwise, a (negative) error code is returned.
-
int nfc_ndef_ch_msg_hr_create(struct nfc_ndef_msg_desc *msg, struct nfc_ndef_record_desc *hr_rec, const struct nfc_ndef_record_desc *cr_rec, const struct nfc_ndef_ch_msg_records *records)
Encode an NFC NDEF Handover Request message.
This function create an NFC NDEF message. It create a nested NDEF message with the Alternative Carrier Records. Next the Records with the Carrier data are added into the main Connection Hanover Request message. Number of the Alternative Carrier Records must be equal to the number of the Carrier Records.
- Parameters
msg – [inout] Pointer to NDEF message. This message is initialized with Connection Handover Record. The message must be able to keep at least count of the Alternative Carrier Records + 1 records.
hr_rec – [out] Pointer to the Handover Request Record.
cr_rec – [in] Pointer to the Collision Resolution Record.
records – [in] Pointer to structure which contains the Alternative Carrier Records and the Carrier Records
- Return values
0 – If the operation was successful. Otherwise, a (negative) error code is returned.
-
int nfc_ndef_ch_msg_hm_create(struct nfc_ndef_msg_desc *msg, struct nfc_ndef_record_desc *hm_rec, const struct nfc_ndef_ch_msg_records *records)
Create an NFC NDEF Handover Mediation message.
This function creates an NFC NDEF message. It create a nested NDEF message with the Alternative Carrier Records. Next the Records with the Carrier data are added into the main Connection Hanover Mediation message. Number of the Alternative Carrier Records must be equal to the number of the Carrier Records.
- Parameters
msg – [inout] Pointer to NDEF message. This message is initialized with Connection Handover Record. The message must be able to keep at least count of the Alternative Carrier Records + 1 records.
hm_rec – [out] Pointer to the Handover Mediation Record.
records – [in] Pointer to structure which contains the Alternative Carrier Records and the Carrier Records
- Return values
0 – If the operation was successful. Otherwise, a (negative) error code is returned.
-
int nfc_ndef_ch_msg_hi_create(struct nfc_ndef_msg_desc *msg, struct nfc_ndef_record_desc *hi_rec, const struct nfc_ndef_ch_msg_records *records)
Create an NFC NDEF Handover Initiate message.
This function creates an NFC NDEF message. It create a nested NDEF message with the Alternative Carrier Records. Next the Records with the Carrier data are added into the main Connection Hanover Initiate message. Number of the Alternative Carrier Records must be equal to the number of the Carrier Records.
- Parameters
msg – [inout] Pointer to NDEF message. This message is initialized with Connection Handover Record. The message must be able to keep at least count of the Alternative Carrier Records + 1 records.
hi_rec – [out] Pointer to the Handover Initiate Record.
records – [in] Pointer to structure which contains the Alternative Carrier Records and the Carrier Records
- Return values
0 – If the operation was successful. Otherwise, a (negative) error code is returned.
-
struct nfc_ndef_ch_msg_records
- #include <ch_msg.h>
NFC NDEF Connection Handover message structure. This structure contains all needed records needed to create the Connection Handover message. It can conatains one or more the Alternative Carrier Records and the Carrier Records.
Public Members
-
const struct nfc_ndef_record_desc *ac
Array of the Alternative Carrier Records.
-
const struct nfc_ndef_record_desc *carrier
Array of the Carrier Records.
-
size_t cnt
Count of the Alternative Carrier Records and the Carrier Records.
-
const struct nfc_ndef_record_desc *ac
-
int nfc_ndef_ch_msg_le_oob_encode(const struct nfc_ndef_le_oob_rec_payload_desc *oob, uint8_t *buf, size_t *len)