Как получать сообщения UDP в приложении Cordova на мобильном устройстве? - PullRequest
0 голосов
/ 06 августа 2020

Я занимаюсь программированием 2 месяца и хочу создать мобильное приложение, которое будет взаимодействовать с сервером на P C в той же локальной сети. Я использую модуль NodeJS Dgram и Socket.io. Я транслирую сообщения на сервере, и я хочу видеть эти сообщения на своем мобильном устройстве, чтобы, когда я запускаю приложение на устройстве, я буду прослушивать сообщения, а затем устанавливать соединение через сокет с адресом, на который было отправлено сообщение. из. Я видел пару примеров / решений в сети, но я все еще не понимаю, и это меня еще больше сбивает с толку. В настоящее время он работает хорошо, потому что я транслирую с одного P C, а с другого P C. Я запускаю клиент узла. js, а затем прослушиваю эти сообщения, но я хотел бы сделать то же самое, только на мобильном устройстве (Кордова платформа).

Цель состоит в том, чтобы я щелкнул кнопку и начал прослушивать широковещательные сообщения, если это вообще возможно.

Код для широковещательной передачи - на сервере:

const dgram = require('dgram');
            const broadcasts = this.getBroadcastAddresses();
            _broadcasting = setInterval(
                function (broadcasts, dgram, options) {
                    broadcasts.forEach(function (broadcast) {
                        const message = Buffer.from(options.data);
                        console.log(message);
                        const client = dgram.createSocket({ type: 'udp4', reuseAddr: true });
                        client.bind(8080, function () {
                            client.setBroadcast(true);
                            client.send(message, 0, message.length, 8080, broadcast, function (err, bytes) {
                                if (err) {
                                    console.error(err);
                                }
                                client.close();
                                if (options.hasOwnProperty('callback')) {
                                    options.callback(broadcast, err, bytes);
                                }
                                return;
                            });
                        });
                    });
                },
                options.timer * 1000,
                broadcasts,
                dgram,
                options
            );

Код для клиента для прослушивания сообщений:

    if (util.platform === 'webkit') {
            var dgram = require('dgram');
            _socket = socket = dgram.createSocket({ type: 'udp4', reuseAddr: true });
            _socket.on('message', function (message, rinfo) {
                console.log('Message: ' + rinfo.address + ':' + rinfo.port + ' - ' + message);
            });
            _socket.on('listening', () => {
                options.bind_callback(socket.address());
            });

            _socket.bind(8080, '0.0.0.0');
        } else if (util.platform === 'cordova') {
            _socket = window.dgram.createSocket('udp4', 8080);
            _socket.on('message', (msg, remote) => {
                options.message_callback(msg.toString(), remote);
            });
            _socket.on('listening', () => {
                options.bind_callback(socket.address());
            });
            _socket.bind();
        }

1 Ответ

0 голосов
/ 07 августа 2020

Я решил это, установив плагин Cordova, который может работать с протоколом UDP и работает как шарм.

Плагин называется cordova-plugin-datagram4 и имеет версию 1.0.2. Вы можете найти его по этой ссылке: https://www.npmjs.com/package/cordova-plugin-datagram4/v/1.0.2

Вот как я сделал это на стороне клиента:

getMaster: async () => {
            const datagram = cordova.require('cordova-plugin-datagram4.datagram');
            const _socket = datagram.createSocket('multicast-udp4');
            _socket.bind(port);
            _socket.on('listening', () => {
                let address = socket.address();
                console.log('UDP _socket listening on ' + address.address + ':' + address.port);
            });
            _socket.on('message', function (message, rinfo) {
                console.log('Message from: ' + rinfo.address + ':' + rinfo.port + ' - ' + message);
                document.getElementById('master-ip-field').value = rinfo.address;
                data.host = rinfo.address.trim();
                _socket.close();
                app.settings._makeConnection(rinfo.address);
            });
            return senderAddress;
        },

Я вызываю app.getMaster ( ), чтобы начать прослушивание UDP-пакетов, отправленных со стороны сервера (NodeJS сервер) в той же локальной сети.

...