Mastering openFrameworks_第十一章_网络

网络

网络为多个设备之间的数据交换提供了一种方式。它是一个主要组成部分,允许远程控制移动和平板设备应用程序中的一些参数,也用于使交互式项目在多台计算机上同步工作。在本章中,您将学习如何在openFrameworks项目中实现和使用OSC和TCP协议,具体如下:

网络基础

使用OSC协议

使用TCP协议处理流图像

网络基础

网络包括许多硬件和软件技术,它们提供数字设备之间甚至计算机内部应用程序之间的数据交换。目前最流行的网络模型是tcp/ip(传输控制协议/互联网协议)。它使用有线(LANー局域网)或无线(wlanー无线局域网)连接。所有的现代计算机和移动设备都支持tcp/ip协议。

注意:另一种网络技术是无线ZigBee网络,广泛应用于物理计算项目。只连接两个设备可以被认为是最简单的网络。旧的但仍然流行的有线连接技术是USB、串行端口(RS-232)、RS-485和I2C(用于微设备)。

在本章中,我们将考虑使用tcp/ip连接本地网络中的多个设备。本地网络是由网络路由器构建和控制的。网络路由器是一个特殊的网络节点,它作为一个独立的设备工作,或者集成在你的笔记本电脑中。

网络路由器给每个连接到网络的设备一个唯一标识符地址,称为网络地址。地址具有192.168.0.3这样的格式,或者可以是计算机名,如Mymachine。每个设备都可以使用地址localhost或其等价物127.0.0.1引用自身。查看网络适配器的属性以查找设备的网络地址。您还可以使用Terminal窗口请求网络信息,方法是输入ipconfig命令(用于Windows)或ifconfig命令(用于MacOSx和Linux)。

要测试具有已知地址的两台计算机之间的连接,可以使用ping命令,例如ping 192.168.0.3。如果连接没有建立,它可能被路由器或计算机的防火墙或防病毒软件阻止。在这种情况下,检查它们的设置。

注意:请注意,当重新启动设备和路由器时,网络地址可能会发生变化。因此,对于长期工作的交互式安装,您应该在其网络适配器的设置中修正计算机的地址,或者只使用计算机名称而不是编号地址。

为了将一些数据从一个设备发送到另一个设备,您应该指定目标设备的网络地址,以及端口号,端口号是介于0和65535之间的整数。有些端口是保留的,例如,端口80用于通过浏览器进行HTTP协议交换。在本章的例子中,我们将使用端口12345。

系统服务很少使用大数量(大于10,000)的端口,因此您最有可能使用它们。要查明您的系统中使用了哪些端口,可以使用来自终端的特殊软件或网络命令。对于连接设备,我们经常使用端口12345、12346、12347和12348。

在本章中,我们将学习如何使用以下两个协议来实现数据传输:

OSC:开放声音控制是非常简单和快速的。它适用于快速传输少量信息(例如更改参数和对象坐标的命令)。它是交互式安装和物理计算项目中使用的主要协议。它在所有与vj-相关的软件中都得到了支持。

最初,OSC作为MIDI的网络替代品,MIDI是连接乐器的有线协议。现在,OSC用于控制广泛的应用程序和设备,通常与音乐无关。

Tcp:传输控制协议可以轻松地传输大量数据。这是一个通用的协议。在本章中,我们将看到一个使用它进行图像流的例子。

让我们从OSC协议开始。

使用OSC协议

Osc是一个非常流行的协议,用于在设备和应用程序之间发送控制命令和参数。这是一个无法确认数据交换是否成功的协议,也就是说,发送方不知道接收方是否收到了数据,接收方也不知道是否有人向它发送了数据。因此,数据可能在没有通知发送方和接收方的情况下丢失。

但是,在本地网络中,这种情况非常罕见,而且只有在使用极快的帧速率发送数据时才会发生。

OSC是UDP协议上的一个薄层。有关更多信息,请阅读UDP规范。

要在openFrameworks项目中使用OSC功能,您需要使用ofxOsc插件。这是一个包含在openFrameworks发行版中的核心插件。

我们建议您第一次尝试OSC时,使用openFrameworks 例子oscSenderExample和oscReceiveExample,它们位于openFrameworks文件夹中的examples/addons中。在同一台PC上运行这两个命令,然后将鼠标移动到oscSenderExample窗口上。您将看到oscReceiveExample接收鼠标坐标并将它们写在屏幕上。

要在你的项目中使用插件,你有三个选择:

1.通过将oscSenderExample或oscReceiveExample复制到您的项目文件夹来启动一个新项目。这种方法对于OSC的首次试验来说是最简单也是最好的。

2.通过指定ofxOsc插件,使用ProjectGenerator向导创建一个新项目。详细信息请参阅附录a,使用插件工作。

3.将addons/ofxOsc文件夹中的所有文件链接到您的项目,并指定它们的路径。这是将OSC支持添加到现有项目的方法。

现在您已经有了带有链接的ofxOsc插件的项目,并且可以使用OSC协议发送和接收数据。

发送数据

要在项目中使用OSC发送数据,请执行以下步骤:

1.将#include“ofxOsc.h”行添加到testApp.h文件中#include“ofMain.h”行。

2.通过添加ofxOscSender sender方来声明将发送OSC数据的发送方对象;testApp类定义中的行。

3.在testApp::setup()函数中使用以下行初始化发送方:

sender.setup("localhost", 12345 );

Sender.setup()函数的第一个参数是包含接收方地址的字符串。Localhost是计算机本身的地址,因此,发送方将向运行在同一台计算机上的其他应用程序发送数据。要将数据发送到另一个设备,必须知道它的地址并指定它,例如,192.168.0.3。第二个整数参数是接收方的端口。我们使用12345是因为它通常不被操作系统用于任何特殊用途。

4.当您需要发送一些数据时,创建OSC消息作为ofxOscMessage类型的对象,指定它的地址,用参数或参数填充它,最后使用sender.sendMessage()发送消息:

ofxOscMessage m;
m.setAddress( "/volume" );
m.addFloatArg( 0.4f );
sender.sendMessage( m );

消息的地址不是接收者的网络地址。它只是接收者可以理解的参数的名称。地址以/开头,如果需要,可以包含多个/符号,例如:

/object1/velocity.

消息可以包含以下类型的几个参数之一:float、int和string。参数通过调用相应的函数依次附加到消息上:m.addFloatArg()、m.addIntArg()和m.addStringArg()。例如:

m.addFloatArg( 0.4f );
m.addIntArg( 1 );
m.addStringArg( "start" );

最常用的参数类型是范围[0,1]中的浮点值。它们通过软件平台(如VDMX和max/msp)自然地与VJ控制器和其他设备相连。此外,整数值用于表示按钮状态(0-disabled,1-enabled)。

您可以让多个发送方将数据发送到多个目的地。

我们建议将目的地址和端口号存储在外部.xml文件放在项目的数据文件夹中。我们称这个文件为settings.xml。将读取目标地址和端口号的值的操作添加到testApp::setup()函数,并使用这些值作为sender.setup()的参数。此方法使您可以灵活地在不同的网络配置中运行项目,而无需重新编译。

使用可以使用的ofxXmlSettings插件.xml文件。了解如何在openFrameworks示例中使用它:example/addons/xmlSettingsExample。

请注意以下规则:

1.小心不要发送信息太快,因为它们可能会丢失。正常情况下,发送30或60帧的效果很好。

2.如果您需要同时发送许多消息,一个好主意是使用ofxOscBundle对象将它们组合成一组。只需创建一个这种类型的对象,添加ofxOscMessage消息,然后发送:

ofxOscBundle bundle;
bundle.addMessage( m ); //First ofxOscMessage message
bundle.addMessage( m2 ); //Second message
//...
sender.sendBundle( bundle ); //Send bundle

OSC数据包的大小是有限的。最大大小取决于操作系统和网络设置,但通常不少于500字节。如果限制值超过,您的OSC数据包经常会丢失。因此,不要发送包含太多信息的消息和包。请注意,所有数据(包括数字)都以文本形式存储在OSC数据包中。

接收数据

要在项目中接收OSC的数据,请执行以下步骤:

1.将#include“ofxOsc.h”行添加到testApp.h文件中#include“ofMain.h”行。

2.通过添加ofxOscReceiver receiver来声明将接收OSC数据的接收器对象;testApp类定义中的行。

3.在testApp::setup()函数中使用下面的代码行启动接收器:

receiver.setup( 12345 );

receiver.setup()函数的参数是端口号的整数值。

注意:如果需要在一台计算机上使用多个接收器,则应为每个接收器指定不同的端口。

4.现在,您应该等待传入到接收方的消息并解析它们。最佳实践是在while循环中的testApp::update()函数中执行:

while ( receiver.hasWaitingMessages() ){
 //Get the next message
 ofxOscMessage m;
 receiver.getNextMessage( &m );
 //Parse message, for example:
 if ( m.getAddress() == "/volume" ){
 //Get first argument
 float volume = m.getArgAsFloat( 0 );
 //...
 //Use volume value, for example:
 sound.setVolume( volume )
 }
};

你可以使用函数m.getArgAsFloat(index)、m.getArgAsInt32(index)和m.getArgAsString(index)获得消息m中的参数值,其中index是参数的索引、0-first、1-second等。要获取属性的数量,请使用m.getNumArgs()函数,该函数返回m中的属性值。

让我们看看通过使用OSC将项目与其他应用程序连接起来使用它们的一些典型方案。

Osc使用的典型方案

Osc的典型用法如下:

1.使用苹果iPad或者其他平板来发送命令,比如保存屏幕截图到磁盘或者控制粒子的速度等参数。

你需要在桌面上安装一个应用程序,比如TouchOSC,它会把OSC消息从你的设备发送到你的openFrameworks的项目中。

2.使用您的openFrameworks应用程序作为一个跟踪器,它从世界获取一些信息(例如,使用深度摄像机计算用户身体部位的坐标),并将其发送到max/msp、VDMX、QuartzComposer、TouchDesigner或Unity3D,以生成声音和视觉效果。

对于更复杂的方案,您需要使用OSC-manager应用程序,该应用程序路由OSC信号,如OSCulator。

尽管OSC得到了所有创造性编码和VJ软件的良好支持,但它不能轻松地传输图像等大数据。因此,让我们考虑如何使用另一个协议来实现它,例如TCP。

使用TCP协议处理流图像

Tcp是所有Internet协议的基础,例如HTTP。这是一个错误检查协议,它保证获取有效数据并通知错误。这使得它适合从计算机发送大量的数据,不仅在您的本地网络,而且在世界各地。

要在openFrameworks中使用TCP,您需要使用ofxNetwork插件。

注意:我们建议第一次尝试使用openFrameworks示例的TCP:networkTcpServerExample和networktcpcpcclientexample,位于openFrameworks的文件夹中的examples/addons。在同一台电脑上运行这两个命令,然后激活networktcpcclientexample窗口并按下一些键。您将看到这些键将被发送到networkTcpServerExample并打印在其屏幕上。

对于链接ofxNetwork插件,有三个类似于ofxOsc插件的选项。有关详细信息,请查看“使用OSC协议”部分的开头。

基于客户-服务器技术的TCP协议实现方案。在一个应用程序中,您需要使用ofxTCPServer对象创建并启动服务器。在另一个应用程序中,您需要使用ofxTCPClient客户机对象创建一个客户机,并与服务器建立连接。在此之后,您可以将字符串消息和原始数据字节从客户机发送到服务器,从服务器发送到客户机。可以有多个客户端连接到一个服务器。

原则上,使用ofxNetwork插件,您可以实现自己的HTTP或FTP服务器,并做任何事情,如从互联网下载文件。但是,对于严肃的项目,我们强烈建议不要自己这样做,因为TCP是一个非常低级的协议。相反,可以使用一些现成的插件或者特殊的库。此外,openFrameworks核心包含几个类,这些类可能对您的需求非常有用:

1.如果你需要从网上下载图片,你可以使用image.loadImage(url)函数,其中URL是指定图像URL的字符串。注意,它会暂停应用程序的执行,直到下载图像。因此,要不停顿地下载图像(称为

异步),请参阅openFrameworks示例:examples/graphics/imageaderwebexample。

2.要下载任意文件,可以使用ofURLFileLoader类。我们不会在这本书中考虑它。

3.要处理HTTP请求和响应,请参阅libs/openframeworks/utils/ofurlfileload.h文件中的函数。这也超出了本书的范围。

我们不会详细考虑ofxTCPServer和ofxTCPClient类,但是我们将包括一个非常有用的例子,通过在同一台或不同的计算机上工作,在应用程序之间使用它来流动图像。

流图像示例

让我们考虑一个演示如何使用TCP在应用程序之间发送图像的示例。它由发送者和接收者两个项目组成。

注意:这个示例包含两个项目,networkImageSender和networkImageReceiver。它们位于文件夹中

11-Networking/networkimageender和11-Networking/networkimagereiver本书的示例。

这两个示例项目是由一些来源提出的.h和.cpp文件。有关如何从这些源创建openFrameworks项目的详细说明,请阅读testApp.h文件的开头。

编译并运行这两个项目。发送者将获取相机图像并将其发送到接收者。两个项目都在屏幕上绘制当前图像,并显示当前帧的ID。此外,接收器显示接收到的图像的帧速率(这不仅取决于网络,还取决于相机的实际帧速率):

发送方和接收方使用ofxTCPServer和ofxTCPClient类将图像作为未压缩的数组发送和接收。在pbNetwork.h和pbNetwork.cpp文件中查看其实现的详细信息,这些文件包含在每个示例的项目中。

当您需要在应用程序之间发送大量信息时,可以将此示例用作您自己项目的草图。

注意:我们经常在我们的互动装置和表演中使用这种技术。我们安装了两个pc,一个是可以和深度摄像机一起工作的Tracker,另一个是渲染,渲染安装的视觉效果。跟踪器从几个深度相机获取数据,将它们粘贴到一个更大的深度图像中,并通过TCP发送到Render。这种跟踪和渲染的分离提高了系统的整体稳定性,并且从深度数据分析中卸载了Render,从而可以进行更多的处理,获得更丰富的可视化效果。

通常你可以用100mbps的有线连接以30fps的速度发送320240的灰度图像。为了发送更大的图像,使用更快的网络设备,如1gbp或更高。请注意,我们从来没有使用无线连接在严重的音乐会和演出,因为可能会导致观众的移动设备的不稳定性。

如果您需要在Mac计算机上将图像从一个应用程序发送到另一个应用程序,则不需要使用网络。在这种情况下,最好的选择是使用一个名为Syphon的开放库,方法是下载和安装ofxSyphon插件。这个插件允许openFrameworks和其他应用程序在OpenGL级别上交换映像,因此它比网络工作得更快。

摘要

在本章中,我们学习了如何使用OSC和TCP协议将应用程序与其他应用程序和设备连接起来。它使我们能够创建复杂的分布式交互系统,其可能性远远超过单个openFrameworks项目。

这是这本书的最后一章。在这本书中,我们学习了一些交互式多媒体的基础知识。我们希望您继续您的调查,实现您自己的项目,并打破交互体验的界限!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/879262.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Go 1.19.4 路径和目录-Day 15

1. 路径介绍 存储设备保存着数据,但是得有一种方便的模式让用户可以定位资源位置,操作系统采用一种路径字符 串的表达方式,这是一棵倒置的层级目录树,从根开始。 相对路径:不是以根目录开始的路径,例如 a/b…

【Qt笔记】QScrollArea控件详解

目录 引言 一、QScrollArea 的基本概念 二、QScrollArea 的主要属性 2.1 设置内容大小是否随滚动区域变化 2.2 设置水平与垂直滚动条 2.3 设置视口外边距 三、QScrollArea 的常用方法 3.1 设置显示小部件 3.2 返回当前设置的小部件 3.3 设置内部小部件是否可以填充…

【bug】通过lora方式微调sdxl inpainting踩坑

报错内容 ValueError: Attempting to unscale FP16 gradients. 报错位置 if accelerator.sync_gradients:params_to_clip (itertools.chain(unet_lora_parameters, text_lora_parameters_one, text_lora_parameters_two)if args.train_text_encoderelse unet_lora_parameters…

ICP算法介绍,机器人姿态估计,三维点云配准

介绍 ICP算法,即Iterative Closest Point(迭代最近点)算法,是一种广泛应用于计算机视觉和图像处理领域的几何配准算法。它的主要目的是通过最小化两组点集之间的距离来找出一组变换,使得两组点集尽可能地对齐。ICP算法…

37拼购:电商新风尚,共享双赢的购物革命

随着2024年电商市场的日益繁荣,商品海洋中的同质化问题愈发严峻,消费者在茫茫商海中寻觅独特价值的难度陡增。在此背景下,一种名为“37悦享拼”的创新电商模式横空出世,它巧妙融合了私域社交与电商精髓,旨在打破传统壁…

9.18作业

提示并输入一个字符串&#xff0c;统计该字符串中字母、数字、空格、其他字符的个数并输出 代码展示 #include <iostream>using namespace std;int main() {string str;int countc 0; // 字母计数int countn 0; // 数字计数int count 0; // 空格计数int counto 0;…

部署自己的对话大模型,使用Ollama + Qwen2 +FastGPT 实现

部署资源 AUTODL 使用最小3080Ti 资源&#xff0c;cuda > 12.0使用云服务器&#xff0c;部署fastGPT oneAPI&#xff0c;M3E 模型 操作步骤 配置代理 export HF_ENDPOINThttps://hf-mirror.com下载qwen2模型 - 如何下载huggingface huggingface-cli download Qwen/Qwen2-…

Java | Leetcode Java题解之第402题移掉K位数字

题目&#xff1a; 题解&#xff1a; class Solution {public String removeKdigits(String num, int k) {Deque<Character> deque new LinkedList<Character>();int length num.length();for (int i 0; i < length; i) {char digit num.charAt(i);while (!…

ERP进销存管理系统的业务全流程 Axure高保真原型源文件分享

这是一套ERP进销存管理系统的业务全流程Axure高保真原型设计文档。 原型预览地址&#xff1a;https://ppndif.axshare.com 产品意义&#xff1a; 提高工作效率&#xff1a; 电子记账替代手工记账&#xff0c;减少工作负担和人为错误。 实时查看库存情况&#xff0c;减少盘点时…

MySQL常用语句(一)

#数据库操作思路 #相关实验 <SQL语句简介> <web安全SQL语句基本操作> #数据库管理 #创建数据库 在与数据进行任何操作之前&#xff0c;需要创建一个数据库。数据库是数据的容器&#xff0c;用于存储和操作诸如表、数据库视图、触发器、存储过程等数据的数据集…

项目管理 | 一文读懂什么是敏捷开发管理

在快速变化的商业环境中&#xff0c;项目管理方式也在不断演进&#xff0c;其中敏捷开发管理因其高效、灵活和适应性强的特点&#xff0c;逐渐成为众多企业和团队的首选。本文将详细解析敏捷开发管理的定义、具体内容及其核心角色&#xff0c;帮助读者全面理解这一先进的项目管…

Alinx MPSoC驱动开发第17章I2C实验修改设备树后petalinux编译报错

问题描述 在使用Alinx的MPSoC Linux驱动开发手册第17章进行I2C驱动学习时&#xff0c;在按照手册&#xff0c;在system-user.dtsi文件最后添加引用i2c1节点内容&#xff1a; 然后使用petalinux-build命令进行编译&#xff0c;后报错如下&#xff1a; 尝试解决问题 1&#xff0c…

vscode软件在 C发中常用插件

一. 简介 本文简单介绍一下&#xff0c;当做 C开发时 vscode软件常用的插件。 vscode软件是 微软公司目前提供的一款免费的开发软件&#xff0c;可以通过 vscode官网下载 vscode。 二. vscode软件在 C开发中常用插件 注意&#xff1a;vscode软件安装后&#xff0c;可以直接…

FlinkCDC 3.2.0 新增优点 Pattern Replacement in routing rules

新增优点&#xff1a;Pattern Replacement in routing rules flinkcdc 3.2.0版本相较于3.1.0版本&#xff0c;避免了多表多sink多次写 route 路由的麻烦&#xff0c;类似于统一前后缀的形式多表多sink&#xff0c;通过<>正则&#xff0c;大大减少了书写 官网&#xff1…

鸿蒙开发之ArkUI 界面篇 九 QQ音乐登录界面揭秘

我们需要实现的效果如下图&#xff1a; : 分析&#xff0c;垂直方向&#xff0c;四个按钮&#xff0c;从上往下第一个是Image&#xff0c;第二个是Text、第三个是是Button、第四个是Button&#xff0c;垂直布局用Column&#xff0c;代码实现如下&#xff1a; Entry Component…

【C语言进阶】动态内存与柔性数组:C语言开发者必须知道的陷阱与技巧

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ ⏩收录专栏⏪&#xff1a;C语言 “ 登神长阶 ” &#x1f921;往期回顾&#x1f921;&#xff1a;C语言动态内存管理 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀C语言动态内存管理 &…

RabbitMQ 基础入门

文章内容是学习过程中的知识总结&#xff0c;如有纰漏&#xff0c;欢迎指正 文章目录 前言 1. 重要概念 1.1 Publisher 1.2 Message 1.3 Exchange 1.4 BindingKey 1.5 Routingkey 1.6 Queue 1.7 Consumer 1.8 Connection 1.9 Channel 1.10 Virtual Host 1.11Broker 2. RabbitMQ…

三菱变频器以模拟量电流进行频率设定(电流输入)

POINT 1、在 STF(STR)信号 ON 时&#xff0c;发出启动指令。2、请将 AU 信号置为 ON。 3、请设定 Pr.79 运行模式选择 “2”(外部运行模式)。 接线示例 重点&#xff1a;请将 AU 信号置为 ON。 操作示例&#xff1a;以 60Hz 运行。 1、接通电源时的画面&#xff0c;监视器显…

vue3+ant design vue 中弹窗自定义按钮设置及以冒号为基准布局

1、自定义弹窗按钮&#xff0c;去除取消和确定按钮。&#xff08;网上很多方法都是说通过插槽来实现&#xff0c;但是试了下不生效&#xff0c;那既然插槽不生效的话&#xff0c;干脆直接写按钮就好了&#xff09; <a-modalv-model:open"open"title"人员信息…

如何挑选适用的WMS 智能仓储管理系统?这份盘点攻略请收好!

本文将盘点十款WMS智能仓储管理系统&#xff0c;为企业选型提供参考&#xff01; 在现代企业的物流运作中&#xff0c;仓库就如同一个关键的枢纽&#xff0c;连接着生产与销售的各个环节。而一个高效的 WMS 智能仓储管理系统&#xff0c;就像是一位精明的管家&#xff0c;能让仓…