Skip to content

Commit 88a9009

Browse files
committed
Merge branch 'controller/pairing_command_callbacks' into 'main'
controller: add APIs to set callbacks for pairing command Closes CON-1420 See merge request app-frameworks/esp-matter!960
2 parents bd3092a + 22aa659 commit 88a9009

File tree

2 files changed

+71
-94
lines changed

2 files changed

+71
-94
lines changed

components/esp_matter_controller/commands/esp_matter_controller_pairing_command.cpp

+48-63
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,11 @@
1212
// See the License for the specific language governing permissions and
1313
// limitations under the License.
1414

15+
#include <credentials/FabricTable.h>
1516
#include <esp_log.h>
1617
#include <esp_matter_controller_client.h>
1718
#include <esp_matter_controller_pairing_command.h>
19+
#include <optional>
1820

1921
static const char *TAG = "pairing_command";
2022

@@ -24,71 +26,48 @@ using namespace chip::Controller;
2426
namespace esp_matter {
2527
namespace controller {
2628

27-
void pairing_command::OnStatusUpdate(DevicePairingDelegate::Status status)
28-
{
29-
switch (status) {
30-
case DevicePairingDelegate::Status::SecurePairingSuccess:
31-
ESP_LOGI(TAG, "Secure Pairing Success");
32-
break;
33-
case DevicePairingDelegate::Status::SecurePairingFailed:
34-
ESP_LOGI(TAG, "Secure Pairing Failed");
35-
break;
36-
}
37-
}
38-
3929
void pairing_command::OnPairingComplete(CHIP_ERROR err)
4030
{
4131
if (err == CHIP_NO_ERROR) {
42-
ESP_LOGI(TAG, "Pairing Success");
32+
ESP_LOGI(TAG, "PASE session establishment success");
4333
} else {
44-
ESP_LOGI(TAG, "Pairing Failure: Matter-%s", ErrorStr(err));
34+
ESP_LOGI(TAG, "PASE session establishment failure: Matter-%s", ErrorStr(err));
35+
auto &controller_instance = esp_matter::controller::matter_controller_client::get_instance();
36+
controller_instance.get_commissioner()->RegisterPairingDelegate(nullptr);
4537
}
46-
}
47-
48-
void pairing_command::OnPairingDeleted(CHIP_ERROR err)
49-
{
50-
if (err == CHIP_NO_ERROR) {
51-
ESP_LOGI(TAG, "Pairing Deleted Success");
52-
} else {
53-
ESP_LOGI(TAG, "Pairing Deleted Failure: Matter-%s", ErrorStr(err));
38+
if (m_callbacks.pase_callback) {
39+
m_callbacks.pase_callback(err);
5440
}
5541
}
5642

57-
void pairing_command::OnCommissioningComplete(NodeId nodeId, CHIP_ERROR err)
43+
void pairing_command::OnCommissioningSuccess(chip::PeerId peerId)
5844
{
59-
if (err == CHIP_NO_ERROR) {
60-
ESP_LOGI(TAG, "Device commissioning completed with success - getting OperationalDeviceProxy");
61-
auto &controller_instance = esp_matter::controller::matter_controller_client::get_instance();
62-
controller_instance.get_commissioner()->GetConnectedDevice(nodeId, &mOnDeviceConnectedCallback,
63-
&mOnDeviceConnectionFailureCallback);
64-
} else {
65-
ESP_LOGI(TAG, "Device commissioning Failure: Matter%s", ErrorStr(err));
45+
ESP_LOGI(TAG, "Commissioning success with node %" PRIX64 "-%" PRIX64, peerId.GetCompressedFabricId(),
46+
peerId.GetNodeId());
47+
auto &controller_instance = esp_matter::controller::matter_controller_client::get_instance();
48+
controller_instance.get_commissioner()->RegisterPairingDelegate(nullptr);
49+
if (m_callbacks.commissioning_success_callback) {
50+
auto fabric = controller_instance.get_commissioner()->GetFabricTable()->FindFabricWithCompressedId(
51+
peerId.GetCompressedFabricId());
52+
m_callbacks.commissioning_success_callback(ScopedNodeId(fabric->GetFabricIndex(), peerId.GetNodeId()));
6653
}
6754
}
6855

69-
void pairing_command::OnDeviceConnectedFn(void *context, ExchangeManager &exchangeMgr,
70-
const SessionHandle &sessionHandle)
71-
{
72-
ESP_LOGI(TAG, "OnDeviceConnectedFn");
73-
}
74-
75-
void pairing_command::OnDeviceConnectionFailureFn(void *context, const ScopedNodeId &peerId, CHIP_ERROR err)
76-
{
77-
ESP_LOGI(TAG, "OnDeviceConnectionFailureFn - attempt to get OperationalDeviceProxy failed");
78-
}
79-
80-
CommissioningParameters pairing_command::get_commissioning_params()
56+
void pairing_command::OnCommissioningFailure(
57+
chip::PeerId peerId, CHIP_ERROR error, chip::Controller::CommissioningStage stageFailed,
58+
chip::Optional<chip::Credentials::AttestationVerificationResult> additionalErrorInfo)
8159
{
82-
switch (m_pairing_network_type) {
83-
case NETWORK_TYPE_ETHERNET:
84-
case NETWORK_TYPE_NONE:
85-
return CommissioningParameters();
86-
break;
87-
default:
88-
ESP_LOGE(TAG, "Unsuppoted pairing network type");
89-
break;
60+
ESP_LOGI(TAG, "Commissioning failure with node %" PRIX64 "-%" PRIX64, peerId.GetCompressedFabricId(),
61+
peerId.GetNodeId());
62+
auto &controller_instance = esp_matter::controller::matter_controller_client::get_instance();
63+
controller_instance.get_commissioner()->RegisterPairingDelegate(nullptr);
64+
if (m_callbacks.commissioning_failure_callback) {
65+
auto fabric = controller_instance.get_commissioner()->GetFabricTable()->FindFabricWithCompressedId(
66+
peerId.GetCompressedFabricId());
67+
m_callbacks.commissioning_failure_callback(
68+
ScopedNodeId(fabric->GetFabricIndex(), peerId.GetNodeId()), error, stageFailed,
69+
additionalErrorInfo.HasValue() ? std::make_optional(additionalErrorInfo.Value()) : std::nullopt);
9070
}
91-
return CommissioningParameters();
9271
}
9372

9473
void pairing_command::OnDiscoveredDevice(const Dnssd::CommissionNodeData &nodeData)
@@ -104,12 +83,11 @@ void pairing_command::OnDiscoveredDevice(const Dnssd::CommissionNodeData &nodeDa
10483
// Stop Mdns discovery. TODO: Check whether it is a right method
10584
controller_instance.get_commissioner()->RegisterDeviceDiscoveryDelegate(nullptr);
10685

107-
Inet::InterfaceId interfaceId = nodeData.ipAddress[0].IsIPv6LinkLocal()
108-
? nodeData.interfaceId
109-
: Inet::InterfaceId::Null();
86+
Inet::InterfaceId interfaceId =
87+
nodeData.ipAddress[0].IsIPv6LinkLocal() ? nodeData.interfaceId : Inet::InterfaceId::Null();
11088
PeerAddress peerAddress = PeerAddress::UDP(nodeData.ipAddress[0], port, interfaceId);
11189
RendezvousParameters params = RendezvousParameters().SetSetupPINCode(m_setup_pincode).SetPeerAddress(peerAddress);
112-
CommissioningParameters commissioning_params = get_commissioning_params();
90+
CommissioningParameters commissioning_params = CommissioningParameters();
11391
controller_instance.get_commissioner()->PairDevice(m_remote_node_id, params, commissioning_params);
11492
}
11593

@@ -118,10 +96,9 @@ esp_err_t pairing_on_network(NodeId node_id, uint32_t pincode)
11896
Dnssd::DiscoveryFilter filter(Dnssd::DiscoveryFilterType::kNone);
11997
auto &controller_instance = esp_matter::controller::matter_controller_client::get_instance();
12098
controller_instance.get_commissioner()->RegisterDeviceDiscoveryDelegate(&pairing_command::get_instance());
121-
pairing_command::get_instance().m_pairing_mode = PAIRING_MODE_ONNETWORK;
99+
controller_instance.get_commissioner()->RegisterPairingDelegate(&pairing_command::get_instance());
122100
pairing_command::get_instance().m_setup_pincode = pincode;
123101
pairing_command::get_instance().m_remote_node_id = node_id;
124-
pairing_command::get_instance().m_pairing_network_type = NETWORK_TYPE_NONE;
125102
if (CHIP_NO_ERROR != controller_instance.get_commissioner()->DiscoverCommissionableNodes(filter)) {
126103
ESP_LOGE(TAG, "Failed to discover commissionable nodes");
127104
return ESP_FAIL;
@@ -134,12 +111,13 @@ esp_err_t pairing_ble_wifi(NodeId node_id, uint32_t pincode, uint16_t disc, cons
134111
{
135112
RendezvousParameters params = RendezvousParameters().SetSetupPINCode(pincode).SetDiscriminator(disc).SetPeerAddress(
136113
Transport::PeerAddress::BLE());
114+
auto &controller_instance = esp_matter::controller::matter_controller_client::get_instance();
115+
controller_instance.get_commissioner()->RegisterPairingDelegate(&pairing_command::get_instance());
137116

138117
ByteSpan nameSpan(reinterpret_cast<const uint8_t *>(ssid), strlen(ssid));
139118
ByteSpan pwdSpan(reinterpret_cast<const uint8_t *>(pwd), strlen(pwd));
140119
CommissioningParameters commissioning_params =
141120
CommissioningParameters().SetWiFiCredentials(Controller::WiFiCredentials(nameSpan, pwdSpan));
142-
auto &controller_instance = esp_matter::controller::matter_controller_client::get_instance();
143121
controller_instance.get_commissioner()->PairDevice(node_id, params, commissioning_params);
144122
return ESP_OK;
145123
}
@@ -149,10 +127,11 @@ esp_err_t pairing_ble_thread(NodeId node_id, uint32_t pincode, uint16_t disc, ui
149127
{
150128
RendezvousParameters params = RendezvousParameters().SetSetupPINCode(pincode).SetDiscriminator(disc).SetPeerAddress(
151129
Transport::PeerAddress::BLE());
130+
auto &controller_instance = esp_matter::controller::matter_controller_client::get_instance();
131+
controller_instance.get_commissioner()->RegisterPairingDelegate(&pairing_command::get_instance());
152132

153133
ByteSpan dataset_span(dataset_tlvs, dataset_len);
154134
CommissioningParameters commissioning_params = CommissioningParameters().SetThreadOperationalDataset(dataset_span);
155-
auto &controller_instance = esp_matter::controller::matter_controller_client::get_instance();
156135
controller_instance.get_commissioner()->PairDevice(node_id, params, commissioning_params);
157136
return ESP_OK;
158137
}
@@ -162,7 +141,9 @@ esp_err_t pairing_code(NodeId nodeId, const char *payload)
162141
{
163142
CommissioningParameters commissioning_params = CommissioningParameters();
164143
auto &controller_instance = esp_matter::controller::matter_controller_client::get_instance();
165-
controller_instance.get_commissioner()->PairDevice(nodeId, payload, commissioning_params, DiscoveryType::kDiscoveryNetworkOnly);
144+
controller_instance.get_commissioner()->RegisterPairingDelegate(&pairing_command::get_instance());
145+
controller_instance.get_commissioner()->PairDevice(nodeId, payload, commissioning_params,
146+
DiscoveryType::kDiscoveryNetworkOnly);
166147
return ESP_OK;
167148
}
168149

@@ -172,6 +153,7 @@ esp_err_t pairing_code_thread(NodeId nodeId, const char *payload, uint8_t *datas
172153

173154
CommissioningParameters commissioning_params = CommissioningParameters().SetThreadOperationalDataset(dataset_span);
174155
auto &controller_instance = esp_matter::controller::matter_controller_client::get_instance();
156+
controller_instance.get_commissioner()->RegisterPairingDelegate(&pairing_command::get_instance());
175157
controller_instance.get_commissioner()->PairDevice(nodeId, payload, commissioning_params, DiscoveryType::kAll);
176158

177159
return ESP_OK;
@@ -185,22 +167,25 @@ esp_err_t pairing_code_wifi(NodeId nodeId, const char *ssid, const char *passwor
185167
CommissioningParameters commissioning_params =
186168
CommissioningParameters().SetWiFiCredentials(Controller::WiFiCredentials(nameSpan, pwdSpan));
187169
auto &controller_instance = esp_matter::controller::matter_controller_client::get_instance();
170+
controller_instance.get_commissioner()->RegisterPairingDelegate(&pairing_command::get_instance());
188171
controller_instance.get_commissioner()->PairDevice(nodeId, payload, commissioning_params, DiscoveryType::kAll);
189172

190173
return ESP_OK;
191174
}
192175

193176
esp_err_t pairing_code_wifi_thread(NodeId nodeId, const char *ssid, const char *password, const char *payload,
194-
uint8_t *dataset_buf, uint8_t dataset_len)
177+
uint8_t *dataset_buf, uint8_t dataset_len)
195178
{
196179
ByteSpan nameSpan(reinterpret_cast<const uint8_t *>(ssid), strlen(ssid));
197180
ByteSpan pwdSpan(reinterpret_cast<const uint8_t *>(password), strlen(password));
198181
ByteSpan dataset_span(dataset_buf, dataset_len);
199182

200183
CommissioningParameters commissioning_params =
201-
CommissioningParameters().SetWiFiCredentials(Controller::WiFiCredentials(nameSpan, pwdSpan)).SetThreadOperationalDataset(
202-
dataset_span);
184+
CommissioningParameters()
185+
.SetWiFiCredentials(Controller::WiFiCredentials(nameSpan, pwdSpan))
186+
.SetThreadOperationalDataset(dataset_span);
203187
auto &controller_instance = esp_matter::controller::matter_controller_client::get_instance();
188+
controller_instance.get_commissioner()->RegisterPairingDelegate(&pairing_command::get_instance());
204189
controller_instance.get_commissioner()->PairDevice(nodeId, payload, commissioning_params, DiscoveryType::kAll);
205190

206191
return ESP_OK;

components/esp_matter_controller/commands/esp_matter_controller_pairing_command.h

+23-31
Original file line numberDiff line numberDiff line change
@@ -27,31 +27,32 @@ using chip::Messaging::ExchangeManager;
2727
namespace esp_matter {
2828
namespace controller {
2929

30-
typedef enum pairing_network_type {
31-
NETWORK_TYPE_NONE,
32-
NETWORK_TYPE_WIFI,
33-
NETWORK_TYPE_THREAD,
34-
NETWORK_TYPE_ETHERNET,
35-
} pairing_network_type_t;
36-
37-
typedef enum pairing_mode {
38-
PAIRING_MODE_NONE,
39-
PAIRING_MODE_CODE,
40-
PAIRING_MODE_BLE,
41-
PAIRING_MODE_SOFTAP,
42-
PAIRING_MODE_ETHERNET,
43-
PAIRING_MODE_ONNETWORK,
44-
} pairing_mode_t;
30+
typedef struct {
31+
// Callback for the success or failure of PASE session establishment. err will be CHIP_NO_ERROR when the commissioner
32+
// establishes PASE session with peer node. Otherwise the commissioner fails to establish PASE session.
33+
void (*pase_callback)(CHIP_ERROR err);
34+
// Callback for the sussess of commisioning
35+
void (*commissioning_success_callback)(ScopedNodeId peer_id);
36+
// Callback for the failure of commissioning
37+
void (*commissioning_failure_callback)(
38+
ScopedNodeId peer_id, CHIP_ERROR error, chip::Controller::CommissioningStage stage,
39+
std::optional<chip::Credentials::AttestationVerificationResult> addtional_err_info);
40+
} pairing_command_callbacks_t;
4541

4642
/** Pairing command class to finish commissioning with Matter end-devices **/
4743
class pairing_command : public chip::Controller::DevicePairingDelegate,
4844
public chip::Controller::DeviceDiscoveryDelegate {
4945
public:
5046
/****************** DevicePairingDelegate Interface *****************/
51-
void OnStatusUpdate(DevicePairingDelegate::Status status) override;
47+
// This function will be called when the PASE session is established or the commisioner fails to establish
48+
// PASE session.
5249
void OnPairingComplete(CHIP_ERROR error) override;
53-
void OnPairingDeleted(CHIP_ERROR error) override;
54-
void OnCommissioningComplete(NodeId deviceId, CHIP_ERROR error) override;
50+
// The two functions are invoked upon the completion of the commissioning process, either successfully or
51+
// failed.
52+
void OnCommissioningSuccess(chip::PeerId peerId) override;
53+
void OnCommissioningFailure(
54+
chip::PeerId peerId, CHIP_ERROR error, chip::Controller::CommissioningStage stageFailed,
55+
chip::Optional<chip::Credentials::AttestationVerificationResult> additionalErrorInfo) override;
5556

5657
/****************** DeviceDiscoveryDelegate Interface ***************/
5758
void OnDiscoveredDevice(const chip::Dnssd::CommissionNodeData &nodeData) override;
@@ -62,25 +63,16 @@ class pairing_command : public chip::Controller::DevicePairingDelegate,
6263
return s_instance;
6364
}
6465

66+
void set_callbacks(pairing_command_callbacks_t callbacks) { m_callbacks = callbacks; }
67+
6568
NodeId m_remote_node_id;
6669
uint32_t m_setup_pincode;
6770
uint16_t m_discriminator;
68-
pairing_network_type_t m_pairing_network_type;
69-
pairing_mode_t m_pairing_mode;
71+
pairing_command_callbacks_t m_callbacks;
7072

7173
private:
7274
pairing_command()
73-
: mOnDeviceConnectedCallback(OnDeviceConnectedFn, this)
74-
, mOnDeviceConnectionFailureCallback(OnDeviceConnectionFailureFn, this)
75-
{
76-
}
77-
CommissioningParameters get_commissioning_params();
78-
79-
static void OnDeviceConnectedFn(void *context, ExchangeManager &exchangeMgr, const SessionHandle &sessionHandle);
80-
static void OnDeviceConnectionFailureFn(void *context, const ScopedNodeId &peerId, CHIP_ERROR error);
81-
82-
chip::Callback::Callback<chip::OnDeviceConnected> mOnDeviceConnectedCallback;
83-
chip::Callback::Callback<chip::OnDeviceConnectionFailure> mOnDeviceConnectionFailureCallback;
75+
: m_remote_node_id(0), m_setup_pincode(0), m_discriminator(0), m_callbacks{nullptr, nullptr, nullptr} {}
8476
};
8577

8678
/**

0 commit comments

Comments
 (0)