This commit is contained in:
Miles Raymond 2026-02-03 17:16:49 -05:00 committed by GitHub
commit 5687a22c4f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 36 additions and 10 deletions

View File

@ -11,7 +11,19 @@
#include "fontIds.h" #include "fontIds.h"
namespace { namespace {
constexpr const char* HOSTNAME = "crosspoint"; // Generate hostname dynamically based on device MAC address
String getDeviceHostname() {
static String deviceHostname;
if (deviceHostname.length() == 0) {
uint64_t chipId = ESP.getEfuseMac();
// Extract last 6 hex digits (24 bits) for serial number
uint32_t serialNum = (uint32_t)(chipId & 0xFFFFFF);
char hostname[32];
snprintf(hostname, sizeof(hostname), "XTeinkX4-%06X", serialNum);
deviceHostname = String(hostname);
}
return deviceHostname;
}
} // namespace } // namespace
void CalibreConnectActivity::taskTrampoline(void* param) { void CalibreConnectActivity::taskTrampoline(void* param) {
@ -94,9 +106,9 @@ void CalibreConnectActivity::startWebServer() {
state = CalibreConnectState::SERVER_STARTING; state = CalibreConnectState::SERVER_STARTING;
updateRequired = true; updateRequired = true;
if (MDNS.begin(HOSTNAME)) { if (MDNS.begin(getDeviceHostname().c_str())) {
// mDNS is optional for the Calibre plugin but still helpful for users. // mDNS is optional for the Calibre plugin but still helpful for users.
Serial.printf("[%lu] [CAL] mDNS started: http://%s.local/\n", millis(), HOSTNAME); Serial.printf("[%lu] [CAL] mDNS started: http://%s.local/\n", millis(), getDeviceHostname().c_str());
} }
webServer.reset(new CrossPointWebServer()); webServer.reset(new CrossPointWebServer());

View File

@ -19,10 +19,24 @@ namespace {
// AP Mode configuration // AP Mode configuration
constexpr const char* AP_SSID = "CrossPoint-Reader"; constexpr const char* AP_SSID = "CrossPoint-Reader";
constexpr const char* AP_PASSWORD = nullptr; // Open network for ease of use constexpr const char* AP_PASSWORD = nullptr; // Open network for ease of use
constexpr const char* AP_HOSTNAME = "crosspoint";
constexpr uint8_t AP_CHANNEL = 1; constexpr uint8_t AP_CHANNEL = 1;
constexpr uint8_t AP_MAX_CONNECTIONS = 4; constexpr uint8_t AP_MAX_CONNECTIONS = 4;
// Static cached hostname for the device
static String deviceHostname;
// Generate hostname dynamically based on device MAC address
String getDeviceHostname() {
if (deviceHostname.length() == 0) {
// Extract last 6 hex digits (24 bits) for serial number
uint32_t serialNum = (uint32_t)(ESP.getEfuseMac() & 0xFFFFFF);
char hostname[32];
snprintf(hostname, sizeof(hostname), "XTeinkX4-%06X", serialNum);
deviceHostname = String(hostname);
}
return deviceHostname;
}
// DNS server for captive portal (redirects all DNS queries to our IP) // DNS server for captive portal (redirects all DNS queries to our IP)
DNSServer* dnsServer = nullptr; DNSServer* dnsServer = nullptr;
constexpr uint16_t DNS_PORT = 53; constexpr uint16_t DNS_PORT = 53;
@ -181,8 +195,8 @@ void CrossPointWebServerActivity::onWifiSelectionComplete(const bool connected)
exitActivity(); exitActivity();
// Start mDNS for hostname resolution // Start mDNS for hostname resolution
if (MDNS.begin(AP_HOSTNAME)) { if (MDNS.begin(getDeviceHostname().c_str())) {
Serial.printf("[%lu] [WEBACT] mDNS started: http://%s.local/\n", millis(), AP_HOSTNAME); Serial.printf("[%lu] [WEBACT] mDNS started: http://%s.local/\n", millis(), getDeviceHostname().c_str());
} }
// Start the web server // Start the web server
@ -234,8 +248,8 @@ void CrossPointWebServerActivity::startAccessPoint() {
Serial.printf("[%lu] [WEBACT] IP: %s\n", millis(), connectedIP.c_str()); Serial.printf("[%lu] [WEBACT] IP: %s\n", millis(), connectedIP.c_str());
// Start mDNS for hostname resolution // Start mDNS for hostname resolution
if (MDNS.begin(AP_HOSTNAME)) { if (MDNS.begin(getDeviceHostname().c_str())) {
Serial.printf("[%lu] [WEBACT] mDNS started: http://%s.local/\n", millis(), AP_HOSTNAME); Serial.printf("[%lu] [WEBACT] mDNS started: http://%s.local/\n", millis(), getDeviceHostname().c_str());
} else { } else {
Serial.printf("[%lu] [WEBACT] WARNING: mDNS failed to start\n", millis()); Serial.printf("[%lu] [WEBACT] WARNING: mDNS failed to start\n", millis());
} }
@ -439,7 +453,7 @@ void CrossPointWebServerActivity::renderServerRunning() const {
startY += 6 * 29 + 3 * LINE_SPACING; startY += 6 * 29 + 3 * LINE_SPACING;
// Show primary URL (hostname) // Show primary URL (hostname)
std::string hostnameUrl = std::string("http://") + AP_HOSTNAME + ".local/"; std::string hostnameUrl = std::string("http://") + getDeviceHostname().c_str() + ".local/";
renderer.drawCenteredText(UI_10_FONT_ID, startY + LINE_SPACING * 3, hostnameUrl.c_str(), true, EpdFontFamily::BOLD); renderer.drawCenteredText(UI_10_FONT_ID, startY + LINE_SPACING * 3, hostnameUrl.c_str(), true, EpdFontFamily::BOLD);
// Show IP address as fallback // Show IP address as fallback
@ -468,7 +482,7 @@ void CrossPointWebServerActivity::renderServerRunning() const {
renderer.drawCenteredText(UI_10_FONT_ID, startY + LINE_SPACING * 2, webInfo.c_str(), true, EpdFontFamily::BOLD); renderer.drawCenteredText(UI_10_FONT_ID, startY + LINE_SPACING * 2, webInfo.c_str(), true, EpdFontFamily::BOLD);
// Also show hostname URL // Also show hostname URL
std::string hostnameUrl = std::string("or http://") + AP_HOSTNAME + ".local/"; std::string hostnameUrl = std::string("or http://") + getDeviceHostname().c_str() + ".local/";
renderer.drawCenteredText(SMALL_FONT_ID, startY + LINE_SPACING * 3, hostnameUrl.c_str()); renderer.drawCenteredText(SMALL_FONT_ID, startY + LINE_SPACING * 3, hostnameUrl.c_str());
renderer.drawCenteredText(SMALL_FONT_ID, startY + LINE_SPACING * 4, "Open this URL in your browser"); renderer.drawCenteredText(SMALL_FONT_ID, startY + LINE_SPACING * 4, "Open this URL in your browser");