Bluetooth® OPP API
Overview
OPP (Object Push Profile) enables pushing objects such as vCards and other files between Bluetooth devices over OBEX. It is commonly used for contact exchange, file sharing, and similar one-way object transfer scenarios. The OPP API provides functionality for both server and client roles.
Application Examples
bluetooth/bluedroid/classic_bt/bt_opp_server demonstrates how to implement an OPP server that receives objects.
bluetooth/bluedroid/classic_bt/bt_opp_client demonstrates how to implement an OPP client that discovers the server by device name and sends sample vCards.
API Reference
Header File
This header file can be included with:
#include "esp_opp_api.h"
This header file is a part of the API provided by the
btcomponent. To declare that your component depends onbt, add the following to your CMakeLists.txt:REQUIRES bt
or
PRIV_REQUIRES bt
Functions
-
esp_err_t esp_opp_server_register_callback(esp_opp_server_callback_t callback)
This function is called to register a user callback for OPP server.
- Parameters:
callback -- [in] pointer to the user callback function.
- Returns:
ESP_OK: success
other: failed
-
esp_err_t esp_opp_client_register_callback(esp_opp_client_callback_t callback)
This function is called to register a user callback for OPP client.
- Parameters:
callback -- [in] pointer to the user callback function.
- Returns:
ESP_OK: success
other: failed
-
esp_err_t esp_opp_server_init(void)
This function is called to initialize OPP server.
Acquires the shared OPP VFS (read side). When the operation is completed, the callback function will be called with ESP_OPP_SERVER_INIT_EVT. This function should be called after esp_bluedroid_enable() and esp_opp_server_register_callback() complete successfully.
- Returns:
ESP_OK: success
other: failed
-
esp_err_t esp_opp_server_deinit(void)
This function is called to deinitialize OPP server.
Active server connections are closed first. When the operation is completed, the callback function will be called with ESP_OPP_SERVER_DEINIT_EVT. This function should be called after esp_opp_server_init() completes successfully.
Finish all OPP VFS read/write and close() every OPP fd before calling this function.
- Returns:
ESP_OK: success
other: failed
-
esp_err_t esp_opp_server_start(const esp_opp_server_cfg_t *cfg)
This function creates an OPP server and starts listening for inbound connections.
When the server is started successfully, the callback is called with ESP_OPP_SERVER_START_EVT. When an inbound connection is established or released, the callback is called with ESP_OPP_SERVER_CONNECTION_STATE_EVT. This function should be called after esp_opp_server_init() completes successfully.
- Parameters:
cfg -- [in] OPP server configuration.
- Returns:
ESP_OK: success
other: failed
-
esp_err_t esp_opp_server_stop(void)
This function stops the OPP server.
When the operation is completed, the callback function will be called with ESP_OPP_SERVER_STOP_EVT. This function should be called after esp_opp_server_start() completes successfully.
- Returns:
ESP_OK: success
other: failed
-
esp_err_t esp_opp_server_accept(esp_opp_conn_hdl_t handle)
Accept a pending incoming object.
Call this when ESP_OPP_SERVER_INCOMING_OBJECT_EVT reports needs_accept == true (auto_accept is false and this is the first object on the connection). The first PUT is held without an OBEX response until accept, reject, or the stack accept timeout (~30s). Accept also authorizes further objects on the same connection and unblocks body delivery from the peer. When the operation is completed, the callback is called with ESP_OPP_SERVER_ACCEPT_EVT (status, handle, fd). After a successful accept, read(fd) until EOF (0), then close(fd).
- Parameters:
handle -- [in] Connection handle from ESP_OPP_SERVER_INCOMING_OBJECT_EVT.
- Returns:
ESP_OK: request posted; result is in ESP_OPP_SERVER_ACCEPT_EVT
other: failed
-
esp_err_t esp_opp_server_reject(esp_opp_conn_hdl_t handle)
Reject a pending incoming object and close the connection.
Sends OBEX Forbidden and cancels the whole batch on that connection (subsequent objects are not received).
- Parameters:
handle -- [in] Connection handle from ESP_OPP_SERVER_INCOMING_OBJECT_EVT.
- Returns:
ESP_OK: success
other: failed
-
esp_err_t esp_opp_server_cancel(esp_opp_conn_hdl_t handle)
Cancel the current incoming object transfer on the server connection.
- Parameters:
handle -- [in] Connection handle.
- Returns:
ESP_OK: success
other: failed
-
esp_err_t esp_opp_client_init(void)
This function is called to initialize OPP client.
Acquires the shared OPP VFS (write side). When the operation is completed, the callback function will be called with ESP_OPP_CLIENT_INIT_EVT. This function should be called after esp_bluedroid_enable() and esp_opp_client_register_callback() complete successfully.
- Returns:
ESP_OK: success
other: failed
-
esp_err_t esp_opp_client_deinit(void)
This function is called to deinitialize OPP client.
Active client connections are closed first. When the operation is completed, the callback function will be called with ESP_OPP_CLIENT_DEINIT_EVT. This function should be called after esp_opp_client_init() completes successfully.
Finish all OPP VFS read/write and close() every OPP fd before calling this function.
- Returns:
ESP_OK: success
other: failed
-
esp_err_t esp_opp_client_connect(const esp_opp_client_connect_param_t *param)
This function connects OPP client to a remote OPP server.
When the connection is established or failed, the callback is called with ESP_OPP_CLIENT_CONNECTION_STATE_EVT. This function should be called after esp_opp_client_init() completes successfully.
- Parameters:
param -- [in] Connect parameters including peer address and security.
- Returns:
ESP_OK: success
other: failed
-
esp_err_t esp_opp_client_disconnect(esp_opp_conn_hdl_t handle)
This function disconnects the OPP client from the remote OPP server.
When the operation is completed, the callback function will be called with ESP_OPP_CLIENT_CONNECTION_STATE_EVT. This function should be called after a successful connection.
- Parameters:
handle -- [in] Connection handle from ESP_OPP_CLIENT_CONNECTION_STATE_EVT.
- Returns:
ESP_OK: success
other: failed
-
esp_err_t esp_opp_client_open_object(const esp_opp_client_object_cfg_t *cfg)
Open a VFS write fd for pushing one object on an OPP client connection.
When the operation is completed, the callback is called with ESP_OPP_CLIENT_OPEN_EVT (status, handle, fd). On success, write the object body with write(fd), then close(fd) to send End-of-Body. The total bytes written must equal cfg->len. Transfer completion is reported by ESP_OPP_CLIENT_TRANSFER_COMPLETE_EVT.
After each OBEX CONNECT/PUT/DISCONNECT request, the stack waits up to ~30s for the peer response (Continue/OK). No response aborts the transfer (if any) and closes the connection. Waiting for the application to write(fd) does not consume that timeout.
- Parameters:
cfg -- [in] Object metadata and connection handle.
- Returns:
ESP_OK: request posted; result is in ESP_OPP_CLIENT_OPEN_EVT
other: failed
-
esp_err_t esp_opp_client_cancel(esp_opp_conn_hdl_t handle)
Cancel the current outgoing object transfer on the client connection.
- Parameters:
handle -- [in] Connection handle.
- Returns:
ESP_OK: success
other: failed
-
esp_err_t esp_opp_get_profile_status(esp_opp_profile_status_t *profile_status)
This function is used to get the status of OPP.
- Parameters:
profile_status -- [out] OPP status
- Returns:
ESP_OK: success
other: failed
Unions
-
union esp_opp_server_param_t
- #include <esp_opp_api.h>
OPP server callback parameters.
Public Members
-
struct esp_opp_server_param_t::opp_server_init_evt_param init
OPP server callback param of ESP_OPP_SERVER_INIT_EVT
-
struct esp_opp_server_param_t::opp_server_deinit_evt_param deinit
OPP server callback param of ESP_OPP_SERVER_DEINIT_EVT
-
struct esp_opp_server_param_t::opp_server_start_evt_param start
OPP server callback param of ESP_OPP_SERVER_START_EVT
-
struct esp_opp_server_param_t::opp_server_stop_evt_param stop
OPP server callback param of ESP_OPP_SERVER_STOP_EVT
-
struct esp_opp_server_param_t::opp_server_conn_evt_param conn
OPP server callback param of ESP_OPP_SERVER_CONNECTION_STATE_EVT
-
struct esp_opp_server_param_t::opp_server_incoming_object_evt_param incoming
OPP server callback param of ESP_OPP_SERVER_INCOMING_OBJECT_EVT
-
struct esp_opp_server_param_t::opp_server_accept_evt_param accept
OPP server callback param of ESP_OPP_SERVER_ACCEPT_EVT
-
struct esp_opp_server_param_t::opp_server_progress_evt_param progress
OPP server callback param of ESP_OPP_SERVER_PROGRESS_EVT
-
struct esp_opp_server_param_t::opp_server_complete_evt_param complete
OPP server callback param of ESP_OPP_SERVER_TRANSFER_COMPLETE_EVT
-
struct opp_server_accept_evt_param
- #include <esp_opp_api.h>
ESP_OPP_SERVER_ACCEPT_EVT.
Public Members
-
esp_bt_status_t status
status
-
esp_opp_conn_hdl_t handle
Connection handle
-
int fd
VFS read file descriptor; -1 on failure
-
esp_bt_status_t status
-
struct opp_server_complete_evt_param
- #include <esp_opp_api.h>
ESP_OPP_SERVER_TRANSFER_COMPLETE_EVT.
Public Members
-
esp_opp_conn_hdl_t handle
Connection handle
-
esp_bt_status_t status
Transfer result
-
uint32_t transferred
Bytes received when transfer ended
-
esp_opp_conn_hdl_t handle
-
struct opp_server_conn_evt_param
- #include <esp_opp_api.h>
ESP_OPP_SERVER_CONNECTION_STATE_EVT.
Public Members
-
esp_opp_conn_hdl_t handle
Connection handle
-
esp_opp_connection_state_t state
Connection state
-
esp_bt_status_t status
status
-
esp_bd_addr_t bd_addr
Peer Bluetooth device address
-
esp_opp_conn_hdl_t handle
-
struct opp_server_deinit_evt_param
- #include <esp_opp_api.h>
ESP_OPP_SERVER_DEINIT_EVT.
Public Members
-
esp_bt_status_t status
status
-
esp_bt_status_t status
-
struct opp_server_incoming_object_evt_param
- #include <esp_opp_api.h>
ESP_OPP_SERVER_INCOMING_OBJECT_EVT.
Public Members
-
esp_opp_conn_hdl_t handle
Connection handle
-
const char *name
Object name; valid only during the callback
-
const char *type
Object MIME type; may be NULL
-
uint32_t len
Declared object length; 0 if unknown
-
int fd
VFS fd for reading the object body; -1 if needs_accept (fd is delivered in ESP_OPP_SERVER_ACCEPT_EVT)
-
bool needs_accept
true: call esp_opp_server_accept/reject; false: already authorized, read(fd) directly
-
esp_opp_conn_hdl_t handle
-
struct opp_server_init_evt_param
- #include <esp_opp_api.h>
ESP_OPP_SERVER_INIT_EVT.
Public Members
-
esp_bt_status_t status
status
-
esp_bt_status_t status
-
struct opp_server_progress_evt_param
- #include <esp_opp_api.h>
ESP_OPP_SERVER_PROGRESS_EVT.
Public Members
-
esp_opp_conn_hdl_t handle
Connection handle
-
uint32_t transferred
Bytes received so far
-
uint32_t total
Declared total length; 0 if unknown
-
esp_opp_conn_hdl_t handle
-
struct opp_server_start_evt_param
- #include <esp_opp_api.h>
ESP_OPP_SERVER_START_EVT.
-
struct opp_server_stop_evt_param
- #include <esp_opp_api.h>
ESP_OPP_SERVER_STOP_EVT.
Public Members
-
esp_bt_status_t status
status
-
esp_bt_status_t status
-
struct esp_opp_server_param_t::opp_server_init_evt_param init
-
union esp_opp_client_param_t
- #include <esp_opp_api.h>
OPP client callback parameters.
Public Members
-
struct esp_opp_client_param_t::opp_client_init_evt_param init
OPP client callback param of ESP_OPP_CLIENT_INIT_EVT
-
struct esp_opp_client_param_t::opp_client_deinit_evt_param deinit
OPP client callback param of ESP_OPP_CLIENT_DEINIT_EVT
-
struct esp_opp_client_param_t::opp_client_conn_evt_param conn
OPP client callback param of ESP_OPP_CLIENT_CONNECTION_STATE_EVT
-
struct esp_opp_client_param_t::opp_client_open_evt_param open
OPP client callback param of ESP_OPP_CLIENT_OPEN_EVT
-
struct esp_opp_client_param_t::opp_client_progress_evt_param progress
OPP client callback param of ESP_OPP_CLIENT_PROGRESS_EVT
-
struct esp_opp_client_param_t::opp_client_complete_evt_param complete
OPP client callback param of ESP_OPP_CLIENT_TRANSFER_COMPLETE_EVT
-
struct opp_client_complete_evt_param
- #include <esp_opp_api.h>
ESP_OPP_CLIENT_TRANSFER_COMPLETE_EVT.
Public Members
-
esp_opp_conn_hdl_t handle
Connection handle
-
esp_bt_status_t status
Transfer result
-
uint32_t transferred
Bytes sent when transfer ended
-
esp_opp_conn_hdl_t handle
-
struct opp_client_conn_evt_param
- #include <esp_opp_api.h>
ESP_OPP_CLIENT_CONNECTION_STATE_EVT.
Public Members
-
esp_opp_conn_hdl_t handle
Connection handle
-
esp_opp_connection_state_t state
Connection state
-
esp_bt_status_t status
status
-
esp_bd_addr_t bd_addr
Peer Bluetooth device address
-
esp_opp_conn_hdl_t handle
-
struct opp_client_deinit_evt_param
- #include <esp_opp_api.h>
ESP_OPP_CLIENT_DEINIT_EVT.
Public Members
-
esp_bt_status_t status
status
-
esp_bt_status_t status
-
struct opp_client_init_evt_param
- #include <esp_opp_api.h>
ESP_OPP_CLIENT_INIT_EVT.
Public Members
-
esp_bt_status_t status
status
-
esp_bt_status_t status
-
struct opp_client_open_evt_param
- #include <esp_opp_api.h>
ESP_OPP_CLIENT_OPEN_EVT.
Public Members
-
esp_bt_status_t status
status
-
esp_opp_conn_hdl_t handle
Connection handle
-
int fd
VFS write file descriptor; -1 on failure
-
esp_bt_status_t status
-
struct opp_client_progress_evt_param
- #include <esp_opp_api.h>
ESP_OPP_CLIENT_PROGRESS_EVT.
Public Members
-
esp_opp_conn_hdl_t handle
Connection handle
-
uint32_t transferred
Bytes sent so far
-
uint32_t total
Declared total length
-
esp_opp_conn_hdl_t handle
-
struct esp_opp_client_param_t::opp_client_init_evt_param init
Structures
-
struct esp_opp_profile_status_t
OPP profile status parameters.
-
struct esp_opp_server_cfg_t
OPP server start configuration parameters.
Public Members
-
esp_bt_sec_t sec_mask
Security setting mask.
Note
Suggest using one of:
ESP_BT_SEC_NONE
ESP_BT_SEC_AUTHENTICATE
(ESP_BT_SEC_AUTHENTICATE | ESP_BT_SEC_ENCRYPT)
-
uint16_t mtu
Preferred OBEX packet length, range: ESP_OPP_MTU_MIN ~ ESP_OPP_MTU_MAX; 0 means transport default
-
const char *service_name
SDP service name; NULL uses stack default
-
const uint8_t *supported_formats
Supported formats list for SDP; NULL means any type
-
uint8_t supported_formats_len
Number of bytes in supported_formats
-
bool auto_accept
true: accept every object automatically. false: accept once per OBEX connection (first object needs esp_opp_server_accept; later objects on the same connection are auto-accepted)
-
esp_bt_sec_t sec_mask
-
struct esp_opp_client_connect_param_t
OPP client connect parameters.
Public Members
-
esp_bd_addr_t bd_addr
Remote device Bluetooth address
-
esp_bt_sec_t sec_mask
Security setting mask.
Note
Suggest using one of:
ESP_BT_SEC_NONE
ESP_BT_SEC_AUTHENTICATE
(ESP_BT_SEC_AUTHENTICATE | ESP_BT_SEC_ENCRYPT)
-
uint16_t mtu
Preferred OBEX packet length, range: ESP_OPP_MTU_MIN ~ ESP_OPP_MTU_MAX; 0 means transport default
-
esp_bd_addr_t bd_addr
-
struct esp_opp_client_object_cfg_t
OPP client object open parameters.
After ESP_OPP_CLIENT_OPEN_EVT reports success, write object body bytes with write(fd), then close(fd) to finish the object (End-of-Body). The number of bytes written must equal len.
Public Members
-
esp_opp_conn_hdl_t handle
Connection handle from CONNECTION_STATE_EVT
-
const char *name
Object name; ASCII is encoded as OBEX UTF-16BE
-
const char *type
MIME type, for example text/x-vcard; may be NULL
-
uint32_t len
Declared object length (OBEX Length header)
-
esp_opp_conn_hdl_t handle
Macros
-
ESP_OPP_INVALID_HANDLE
Invalid OPP connection handle
-
ESP_OPP_MAX_NAME_LEN
Maximum object name length (ASCII bytes)
-
ESP_OPP_MAX_TYPE_LEN
Maximum MIME type length
-
ESP_OPP_MTU_MIN
Minimal MTU can be used in OPP connection
-
ESP_OPP_MTU_MAX
Maximum MTU can be used in OPP connection
-
ESP_OPP_FORMAT_VCARD_2_1
OPP supported formats for SDP (GOEP Supported Formats List).
vCard 2.1
-
ESP_OPP_FORMAT_VCARD_3_0
vCard 3.0
-
ESP_OPP_FORMAT_VCAL_1_0
vCal 1.0
-
ESP_OPP_FORMAT_ICAL_2_0
iCal 2.0
-
ESP_OPP_FORMAT_VNOTE
vNote
-
ESP_OPP_FORMAT_VMESSAGE
vMessage
-
ESP_OPP_FORMAT_ANY
Any type of object
-
ESP_BT_STATUS_OPP_NOT_FOUND
OPP profile error code.
OPP: requested object/connection not found
-
ESP_BT_STATUS_OPP_ABORTED
OPP: transfer aborted (local cancel or response timeout)
-
ESP_BT_STATUS_OPP_SDP_FAIL
OPP: operation failed during SDP
-
ESP_BT_STATUS_OPP_OBEX_FAIL
OPP: operation failed during OBEX/GOEP
-
ESP_BT_STATUS_OPP_FORBIDDEN
OPP: operation refused (OBEX Forbidden)
Type Definitions
-
typedef uint16_t esp_opp_conn_hdl_t
OPP connection handle
-
typedef void (*esp_opp_server_callback_t)(esp_opp_server_cb_event_t event, esp_opp_server_param_t *param)
OPP server callback function type.
- Param event:
[in] Event type
- Param param:
[in] Pointer to callback parameter
-
typedef void (*esp_opp_client_callback_t)(esp_opp_client_cb_event_t event, esp_opp_client_param_t *param)
OPP client callback function type.
- Param event:
[in] Event type
- Param param:
[in] Pointer to callback parameter
Enumerations
-
enum esp_opp_server_cb_event_t
OPP server callback events.
Values:
-
enumerator ESP_OPP_SERVER_INIT_EVT
When OPP server is initialized, the event comes
-
enumerator ESP_OPP_SERVER_DEINIT_EVT
When OPP server is deinitialized, the event comes
-
enumerator ESP_OPP_SERVER_START_EVT
When OPP server starts listening, the event comes
-
enumerator ESP_OPP_SERVER_STOP_EVT
When OPP server stops listening, the event comes
-
enumerator ESP_OPP_SERVER_CONNECTION_STATE_EVT
When inbound OPP connection state changes, the event comes
-
enumerator ESP_OPP_SERVER_INCOMING_OBJECT_EVT
When a peer starts pushing an object, the event comes
-
enumerator ESP_OPP_SERVER_ACCEPT_EVT
When esp_opp_server_accept completes, the event comes
-
enumerator ESP_OPP_SERVER_PROGRESS_EVT
When incoming object transfer progress updates, the event comes
-
enumerator ESP_OPP_SERVER_TRANSFER_COMPLETE_EVT
When an incoming object transfer finishes, the event comes
-
enumerator ESP_OPP_SERVER_INIT_EVT
-
enum esp_opp_client_cb_event_t
OPP client callback events.
Values:
-
enumerator ESP_OPP_CLIENT_INIT_EVT
When OPP client is initialized, the event comes
-
enumerator ESP_OPP_CLIENT_DEINIT_EVT
When OPP client is deinitialized, the event comes
-
enumerator ESP_OPP_CLIENT_CONNECTION_STATE_EVT
When outbound OPP connection state changes, the event comes
-
enumerator ESP_OPP_CLIENT_OPEN_EVT
When esp_opp_client_open_object completes, the event comes
-
enumerator ESP_OPP_CLIENT_PROGRESS_EVT
When outgoing object transfer progress updates, the event comes
-
enumerator ESP_OPP_CLIENT_TRANSFER_COMPLETE_EVT
When an outgoing object transfer finishes, the event comes
-
enumerator ESP_OPP_CLIENT_INIT_EVT