主要内容

显示流媒体数据在图窗口

这个例子展示了如何定制HTTPStringConsumer类- - -PricesStreamer——显示流数据从一个假设的网站在MATLAB®图窗口。创建一个工作示例:

  • 确定一个URL,类似于:

    url = matlab.net.URI (“< URL >”,“accountId”< YOUR_ACCOUNT_ID >,“<名称>”,“<价值>”);
  • 修改PricesStreamer.putData读取数据特定于您的web服务

以下任务描述了这个话题。显示表数据信息图窗口,看到的场上

PricesStreamer

PricesStreamer.m的一个子类StringConsumer类,这个类的一个子类ContentConsumerPricesStreamer接收流数据定制特定的web服务提供的数据。在本例中,数据的结构是:

%数据包含一个或多个CRLF-separated JSON结构。%每个结构的格式:%{“心跳”=“时间戳”}%{“滴答”=“时间戳”、“投标”=报价,“问”=问}%的时间戳是格林尼治时间时间和买入价和卖出价是数字。

MATLAB调用PricesStreamer.putData函数为每个块从服务器接收到的数据。首先将原始的函数uint8一个JSON字符串使用字节StringConsumer。接下来,它被一个JSON字符串使用MATLAB结构jsondecode然后在一个表中显示的数据图,表的顶部添加一行对每个增量的数据。您可以修改putData与数据函数来做其他的事情,例如,情节一个实时图或显示三角洲价格。PricesStreamer设置停止返回值停止操作,当用户关闭图。有关更多信息,请参见putData

classdefPricesStreamer < matlab.net.http.io.StringConsumer% PricesStreamer接受流JSON%和显示结果在场上图窗口。% 2016 - 2017版权MathWorks公司。属性图表瘟疫逻辑HaveTick逻辑结束方法(访问=保护)函数长度=开始(obj)如果obj.Response。StatusCode ~ = matlab.net.http.StatusCode.OK长度= 0;其他的长度= obj.start@matlab.net.http.io.StringConsumer;obj。图=图(“CloseRequestFcn”,@obj.endit);obj.Figure.Position (4) = 550;obj.Figure.Position (2) = 50;obj。表=场上(obj.Figure,“ColumnName”,{“时间”,“收购”,“问”},“ColumnWidth”{130年,“汽车”,“汽车”});obj.Table.Position (4) = 500;obj.Table。Data =细胞(0,3);obj.Endit= false; obj.HaveTick = false;结束结束结束方法函数(len,停止)= putData (obj,数据)%数据包含一个或多个CRLF-separated JSON结构。%每个结构的格式:%{“心跳”=“时间戳”}%{“滴答”=“时间戳”、“投标”=报价,“问”=问}%的时间戳是格林尼治时间时间和买入价和卖出价是数字。如果obj.Enditdata = []; delete(obj.Figure);结束第一次= obj。CurrentLength + 1;(len,停止)= obj.putData@matlab.net.http.io.StringConsumer(数据);如果isempty(数据)| |停止如果ischar(数据)% = =数据”意味着用户按ctrl /“c”,所以设置为obj.Endit= true;%下关闭删除图结束停止= true;其他的停止= false;去年= obj.CurrentLength;newData = obj.Response.Body.Data.extractBetween(第一个,最后一个);%在crlf分裂字符串= strsplit (newData,“\ r \ n”);试一试cellfun (@obj。displayJSON,strings);e流(对JSON的错误:\ n % s < EOF > \ n '、数据);obj.Endit= true; rethrow(e);结束结束结束函数displayJSON (obj, str)如果~ isempty (str)试一试val = jsondecode (str);e流(”错误“% s”JSON: \ n % s < EOF > \ n 'e.message, str);重新抛出(e);结束如果isfield (val,“滴答”蜱虫)= val.tick;newdata = {cvtime (val.tick.time)、tick.bid tick.ask};setExtent = ~ obj.HaveTick;obj。HaveTick = true;elseifisfield (val,“心跳”)newdata = {cvtime (val.heartbeat.time),,};setExtent = false;结束obj.Table。Data = [newdata; obj.Table.Data];如果setExtent | | ~国防部(log10(长度(obj.Table.Data)), 1)%设置程度上首先蜱虫,每10的力量% 15添加滚动条的宽度obj.Table.Position (3) = obj.Table.Extent (3) + 15;结束drawnow结束结束函数瘟疫(obj, ~ ~)从近%瘟疫回调(obj.Figure)如果存在(“obj”,“var”)& & (obj)是否是可用的。如果obj.Endit如果isvalid (obj.Figure)删除(obj.Figure);结束其他的obj.Endit= true;结束结束结束函数删除(obj)如果~ isempty (obj.Figure) & & (obj.Figure)是否是可用的删除(obj.Figure);结束结束结束结束函数时间= cvtime(时间)%的格式显示时间数据时间= datetime(时间、“InputFormat”,“yyyy-MM-dd“T”HH: mm: ss.S“Z”,“时区”,“格林尼治时间”);时间。时区=“本地”;时间= char(时间,“dd-MMM-yyyy HH: mm: ss.S”);结束

地图数据MATLAB场上对象

确定你的用例的数据结构通过阅读从web服务API的信息。这个例子的数据包含一个或多个CRLF-separated JSON结构。结构的格式是下列之一,时间戳是GMT时间和报价是数字。

  • {“心跳”=“时间戳”}

  • {“滴答”=“时间戳”、“投标”=报价,“问”=问}

阅读这个特定的格式,覆盖putData方法。从下面的语句PricesStreamer类使用StringConsumer.putData读下一个缓冲区,然后选择JSON字符串。

第一次= obj。CurrentLength + 1;(len,停止)= obj.putData@matlab.net.http.io.StringConsumer(数据);去年= obj.CurrentLength;newData = obj.Response.Body.Data.extractBetween(第一个,最后一个);%在crlf分裂字符串= strsplit (newData,“\ r \ n”);

以JSON格式显示数据

从下面的语句displayJSON函数单独处理JSON蜱虫心跳结构。一个helper函数cvtime格式显示在表的时间数据。

函数displayJSON (obj, str)val = jsondecode (str);如果isfield (val,“滴答”蜱虫)= val.tick;newdata = {cvtime (val.tick.time)、tick.bid tick.ask};elseifisfield (val,“心跳”)newdata = {cvtime (val.heartbeat.time),,};结束obj.Table。Data = [newdata; obj.Table.Data];结束

终止数据流

在这个例子中,MATLAB接收数据只要web服务是活跃的。用户可以通过关闭终止流图窗口或按Ctrl + C。告知用户中断的MATLAB,设置停止论点putData。清理任务包括关闭图使用CloseRequestFcn财产和删除对象使用PricesStreamer.delete函数。

调用PricesStreamer

下面的代码提供了一个框架,用于从web服务获取数据。要运行此代码,您必须为内容提供值< >字符。您的web服务的URL可能包括额外的参数,如登录信息和其他信息指定为名称、值对参数。利用PricesStreamer,将它添加到你的电话发送。创建请求消息的信息,请参阅使用HTTP与MATLAB

url = matlab.net.URI (“< URL >”,“accountId”< YOUR_ACCOUNT_ID >,“<名称>”,“<价值>”);authInfo = matlab.net.http.AuthInfo (matlab.net.http.AuthenticationScheme.Bearer,“编码”,“< YOUR_CREDENTIALS >”);房颤= matlab.net.http.field.AuthorizationField (“授权”authInfo);r = matlab.net.http.RequestMessage (“得到”、af);消费者= PricesStreamer;% SavePayload将保留所有的结果——用于调试(职责、要求、嘘]= r.send (url, matlab.net.http.HTTPOptions (“SavePayload”,真的),消费者);%显示结果进行调试显示(职责)

下面是一个例子的数据从web服务描述的发送数据将数据映射到MATLAB场上对象

HTTP / 1.1 200 Ok服务器:openresty / 1.9.15.1日期:结婚,2017年9月06日19:26:56 GMT - type: application / json传输编码:分块连接:紧密Access-Control-Allow-Origin: *{“滴答”:{“仪器”:“AUD_CAD”,“时间”:“2017 - 09 - 06 - t19:26:54.304054z”、“投标”:0.97679,“问”:0.97703}}{“心跳”:{“时间”:“2017 - 09 - 06 - t19:26:56.253091z”}}{“滴答”:{“仪器”:“AUD_CAD”,“时间”:“2017 - 09 - 06 - t19:26:57.226918z”、“投标”:0.97678,“问”:0.97703}}{“滴答”:{“仪器”:“AUD_CAD”,“时间”:“2017 - 09 - 06 - t19:26:58.226909z”、“投标”:0.97678,“问”:0.97705}}{“心跳”:{“时间”:“2017 - 09 - 06 - t19:26:58.720409z”}}{“滴答”:{“仪器”:“AUD_CAD”,“时间”:“2017 - 09 - 06 - t19:27:00.733194z”、“投标”:0.97679,“问”:0.97704}}{“心跳”:{“时间”:“2017 - 09 - 06 - t19:27:01.251202z”}}{“滴答”:{“仪器”:“AUD_CAD”,“时间”:“2017 - 09 - 06 - t19:27:01.757501z”、“投标”:0.9768,“问”:0.97706}}{“心跳”:{“时间”:“2017 - 09 - 06 - t19:27:03.720469z "}}

另请参阅

|