Skip to content

Commit 6d735ae

Browse files
author
Ravi Singh
committed
feat(rx): unique AP SSID + mDNS hostname, device_id in /api/system
- AP SSID: TankSync-XXXX (last 4 hex of WiFi MAC) — multi-RX safe - mDNS hostname: tanksync-xxxx.local — unique per device - /api/system now returns device_id and mdns_host for PWA discovery - Added _tanksync._tcp mDNS service type for network discovery - Applied to both receiver (DevKit) and receiver-c3 (C3 Mini)
1 parent 105ca62 commit 6d735ae

6 files changed

Lines changed: 60 additions & 20 deletions

File tree

firmware/receiver-c3/components/web_server/web_server.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -547,6 +547,8 @@ static esp_err_t handle_api_system(httpd_req_t *req) {
547547
cJSON_AddStringToObject(root, "ip", wifi_manager_ip());
548548
cJSON_AddStringToObject(root, "ssid", wifi_manager_ssid());
549549
cJSON_AddStringToObject(root, "wifi_status", wifi_manager_status() == WIFI_ST_CONNECTED ? "connected" : "ap_mode");
550+
cJSON_AddStringToObject(root, "device_id", mqtt_manager_device_id());
551+
cJSON_AddStringToObject(root, "mdns_host", wifi_manager_mdns_host());
550552
cJSON_AddNumberToObject(root, "uptime_s", (double)(esp_timer_get_time() / 1000000LL));
551553
cJSON_AddNumberToObject(root, "free_heap", esp_get_free_heap_size());
552554
char *json = cJSON_PrintUnformatted(root); cJSON_Delete(root); send_json(req, json); free(json);

firmware/receiver-c3/components/wifi_manager/wifi_manager.c

Lines changed: 25 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,21 @@
2727
static const char *TAG = "wifi";
2828

2929
#define NVS_NS "wifi"
30-
#define AP_SSID "TankSync"
30+
#define AP_SSID_BASE "TankSync"
3131
#define AP_PASS ""
3232
#define AP_IP "192.168.4.1"
33-
#define MDNS_HOST "tanksync"
33+
#define MDNS_HOST_BASE "tanksync"
34+
35+
// Unique AP SSID and mDNS hostname (appends last 4 hex of MAC)
36+
static char s_ap_ssid[24] = AP_SSID_BASE;
37+
static char s_mdns_host[24] = MDNS_HOST_BASE;
38+
39+
static void build_unique_ids(void) {
40+
uint8_t mac[6];
41+
esp_read_mac(mac, ESP_MAC_WIFI_STA);
42+
snprintf(s_ap_ssid, sizeof(s_ap_ssid), "%s-%02X%02X", AP_SSID_BASE, mac[4], mac[5]);
43+
snprintf(s_mdns_host, sizeof(s_mdns_host), "%s-%02x%02x", MDNS_HOST_BASE, mac[4], mac[5]);
44+
}
3445
#define CONNECT_TIMEOUT_MS 20000
3546

3647
// System event bits (same definitions as config.h)
@@ -41,7 +52,7 @@ static const char *TAG = "wifi";
4152
static EventGroupHandle_t s_events = NULL;
4253
static wifi_status_t s_status = WIFI_ST_DISCONNECTED;
4354
static char s_ip[20] = AP_IP;
44-
static char s_ssid[33] = AP_SSID;
55+
static char s_ssid[33] = AP_SSID_BASE;
4556
static esp_netif_t *s_sta_netif = NULL;
4657
static esp_netif_t *s_ap_netif = NULL;
4758
static int s_retry = 0;
@@ -86,11 +97,13 @@ esp_err_t wifi_manager_forget(void) {
8697

8798
// ── mDNS ──────────────────────────────────────────────────────────────────────
8899
static void start_mdns(void) {
100+
build_unique_ids();
89101
mdns_init();
90-
mdns_hostname_set(MDNS_HOST);
102+
mdns_hostname_set(s_mdns_host);
91103
mdns_instance_name_set("TankSync Water Monitor");
92104
mdns_service_add(NULL, "_http", "_tcp", 80, NULL, 0);
93-
ESP_LOGI(TAG, "mDNS: %s.local", MDNS_HOST);
105+
mdns_service_add(NULL, "_tanksync", "_tcp", 80, NULL, 0);
106+
ESP_LOGI(TAG, "mDNS: %s.local", s_mdns_host);
94107
}
95108

96109
// ── Captive portal DNS (UDP port 53) ─────────────────────────────────────────
@@ -224,21 +237,22 @@ void wifi_manager_connect(void) {
224237
void wifi_manager_start_ap(void) {
225238
esp_wifi_stop();
226239
s_status = WIFI_ST_AP_MODE;
227-
strncpy(s_ssid, AP_SSID, sizeof(s_ssid));
228-
strncpy(s_ip, AP_IP, sizeof(s_ip));
240+
build_unique_ids();
241+
strncpy(s_ssid, s_ap_ssid, sizeof(s_ssid));
242+
strncpy(s_ip, AP_IP, sizeof(s_ip));
229243

230244
// Use APSTA mode so WiFi scan works while AP is active
231245
ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_APSTA));
232246

233247
wifi_config_t ap_cfg = {
234248
.ap = {
235-
.ssid_len = strlen(AP_SSID),
249+
.ssid_len = strlen(s_ap_ssid),
236250
.channel = 6,
237251
.authmode = WIFI_AUTH_OPEN,
238252
.max_connection = 4,
239253
}
240254
};
241-
strncpy((char*)ap_cfg.ap.ssid, AP_SSID, sizeof(ap_cfg.ap.ssid));
255+
strncpy((char*)ap_cfg.ap.ssid, s_ap_ssid, sizeof(ap_cfg.ap.ssid));
242256

243257
ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_AP, &ap_cfg));
244258
ESP_ERROR_CHECK(esp_wifi_start());
@@ -247,12 +261,13 @@ void wifi_manager_start_ap(void) {
247261
xTaskCreate(dns_server_task, "dns_cp", 4096, NULL, 5, NULL);
248262
start_mdns();
249263

250-
ESP_LOGI(TAG, "AP mode: SSID=%s, IP=%s", AP_SSID, AP_IP);
264+
ESP_LOGI(TAG, "AP mode: SSID=%s, IP=%s, mDNS=%s.local", s_ap_ssid, AP_IP, s_mdns_host);
251265
}
252266

253267
wifi_status_t wifi_manager_status(void) { return s_status; }
254268
const char *wifi_manager_ip(void) { return s_ip; }
255269
const char *wifi_manager_ssid(void) { return s_ssid; }
270+
const char *wifi_manager_mdns_host(void) { return s_mdns_host; }
256271

257272
int wifi_manager_rssi(void) {
258273
if (s_status != WIFI_ST_CONNECTED) return 0;

firmware/receiver-c3/components/wifi_manager/wifi_manager.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,5 +57,8 @@ const char *wifi_manager_ssid(void);
5757
/** Get WiFi RSSI in STA mode (0 if not connected). */
5858
int wifi_manager_rssi(void);
5959

60+
/** Get mDNS hostname (e.g. "tanksync-a1b2"). */
61+
const char *wifi_manager_mdns_host(void);
62+
6063
/** Scan for nearby networks. Returns JSON array string (caller must free). */
6164
char *wifi_manager_scan_json(void);

firmware/receiver/components/web_server/web_server.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -547,6 +547,8 @@ static esp_err_t handle_api_system(httpd_req_t *req) {
547547
cJSON_AddStringToObject(root, "ip", wifi_manager_ip());
548548
cJSON_AddStringToObject(root, "ssid", wifi_manager_ssid());
549549
cJSON_AddStringToObject(root, "wifi_status", wifi_manager_status() == WIFI_ST_CONNECTED ? "connected" : "ap_mode");
550+
cJSON_AddStringToObject(root, "device_id", mqtt_manager_device_id());
551+
cJSON_AddStringToObject(root, "mdns_host", wifi_manager_mdns_host());
550552
cJSON_AddNumberToObject(root, "uptime_s", (double)(esp_timer_get_time() / 1000000LL));
551553
cJSON_AddNumberToObject(root, "free_heap", esp_get_free_heap_size());
552554
char *json = cJSON_PrintUnformatted(root); cJSON_Delete(root); send_json(req, json); free(json);

firmware/receiver/components/wifi_manager/wifi_manager.c

Lines changed: 25 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,21 @@
2727
static const char *TAG = "wifi";
2828

2929
#define NVS_NS "wifi"
30-
#define AP_SSID "TankSync"
30+
#define AP_SSID_BASE "TankSync"
3131
#define AP_PASS ""
3232
#define AP_IP "192.168.4.1"
33-
#define MDNS_HOST "tanksync"
33+
#define MDNS_HOST_BASE "tanksync"
34+
35+
// Unique AP SSID and mDNS hostname (appends last 4 hex of MAC)
36+
static char s_ap_ssid[24] = AP_SSID_BASE;
37+
static char s_mdns_host[24] = MDNS_HOST_BASE;
38+
39+
static void build_unique_ids(void) {
40+
uint8_t mac[6];
41+
esp_read_mac(mac, ESP_MAC_WIFI_STA);
42+
snprintf(s_ap_ssid, sizeof(s_ap_ssid), "%s-%02X%02X", AP_SSID_BASE, mac[4], mac[5]);
43+
snprintf(s_mdns_host, sizeof(s_mdns_host), "%s-%02x%02x", MDNS_HOST_BASE, mac[4], mac[5]);
44+
}
3445
#define CONNECT_TIMEOUT_MS 20000
3546

3647
// System event bits (same definitions as config.h)
@@ -41,7 +52,7 @@ static const char *TAG = "wifi";
4152
static EventGroupHandle_t s_events = NULL;
4253
static wifi_status_t s_status = WIFI_ST_DISCONNECTED;
4354
static char s_ip[20] = AP_IP;
44-
static char s_ssid[33] = AP_SSID;
55+
static char s_ssid[33] = AP_SSID_BASE;
4556
static esp_netif_t *s_sta_netif = NULL;
4657
static esp_netif_t *s_ap_netif = NULL;
4758
static int s_retry = 0;
@@ -86,11 +97,13 @@ esp_err_t wifi_manager_forget(void) {
8697

8798
// ── mDNS ──────────────────────────────────────────────────────────────────────
8899
static void start_mdns(void) {
100+
build_unique_ids();
89101
mdns_init();
90-
mdns_hostname_set(MDNS_HOST);
102+
mdns_hostname_set(s_mdns_host);
91103
mdns_instance_name_set("TankSync Water Monitor");
92104
mdns_service_add(NULL, "_http", "_tcp", 80, NULL, 0);
93-
ESP_LOGI(TAG, "mDNS: %s.local", MDNS_HOST);
105+
mdns_service_add(NULL, "_tanksync", "_tcp", 80, NULL, 0);
106+
ESP_LOGI(TAG, "mDNS: %s.local", s_mdns_host);
94107
}
95108

96109
// ── Captive portal DNS (UDP port 53) ─────────────────────────────────────────
@@ -224,21 +237,22 @@ void wifi_manager_connect(void) {
224237
void wifi_manager_start_ap(void) {
225238
esp_wifi_stop();
226239
s_status = WIFI_ST_AP_MODE;
227-
strncpy(s_ssid, AP_SSID, sizeof(s_ssid));
228-
strncpy(s_ip, AP_IP, sizeof(s_ip));
240+
build_unique_ids();
241+
strncpy(s_ssid, s_ap_ssid, sizeof(s_ssid));
242+
strncpy(s_ip, AP_IP, sizeof(s_ip));
229243

230244
// Use APSTA mode so WiFi scan works while AP is active
231245
ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_APSTA));
232246

233247
wifi_config_t ap_cfg = {
234248
.ap = {
235-
.ssid_len = strlen(AP_SSID),
249+
.ssid_len = strlen(s_ap_ssid),
236250
.channel = 6,
237251
.authmode = WIFI_AUTH_OPEN,
238252
.max_connection = 4,
239253
}
240254
};
241-
strncpy((char*)ap_cfg.ap.ssid, AP_SSID, sizeof(ap_cfg.ap.ssid));
255+
strncpy((char*)ap_cfg.ap.ssid, s_ap_ssid, sizeof(ap_cfg.ap.ssid));
242256

243257
ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_AP, &ap_cfg));
244258
ESP_ERROR_CHECK(esp_wifi_start());
@@ -247,12 +261,13 @@ void wifi_manager_start_ap(void) {
247261
xTaskCreate(dns_server_task, "dns_cp", 4096, NULL, 5, NULL);
248262
start_mdns();
249263

250-
ESP_LOGI(TAG, "AP mode: SSID=%s, IP=%s", AP_SSID, AP_IP);
264+
ESP_LOGI(TAG, "AP mode: SSID=%s, IP=%s, mDNS=%s.local", s_ap_ssid, AP_IP, s_mdns_host);
251265
}
252266

253267
wifi_status_t wifi_manager_status(void) { return s_status; }
254268
const char *wifi_manager_ip(void) { return s_ip; }
255269
const char *wifi_manager_ssid(void) { return s_ssid; }
270+
const char *wifi_manager_mdns_host(void) { return s_mdns_host; }
256271

257272
int wifi_manager_rssi(void) {
258273
if (s_status != WIFI_ST_CONNECTED) return 0;

firmware/receiver/components/wifi_manager/wifi_manager.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,5 +57,8 @@ const char *wifi_manager_ssid(void);
5757
/** Get WiFi RSSI in STA mode (0 if not connected). */
5858
int wifi_manager_rssi(void);
5959

60+
/** Get mDNS hostname (e.g. "tanksync-a1b2"). */
61+
const char *wifi_manager_mdns_host(void);
62+
6063
/** Scan for nearby networks. Returns JSON array string (caller must free). */
6164
char *wifi_manager_scan_json(void);

0 commit comments

Comments
 (0)