DENO UDP Datagram Connection Socket не получает ответ на LinuxLinux

Ответить
Anonymous
 DENO UDP Datagram Connection Socket не получает ответ на Linux

Сообщение Anonymous »

Итак, в основном я начал небольшой проект, включая Yeelight вчера. Система Linux. Все работает, но Дено не ловит никаких ответов. И из Wireshark устройство Yeelight отвечает на мою систему, Deno, кажется, просто игнорирует его. Так что это не должно быть проблемой устройства или сети. < /P>
Я что-то упускаю?

Код: Выделить всё

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,
);
}
}
})();

// Send M-SEARCH request
console.log(`Sending discovery request on interface ${iface.name} (${iface.address})`);
await socket.send(data, {
hostname: "239.255.255.250",
port: 1982,
transport: "udp",
}).then(() => {
console.log(`Sent discovery request on interface ${iface.name} (${iface.address})`);
}).catch((error) => {
console.error(`Error sending discovery request on interface ${iface.name} (${iface.address}):`, 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
Обычно у меня есть проблемы с запуском кода в Windows, а не на Linux lmao
С уважением

Подробнее здесь: https://stackoverflow.com/questions/797 ... e-on-linux
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Linux»