Отправка данных через сокет домена unix для канала данных UV4L - PullRequest
0 голосов
/ 29 января 2019

У меня есть вопрос, связанный с отправкой двоичных данных из Raspberry Pi в веб-клиент по каналу данных WebRTC.На самом деле я нашел решение, но я считаю, что оно может быть неэффективным, и я не уверен, почему оно работает.

По сути, у меня есть сервер UV4L с включенными каналами данных WebRTC.Моя цель - отправить данные, собранные через I2C, веб-клиенту через WebRTC.Документация UV4L объясняет, что должен быть создан сокет домена Unix, и данные передаются через сокет от сервера UV4L и приложения, запущенного на Raspberry.Я использовал код C в своем проекте C ++, так как я более знаком с языком.Вот как я создаю сокет в коде моего приложения.Сервер UV4L настроен на создание соединения с соответствующим сокетом.

      struct thread_info *info = (struct thread_info *)args;
      int fd = 0, connfd = 0, returned_len = 0;

      fd = socket(AF_UNIX, SOCK_SEQPACKET, 0);
      if (fd < 0) {
          fprintf(stderr, "Failed to create socket file descriptor\n");
          exit(1);
       }

       struct sockaddr_un addr;
       addr.sun_family = AF_UNIX;
       strncpy(addr.sun_path, "/tmp/uv4l.socket", sizeof(addr.sun_path)-1);

       bind(fd, (struct sockaddr *) &addr, sizeof(addr));
       if (listen(fd, 10)) {
           fprintf(stderr, "Failed to listen on UNIX socket %d\n", errno);
           exit(1);
       }
       socklen_t socket_length = sizeof(addr);
       connfd = accept(fd,(struct sockaddr *)&addr, &socket_length);
       if (connfd < 0) {
           fprintf(stderr, "Failed to accept socket connection\n");
           exit(1);
       }
       info->socketfd = connfd;

Это соединение успешно.Затем я использую файловый дескриптор в другом потоке для отправки данных.Библиотека I2C, которую я использую (pigpio), позволяет копировать данные в char * buffer, что я определяю char buffer[nb_reads];

Я пытаюсь отправить эти данные напрямую, но не вижу сообщений на другомсторона моего канала данных (браузер).Только когда я кодирую данные в виде строки base64, я получаю ожидаемый результат.

    if (total_read > 0) {
        size_t encoded_length; 
        unsigned char *encoded = base64_encode((const unsigned char*)buffer, total_read, &encoded_length);
        ssize_t sent = send(info->socketfd, encoded, encoded_length, MSG_EOR);
        if (sent < 0) {
            fprintf(stderr, "Failed to send all necessary MPU6050 data");
        }
        free(encoded);
    }

Почему я не могу просто отправить байтовый массив напрямую?

1 Ответ

0 голосов
/ 30 января 2019

Каналы данных WebRTC могут обрабатывать сообщения в двух разных двоичных типах : либо Blob, либо ArrayBuffer .Последний является единственным типом сообщений, которые UV4L поддерживает (на данный момент) и ожидает отправки или получения от другого партнера (например, браузера).Другими словами, убедитесь, что браузер интерпретирует данные как ArrayBuffer.

...