35
35
#include <qrcode.h>
36
36
#include <nvs.h>
37
37
#include <nvs_flash.h>
38
- #include "app_wifi.h"
38
+ #include "app_wifi_with_homekit.h"
39
+
40
+ #ifdef CONFIG_APP_WIFI_USE_WAC_PROVISIONING
41
+ #include <hap_wac.h>
42
+ #endif /* CONFIG_APP_WIFI_USE_WAC_PROVISIONING */
39
43
40
44
static const char * TAG = "app_wifi" ;
41
45
static const int WIFI_CONNECTED_EVENT = BIT0 ;
@@ -67,6 +71,28 @@ static void app_wifi_print_qr(const char *name, const char *pop, const char *tra
67
71
ESP_LOGI (TAG , "If QR code is not visible, copy paste the below URL in a browser.\n%s?data=%s" , QRCODE_BASE_URL , payload );
68
72
}
69
73
74
+ #ifdef CONFIG_APP_WIFI_USE_WAC_PROVISIONING
75
+ #ifdef CONFIG_APP_WIFI_PROV_TRANSPORT_SOFTAP
76
+ static void app_wac_softap_start (char * ssid )
77
+ {
78
+ }
79
+ #else
80
+ static void app_wac_softap_start (char * ssid )
81
+ {
82
+ hap_wifi_softap_start (ssid );
83
+ }
84
+ #endif /* ! CONFIG_APP_WIFI_PROV_TRANSPORT_SOFTAP */
85
+ static void app_wac_softap_stop (void )
86
+ {
87
+ hap_wifi_softap_stop ();
88
+ }
89
+ static void app_wac_sta_connect (wifi_config_t * wifi_cfg )
90
+ {
91
+ wifi_prov_mgr_configure_sta (wifi_cfg );
92
+ }
93
+ #endif /* CONFIG_APP_WIFI_USE_WAC_PROVISIONING */
94
+
95
+
70
96
/* Event handler for catching system events */
71
97
static void event_handler (void * arg , esp_event_base_t event_base ,
72
98
int32_t event_id , void * event_data )
@@ -96,6 +122,9 @@ static void event_handler(void* arg, esp_event_base_t event_base,
96
122
ESP_LOGI (TAG , "Provisioning successful" );
97
123
break ;
98
124
case WIFI_PROV_END :
125
+ #ifdef CONFIG_APP_WIFI_USE_WAC_PROVISIONING
126
+ hap_wac_stop ();
127
+ #endif
99
128
/* De-initialize manager once provisioning is finished */
100
129
wifi_prov_mgr_deinit ();
101
130
break ;
@@ -104,14 +133,42 @@ static void event_handler(void* arg, esp_event_base_t event_base,
104
133
}
105
134
} else if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_START ) {
106
135
esp_wifi_connect ();
136
+ } else if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_CONNECTED ) {
137
+ #ifdef ESP_NETIF_SUPPORTED
138
+ esp_netif_create_ip6_linklocal ((esp_netif_t * )arg );
139
+ #else
140
+ tcpip_adapter_create_ip6_linklocal (TCPIP_ADAPTER_IF_STA );
141
+ #endif
107
142
} else if (event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP ) {
108
143
ip_event_got_ip_t * event = (ip_event_got_ip_t * ) event_data ;
109
144
ESP_LOGI (TAG , "Connected with IP Address:" IPSTR , IP2STR (& event -> ip_info .ip ));
110
145
/* Signal main application to continue execution */
111
146
xEventGroupSetBits (wifi_event_group , WIFI_CONNECTED_EVENT );
147
+ } else if (event_base == IP_EVENT && event_id == IP_EVENT_GOT_IP6 ) {
148
+ ip_event_got_ip6_t * event = (ip_event_got_ip6_t * )event_data ;
149
+ ESP_LOGI (TAG , "Connected with IPv6 Address:" IPV6STR , IPV62STR (event -> ip6_info .ip ));
112
150
} else if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_DISCONNECTED ) {
113
151
ESP_LOGI (TAG , "Disconnected. Connecting to the AP again..." );
114
152
esp_wifi_connect ();
153
+ #ifdef CONFIG_APP_WIFI_USE_WAC_PROVISIONING
154
+ } else if (event_base == HAP_WAC_EVENT ) {
155
+ switch (event_id ) {
156
+ case HAP_WAC_EVENT_REQ_SOFTAP_START :
157
+ app_wac_softap_start ((char * )event_data );
158
+ break ;
159
+ case HAP_WAC_EVENT_REQ_SOFTAP_STOP :
160
+ app_wac_softap_stop ();
161
+ break ;
162
+ case HAP_WAC_EVENT_RECV_CRED :
163
+ app_wac_sta_connect ((wifi_config_t * )event_data );
164
+ break ;
165
+ case HAP_WAC_EVENT_STOPPED :
166
+ ESP_LOGI (TAG , "WAC Stopped" );
167
+ break ;
168
+ default :
169
+ break ;
170
+ }
171
+ #endif /* CONFIG_APP_WIFI_USE_WAC_PROVISIONING */
115
172
}
116
173
}
117
174
@@ -120,45 +177,55 @@ static void wifi_init_sta()
120
177
ESP_ERROR_CHECK (esp_wifi_set_mode (WIFI_MODE_STA ));
121
178
ESP_ERROR_CHECK (esp_wifi_start ());
122
179
}
123
-
124
- static void get_device_service_name (char * service_name , size_t max )
125
- {
126
- uint8_t eth_mac [6 ];
127
- const char * ssid_prefix = "PROV_" ;
128
- esp_wifi_get_mac (WIFI_IF_STA , eth_mac );
129
- snprintf (service_name , max , "%s%02X%02X%02X" ,
130
- ssid_prefix , eth_mac [3 ], eth_mac [4 ], eth_mac [5 ]);
131
- }
132
-
133
- /* free the return value after use. */
134
- static char * read_random_bytes_from_nvs ()
180
+ /* Free random_bytes after use only if function returns ESP_OK */
181
+ static esp_err_t read_random_bytes_from_nvs (uint8_t * * random_bytes , size_t * len )
135
182
{
136
183
nvs_handle handle ;
137
184
esp_err_t err ;
138
- size_t required_size = 0 ;
139
- void * value ;
185
+ * len = 0 ;
140
186
141
187
if ((err = nvs_open_from_partition (CONFIG_ESP_RMAKER_FACTORY_PARTITION_NAME , CREDENTIALS_NAMESPACE ,
142
188
NVS_READONLY , & handle )) != ESP_OK ) {
143
189
ESP_LOGD (TAG , "NVS open for %s %s %s failed with error %d" , CONFIG_ESP_RMAKER_FACTORY_PARTITION_NAME , CREDENTIALS_NAMESPACE , RANDOM_NVS_KEY , err );
144
- return NULL ;
190
+ return ESP_FAIL ;
145
191
}
146
192
147
- if ((err = nvs_get_blob (handle , RANDOM_NVS_KEY , NULL , & required_size )) != ESP_OK ) {
148
- ESP_LOGD (TAG , "Failed to read key %s with error %d size %d " , RANDOM_NVS_KEY , err , required_size );
193
+ if ((err = nvs_get_blob (handle , RANDOM_NVS_KEY , NULL , len )) != ESP_OK ) {
194
+ ESP_LOGD (TAG , "Error %d. Failed to read key %s. " , err , RANDOM_NVS_KEY );
149
195
nvs_close (handle );
150
- return NULL ;
196
+ return ESP_ERR_NOT_FOUND ;
151
197
}
152
198
153
- value = calloc (required_size + 1 , 1 ); /* + 1 for NULL termination */
154
- if (value ) {
155
- nvs_get_blob (handle , RANDOM_NVS_KEY , value , & required_size );
199
+ * random_bytes = calloc (* len , 1 );
200
+ if (* random_bytes ) {
201
+ nvs_get_blob (handle , RANDOM_NVS_KEY , * random_bytes , len );
202
+ nvs_close (handle );
203
+ return ESP_OK ;
156
204
}
157
-
158
205
nvs_close (handle );
159
- return value ;
206
+ return ESP_ERR_NO_MEM ;
207
+ }
208
+
209
+ static esp_err_t get_device_service_name (char * service_name , size_t max )
210
+ {
211
+ uint8_t * nvs_random = NULL ;
212
+ const char * ssid_prefix = "PROV_" ;
213
+ size_t nvs_random_size = 0 ;
214
+ if ((read_random_bytes_from_nvs (& nvs_random , & nvs_random_size ) != ESP_OK ) || nvs_random_size < 3 ) {
215
+ uint8_t eth_mac [6 ];
216
+ esp_wifi_get_mac (WIFI_IF_STA , eth_mac );
217
+ snprintf (service_name , max , "%s%02x%02x%02x" , ssid_prefix , eth_mac [3 ], eth_mac [4 ], eth_mac [5 ]);
218
+ } else {
219
+ snprintf (service_name , max , "%s%02x%02x%02x" , ssid_prefix , nvs_random [nvs_random_size - 3 ],
220
+ nvs_random [nvs_random_size - 2 ], nvs_random [nvs_random_size - 1 ]);
221
+ }
222
+ if (nvs_random ) {
223
+ free (nvs_random );
224
+ }
225
+ return ESP_OK ;
160
226
}
161
227
228
+
162
229
static esp_err_t get_device_pop (char * pop , size_t max , app_wifi_pop_type_t pop_type )
163
230
{
164
231
if (!pop || !max ) {
@@ -175,14 +242,13 @@ static esp_err_t get_device_pop(char *pop, size_t max, app_wifi_pop_type_t pop_t
175
242
return err ;
176
243
}
177
244
} else if (pop_type == POP_TYPE_RANDOM ) {
178
- char * nvs_pop = read_random_bytes_from_nvs ();
179
- if (!nvs_pop ) {
245
+ uint8_t * nvs_random ;
246
+ size_t nvs_random_size = 0 ;
247
+ if ((read_random_bytes_from_nvs (& nvs_random , & nvs_random_size ) != ESP_OK ) || nvs_random_size < 4 ) {
180
248
return ESP_ERR_NOT_FOUND ;
181
249
} else {
182
- strncpy (pop , nvs_pop , max - 1 );
183
- pop [max - 1 ] = 0 ;
184
- free (nvs_pop );
185
- nvs_pop = NULL ;
250
+ snprintf (pop , max , "%02x%02x%02x%02x" , nvs_random [0 ], nvs_random [1 ], nvs_random [2 ], nvs_random [3 ]);
251
+ free (nvs_random );
186
252
return ESP_OK ;
187
253
}
188
254
} else {
@@ -203,15 +269,21 @@ void app_wifi_with_homekit_init(void)
203
269
ESP_ERROR_CHECK (esp_event_loop_create_default ());
204
270
wifi_event_group = xEventGroupCreate ();
205
271
272
+ /* Initialize Wi-Fi including netif with default config */
273
+ #ifdef ESP_NETIF_SUPPORTED
274
+ esp_netif_t * wifi_netif = esp_netif_create_default_wifi_sta ();
275
+ #endif
276
+
206
277
/* Register our event handler for Wi-Fi, IP and Provisioning related events */
207
- ESP_ERROR_CHECK (esp_event_handler_register (WIFI_PROV_EVENT , ESP_EVENT_ANY_ID , & event_handler , NULL ));
278
+ #ifdef ESP_NETIF_SUPPORTED
279
+ ESP_ERROR_CHECK (esp_event_handler_register (WIFI_EVENT , ESP_EVENT_ANY_ID , & event_handler , wifi_netif ));
280
+ #else
208
281
ESP_ERROR_CHECK (esp_event_handler_register (WIFI_EVENT , ESP_EVENT_ANY_ID , & event_handler , NULL ));
282
+ #endif
283
+ ESP_ERROR_CHECK (esp_event_handler_register (WIFI_PROV_EVENT , ESP_EVENT_ANY_ID , & event_handler , NULL ));
209
284
ESP_ERROR_CHECK (esp_event_handler_register (IP_EVENT , IP_EVENT_STA_GOT_IP , & event_handler , NULL ));
285
+ ESP_ERROR_CHECK (esp_event_handler_register (IP_EVENT , IP_EVENT_GOT_IP6 , & event_handler , NULL ));
210
286
211
- /* Initialize Wi-Fi including netif with default config */
212
- #ifdef ESP_NETIF_SUPPORTED
213
- esp_netif_create_default_wifi_sta ();
214
- #endif
215
287
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT ();
216
288
ESP_ERROR_CHECK (esp_wifi_init (& cfg ));
217
289
}
@@ -326,6 +398,10 @@ esp_err_t app_wifi_with_homekit_start(app_wifi_pop_type_t pop_type)
326
398
app_wifi_print_qr (service_name , pop , PROV_TRANSPORT_SOFTAP );
327
399
#endif /* CONFIG_APP_WIFI_PROV_TRANSPORT_BLE */
328
400
ESP_LOGI (TAG , "Provisioning Started. Name : %s, POP : %s" , service_name , pop );
401
+ #ifdef CONFIG_APP_WIFI_USE_WAC_PROVISIONING
402
+ esp_event_handler_register (HAP_WAC_EVENT , ESP_EVENT_ANY_ID , & event_handler , NULL );
403
+ hap_wac_start ();
404
+ #endif /* CONFIG_APP_WIFI_USE_WAC_PROVISIONING */
329
405
} else {
330
406
ESP_LOGI (TAG , "Already provisioned, starting Wi-Fi STA" );
331
407
0 commit comments