我有一个问题,涉及通过WebRTC数据通道从Raspberry Pi向Web客户端发送二进制数据。我实际上已经找到了解决方案,但是我认为它可能效率不高,而且我不确定它为什么有效。
基本上,我有一台启用了WebRTC数据通道的UV4L服务器。我的目标是将通过I2C收集的数据发送到通过WebRTC的Web客户端。 UV4L文档解释说,必须创建Unix域套接字,并且数据将从UV4L服务器和Raspberry上运行的应用程序通过套接字传递。因为我对C ++语言更加熟悉,所以我在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];
我尝试直接使用send发送此数据,但是在数据通道(浏览器)的另一侧没有看到消息。只有当我将数据编码为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);
}
为什么我不能直接发送字节数组?
答案 0 :(得分:0)
WebRTC数据通道可以处理两个不同的binaryTypes中的消息:Blob
或ArrayBuffer。后者是UV4L目前(目前)支持的唯一消息类型,并且期望send或从其他对等方(例如浏览器)接收或接收。换句话说,请确保浏览器将数据解释为ArrayBuffer
。