示例#1
0
INT32 nativeNdef_readText( UINT8*ndefBuff, UINT32 ndefBuffLen, char * outText, UINT32 textLen)
{
    int langCodeLen;
    UINT8 *payload;
    UINT32 payloadLength;
    UINT8 ndef_tnf;
    UINT8 *ndef_type;
    UINT8 ndef_typeLength;
    nfc_friendly_type_t friendly_type;

    ndef_type = NDEF_RecGetType((UINT8*)ndefBuff, &ndef_tnf, &ndef_typeLength);
    friendly_type = nativeNdef_getFriendlyType(ndef_tnf, ndef_type, ndef_typeLength);
    if (friendly_type != NDEF_FRIENDLY_TYPE_TEXT)
    {
        return -1;
    }
    payload = NDEF_RecGetPayload((UINT8*)ndefBuff, &payloadLength);
    if (payload == NULL)
    {
        return -1;
    }
    langCodeLen = payload[0];
    memcpy(outText, payload + langCodeLen + 1, payloadLength - langCodeLen - 1);
    outText[payloadLength - langCodeLen - 1] = '\0';
    return 0;
}
示例#2
0
INT32 nativeNdef_readUrl(UINT8*ndefBuff, UINT32 ndefBuffLen, char * outUrl, UINT32 urlBufferLen)
{
    UINT32 prefixIdx;
    UINT32 prefixLen;
    UINT8 *payload;
    UINT32 payloadLength;
    UINT8 ndef_tnf;
    UINT8 *ndef_type;
    UINT8 ndef_typeLength;
    nfc_friendly_type_t friendly_type;

    ndef_type = NDEF_RecGetType((UINT8*)ndefBuff, &ndef_tnf, &ndef_typeLength);
    friendly_type = nativeNdef_getFriendlyType(ndef_tnf, ndef_type, ndef_typeLength);
    if (friendly_type != NDEF_FRIENDLY_TYPE_URL)
    {
        return -1;
    }
    payload = NDEF_RecGetPayload((UINT8*)ndefBuff, &payloadLength);
    if (payload == NULL)
    {
        return -1;
    }
    prefixIdx = payload[0];
    prefixLen = strlen(URI_PREFIX_MAP[prefixIdx]);
    if (urlBufferLen >= payloadLength + prefixLen)
    {
        memcpy(outUrl, URI_PREFIX_MAP[prefixIdx], prefixLen);
        memcpy(outUrl + prefixLen, payload + 1, payloadLength - 1);
    
        outUrl[prefixLen + payloadLength - 1] = '\0';
    }
    return 0;
}
示例#3
0
static tNFA_STATUS getDeviceCps(UINT8 *record, UINT8 *ref_name, UINT8 ref_len, nfc_handover_cps_t *power)
{
    UINT8 *p_ac_record, *p_ac_payload;
    UINT32 ac_payload_len;
    UINT8 cps = HANDOVER_CPS_UNKNOWN;
    UINT8 carrier_ref_name_len;

    NXPLOG_API_D ("%s: enter\n", __FUNCTION__);
    p_ac_record = NDEF_MsgGetFirstRecByType (record, NDEF_TNF_WELLKNOWN, RTD_Ac, sizeof(RTD_Ac));
    while ((p_ac_record))
    {
        NXPLOG_API_D ("%s: find ac record\n", __FUNCTION__);
        /* get payload */
        p_ac_payload = NDEF_RecGetPayload (p_ac_record, &ac_payload_len);

        if ((!p_ac_payload) || (ac_payload_len < 3))
        {
            NXPLOG_API_E ("%s: Failed to get ac payload", __FUNCTION__);
            return NFA_STATUS_FAILED;
        }

        /* Carrier Power State */
        cps = *p_ac_payload++;

        /* Carrier Data Reference Length and Characters */
        carrier_ref_name_len =  *p_ac_payload++;

        ac_payload_len -= 2;

        /* remaining must have carrier data ref and Auxiliary Data Reference Count at least */
        if (ac_payload_len > carrier_ref_name_len)
        {
            if (carrier_ref_name_len > NFA_CHO_MAX_REF_NAME_LEN)
            {
                NXPLOG_API_E ("%s: Too many bytes for carrier_ref_name, len = %d",
                                   __FUNCTION__, carrier_ref_name_len);
                return NFA_STATUS_FAILED;
            }
        }
        else
        {
            NXPLOG_API_E ("%s: Failed to parse carrier_ref_name", __FUNCTION__);
            return NFA_STATUS_FAILED;
        }

        if ((carrier_ref_name_len == ref_len) && (memcmp(p_ac_payload, ref_name, ref_len) == 0))
        {
            *power = (nfc_handover_cps_t)cps;
            return NFA_STATUS_OK;
        }

        /* get next Alternative Carrier record */
        p_ac_record = NDEF_MsgGetNextRecByType (p_ac_record, NDEF_TNF_WELLKNOWN, RTD_Ac, sizeof(RTD_Ac));
    }

    return NFA_STATUS_FAILED;
}
/*******************************************************************************
**
** Function         NDEF_MsgAppendMediaBtOobName
**
** Description      This function appends Bluetooth Local Name EIR data
**                  at the end of BT OOB Record.
**
** Returns          NDEF_OK if all OK
**
*******************************************************************************/
tNDEF_STATUS NDEF_MsgAppendMediaBtOobName (UINT8 *p_msg, UINT32 max_size, UINT32 *p_cur_size,
                                           char *p_id_str, BOOLEAN is_complete,
                                           UINT8 name_len, UINT8 *p_name)
{
    tNDEF_STATUS    status;
    UINT8          *p_rec;
    UINT8           eir_data[256];
    UINT8          *p;
    UINT8           eir_data_len;
    UINT32          oob_data_len;

    /* find record by Payload ID */
    p_rec = ndef_get_bt_oob_record (p_msg, max_size, p_cur_size, p_id_str);

    if (!p_rec)
        return (NDEF_REC_NOT_FOUND);

    /* create EIR data format for COD */
    p = eir_data;
    UINT8_TO_STREAM (p, name_len + 1);

    if (is_complete)
    {
        UINT8_TO_STREAM (p, BT_EIR_COMPLETE_LOCAL_NAME_TYPE);
    }
    else
    {
        UINT8_TO_STREAM (p, BT_EIR_SHORTENED_LOCAL_NAME_TYPE);
    }

    ARRAY_TO_STREAM (p, p_name, name_len);
    eir_data_len = name_len + 2;

    /* append EIR data at the end of record */
    status = NDEF_MsgAppendPayload(p_msg, max_size, p_cur_size,
                                   p_rec, eir_data, eir_data_len);

    /* update BT OOB data length, if success */
    if (status == NDEF_OK)
    {
        /* payload length is the same as BT OOB data length */
        p = NDEF_RecGetPayload (p_rec, &oob_data_len);

        /* Get a pointer to the payload or NULL (for none) which is valid */
        if (p)
        {
            UINT16_TO_STREAM (p, oob_data_len);
        }
    }

    return (status);
}
/*******************************************************************************
**
** Function         NDEF_MsgAppendMediaBtOobHashCRandR
**
** Description      This function appends Hash C and Rand R at the end of BT OOB Record.
**
** Returns          NDEF_OK if all OK
**
*******************************************************************************/
tNDEF_STATUS NDEF_MsgAppendMediaBtOobHashCRandR (UINT8 *p_msg, UINT32 max_size, UINT32 *p_cur_size,
                                                 char *p_id_str, UINT8 *p_hash_c, UINT8 *p_rand_r)
{
    tNDEF_STATUS    status;
    UINT8          *p_rec;
    UINT8           eir_data[BT_OOB_HASH_C_SIZE + BT_OOB_RAND_R_SIZE + 4];
    UINT8          *p;
    UINT8           eir_data_len;
    UINT32          oob_data_len;

    /* find record by Payload ID */
    p_rec = ndef_get_bt_oob_record (p_msg, max_size, p_cur_size, p_id_str);

    if (!p_rec)
        return (NDEF_REC_NOT_FOUND);

    /* create EIR data format */
    p = eir_data;

    UINT8_TO_STREAM   (p, BT_OOB_HASH_C_SIZE + 1);
    UINT8_TO_STREAM   (p, BT_EIR_OOB_SSP_HASH_C_TYPE);
    ARRAY16_TO_STREAM (p, p_hash_c);

    UINT8_TO_STREAM   (p, BT_OOB_RAND_R_SIZE + 1);
    UINT8_TO_STREAM   (p, BT_EIR_OOB_SSP_RAND_R_TYPE);
    ARRAY16_TO_STREAM (p, p_rand_r);

    eir_data_len = BT_OOB_HASH_C_SIZE + BT_OOB_RAND_R_SIZE + 4;

    /* append EIR data at the end of record */
    status = NDEF_MsgAppendPayload(p_msg, max_size, p_cur_size,
                                   p_rec, eir_data, eir_data_len);

    /* update BT OOB data length, if success */
    if (status == NDEF_OK)
    {
        /* payload length is the same as BT OOB data length */
        p = NDEF_RecGetPayload (p_rec, &oob_data_len);

        /* Get a pointer to the payload or NULL (for none) which is valid */
        if (p)
        {
            UINT16_TO_STREAM (p, oob_data_len);
        }
    }

    return (status);
}
/*******************************************************************************
**
** Function         NDEF_MsgAppendMediaBtOobEirData
**
** Description      This function appends EIR Data at the end of BT OOB Record.
**
** Returns          NDEF_OK if all OK
**
*******************************************************************************/
tNDEF_STATUS NDEF_MsgAppendMediaBtOobEirData (UINT8 *p_msg, UINT32 max_size, UINT32 *p_cur_size,
                                              char *p_id_str,
                                              UINT8 eir_type, UINT8 data_len, UINT8 *p_data)
{
    tNDEF_STATUS    status;
    UINT8          *p_rec;
    UINT8           eir_data[256];
    UINT8          *p;
    UINT8           eir_data_len;
    UINT32          oob_data_len;

    /* find record by Payload ID */
    p_rec = ndef_get_bt_oob_record (p_msg, max_size, p_cur_size, p_id_str);

    if (!p_rec)
        return (NDEF_REC_NOT_FOUND);

    /* create EIR data format */
    p = eir_data;
    UINT8_TO_STREAM (p, data_len + 1);
    UINT8_TO_STREAM (p, eir_type);
    ARRAY_TO_STREAM (p, p_data, data_len);
    eir_data_len = data_len + 2;

    /* append EIR data at the end of record */
    status = NDEF_MsgAppendPayload(p_msg, max_size, p_cur_size,
                                   p_rec, eir_data, eir_data_len);

    /* update BT OOB data length, if success */
    if (status == NDEF_OK)
    {
        /* payload length is the same as BT OOB data length */
        p = NDEF_RecGetPayload (p_rec, &oob_data_len);

        /* Get a pointer to the payload or NULL (for none) which is valid */
        if (p)
        {
            UINT16_TO_STREAM (p, oob_data_len);
        }
    }

    return (status);
}
/*******************************************************************************
**
** Function         NDEF_MsgAppendMediaBtOobCod
**
** Description      This function appends COD EIR data at the end of BT OOB Record.
**
** Returns          NDEF_OK if all OK
**
*******************************************************************************/
tNDEF_STATUS NDEF_MsgAppendMediaBtOobCod (UINT8 *p_msg, UINT32 max_size, UINT32 *p_cur_size,
                                          char *p_id_str, DEV_CLASS cod)
{
    tNDEF_STATUS    status;
    UINT8          *p_rec;
    UINT8           eir_data[BT_OOB_COD_SIZE + 2];
    UINT8          *p;
    UINT8           eir_data_len;
    UINT32          oob_data_len;

    /* find record by Payload ID */
    p_rec = ndef_get_bt_oob_record (p_msg, max_size, p_cur_size, p_id_str);

    if (!p_rec)
        return (NDEF_REC_NOT_FOUND);

    /* create EIR data format for COD */
    p = eir_data;
    UINT8_TO_STREAM (p, BT_OOB_COD_SIZE + 1);
    UINT8_TO_STREAM (p, BT_EIR_OOB_COD_TYPE);
    DEVCLASS_TO_STREAM (p, cod);
    eir_data_len = BT_OOB_COD_SIZE + 2;

    /* append EIR data at the end of record */
    status = NDEF_MsgAppendPayload(p_msg, max_size, p_cur_size,
                                   p_rec, eir_data, eir_data_len);

    /* update BT OOB data length, if success */
    if (status == NDEF_OK)
    {
        /* payload length is the same as BT OOB data length */
        p = NDEF_RecGetPayload (p_rec, &oob_data_len);

        /* Get a pointer to the payload or NULL (for none) which is valid */
        if (p)
        {
            UINT16_TO_STREAM (p, oob_data_len);
        }
    }

    return (status);
}
示例#8
0
INT32 nativeNdef_readHs(UINT8*ndefBuff, UINT32 ndefBuffLen, nfc_handover_select_t *hsInfo)
{
    UINT8 *p_hs_record;
    UINT8 *p_hs_payload;
    UINT32 hs_payload_len = 0;
    UINT8 *p_record;
    UINT8 *p_payload;
    UINT32 record_payload_len;
    UINT8 *p_id;
    UINT8 id_len;
    UINT8  version = 0;
    UINT32 index;
    UINT8 bt_len;
    UINT8 bt_type;
    UINT16 wifi_len;
    UINT16 wifi_type;
    UINT8 status = -1;

    (void)ndefBuffLen;
    if (hsInfo == NULL)
    {
        return -1;
    }
    memset(hsInfo, 0, sizeof(nfc_handover_select_t));

    /* get Handover Request record */
    p_hs_record = NDEF_MsgGetFirstRecByType (ndefBuff, NDEF_TNF_WELLKNOWN, (UINT8*)RTD_Hs, sizeof(RTD_Hs));
    if (p_hs_record)
    {
        p_hs_payload = NDEF_RecGetPayload (p_hs_record, &hs_payload_len);

        if ((!p_hs_payload) || (hs_payload_len < 7))
        {
            NXPLOG_API_E ("%s: Failed to get Hs payload (version, cr/ac record)", __FUNCTION__);
            return -1;
        }

        /* Version */
        if (NFC_FORUM_HANDOVER_VERSION != p_hs_payload[0])
        {
            NXPLOG_API_E ("%s: Version (0x%02x) not matched", __FUNCTION__, p_hs_payload[0]);
            return -1;
        }
        p_hs_payload += 1;
        hs_payload_len--;

        /* NDEF message for Collision Resolution record and Alternative Carrier records */
        if (NDEF_OK != NDEF_MsgValidate (p_hs_payload, hs_payload_len, FALSE))
        {
            NXPLOG_API_E ("%s: Failed to validate NDEF message for cr/ac records", __FUNCTION__);
            return -1;
        }
    }
    else
    {
        NXPLOG_API_E ("%s: Hs record not found", __FUNCTION__);
        return -1;
    }

    p_record = NDEF_MsgGetFirstRecByType (ndefBuff, NDEF_TNF_MEDIA,
                                          BT_OOB_REC_TYPE, BT_OOB_REC_TYPE_LEN);

    if (p_record)
    {
        status = 0;
        NXPLOG_API_D ("%s: Found BT OOB record");
        if (p_hs_record)
        {
            p_id = NDEF_RecGetId(p_record, &id_len);
            if (p_id == NULL || id_len == 0)
            {
                NXPLOG_API_E ("%s: Failed to retreive NDEF ID", __FUNCTION__);
                return -1;
            }
        
            if (getDeviceCps(p_hs_payload, p_id, id_len, &hsInfo->bluetooth.power_state)!=NFA_STATUS_OK)
            {
                hsInfo->bluetooth.power_state = HANDOVER_CPS_UNKNOWN;
            }
        }
        p_payload = NDEF_RecGetPayload(p_record, &record_payload_len);
        if (p_payload == NULL)
        {
            NXPLOG_API_E ("%s: Failed to retreive NDEF payload", __FUNCTION__);
            return -1;
        }
        hsInfo->bluetooth.type = HANDOVER_TYPE_BT;
        hsInfo->bluetooth.ndef = p_record;
        hsInfo->bluetooth.ndef_length = record_payload_len;
        index = 2;
        if (parseBluetoothAddress(&p_payload[index] , record_payload_len - index, hsInfo->bluetooth.address)!= 0)
        {
            NXPLOG_API_E ("%s: Failed to retreive device address", __FUNCTION__);
            return -1;
        }
        index += BLUETOOTH_ADDRESS_LENGTH;
        while(index < record_payload_len)
        {
            bt_len = p_payload[index++];
            bt_type = p_payload[index++];
            switch (bt_type)
            {
                case BT_HANDOVER_TYPE_SHORT_LOCAL_NAME:
                    hsInfo->bluetooth.device_name = &p_payload[index];
                    hsInfo->bluetooth.device_name_length = bt_len-1;
                    break;
                case BT_HANDOVER_TYPE_LONG_LOCAL_NAME:
                    if (hsInfo->bluetooth.device_name)
                    {
                        break;  // prefer short name
                    }
                    hsInfo->bluetooth.device_name = &p_payload[index];
                    hsInfo->bluetooth.device_name_length = bt_len-1;
                    break;
                default:
                    break;
            }
        }
    }
    else
    {
        p_record = NDEF_MsgGetFirstRecByType (ndefBuff, NDEF_TNF_MEDIA,
                                              BLE_OOB_REC_TYPE, BT_OOB_REC_TYPE_LEN);

        if (p_record)
        {
            status = 0;
            NXPLOG_API_D ("%s: Found BLE OOB record", __FUNCTION__);
            if (p_hs_record)
            {
                p_id = NDEF_RecGetId(p_record, &id_len);
                if (p_id == NULL || id_len == 0)
                {
                    NXPLOG_API_E ("%s: Failed to retreive NDEF ID", __FUNCTION__);
                    return -1;
                }
            
                if (getDeviceCps(p_hs_payload, p_id, id_len, &hsInfo->bluetooth.power_state)!=NFA_STATUS_OK)
                {
                    hsInfo->bluetooth.power_state = HANDOVER_CPS_UNKNOWN;
                }
            }
            p_payload = NDEF_RecGetPayload(p_record, &record_payload_len);
            if (p_payload == NULL)
            {
                NXPLOG_API_E ("%s: Failed to retreive NDEF payload", __FUNCTION__);
                return -1;
            }
            hsInfo->bluetooth.type = HANDOVER_TYPE_BLE;
            hsInfo->bluetooth.ndef = p_record;
            hsInfo->bluetooth.ndef_length = record_payload_len;
            index = 0;
            while(index < record_payload_len)
            {
                bt_len = p_payload[index++];
                bt_type = p_payload[index++];
                switch (bt_type)
                {
                    case BT_HANDOVER_TYPE_MAC:
                        parseBluetoothAddress(&p_payload[index] , record_payload_len - index, hsInfo->bluetooth.address);
                        break;
                    case BT_HANDOVER_TYPE_SHORT_LOCAL_NAME:
                        hsInfo->bluetooth.device_name = &p_payload[index];
                        hsInfo->bluetooth.device_name_length = bt_len-1;
                        break;
                    case BT_HANDOVER_TYPE_LONG_LOCAL_NAME:
                        if (hsInfo->bluetooth.device_name)
                        {
                            break;  // prefer short name
                        }
                        hsInfo->bluetooth.device_name = &p_payload[index];
                        hsInfo->bluetooth.device_name_length = bt_len-1;
                        break;
                    default:
                        break;
                }
            }        
        }
    }
    p_record = NDEF_MsgGetFirstRecByType (ndefBuff, NDEF_TNF_MEDIA,
                                          WIFI_WSC_REC_TYPE, WIFI_WSC_REC_TYPE_LEN);

    if (p_record)
    {
        status = 0;
        NXPLOG_API_D ("%s: Found WiFi record", __FUNCTION__);
        if (p_hs_record)
        {
            p_id = NDEF_RecGetId(p_record, &id_len);
            if (p_id == NULL || id_len == 0)
            {
                NXPLOG_API_E ("%s: Failed to retreive NDEF ID", __FUNCTION__);
                return -1;
            }
        
            if (getDeviceCps(p_hs_payload, p_id, id_len, &hsInfo->wifi.power_state)!=NFA_STATUS_OK)
            {
                hsInfo->wifi.power_state = HANDOVER_CPS_UNKNOWN;
            }
        }
        p_payload = NDEF_RecGetPayload(p_record, &record_payload_len);
        if (p_payload == NULL)
        {
            NXPLOG_API_E ("%s: Failed to retreive NDEF payload", __FUNCTION__);
            return -1;
        }
        hsInfo->wifi.ndef = p_record;
        hsInfo->wifi.ndef_length = record_payload_len;
        index = 0;
        while(index < record_payload_len)
        {
            /* wifi type is a 2 byte field*/
            wifi_type = p_payload[index++];
            wifi_type = wifi_type << 8;
            wifi_type += p_payload[index++];

            /* wifi len is a 2 byte field */
            wifi_len = p_payload[index++];
            wifi_len = wifi_len << 8;
            wifi_len += p_payload[index++];

            switch (wifi_type)
            {
                case WIFI_HANDOVER_SSID_ID:
                    hsInfo->wifi.ssid_length = wifi_len;
                    hsInfo->wifi.ssid = &p_payload[index];
                    index += hsInfo->wifi.ssid_length;
                    break;
                case WIFI_HANDOVER_NETWORK_KEY_ID:
                    hsInfo->wifi.key_length = wifi_len;
                    hsInfo->wifi.key = &p_payload[index];
                    index += hsInfo->wifi.key_length;
                    break;
                default:
                    break;
            }
        }
    }
    return status;
}
示例#9
0
INT32 nativeNdef_readHr(UINT8*ndefBuff, UINT32 ndefBuffLen, nfc_handover_request_t *hrInfo)
{
    UINT8 *p_hr_record;
    UINT8 *p_hr_payload;
    UINT32 hr_payload_len = 0;
    UINT8 *p_record;
    UINT8 *p_payload;
    UINT32 record_payload_len;
    UINT8 *p_id;
    UINT8 id_len;
    UINT8   version = 0;
    UINT32 index;
    UINT8 len;
    UINT8 type;

    (void)ndefBuffLen;
    if (hrInfo == NULL)
    {
        return -1;
    }
    memset(hrInfo, 0, sizeof(nfc_handover_request_t));
    NXPLOG_API_D ("%s: enter", __FUNCTION__);

    /* get Handover Request record */
    p_hr_record = NDEF_MsgGetFirstRecByType (ndefBuff, NDEF_TNF_WELLKNOWN, (UINT8*)RTD_Hr, sizeof(RTD_Hr));
    if (p_hr_record)
    {
        NXPLOG_API_E ("%s: Find Hr record", __FUNCTION__);
        p_hr_payload = NDEF_RecGetPayload (p_hr_record, &hr_payload_len);

        if ((!p_hr_payload) || (hr_payload_len < 7))
        {
            NXPLOG_API_E ("%s: Failed to get Hr payload (version, cr/ac record)", __FUNCTION__);
            return -1;
        }

        /* Version */
        if (NFC_FORUM_HANDOVER_VERSION != p_hr_payload[0])
        {
            NXPLOG_API_E ("%s: Version (0x%02x) not matched", __FUNCTION__, p_hr_payload[0]);
            return -1;
        }
        p_hr_payload += 1;
        hr_payload_len--;

        /* NDEF message for Collision Resolution record and Alternative Carrier records */
        if (NDEF_OK != NDEF_MsgValidate (p_hr_payload, hr_payload_len, FALSE))
        {
            NXPLOG_API_E ("%s: Failed to validate NDEF message for cr/ac records", __FUNCTION__);
            return -1;
        }
    }

    p_record = NDEF_MsgGetFirstRecByType (ndefBuff, NDEF_TNF_MEDIA,
                                          BT_OOB_REC_TYPE, BT_OOB_REC_TYPE_LEN);

    if (p_record)
    {
        NXPLOG_API_D ("%s: Found BT OOB record", __FUNCTION__);
        if (p_hr_record)
        {
            p_id = NDEF_RecGetId(p_record, &id_len);
            if (p_id == NULL || id_len == 0)
            {
                NXPLOG_API_E ("%s: Failed to retreive NDEF ID", __FUNCTION__);
                return -1;
            }
        
            if (getDeviceCps(p_hr_payload, p_id, id_len, &hrInfo->bluetooth.power_state)!=NFA_STATUS_OK)
            {
                hrInfo->bluetooth.power_state = HANDOVER_CPS_UNKNOWN;
            }
        }
        p_payload = NDEF_RecGetPayload(p_record, &record_payload_len);
        if (p_payload == NULL)
        {
            NXPLOG_API_E ("%s: Failed to retreive NDEF payload", __FUNCTION__);
            return -1;
        }
        hrInfo->bluetooth.type = HANDOVER_TYPE_BT;
        hrInfo->bluetooth.ndef = p_record;
        hrInfo->bluetooth.ndef_length = record_payload_len;
        index = 2;
        if (parseBluetoothAddress(&p_payload[index] , record_payload_len - index, hrInfo->bluetooth.address)!= 0)
        {
            NXPLOG_API_E ("%s: Failed to retreive device address", __FUNCTION__);
            return -1;
        }
        index += BLUETOOTH_ADDRESS_LENGTH;
        while(index < record_payload_len)
        {
            len = p_payload[index++];
            type = p_payload[index++];
            switch (type)
            {
                case BT_HANDOVER_TYPE_SHORT_LOCAL_NAME:
                    hrInfo->bluetooth.device_name = p_payload;
                    hrInfo->bluetooth.device_name_length = len;
                    break;
                case BT_HANDOVER_TYPE_LONG_LOCAL_NAME:
                    if (hrInfo->bluetooth.device_name)
                    {
                        break;  // prefer short name
                    }
                    hrInfo->bluetooth.device_name = p_payload;
                    hrInfo->bluetooth.device_name_length = len;
                    break;
                default:
                    index += (len - 1);
                    break;
            }
        }
    }
    else
    {
        p_record = NDEF_MsgGetFirstRecByType (ndefBuff, NDEF_TNF_MEDIA,
                                              BLE_OOB_REC_TYPE, BT_OOB_REC_TYPE_LEN);

        if (p_record)
        {
            NXPLOG_API_D ("%s: Found BLE OOB record", __FUNCTION__);
            if (p_hr_record)
            {
                p_id = NDEF_RecGetId(p_record, &id_len);
                if (p_id == NULL || id_len == 0)
                {
                    NXPLOG_API_E ("%s: Failed to retreive NDEF ID", __FUNCTION__);
                    return -1;
                }
            
                if (getDeviceCps(p_hr_payload, p_id, id_len, &hrInfo->bluetooth.power_state)!=NFA_STATUS_OK)
                {
                    hrInfo->bluetooth.power_state = HANDOVER_CPS_UNKNOWN;
                }
            }

            p_payload = NDEF_RecGetPayload(p_record, &record_payload_len);
            if (p_payload == NULL)
            {
                NXPLOG_API_E ("%s: Failed to retreive NDEF payload", __FUNCTION__);
                return -1;
            }
            hrInfo->bluetooth.type = HANDOVER_TYPE_BLE;
            hrInfo->bluetooth.ndef = p_record;
            hrInfo->bluetooth.ndef_length = record_payload_len;
            index = 0;
            while(index < record_payload_len)
            {
                len = p_payload[index++];
                type = p_payload[index++];
                switch (type)
                {
                    case BT_HANDOVER_TYPE_MAC:
                        parseBluetoothAddress(&p_payload[index] , record_payload_len - index, hrInfo->bluetooth.address);
                        break;
                    case BT_HANDOVER_TYPE_SHORT_LOCAL_NAME:
                        hrInfo->bluetooth.device_name = p_payload;
                        hrInfo->bluetooth.device_name_length = len;
                        break;
                    case BT_HANDOVER_TYPE_LONG_LOCAL_NAME:
                        if (hrInfo->bluetooth.device_name)
                        {
                            break;  // prefer short name
                        }
                        hrInfo->bluetooth.device_name = p_payload;
                        hrInfo->bluetooth.device_name_length = len;
                        break;
                    default:
                        index += (len - 1);
                        break;
                }
            }        
        }
    }
    p_record = NDEF_MsgGetFirstRecByType (ndefBuff, NDEF_TNF_MEDIA,
                                          WIFI_WSC_REC_TYPE, WIFI_WSC_REC_TYPE_LEN);

    if (p_record)
    {
        NXPLOG_API_D ("%s: Found WiFi record", __FUNCTION__);
        hrInfo->wifi.has_wifi = TRUE;
        hrInfo->wifi.ndef = p_record;
        hrInfo->wifi.ndef_length = record_payload_len;
    }
    return 0;
}
/*******************************************************************************
**
** Function         NDEF_MsgAddWktAc
**
** Description      This function adds Alternative Carrier Record.
**
** Returns          NDEF_OK if all OK
**
*******************************************************************************/
tNDEF_STATUS NDEF_MsgAddWktAc (UINT8 *p_msg, UINT32 max_size, UINT32 *p_cur_size,
                               UINT8 cps, char *p_carrier_data_ref_str,
                               UINT8 aux_data_ref_count, char *p_aux_data_ref_str[])
{
    tNDEF_STATUS    status;
    UINT32          payload_len;
    UINT8           ref_str_len, xx;
    UINT8 *p_rec, *p;

    /* get payload length first */

    /* CPS, length of carrier data ref, carrier data ref, Aux data reference count */
    payload_len = 3 + (UINT8)strlen (p_carrier_data_ref_str);
    for (xx = 0; xx < aux_data_ref_count; xx++)
    {
        /* Aux Data Reference length (1 byte) */
        payload_len += 1 + (UINT8)strlen (p_aux_data_ref_str[xx]);
    }

    /* reserve memory for payload */
    status = NDEF_MsgAddRec (p_msg, max_size, p_cur_size,
                             NDEF_TNF_WKT, ac_rec_type, AC_REC_TYPE_LEN,
                             NULL, 0, NULL, payload_len);

    if (status == NDEF_OK)
    {
        /* get AC record added at the end */
        p_rec = NDEF_MsgGetLastRecInMsg (p_msg);

        /* get start pointer of reserved payload */
        p = NDEF_RecGetPayload (p_rec, &payload_len);

        /* Get a pointer to the payload or NULL (for none) which is valid */
        if (p)
        {
            /* Add Carrier Power State */
            UINT8_TO_BE_STREAM (p, cps);

            /* Carrier Data Reference length */
            ref_str_len = (UINT8)strlen (p_carrier_data_ref_str);

            UINT8_TO_BE_STREAM (p, ref_str_len);

            /* Carrier Data Reference */
            ARRAY_TO_BE_STREAM (p, p_carrier_data_ref_str, ref_str_len);

            /* Aux Data Reference Count */
            UINT8_TO_BE_STREAM (p, aux_data_ref_count);

            for (xx = 0; xx < aux_data_ref_count; xx++)
            {
                /* Aux Data Reference length (1 byte) */
                ref_str_len = (UINT8)strlen (p_aux_data_ref_str[xx]);

                UINT8_TO_BE_STREAM (p, ref_str_len);

                /* Aux Data Reference */
                ARRAY_TO_BE_STREAM (p, p_aux_data_ref_str[xx], ref_str_len);
            }
        }
    }

    return (status);
}