Skip to content

Commit

Permalink
Add ESP32 platform driver for full NetworkCommissioning cluster
Browse files Browse the repository at this point in the history
  • Loading branch information
wqx6 committed Jan 6, 2022
1 parent a0e8e3a commit e385442
Show file tree
Hide file tree
Showing 9 changed files with 485 additions and 87 deletions.
1 change: 1 addition & 0 deletions examples/all-clusters-app/esp32/main/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ set(SRC_DIRS_LIST
"${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/window-covering-server"
"${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/general-commissioning-server"
"${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/network-commissioning-old"
"${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/network-commissioning"
"${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/groups-server"
"${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/color-control-server"
"${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/content-launch-server"
Expand Down
14 changes: 13 additions & 1 deletion examples/all-clusters-app/esp32/main/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -62,10 +62,12 @@
#include <lib/support/CHIPMem.h>
#include <lib/support/ErrorStr.h>
#include <platform/CHIPDeviceLayer.h>
#include <platform/ESP32/NetworkCommissioningDriver.h>
#include <setup_payload/ManualSetupPayloadGenerator.h>
#include <setup_payload/QRCodeSetupPayloadGenerator.h>

#include <app/clusters/door-lock-server/door-lock-server.h>
#include <app/clusters/network-commissioning/network-commissioning.h>
#include <app/clusters/on-off-server/on-off-server.h>

#if CONFIG_ENABLE_PW_RPC
Expand Down Expand Up @@ -133,6 +135,16 @@ typedef std::tuple<std::string, Endpoints> Device;
typedef std::vector<Device> Devices;
Devices devices;

namespace {
app::Clusters::NetworkCommissioning::Instance
sWiFiNetworkCommissioningInstance(0 /* Endpoint Id */, &(NetworkCommissioning::ESPWiFiDriver::GetInstance()));
} // namespace

void NetWorkCommissioningInstInit()
{
sWiFiNetworkCommissioningInstance.Init();
}

void AddAttribute(std::string name, std::string value)
{
Attribute attribute = std::make_tuple(std::move(name), std::move(value));
Expand Down Expand Up @@ -521,7 +533,7 @@ static void InitServer(intptr_t context)

// Initialize device attestation config
SetDeviceAttestationCredentialsProvider(Examples::GetExampleDACProvider());

NetWorkCommissioningInstInit();
SetupPretendDevices();
SetupInitialLevelControlValues(/* endpointId = */ 1);
SetupInitialLevelControlValues(/* endpointId = */ 2);
Expand Down
4 changes: 2 additions & 2 deletions src/platform/ESP32/BUILD.gn
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ static_library("ESP32") {
"KeyValueStoreManagerImpl.h",
"Logging.cpp",
"LwIPCoreLock.cpp",
"NetworkCommissioningDriver.h",
"PlatformManagerImpl.cpp",
"PlatformManagerImpl.h",
"SystemTimeSupport.cpp",
Expand All @@ -67,8 +68,7 @@ static_library("ESP32") {
if (chip_enable_wifi) {
sources += [
"ConnectivityManagerImpl_WiFi.cpp",
"WiFiProvisioning.cpp",
"WiFiProvisioning.h",
"NetworkCommissioningWiFiDriver.cpp",
]
}

Expand Down
7 changes: 6 additions & 1 deletion src/platform/ESP32/ConnectivityManagerImpl_WiFi.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
#include <lib/support/CodeUtils.h>
#include <lib/support/logging/CHIPLogging.h>
#include <platform/ESP32/ESP32Utils.h>
#include <platform/ESP32/NetworkCommissioningDriver.h>
#include <platform/internal/BLEManager.h>

#include "esp_event.h"
Expand Down Expand Up @@ -441,6 +442,10 @@ void ConnectivityManagerImpl::OnWiFiPlatformEvent(const ChipDeviceEvent * event)
{
switch (event->Platform.ESPSystemEvent.Id)
{
case WIFI_EVENT_SCAN_DONE:
ChipLogProgress(DeviceLayer, "WIFI_EVENT_SCAN_DONE");
NetworkCommissioning::ESPWiFiDriver::GetInstance().OnScanWiFiNetworkDone();
break;
case WIFI_EVENT_STA_START:
ChipLogProgress(DeviceLayer, "WIFI_EVENT_STA_START");
DriveStationState();
Expand Down Expand Up @@ -644,7 +649,7 @@ void ConnectivityManagerImpl::OnStationConnected()
{
ChipLogError(DeviceLayer, "esp_netif_create_ip6_linklocal() failed for WIFI_STA_DEF interface: %s", esp_err_to_name(err));
}

NetworkCommissioning::ESPWiFiDriver::GetInstance().OnConnectWiFiNetwork();
// TODO Invoke WARM to perform actions that occur when the WiFi station interface comes up.

// Alert other components of the new state.
Expand Down
4 changes: 2 additions & 2 deletions src/platform/ESP32/DeviceNetworkProvisioningDelegateImpl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
#include <lib/support/logging/CHIPLogging.h>

#include "DeviceNetworkProvisioningDelegateImpl.h"
#include "WiFiProvisioning.h"
#include "NetworkCommissioningDriver.h"

namespace chip {
namespace DeviceLayer {
Expand All @@ -29,7 +29,7 @@ CHIP_ERROR DeviceNetworkProvisioningDelegateImpl::_ProvisionWiFiNetwork(const ch
#if CHIP_DEVICE_CONFIG_ENABLE_WIFI
CHIP_ERROR err = CHIP_NO_ERROR;
ChipLogProgress(NetworkProvisioning, "ESP32NetworkProvisioningDelegate: SSID: %s", ssid);
err = SetWiFiStationProvisioning(ssid, key);
err = NetworkCommissioning::ESPWiFiDriver::GetInstance().ConnectWiFiNetwork(ssid, strlen(ssid), key, strlen(key));
if (err != CHIP_NO_ERROR)
{
ChipLogError(NetworkProvisioning, "Failed to connect to WiFi network: %s", chip::ErrorStr(err));
Expand Down
136 changes: 136 additions & 0 deletions src/platform/ESP32/NetworkCommissioningDriver.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,136 @@
/*
*
* Copyright (c) 2021 Project CHIP Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

#pragma once
#include <esp_wifi.h>
#include <platform/NetworkCommissioning.h>

namespace chip {
namespace DeviceLayer {
namespace NetworkCommissioning {
#if CHIP_DEVICE_CONFIG_ENABLE_WIFI
namespace {
constexpr uint8_t kMaxWiFiNetworks = 1;
constexpr uint8_t kWiFiScanNetworksTimeOutSeconds = 10;
constexpr uint8_t kWiFiConnectNetworkTimeoutSeconds = 20;
} // namespace

class ESPScanResponseIterator : public Iterator<WiFiScanResponse>
{
public:
ESPScanResponseIterator(const size_t size, const wifi_ap_record_t * scanResults) : mSize(size), mpScanResults(scanResults) {}
size_t Count() override { return mSize; }
bool Next(WiFiScanResponse & item) override
{
if (mIternum >= mSize)
{
return false;
}

item.security = mpScanResults[mIternum].authmode;
item.ssidLen =
strnlen(reinterpret_cast<const char *>(mpScanResults[mIternum].ssid), chip::DeviceLayer::Internal::kMaxWiFiSSIDLength);
item.channel = mpScanResults[mIternum].primary;
item.wiFiBand = chip::DeviceLayer::NetworkCommissioning::WiFiBand::k2g4;
item.rssi = mpScanResults[mIternum].rssi;
memcpy(item.ssid, mpScanResults[mIternum].ssid, item.ssidLen);
memcpy(item.bssid, mpScanResults[mIternum].bssid, 6);

mIternum++;
return true;
}
void Release() override {}

private:
const size_t mSize;
const wifi_ap_record_t * mpScanResults;
size_t mIternum = 0;
};

class ESPWiFiDriver final : public WiFiDriver
{
public:
class WiFiNetworkIterator final : public NetworkIterator
{
public:
WiFiNetworkIterator(ESPWiFiDriver * aDriver) : mDriver(aDriver) {}
size_t Count() override;
bool Next(Network & item) override;
void Release() override { delete this; }
~WiFiNetworkIterator() = default;

private:
ESPWiFiDriver * mDriver;
bool mExhausted = false;
};

struct WiFiNetwork
{
char ssid[DeviceLayer::Internal::kMaxWiFiSSIDLength];
uint8_t ssidLen = 0;
char credentials[DeviceLayer::Internal::kMaxWiFiKeyLength];
uint8_t credentialsLen = 0;
};

// BaseDriver
NetworkIterator * GetNetworks() override { return new WiFiNetworkIterator(this); }
CHIP_ERROR Init() override;
CHIP_ERROR Shutdown() override;

// WirelessDriver
uint8_t GetMaxNetworks() override { return kMaxWiFiNetworks; }
uint8_t GetScanNetworkTimeoutSeconds() override { return kWiFiScanNetworksTimeOutSeconds; }
uint8_t GetConnectNetworkTimeoutSeconds() override { return kWiFiConnectNetworkTimeoutSeconds; }

CHIP_ERROR CommitConfiguration() override;
CHIP_ERROR RevertConfiguration() override;

Status RemoveNetwork(ByteSpan networkId) override;
Status ReorderNetwork(ByteSpan networkId, uint8_t index) override;
void ConnectNetwork(ByteSpan networkId, ConnectCallback * callback) override;

// WiFiDriver
Status AddOrUpdateNetwork(ByteSpan ssid, ByteSpan credentials) override;
void ScanNetworks(ByteSpan ssid, ScanCallback * callback) override;

CHIP_ERROR ConnectWiFiNetwork(const char * ssid, uint8_t ssidLen, const char * key, uint8_t keyLen);
void OnConnectWiFiNetwork();
void OnScanWiFiNetworkDone();
static ESPWiFiDriver & GetInstance()
{
static ESPWiFiDriver instance;
return instance;
}

private:
bool NetworkMatch(const WiFiNetwork & network, ByteSpan networkId);
CHIP_ERROR StartScanWiFiNetworks(ByteSpan ssid);

WiFiNetworkIterator mWiFiIterator = WiFiNetworkIterator(this);
WiFiNetwork mSavedNetwork;
WiFiNetwork mStagingNetwork;
ScanCallback * mpScanCallback;
ConnectCallback * mpConnectCallback;
};
#endif // CHIP_DEVICE_CONFIG_ENABLE_WIFI

#if CHIP_DEVICE_CONFIG_ENABLE_THREAD
// TODO: Add Thread Driver for ESP32H2 platform
#endif
} // namespace NetworkCommissioning
} // namespace DeviceLayer
} // namespace chip
Loading

0 comments on commit e385442

Please sign in to comment.