Итак, в основном я начал небольшой проект, включая Yeelight вчера. Система Linux. Все работает, но Дено не ловит никаких ответов. И из Wireshark устройство Yeelight отвечает на мою систему, Deno, кажется, просто игнорирует его. Так что это не должно быть проблемой устройства или сети. < /P>
Я что-то упускаю?
Итак, в основном я начал небольшой проект, включая Yeelight вчера. Система Linux. Все работает, но Дено не ловит никаких ответов. И из Wireshark устройство Yeelight отвечает на мою систему, Deno, кажется, просто игнорирует его. Так что это не должно быть проблемой устройства или сети. < /P> Я что-то упускаю?[code]deno run --allow-net --unstable-net --allow-sys main.ts < /code> Код процесса обнаружения (он еще немного неприятен): < /p> const pulledDevices = new Map(); const sockets = new Map();
// As stated form https://www.yeelight.com/download/Yeelight_Inter-Operation_Spec.pdf const encoder = new TextEncoder(); const data = encoder.encode( `M-SEARCH * HTTP/1.1\r\nMAN: "ssdp:discover"\r\nST: wifi_bulb\r\n\r\n`, );
// iterate over all network interfaces -> ensure we find devices on all interfaces, "0.0.0.0" is not sufficient on some systems const interfaces = Deno.networkInterfaces(); for (const iface of interfaces) { if (iface.family !== "IPv4" || iface.address.startsWith("127.")) continue; console.log(`Searching on interface: ${iface.name} (${iface.address})`); // Bind to local interface const socket = Deno.listenDatagram({ port: 0, transport: "udp", hostname: iface.address, reuseAddress: true, });
console.log(`Listening on ${iface.name} (${iface.address})`); console.log(`Socket bound to port ${socket.addr.port}`); sockets.set(iface, socket);
// Listen for responses on the socket (async () => { console.log( `Listening for responses on ${iface.name} (${iface.address})`, ); for await (const [data, addr] of socket) { const response = new TextDecoder().decode(data); const deviceLocation = `${addr.hostname}:${addr.port}`; if (pulledDevices.has(deviceLocation)) { console.log( `Device already pulled from ${addr.hostname}:${addr.port}`, ); continue; } console.log(`Received response from ${addr.hostname}:${addr.port}`); console.log(response); try { console.log(`Adding device ${addr.hostname}:${addr.port}`); const device = this.addDevice(data); pulledDevices.set(deviceLocation, device); console.log( `${device.deviceInfo.name} (${device.deviceInfo.id}) added from ${addr.hostname}:${addr.port}`, ); } catch (error) { console.error( `Error adding device from ${addr.hostname}:${addr.port}:`, error, ); } } })();
// Time to live for the discovery process console.log("Waiting for responses for 5 seconds..."); await new Promise((resolve) => setTimeout(resolve, 5000)); for (const socket of sockets) { console.log(`Closing socket on interface ${socket[0].name}`); socket[1].close(); } < /code> Консольные журналы: < /p> Starting yeelight.ts... Searching on interface: wlp5s0 (172.16.0.110) Listening on wlp5s0 (172.16.0.110) Socket bound to port 37460 Listening for responses on wlp5s0 (172.16.0.110) Sending discovery request on interface wlp5s0 (172.16.0.110) Sent discovery request on interface wlp5s0 (172.16.0.110) Waiting for responses for 5 seconds... Closing socket on interface wlp5s0 < /code> Wireshark Communication: < /p> 1 0.000000000 172.16.0.110 239.255.255.250 UDP 102 37536 → 1982 Len=60 2 0.113301160 172.16.0.105 172.16.0.110 UDP 573 64584 → 37536 Len=531 [/code] Обычно у меня есть проблемы с запуском кода в Windows, а не на Linux lmao С уважением