From 5570c76f16f8069f3a81044784842f6dbd1aaf66 Mon Sep 17 00:00:00 2001 From: Li Zhineng Date: Wed, 2 Jul 2025 20:57:59 +0800 Subject: stub eagle online handler --- server.mjs | 14 ++++++++++++++ server.test.mjs | 13 +++++++++++++ 2 files changed, 27 insertions(+) diff --git a/server.mjs b/server.mjs index 2475442..b431d1e 100644 --- a/server.mjs +++ b/server.mjs @@ -35,6 +35,9 @@ const eagleController = (req, res) => { case 'eagle/GET/genId': eagleGenIdController(req, res) break + case 'eagle/GET/online': + eagleOnlineController(req, res) + break default: notFoundController(req, res) break @@ -66,6 +69,17 @@ const eagleGenIdController = (req, res) => { })) } +const eagleOnlineController = (req, res) => { + res.writeHead(200, { 'Content-Type': 'application/json' }) + res.end(JSON.stringify({ + status: 200, + data: { + snow: 1, // Air quality monitor + eagle: 1 // The AIRMX Pro unit + } + })) +} + const exchangeController = (req, res) => { const [, query] = req.url.split('?') const params = new URLSearchParams(query) diff --git a/server.test.mjs b/server.test.mjs index 1e44083..619d29f 100644 --- a/server.test.mjs +++ b/server.test.mjs @@ -142,6 +142,19 @@ test('device registration endpoint returns not found if path is not supported', assert.strictEqual(res.status, 404) }) +test('device status endpoint', async () => { + const params = new URLSearchParams({ + source: 5, + reqid: '0000000000', + eagleId: 1, + path: 'eagle/GET/online', + params: '{}', + sig: '00000000000000000000000000000000' + }) + const res = await fetch(`${baseUrl}/eagle?${params.toString()}`) + assert.strictEqual(res.status, 200) +}) + test('exchange endpoint', async () => { const stubMacAddress = '0000000000' const stubKey = '00000000000000000000000000000000' -- cgit v1.2.3 From 771a17b76ddfc2315ddbce5688a9a897e7a56a12 Mon Sep 17 00:00:00 2001 From: Li Zhineng Date: Wed, 2 Jul 2025 21:25:59 +0800 Subject: update docs --- README.md | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 86994e5..e042ce3 100644 --- a/README.md +++ b/README.md @@ -39,7 +39,7 @@ HOSTNAME="127.0.0.1" PORT=8080 node server.mjs seconds back to the device. -
GET /eagle
+
GET /eagle?path=eagle/GET/genId
During the pairing process, when the device receives the Wi-Fi credentials you provide, it registers itself with this endpoint along with its MAC @@ -49,6 +49,17 @@ HOSTNAME="127.0.0.1" PORT=8080 node server.mjs the final stage of the pairing process.
+
GET /eagle?path=eagle/GET/online
+
+

The device will access this endpoint immediately after it receives the + Wi-Fi credentials during the pairing process. Based on the hints from + the path name and payload, we believe this endpoint allows the device to + determine if it has successfully connected to the AIRMX network.

+

Therefore, regardless of the parameters the API receives, we will + always provide it with a predetermined response, making it appear as + though the air monitor and the AIRMX Pro unit are already connected.

+
+
GET /exchange
To streamline device pairing, we introduce an unofficial API that enables -- cgit v1.2.3 From 72643a9424fc8e71d0360d710581c194fe6ba945 Mon Sep 17 00:00:00 2001 From: Li Zhineng Date: Wed, 2 Jul 2025 21:29:05 +0800 Subject: improve test --- server.test.mjs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/server.test.mjs b/server.test.mjs index 619d29f..24437b6 100644 --- a/server.test.mjs +++ b/server.test.mjs @@ -153,6 +153,9 @@ test('device status endpoint', async () => { }) const res = await fetch(`${baseUrl}/eagle?${params.toString()}`) assert.strictEqual(res.status, 200) + const data = await res.json() + assert.strictEqual(data.data.snow, 1) + assert.strictEqual(data.data.eagle, 1) }) test('exchange endpoint', async () => { -- cgit v1.2.3