简体   繁体   中英

Get webRTC to listen to a UDP connection

I have been really struggling to send data from Matlab over a network to a series of 'Dashboards' written in HTML/JS that essentially just display the data.

In Matlab I use uSend = udpport("datagram","IPV4","LocalHost","127.0.0.1","LocalPort",3333) then write(uSend,D,"char","LocalHost",2560) to send an array D=jsonencode([1,2,3,4,5]) to port 2560.

My current implementation uses NodeJS 'dgram' to receive the data. The implementation below works:

const dgram = require('dgram');
const socket = dgram.CreateSocket('udp4');
socket.on('message', (msg,rinfo) => {
    console.log(`Data Received: ${JSON.parse(msg)}`)
})
socket.bind(2560,"127.0.0.1")

BUT: This only works with NodeJS ie run the script above node script.js . The 'Dashboards' need to run essentially on a chrome browser, which dgram won't work (not even with browserify, it's not a supported function).

Hence, my hands are sort of tied, with Matlab I can realistically only send UDP (it's multicast) and I can't get UDP data on the JS side of things.

I was wondering, with webRTC, is it possible to get it to listen to a port? eg something like webRTC listen to port 2560 @127.0.0.1 ?

Any help would be much appreciated. I am relatively new to programming so I may be asking the wrong question here. Thanks

WebRTC requires a lot more then just a UDP port unfortunately.

I would suggest instead running a node.js server that accepts incoming multicast traffic and caches like this.

const dgram = require('dgram');
const socket = dgram.CreateSocket('udp4');
let data = [];
socket.on('message', (msg,rinfo) => {
    data.push(JSON.parse(msg))
})
socket.bind(2560,"127.0.0.1")

Then I would provide a HTTP endpoint that returns the JSON. You can have the browser poll this at an interval of your choosing.

const http = require('http');


const server = http.createServer((req, res) => {
    response.end(JSON.stringify(data));
})

const port = 3000
server.listen(port, () => {
    console.log(`Server listening on port ${port}`);
})

You can then test this by doing curl http://localhost:3000 . You are just caching the data then making it available via HTTP request.

In the future I would look into using a Websocket instead. This way the server can push the data to the browser as soon as it is available. Using a HTTP endpoint requires the browser to request on an interval.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM