您尚未登录,请先 登录注册,以便参与发帖交流。

C ++ 只是 IQ数据流

回复主题
4 个回复 · 1067 次浏览
#1 2021-04-09 16:52
银光图片
从Aaronia RTSA Suite PRO到您的自定义C ++应用程序中获取实时数据流的最简单方法是运行RTSA Suite PRO,并仅使用HTTP Server块请求数据。

所有配置或设备参数均通过RTSA Suite PRO任务中的预配置完成。远程询问状态,获取和设置RTSA Suite PRO任务的配置将发布在单独的主题中。



在“ RTSA Suite PRO HTTP流服务器”主题中,是HTTP Server块的接口文档,该文件已经包含一个名为“ RESTStreamer.zip”的C ++示例。



现在,让我们仔细看看该示例。

如果RTSA Suite PRO任务包含连接到HTTP Server块的数据源块,则流HTTP REST端点将提供JSON对象的连续数据流。数据块由换行符(ASCII 10)和记录分隔符(ASCII 30)字符分隔。

为了获得更高的数据速率,应使用二进制数据值。如HTTP接口文档中所述,此示例中的格式通过HTTP参数“ format = raw16”设置为二进制整数值(每个16位)。

为了获得更高的动态范围和更高的精度,应通过参数“ format = raw32”选择每个32位浮点值。

例如,在以下地址请求完整的HTTP流:本地主机,端口54664。

HTTP get请求中的结果是:http:// localhost:54664 / stream?format = raw16

这将要求由交替的JSON标头和数据块组成的无尽数据流。

只要有数据,它就会一直重复。流中的JSON对象是一个数据包的报头,其后是二进制IQ数据的有效负载

(I和Q值交错)。

{

"startTime":1614338274.734474,

"endTime":1614338274.734695,

"startFrequency":197609375,

"endFrequency":202390625,

"minPower":-2,

"maxPower":2,

"sampleSize":2,

"sampleDepth":1,

"payload":"iq",

"unit":"volt",

"antenna":{"name":""},

"scale":16384,

"samples":1448

}


TOP
#2 2021-04-09 16:57

RESTStreamer示例使用的是Qt框架,该框架带来了一些优势。 在这里,特别是Qt框架简化了网络访问以及JSON数据解码和编码。 网络操作和JSON对象处理是常见的操作,如果您需要使用其他框架,很可能它提供了类似的功能。 如果没有框架,那么您还有更多工作要做,处理操作系统的网络套接字,解析JSON数据,等等。

(Qt框架可在其网站https://www.qt.io/上找到,并且相对易于使用。此处不满足于解释Qt框架,请查看其官方Qt文档。)

准备示例:

1使用连接到数据源的HTTP Server块创建RTSA Suite任务,这里是Spectran V6块的IQ数据输出,并在Spectran V6块中配置测量参数。



2.要在任务加载时自动启动Spectran V6块,请将控制定序器块添加到Spectran V6块,激活“自动启动”复选框,然后在“命令”配置的汉堡菜单中添加启动命令。 使用您喜欢的名称保存任务,例如RemoteV6.rmix:



3.要在每次启动RTSA Suite时加载创建的任务,请转至RTSA Suite左上方的常规RTSA Suite配置菜单“其他”→“配置”。 在“环境”->“启动”部分中,为“启动时”参数选择“加载任务”,然后为“任务”参数选择先前保存的任务:




4.下载并安装Qt框架,构建并运行您的第一个“ hello world”程序。

5.下载并使用Qt Creator打开RESTStreamer示例项目,然后第一次运行该示例。

TOP
#3 2021-04-09 16:58

该示例包含类RTSARestStreamer,该类正在处理网络请求并对传入的数据做出反应:

[tr]class RTSARestStreamer : public QObject

{

[tr]Q_OBJECT

[tr]public:

[tr]RTSARestStreamer(quint32 httpPort);

[tr]~RTSARestStreamer(void);

[tr]protected:

[tr]// QT htttp client

[tr]QNetworkAccessManager * mNetworkAccessManager;

[tr]// Reply from the HTTP server

[tr]QNetworkReply * mReply;

[tr]// Input buffer

[tr]QByteArray mBuffer;

[tr]// Number of IQ sample pairs in the current packet

[tr]int mPacketSamples;

[tr]// Previous sample end time to check for packet loss

[tr]double mPrevTime;

[tr]protected slots:

[tr]void onError(QNetworkReply::NetworkError code);

[tr]void onFinished(void);

[tr]void onReadyRead(void);

};


onError(QNetworkReply :: NetworkError)和onFinished()插槽很简单,这里不再赘述。 数据在onReadyRead()插槽中处理。 并且由于无休止的流,只要流正在运行并且接收到数据,就会定期触发Qt信号readyRead()。 调用onReadyRead()时可能没有接收到完整的JSON标头或数据包,因此需要对接收到的数据进行缓冲(以类似FIFO的方式),直到接收到完整的JSON标头为止。 如果接收到一个完整的JSON标头,则相关数据将再次从缓冲区中删除,并且它将连续收集下一个标头和数据。

TOP
#4 2021-04-09 17:00

如果C ++应用程序没有从HTTP Server块中获取足够的数据,则HTTP Server块的缓冲区将满。 如果缓冲区已满,它将溢出并丢失数据。

如果您读到这里,我想您已经运行了该示例。 首先,请确保您没有任何数据丢失。 如HTTP接口文档中所述,此示例将每个JSON标头的开始时间与先前接收到的JSON标头的停止时间进行比较,并在应用程序输出中转储所有错过的时隙(即数据丢失):




好的,让我们通过在onReadyRead()方法的开头添加一个断点来产生缓冲区溢出,并在调试模式下运行该应用程序:




当程序在断点处停止时,请查看RTSA Suite中的HTTP Server块。 在HTTP Server块的视图区域中,您应该看到缓冲区负载和下降的/ s值正在增加:




拥有良好的硬件和软件系统,缓冲区负载通常应大致为零,并且连接统计信息中的drop / s值应始终为零。 删除断点,然后继续调试应用程序以再次清空缓冲区。


TOP
#5 2021-04-09 17:00

由参数“ format = raw16”设置的数据格式及其16位整数值具有有限的动态范围。 从RTSA Suite版本1.5.152.8366开始,支持16位整数格式的HTTP get请求参数scale = [value]。 因此,您可以设置从RTSA套件接收的数据值的小数位数。 16位整数值的默认缩放比例为16384。要将其缩放一半,HTTP get请求将如下所示:

http:// localhost:54664 / stream?format = raw16&scale = 8192

我们还添加了由HTTP参数“ format = float16”设置的16位浮点值格式。 与32位浮点值相比,它将数据速率降低了近一半。
TOP
回复主题
快速回复