Как иметь несколько соединений через сокет с помощью Nexmo - PullRequest
2 голосов
/ 08 января 2020

Я внедрил приведенный пример кода (ниже) на моем сервере. Тем не менее, я сталкиваюсь с проблемой, когда 2 абонента пропингуют мой сервер, двоичные данные второго абонента также передаются в одну и ту же конечную точку веб-сокета; в результате получается два двоичных потока в одной конечной точке веб-сокета. Как я могу реализовать nexmo, чтобы у каждого звонящего был свой веб-сокет для подключения к агенту? Я полагаю, что socket.io - это решение, однако я не знаком с ним.

const express = require('express')
const app = express()
var bodyParser = require('body-parser');
app.use(bodyParser.json());
var expressWs = require('express-ws')(app);
var isBuffer = require('is-buffer')
var header = require("waveheader");
var fs = require('fs');
var file;



//Serve a Main Page
app.get('/', function(req, res) {
    res.send("Node Websocket");
});


//Serve the NCCO on the /ncco answer URL
app.get('/ncco', function(req, res) {

    var ncco = require('./ncco.json');
    res.writeHead(200, { 'Content-Type': 'application/json' });
    res.end(JSON.stringify(ncco), 'utf-8');
});


//Log the Events
app.post('/event', function(req, res) {
    console.log(req.body);
    res.send("ok");
});

// Handle the Websocket
app.ws('/socket', function(ws, req) {
    var rawarray = []; 
    console.log("Websocket Connected")
    ws.on('message', function(msg) {
     if (isBuffer(msg)) {
             rawarray.push(msg);
     }
     else {
         console.log(msg); 
     }
    });
    ws.on('close', function(){
      console.log("Websocket Closed")
      file = fs.createWriteStream('./output.wav');
      file.write(header(16000 * rawarray.length/50 * 2,{
                        sampleRate: 16000,
                        channels: 1,
                        bitDepth: 16}));
      rawarray.forEach(function(data){
          file.write(data);
      });
  })
});

app.listen(8000, () => console.log('App listening on port 8000!'))

1 Ответ

2 голосов
/ 08 января 2020

Это должно работать с вашей текущей реализацией, вам нужно сделать несколько изменений. Таким образом, вместо того, чтобы каждый WebSocket находился в одной и той же конечной точке и записывал в один и тот же выходной файл, вам нужно было бы передавать каждый WebSocket по отдельному маршруту и ​​сохранять каждый вывод в разные файлы. Измените свой маршрут сокета, чтобы он выглядел следующим образом:

app.ws('/socket/:identifier', function(ws, req) {
    var rawarray = []; 
    console.log("Websocket Connected")
    ws.on('message', function(msg) {
     if (isBuffer(msg)) {
             rawarray.push(msg);
     }
     else {
         console.log(msg); 
     }
    });
    ws.on('close', function(){
      console.log("Websocket Closed")
      file = fs.createWriteStream('./' + req.params.identifier + '.wav');
      file.write(header(16000 * rawarray.length/50 * 2,{
                        sampleRate: 16000,
                        channels: 1,
                        bitDepth: 16}));
      rawarray.forEach(function(data){
          file.write(data);
      });
  })
});

Чтобы это работало, вам также необходимо изменить свой NCCO, вместо того, чтобы файл stati c, считанный с диска, сгенерируйте его в маршрут. Я не знаю, что именно у вас есть в файле, но вы можете использовать его как есть и изменить бит соединения сокета на что-то вроде:

app.get('/ncco', function(req, res) {

  var ncco = [
    {
      "action": "talk",
      "text": "Please wait while we connect you"
    },
    {
      "action": "connect",
      "eventUrl": [
        "https://yourserver.com/event"
      ],
      "from": "YOUR_NEXMO_NUMBER",
      "endpoint": [
        {
          "type": "websocket",
          "uri": "ws://yourserver.com/socket/" + req.query.from,
          "content-type": "audio/l16;rate=16000"
        }
      ]
    }
  ]
  res.writeHead(200, { 'Content-Type': 'application/json' });
  res.end(JSON.stringify(ncco), 'utf-8');
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...