月华初升 發表於 2023-8-15 00:00:00

建立在Tablestore的Wifi设备监管系统架构实现

<p>
        <span><strong>wifi设备监管</strong></span></p>
<p>
        公司通过监管系统维护wifi设备属性、采集wifi设备监控数据。当需要wifi设备上、下线时,通过监管系统操作完成设备的添加、下线,同时可通过系统修改、增加设备属性信息,如:设备mac地址、设备型号、设备地理位置等。设备上线后,会定期向系统推送监控数据,从而完成设备监控数据的采集。采集数据包含:cpu、内存、连接数、wan口流量与流速、2.4g与5g模块的信道数据等。</p>
<p>
        通过分析监控数据指标、分析设备运行状态,动态将问题设备的运行状态修改为:预警、报警。借助系统,网络部门可以快速获取问题设备列表、了解设备分布、查询历史监控指标。同时,也可以精确锁定老设备从而方便设备升级,或者为长期负载率较高的位置扩充wifi设备提供数据依据;</p>
<p>
        <img title="建立在Tablestore的Wifi设备监管系统架构实现" alt="建立在Tablestore的Wifi设备监管系统架构实现" src="https://zhuji.jb51.net/uploads/img/202305/42b0189426f8e0988dd6aab96008b9e2.jpg"></p>
<p>
        <span><strong>功能需求 </strong></span></p>
<p>
        1、管理wifi设备,通过系统上线新设备、下线老设备;</p>
<p>
        2、系统拥有分组管理能力、标签检索能力;</p>
<p>
        3、高并发海量监控数据采集能力;</p>
<p>
        4、管理所有设备的地理分布;</p>
<p>
        5、查询某一区域内所有设备的位置;</p>
<p>
        6、查询【某设备】在【某段时间】【不同指标】的监控数据;</p>
<p>
        7、低成本持久化所有数据,挖掘数据潜在价值 等等....</p>
<p>
        系统样例,如下所示:官网控制台地址:</p>
<p>
        <img title="建立在Tablestore的Wifi设备监管系统架构实现" alt="建立在Tablestore的Wifi设备监管系统架构实现" src="https://zhuji.jb51.net/uploads/img/202305/f4f14f47995ca24706012779856d6e50.jpg"></p>
<p>
        <strong><span>技术需求</span></strong></p>
<p>
        通常,用户在设计方案是会重点考虑以下四个主要的技术需求:</p>
<p>
        第一、需要有强大的查询、统计能力,实现wifi设备的管理;</p>
<p>
        第二、支撑设备高并发的监控数据采集,数据库需要强大的写入性;</p>
<p>
        第三、数据持久化需求导致数据膨胀,但历史监控数据多为冷数据,存储成本需要尽可能低; 第四、监控数据未来挖掘潜在价值较高,产品下游需要有较好的计算生态;</p>
<p>
        <strong><span>表格存储方案</span></strong></p>
<p>
        表格存储(tablestore)在四个重要技术需求上完全满足要求:</p>
<p>
        其一、表格存储新商业化不久的多元索引(searchindex)功能支持多维检索、geo查询等功能,完全满足元数据管理需求;</p>
<p>
        其二、基于lsm tree打造的分布式nosql数据库,可以轻松应对海量高并发,零运维轻松应对数据量的不断膨胀,理论上无上限;</p>
<p>
        其三、表格存储按量计费,提供容量型、高性能型两种实例类型,容量型对冷数据更适宜,提供了更低存储成本;</p>
<p>
        其四、更重要的,表格存储拥有较为完善的计算生态,提供全、增量通道服务,提供流、批一体的计算体系,对未来监控数据价值挖掘提供渠道;</p>
<p>
        表格存储在时序场景需求的技术点上拥有极高的匹配,而基于时序场景打造的时序模型(timestream)更是将时序场景通用功能,封装成易用的接口,使用户更容易的基于表格存储打造wifi设备监管系统;</p>
<p>
        <strong><span>数据结构设计</span></strong></p>
<p>
        首先,我们在在表格存储中抽象出两类数据,分别是meta类数据(设备元数据)、data类数据(监控数据);下面对两类数据做简单介绍。</p>
<p>
        <strong><span>wifi设备元数据</span></strong></p>
<p>
        meta数据管理着用户时间线的属性信息,支持指标、标签、属性、地理位置、更新时间等参数,模型会为所有属性创建相应的索引,提供多维度条件组合查询(包含geo查询)。其中identifier是时间线的标识,包含两部分:name部分(监控指标标识)、tags部分(固有不可变参数集合)。</p>
<p>
        在本样例中,我们将“wifi”作为指标分类,mac地址作为不可变tag,而将其他属性作为可变attributes存放为属性信息;</p>
<p>
        <img title="建立在Tablestore的Wifi设备监管系统架构实现" alt="建立在Tablestore的Wifi设备监管系统架构实现" src="https://zhuji.jb51.net/uploads/img/202305/24b5782a6fb6720dbc7c4c91b9848a26.jpg"></p>
<p>
        <strong><span>设备监控数据</span></strong></p>
<p>
        data数据管理着各个时间线的监控状态数据,可以为量化数据、地理位置、文字表述任意类型。data数据按照+有序排列,因而同一时间线的所有数据基于时间有序,这种数据存储方式,极大的提升了时间线的查询效率。</p>
<p>
        我们将设备的十几个监控数据某一时间点的监控数据存放为一行数据,不同属性对应不同列;依据不同测监控维度,用户只需提供不同的columntoget字段,获取不同监控维度的部分指标数据,即可对应不同监控指标,如:wan口流量:对应wan_total_in与wan_total_out两个字段; <img title="建立在Tablestore的Wifi设备监管系统架构实现" alt="建立在Tablestore的Wifi设备监管系统架构实现" src="https://zhuji.jb51.net/uploads/img/202305/d8b899e25b8b7c625946642f5c52b766.jpg"></p>
<p>
        <strong><span>读、写接口 </span></strong></p>
<p>
        <span><strong>写数据</strong></span></p>
<p>
        写数据提供两类接口:wifi设备添加、监控数据写入</p>
<ul>
<li>
                wifi设备添加:如果新增一个wifi设备,需要首先向meta表中插入一条设备meta数据,通过metatable.put(meta)创建或修改meta信息;</li>
        <li>
                监控数据写入:创建完meta后,wifi设备端就可以定时、周期性地采集监控数据,并将数据推送、写入到data表;模型设计上可支持多精度表管理,用户可以根据自身需求管理多个精度的data数据</li>
</ul>
<p>
        <img title="建立在Tablestore的Wifi设备监管系统架构实现" alt="建立在Tablestore的Wifi设备监管系统架构实现" src="https://zhuji.jb51.net/uploads/img/202305/6ef59488704d05f60cf4cdbfa369f312.jpg"></p>
<p>
        <span><strong>读数据</strong></span></p>
<p>
        与写数据一样,针对两类数据提供了两类读接口:wifi设备查询、监控数据读取</p>
<ul>
<li>
                wifi设备查询:根据设备分组、设备状态、地理位置等多维度条件组合,获取对应wifi设备列表,掌握设备的最新状态;</li>
        <li>
                监控数据读取:基于单个meta的identifier,获取该设备某段时间内、某一指标的监控数据</li>
</ul>
<p>
        <img title="建立在Tablestore的Wifi设备监管系统架构实现" alt="建立在Tablestore的Wifi设备监管系统架构实现" src="https://zhuji.jb51.net/uploads/img/202305/538e88be208aaa812536fe2a8d335ccf.jpg"><strong><span>核心代码 </span></strong></p>
<p>
        <strong>sdk与样例代码</strong></p>
<p>
        sdk:时序模型timestream模型集成于表格存储的sdk中,已在4.11.0版本中支持:</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlightersql" id="highlighter_61155">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                        <div class="line number3 index2 alt2">
                                                                3</div>
                                                        <div class="line number4 index3 alt1">
                                                                4</div>
                                                        <div class="line number5 index4 alt2">
                                                                5</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="sql plain">&lt;dependency&gt;</code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="sql spaces"> </code><code class="sql plain">&lt;groupid&gt;com.aliyun.openservices&lt;/groupid&gt;</code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="sql spaces"> </code><code class="sql plain">&lt;artifactid&gt;tablestore&lt;/artifactid&gt;</code>
</div>
                                                                <div class="line number4 index3 alt1">
                                                                        <code class="sql spaces"> </code><code class="sql plain">&lt;version&gt;4.11.0&lt;/version&gt;</code>
</div>
                                                                <div class="line number5 index4 alt2">
                                                                        <code class="sql plain">&lt;/dependency&gt;</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        代码开源:https://github.com/aliyun/tablestore-examples/tree/master/demos/wifimonitor</p>
<p>
        <span><strong>创建数据表</strong></span></p>
<p>
        在创建完成实例后,用户需要通过时序模型的sdk创建相应的meta表、data表: 不同精度监控数据存放不同表,用表名作区分,根据不同range的查询,需要不同精度的监控数据,实例中仅用了一个精度,用户可根据自身需求设计多个表;</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlightersql" id="highlighter_560788">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                        <div class="line number3 index2 alt2">
                                                                3</div>
                                                        <div class="line number4 index3 alt1">
                                                                4</div>
                                                        <div class="line number5 index4 alt2">
                                                                5</div>
                                                        <div class="line number6 index5 alt1">
                                                                6</div>
                                                        <div class="line number7 index6 alt2">
                                                                7</div>
                                                        <div class="line number8 index7 alt1">
                                                                8</div>
                                                        <div class="line number9 index8 alt2">
                                                                9</div>
                                                        <div class="line number10 index9 alt1">
                                                                10</div>
                                                        <div class="line number11 index10 alt2">
                                                                11</div>
                                                        <div class="line number12 index11 alt1">
                                                                12</div>
                                                        <div class="line number13 index12 alt2">
                                                                13</div>
                                                        <div class="line number14 index13 alt1">
                                                                14</div>
                                                        <div class="line number15 index14 alt2">
                                                                15</div>
                                                        <div class="line number16 index15 alt1">
                                                                16</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="sql plain">private void init() {</code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="sql spaces"> </code><code class="sql plain">asyncclient asyncclient = new asyncclient(endpoint, accesskeyid, accesskeysecret, instance);</code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="sql spaces"> </code><code class="sql plain">timestreamdbconfiguration conf = new timestreamdbconfiguration(</code><code class="sql string">"metatablename"</code><code class="sql plain">);</code>
</div>
                                                                <div class="line number4 index3 alt1">
                                                                        <code class="sql spaces"> </code><code class="sql plain">timestreamdbclient db = new timestreamdbclient(asyncclient, conf);</code>
</div>
                                                                <div class="line number5 index4 alt2">
                                                                        <code class="sql plain">}</code>
</div>
                                                                <div class="line number6 index5 alt1">
                                                                         </div>
                                                                <div class="line number7 index6 alt2">
                                                                        <code class="sql keyword">public</code> <code class="sql plain">void createtable() {</code>
</div>
                                                                <div class="line number8 index7 alt1">
                                                                        <code class="sql spaces"> </code><code class="sql plain">db.createmetatable(arrays.aslist(</code>
</div>
                                                                <div class="line number9 index8 alt2">
                                                                        <code class="sql spaces"> </code><code class="sql plain">new attributeindexschema(</code><code class="sql string">"group"</code><code class="sql plain">, attributeindexschema.type.keyword),</code>
</div>
                                                                <div class="line number10 index9 alt1">
                                                                        <code class="sql spaces"> </code><code class="sql plain">new attributeindexschema(</code><code class="sql string">"id"</code><code class="sql plain">, attributeindexschema.type.keyword),</code>
</div>
                                                                <div class="line number11 index10 alt2">
                                                                        <code class="sql spaces"> </code><code class="sql plain">new attributeindexschema(</code><code class="sql string">"status"</code><code class="sql plain">, attributeindexschema.type.keyword),</code>
</div>
                                                                <div class="line number12 index11 alt1">
                                                                        <code class="sql spaces"> </code><code class="sql plain">new attributeindexschema(</code><code class="sql string">"version"</code><code class="sql plain">, attributeindexschema.type.keyword),</code>
</div>
                                                                <div class="line number13 index12 alt2">
                                                                        <code class="sql spaces"> </code><code class="sql plain">new attributeindexschema(</code><code class="sql string">"location"</code><code class="sql plain">, attributeindexschema.type.geo_point)</code>
</div>
                                                                <div class="line number14 index13 alt1">
                                                                        <code class="sql spaces"> </code><code class="sql plain">));</code>
</div>
                                                                <div class="line number15 index14 alt2">
                                                                        <code class="sql spaces"> </code><code class="sql plain">db.createdatatable(</code><code class="sql string">"datatablename"</code><code class="sql plain">);</code>
</div>
                                                                <div class="line number16 index15 alt1">
                                                                        <code class="sql plain">}</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        <span><strong>数据写入</strong></span></p>
<p>
        数据写入主要分两部分,meta表添加新wifi设备、data表采集设备监控数据</p>
<p>
        <strong>添加新wifi设备(meta表写入)</strong></p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlightersql" id="highlighter_23949">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                        <div class="line number3 index2 alt2">
                                                                3</div>
                                                        <div class="line number4 index3 alt1">
                                                                4</div>
                                                        <div class="line number5 index4 alt2">
                                                                5</div>
                                                        <div class="line number6 index5 alt1">
                                                                6</div>
                                                        <div class="line number7 index6 alt2">
                                                                7</div>
                                                        <div class="line number8 index7 alt1">
                                                                8</div>
                                                        <div class="line number9 index8 alt2">
                                                                9</div>
                                                        <div class="line number10 index9 alt1">
                                                                10</div>
                                                        <div class="line number11 index10 alt2">
                                                                11</div>
                                                        <div class="line number12 index11 alt1">
                                                                12</div>
                                                        <div class="line number13 index12 alt2">
                                                                13</div>
                                                        <div class="line number14 index13 alt1">
                                                                14</div>
                                                        <div class="line number15 index14 alt2">
                                                                15</div>
                                                        <div class="line number16 index15 alt1">
                                                                16</div>
                                                        <div class="line number17 index16 alt2">
                                                                17</div>
                                                        <div class="line number18 index17 alt1">
                                                                18</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="sql plain">//metawriter对应meta表,提供读、写接口</code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="sql plain">timestreammetatable metawriter = db.metatable();</code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                         </div>
                                                                <div class="line number4 index3 alt1">
                                                                        <code class="sql plain">//identifier作为时间线的身份标识(</code><code class="sql keyword">unique</code><code class="sql plain">),含:</code><code class="sql keyword">name</code><code class="sql plain">、tags,</code>
</div>
                                                                <div class="line number5 index4 alt2">
                                                                        <code class="sql plain">timestreamidentifier identifier = new timestreamidentifier.builder(</code><code class="sql string">"wifi"</code><code class="sql plain">)</code>
</div>
                                                                <div class="line number6 index5 alt1">
                                                                        <code class="sql spaces"> </code><code class="sql plain">.addtag(</code><code class="sql string">"mac"</code><code class="sql plain">, </code><code class="sql string">"mock:mac:1:1"</code><code class="sql plain">)</code>
</div>
                                                                <div class="line number7 index6 alt2">
                                                                        <code class="sql spaces"> </code><code class="sql plain">.build();</code>
</div>
                                                                <div class="line number8 index7 alt1">
                                                                         </div>
                                                                <div class="line number9 index8 alt2">
                                                                        <code class="sql plain">//基于identifier创建meta对象,并为meta设置更多属性,attributes为属性参数</code>
</div>
                                                                <div class="line number10 index9 alt1">
                                                                        <code class="sql plain">timestreammeta meta = new timestreammeta(identifier)</code>
</div>
                                                                <div class="line number11 index10 alt2">
                                                                        <code class="sql spaces"> </code><code class="sql plain">.addattribute(</code><code class="sql string">"group"</code><code class="sql plain">, </code><code class="sql string">"group-1"</code><code class="sql plain">)</code>
</div>
                                                                <div class="line number12 index11 alt1">
                                                                        <code class="sql spaces"> </code><code class="sql plain">.addattribute(</code><code class="sql string">"id"</code><code class="sql plain">, </code><code class="sql string">"id-1"</code><code class="sql plain">)</code>
</div>
                                                                <div class="line number13 index12 alt2">
                                                                        <code class="sql spaces"> </code><code class="sql plain">.addattribute(</code><code class="sql string">"version"</code><code class="sql plain">, </code><code class="sql string">"v1.0"</code><code class="sql plain">)</code>
</div>
                                                                <div class="line number14 index13 alt1">
                                                                        <code class="sql spaces"> </code><code class="sql plain">.addattribute(</code><code class="sql string">"status"</code><code class="sql plain">, </code><code class="sql string">"normal"</code><code class="sql plain">)</code>
</div>
                                                                <div class="line number15 index14 alt2">
                                                                        <code class="sql spaces"> </code><code class="sql plain">.addattribute(</code><code class="sql string">"location"</code><code class="sql plain">, </code><code class="sql string">"30,120"</code><code class="sql plain">);</code>
</div>
                                                                <div class="line number16 index15 alt1">
                                                                         </div>
                                                                <div class="line number17 index16 alt2">
                                                                        <code class="sql plain">//创建新的时间线,然后写入监控数据</code>
</div>
                                                                <div class="line number18 index17 alt1">
                                                                        <code class="sql plain">metawriter.put(meta);</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
         </p>
<p>
        <strong>采集wifi设备监控数据(data表写入)</strong></p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlightersql" id="highlighter_261118">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                        <div class="line number3 index2 alt2">
                                                                3</div>
                                                        <div class="line number4 index3 alt1">
                                                                4</div>
                                                        <div class="line number5 index4 alt2">
                                                                5</div>
                                                        <div class="line number6 index5 alt1">
                                                                6</div>
                                                        <div class="line number7 index6 alt2">
                                                                7</div>
                                                        <div class="line number8 index7 alt1">
                                                                8</div>
                                                        <div class="line number9 index8 alt2">
                                                                9</div>
                                                        <div class="line number10 index9 alt1">
                                                                10</div>
                                                        <div class="line number11 index10 alt2">
                                                                11</div>
                                                        <div class="line number12 index11 alt1">
                                                                12</div>
                                                        <div class="line number13 index12 alt2">
                                                                13</div>
                                                        <div class="line number14 index13 alt1">
                                                                14</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="sql plain">//datawriter分别对应data表,提供读、写接口</code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="sql plain">timestreamdatatable datawriter = db.datatable(</code><code class="sql string">"datatablename"</code><code class="sql plain">);</code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="sql plain">timestreammeta meta;//meta上一步已经构建</code>
</div>
                                                                <div class="line number4 index3 alt1">
                                                                         </div>
                                                                <div class="line number5 index4 alt2">
                                                                        <code class="sql plain">//创建新的时间线,然后写入监控数据</code>
</div>
                                                                <div class="line number6 index5 alt1">
                                                                        <code class="sql plain">datawriter.asyncwrite(</code>
</div>
                                                                <div class="line number7 index6 alt2">
                                                                        <code class="sql spaces"> </code><code class="sql plain">meta.getidentifier(),//identifier identifier</code>
</div>
                                                                <div class="line number8 index7 alt1">
                                                                        <code class="sql spaces"> </code><code class="sql plain">new point.builder(i, timeunit.seconds)</code>
</div>
                                                                <div class="line number9 index8 alt2">
                                                                        <code class="sql spaces"> </code><code class="sql plain">.addfield(</code><code class="sql string">"cpu"</code><code class="sql plain">, 30)</code>
</div>
                                                                <div class="line number10 index9 alt1">
                                                                        <code class="sql spaces"> </code><code class="sql plain">.addfield(</code><code class="sql string">"ram"</code><code class="sql plain">, 29)</code>
</div>
                                                                <div class="line number11 index10 alt2">
                                                                        <code class="sql spaces"> </code><code class="sql plain">.addfield(</code><code class="sql string">"flash_used"</code><code class="sql plain">, 20)</code>
</div>
                                                                <div class="line number12 index11 alt1">
                                                                        <code class="sql spaces"> </code><code class="sql plain">.addfield(</code><code class="sql string">"flash_total"</code><code class="sql plain">, 1048576)</code>
</div>
                                                                <div class="line number13 index12 alt2">
                                                                        <code class="sql spaces"> </code><code class="sql plain">.build()</code>
</div>
                                                                <div class="line number14 index13 alt1">
                                                                        <code class="sql plain">);</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        <strong><span>数据读取</span></strong></p>
<p>
        数据读取分为两类:wifi设备列表查询与设备监控数据查询</p>
<p>
        <strong>查询wifi设备列表(meta表读取)</strong></p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlightersql" id="highlighter_193820">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                        <div class="line number3 index2 alt2">
                                                                3</div>
                                                        <div class="line number4 index3 alt1">
                                                                4</div>
                                                        <div class="line number5 index4 alt2">
                                                                5</div>
                                                        <div class="line number6 index5 alt1">
                                                                6</div>
                                                        <div class="line number7 index6 alt2">
                                                                7</div>
                                                        <div class="line number8 index7 alt1">
                                                                8</div>
                                                        <div class="line number9 index8 alt2">
                                                                9</div>
                                                        <div class="line number10 index9 alt1">
                                                                10</div>
                                                        <div class="line number11 index10 alt2">
                                                                11</div>
                                                        <div class="line number12 index11 alt1">
                                                                12</div>
                                                        <div class="line number13 index12 alt2">
                                                                13</div>
                                                        <div class="line number14 index13 alt1">
                                                                14</div>
                                                        <div class="line number15 index14 alt2">
                                                                15</div>
                                                        <div class="line number16 index15 alt1">
                                                                16</div>
                                                        <div class="line number17 index16 alt2">
                                                                17</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="sql plain">//reader对应meta表,提供读、写接口,此处名字为突出读功能</code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="sql plain">timestreammetatable metareader = db.metatable();</code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                         </div>
                                                                <div class="line number4 index3 alt1">
                                                                        <code class="sql plain">//构建筛选条件</code>
</div>
                                                                <div class="line number5 index4 alt2">
                                                                        <code class="sql plain">filter filter = new andfilter(arrays.aslist(</code>
</div>
                                                                <div class="line number6 index5 alt1">
                                                                        <code class="sql spaces"> </code><code class="sql keyword">name</code><code class="sql plain">.equal(</code><code class="sql string">"wifi"</code><code class="sql plain">),</code>
</div>
                                                                <div class="line number7 index6 alt2">
                                                                        <code class="sql spaces"> </code><code class="sql plain">tag.equal(</code><code class="sql string">"mac"</code><code class="sql plain">, </code><code class="sql string">"mock:mac:1:1"</code><code class="sql plain">),</code>
</div>
                                                                <div class="line number8 index7 alt1">
                                                                        <code class="sql spaces"> </code><code class="sql plain">attribute.ingeodistance(</code><code class="sql string">"location"</code><code class="sql plain">, </code><code class="sql string">"30,120"</code><code class="sql plain">, 100000)</code>
</div>
                                                                <div class="line number9 index8 alt2">
                                                                        <code class="sql plain">));</code>
</div>
                                                                <div class="line number10 index9 alt1">
                                                                         </div>
                                                                <div class="line number11 index10 alt2">
                                                                        <code class="sql plain">iterator&lt;timestreammeta&gt; iterator = metareader</code>
</div>
                                                                <div class="line number12 index11 alt1">
                                                                        <code class="sql spaces"> </code><code class="sql plain">.filter(filter)</code>
</div>
                                                                <div class="line number13 index12 alt2">
                                                                        <code class="sql spaces"> </code><code class="sql plain">.fetchall();</code>
</div>
                                                                <div class="line number14 index13 alt1">
                                                                         </div>
                                                                <div class="line number15 index14 alt2">
                                                                        <code class="sql plain">while (iterator.hasnext()) {</code>
</div>
                                                                <div class="line number16 index15 alt1">
                                                                        <code class="sql spaces"> </code><code class="sql plain">timestreammeta meta = iterator.</code><code class="sql keyword">next</code><code class="sql plain">();//deal </code><code class="sql keyword">with</code> <code class="sql plain">metas</code>
</div>
                                                                <div class="line number17 index16 alt2">
                                                                        <code class="sql plain">}</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        <strong>获取wifi设备的监控数据(data表读取)</strong></p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlightersql" id="highlighter_163971">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                        <div class="line number3 index2 alt2">
                                                                3</div>
                                                        <div class="line number4 index3 alt1">
                                                                4</div>
                                                        <div class="line number5 index4 alt2">
                                                                5</div>
                                                        <div class="line number6 index5 alt1">
                                                                6</div>
                                                        <div class="line number7 index6 alt2">
                                                                7</div>
                                                        <div class="line number8 index7 alt1">
                                                                8</div>
                                                        <div class="line number9 index8 alt2">
                                                                9</div>
                                                        <div class="line number10 index9 alt1">
                                                                10</div>
                                                        <div class="line number11 index10 alt2">
                                                                11</div>
                                                        <div class="line number12 index11 alt1">
                                                                12</div>
                                                        <div class="line number13 index12 alt2">
                                                                13</div>
                                                        <div class="line number14 index13 alt1">
                                                                14</div>
                                                        <div class="line number15 index14 alt2">
                                                                15</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="sql plain">//datawriter分别对应data表,提供读、写接口</code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="sql plain">timestreamdatatable datareader = db.datatable(</code><code class="sql string">"datatablename"</code><code class="sql plain">);</code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="sql plain">timestreammeta meta;//基于已获取的meta列表,分别获取每个时间线的有序监控数据</code>
</div>
                                                                <div class="line number4 index3 alt1">
                                                                         </div>
                                                                <div class="line number5 index4 alt2">
                                                                        <code class="sql plain">iterator&lt;point&gt; iterator = reader.get(meta.getidentifier())</code>
</div>
                                                                <div class="line number6 index5 alt1">
                                                                        <code class="sql spaces"> </code><code class="sql plain">.</code><code class="sql keyword">select</code><code class="sql plain">(</code><code class="sql string">"flash_used"</code><code class="sql plain">, </code><code class="sql string">"flash_total"</code><code class="sql plain">)//设置返回的列</code>
</div>
                                                                <div class="line number7 index6 alt2">
                                                                        <code class="sql spaces"> </code><code class="sql plain">.timerange(timerange.range(0, long.max_value, timeunit.seconds))</code>
</div>
                                                                <div class="line number8 index7 alt1">
                                                                        <code class="sql spaces"> </code><code class="sql plain">.fetchall();</code>
</div>
                                                                <div class="line number9 index8 alt2">
                                                                         </div>
                                                                <div class="line number10 index9 alt1">
                                                                        <code class="sql plain">while (iterator.hasnext()) {</code>
</div>
                                                                <div class="line number11 index10 alt2">
                                                                        <code class="sql spaces"> </code><code class="sql plain">point point = iterator.</code><code class="sql keyword">next</code><code class="sql plain">();//deal </code><code class="sql keyword">with</code> <code class="sql plain">points</code>
</div>
                                                                <div class="line number12 index11 alt1">
                                                                        <code class="sql spaces"> </code><code class="sql plain">long </code><code class="sql keyword">timestamp</code> <code class="sql plain">= point.gettimestamp(timeunit.milliseconds);//毫秒单位时间戳</code>
</div>
                                                                <div class="line number13 index12 alt2">
                                                                        <code class="sql spaces"> </code><code class="sql plain">long flashused = point.getfield(</code><code class="sql string">"flash_used"</code><code class="sql plain">).aslong();//获取该点long类型的数据大小监控</code>
</div>
                                                                <div class="line number14 index13 alt1">
                                                                        <code class="sql spaces"> </code><code class="sql plain">long flashuotal = point.getfield(</code><code class="sql string">"flash_total"</code><code class="sql plain">).aslong();//获取该点long类型的数据大小监控</code>
</div>
                                                                <div class="line number15 index14 alt2">
                                                                        <code class="sql plain">}</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。</p>
<p>
        原文链接:https://my.oschina.net/yunqi/blog/3050763</p>
頁: [1]
查看完整版本: 建立在Tablestore的Wifi设备监管系统架构实现