1const WebSocket = require('ws');
2const https = require('https');
3const { URL } = require('url');
5// Load environment variables
6require('dotenv').config();
8const MESHCENTRAL_URL = process.env.MESHCENTRAL_URL;
9const USERNAME = process.env.MESHCENTRAL_USERNAME;
10const PASSWORD = process.env.MESHCENTRAL_PASSWORD;
15async function login() {
16 const loginUrl = new URL('/login', MESHCENTRAL_URL);
18 const postData = `action=login&username=${encodeURIComponent(USERNAME)}&password=${encodeURIComponent(PASSWORD)}&token=`;
23 'Content-Type': 'application/x-www-form-urlencoded',
24 'Content-Length': Buffer.byteLength(postData)
28 return new Promise((resolve, reject) => {
29 const req = https.request(loginUrl, options, (res) => {
32 if (res.headers['set-cookie']) {
33 const cookies = res.headers['set-cookie'];
34 for (const c of cookies) {
35 if (c.startsWith('xid=')) {
36 cookie = c.split(';')[0].replace('xid=', '');
43 res.on('data', chunk => data += chunk);
44 res.on('end', () => resolve(cookie));
47 req.on('error', reject);
57async function connectWebSocket(cookie) {
58 const wsUrl = MESHCENTRAL_URL.replace('https://', 'wss://') + '/control.ashx';
60 console.log('š Connecting to WebSocket:', wsUrl);
61 console.log('š Using cookie:', cookie ? 'present' : 'missing');
63 const ws = new WebSocket(wsUrl, {
65 'Cookie': `xid=${cookie}`
69 return new Promise((resolve, reject) => {
70 const timeout = setTimeout(() => {
72 reject(new Error('WebSocket connection timeout'));
76 console.log('ā
WebSocket connected');
77 clearTimeout(timeout);
79 // Send authentication
80 ws.send(JSON.stringify({
87 console.log('š” Requesting nodes...');
88 ws.send(JSON.stringify({
96 ws.on('message', (data) => {
98 const msg = JSON.parse(data.toString());
99 console.log('š© Received:', JSON.stringify(msg, null, 2));
101 if (msg.action === 'nodes' || msg.nodes) {
102 console.log('\nā
Found devices:', Object.keys(msg.nodes || {}).length);
103 Object.entries(msg.nodes || {}).forEach(([id, node]) => {
104 console.log(` - ${node.name || id}: ${node.ip || 'no IP'} (${node.state || 'unknown state'})`);
109 console.log('š© Raw message:', data.toString());
113 ws.on('error', (err) => {
114 console.error('ā WebSocket error:', err.message);
115 clearTimeout(timeout);
119 ws.on('close', () => {
120 console.log('š WebSocket closed');
121 clearTimeout(timeout);
129async function main() {
131 console.log('š§ Checking MeshCentral devices...\n');
133 const cookie = await login();
135 throw new Error('Login failed - no cookie received');
138 console.log('ā
Login successful\n');
140 await connectWebSocket(cookie);
143 console.log('\nā±ļø Timeout - no response from server');
148 console.error('ā Error:', error.message);