blob: 6566d213bc35628d1e494be359c9839f97ba7538 [file] [log] [blame]
<html>
<head>
<style type="text/css">
.hll { background-color: #ffffcc }
.c { color: #888888 } /* Comment */
.err { color: #a61717; background-color: #e3d2d2 } /* Error */
.k { color: #008800; font-weight: bold } /* Keyword */
.cm { color: #888888 } /* Comment.Multiline */
.cp { color: #cc0000; font-weight: bold } /* Comment.Preproc */
.c1 { color: #888888 } /* Comment.Single */
.cs { color: #cc0000; font-weight: bold; background-color: #fff0f0 } /* Comment.Special */
.gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
.ge { font-style: italic } /* Generic.Emph */
.gr { color: #aa0000 } /* Generic.Error */
.gh { color: #333333 } /* Generic.Heading */
.gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */
.go { color: #888888 } /* Generic.Output */
.gp { color: #555555 } /* Generic.Prompt */
.gs { font-weight: bold } /* Generic.Strong */
.gu { color: #666666 } /* Generic.Subheading */
.gt { color: #aa0000 } /* Generic.Traceback */
.kc { color: #008800; font-weight: bold } /* Keyword.Constant */
.kd { color: #008800; font-weight: bold } /* Keyword.Declaration */
.kn { color: #008800; font-weight: bold } /* Keyword.Namespace */
.kp { color: #008800 } /* Keyword.Pseudo */
.kr { color: #008800; font-weight: bold } /* Keyword.Reserved */
.kt { color: #888888; font-weight: bold } /* Keyword.Type */
.m { color: #0000DD; font-weight: bold } /* Literal.Number */
.s { color: #dd2200; background-color: #fff0f0 } /* Literal.String */
.na { color: #336699 } /* Name.Attribute */
.nb { color: #003388 } /* Name.Builtin */
.nc { color: #bb0066; font-weight: bold } /* Name.Class */
.no { color: #003366; font-weight: bold } /* Name.Constant */
.nd { color: #555555 } /* Name.Decorator */
.ne { color: #bb0066; font-weight: bold } /* Name.Exception */
.nf { color: #0066bb; font-weight: bold } /* Name.Function */
.nl { color: #336699; font-style: italic } /* Name.Label */
.nn { color: #bb0066; font-weight: bold } /* Name.Namespace */
.py { color: #336699; font-weight: bold } /* Name.Property */
.nt { color: #bb0066; font-weight: bold } /* Name.Tag */
.nv { color: #336699 } /* Name.Variable */
.ow { color: #008800 } /* Operator.Word */
.w { color: #bbbbbb } /* Text.Whitespace */
.mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */
.mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */
.mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */
.mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */
.sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */
.sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */
.sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */
.s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */
.se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */
.sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */
.si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */
.sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */
.sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */
.s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */
.ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */
.bp { color: #003388 } /* Name.Builtin.Pseudo */
.vc { color: #336699 } /* Name.Variable.Class */
.vg { color: #dd7700 } /* Name.Variable.Global */
.vi { color: #3333bb } /* Name.Variable.Instance */
.il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */
</style>
</head>
<body>
<h1>Broker</h1>
<p>The logic for the broker, in abstract form, without the details of the MQTT packets.</p>
<pre>
<div class="highlight"><pre><a name="Brokers.py-pyg.html-1"></a><span class="sd">&quot;&quot;&quot;</span>
<a name="Brokers.py-pyg.html-2"></a><span class="sd">*******************************************************************</span>
<a name="Brokers.py-pyg.html-3"></a><span class="sd"> Copyright (c) 2013, 2014 IBM Corp.</span>
<a name="Brokers.py-pyg.html-4"></a><span class="sd"> </span>
<a name="Brokers.py-pyg.html-5"></a><span class="sd"> All rights reserved. This program and the accompanying materials</span>
<a name="Brokers.py-pyg.html-6"></a><span class="sd"> are made available under the terms of the Eclipse Public License v1.0</span>
<a name="Brokers.py-pyg.html-7"></a><span class="sd"> and Eclipse Distribution License v1.0 which accompany this distribution. </span>
<a name="Brokers.py-pyg.html-8"></a><span class="sd"> </span>
<a name="Brokers.py-pyg.html-9"></a><span class="sd"> The Eclipse Public License is available at </span>
<a name="Brokers.py-pyg.html-10"></a><span class="sd"> http://www.eclipse.org/legal/epl-v10.html</span>
<a name="Brokers.py-pyg.html-11"></a><span class="sd"> and the Eclipse Distribution License is available at </span>
<a name="Brokers.py-pyg.html-12"></a><span class="sd"> http://www.eclipse.org/org/documents/edl-v10.php.</span>
<a name="Brokers.py-pyg.html-13"></a><span class="sd"> </span>
<a name="Brokers.py-pyg.html-14"></a><span class="sd"> Contributors:</span>
<a name="Brokers.py-pyg.html-15"></a><span class="sd"> Ian Craggs - initial implementation and/or documentation</span>
<a name="Brokers.py-pyg.html-16"></a><span class="sd">*******************************************************************</span>
<a name="Brokers.py-pyg.html-17"></a><span class="sd">&quot;&quot;&quot;</span>
<a name="Brokers.py-pyg.html-18"></a>
<a name="Brokers.py-pyg.html-19"></a><span class="kn">import</span> <span class="nn">types</span><span class="o">,</span> <span class="nn">time</span><span class="o">,</span> <span class="nn">logging</span>
<a name="Brokers.py-pyg.html-20"></a>
<a name="Brokers.py-pyg.html-21"></a><span class="kn">from</span> <span class="nn">.</span> <span class="kn">import</span> <span class="n">Topics</span>
<a name="Brokers.py-pyg.html-22"></a><span class="kn">from</span> <span class="nn">.SubscriptionEngines</span> <span class="kn">import</span> <span class="n">SubscriptionEngines</span>
<a name="Brokers.py-pyg.html-23"></a>
<a name="Brokers.py-pyg.html-24"></a><span class="n">logger</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">getLogger</span><span class="p">(</span><span class="s">&#39;MQTT broker&#39;</span><span class="p">)</span>
<a name="Brokers.py-pyg.html-25"></a>
<a name="Brokers.py-pyg.html-26"></a><span class="k">class</span> <span class="nc">Brokers</span><span class="p">:</span>
<a name="Brokers.py-pyg.html-27"></a>
<a name="Brokers.py-pyg.html-28"></a> <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">overlapping_single</span><span class="o">=</span><span class="bp">True</span><span class="p">):</span>
<a name="Brokers.py-pyg.html-29"></a> <span class="bp">self</span><span class="o">.</span><span class="n">se</span> <span class="o">=</span> <span class="n">SubscriptionEngines</span><span class="p">()</span>
<a name="Brokers.py-pyg.html-30"></a> <span class="bp">self</span><span class="o">.</span><span class="n">__clients</span> <span class="o">=</span> <span class="p">{}</span> <span class="c"># clientid -&gt; client</span>
<a name="Brokers.py-pyg.html-31"></a> <span class="bp">self</span><span class="o">.</span><span class="n">overlapping_single</span> <span class="o">=</span> <span class="n">overlapping_single</span>
<a name="Brokers.py-pyg.html-32"></a>
<a name="Brokers.py-pyg.html-33"></a> <span class="k">def</span> <span class="nf">reinitialize</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<a name="Brokers.py-pyg.html-34"></a> <span class="bp">self</span><span class="o">.</span><span class="n">__clients</span> <span class="o">=</span> <span class="p">{}</span>
<a name="Brokers.py-pyg.html-35"></a> <span class="bp">self</span><span class="o">.</span><span class="n">se</span><span class="o">.</span><span class="n">reinitialize</span><span class="p">()</span>
<a name="Brokers.py-pyg.html-36"></a>
<a name="Brokers.py-pyg.html-37"></a> <span class="k">def</span> <span class="nf">getClient</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">clientid</span><span class="p">):</span>
<a name="Brokers.py-pyg.html-38"></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__clients</span><span class="p">[</span><span class="n">clientid</span><span class="p">]</span> <span class="k">if</span> <span class="p">(</span><span class="n">clientid</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__clients</span><span class="o">.</span><span class="n">keys</span><span class="p">())</span> <span class="k">else</span> <span class="bp">None</span>
<a name="Brokers.py-pyg.html-39"></a>
<a name="Brokers.py-pyg.html-40"></a> <span class="k">def</span> <span class="nf">cleanSession</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">aClientid</span><span class="p">):</span>
<a name="Brokers.py-pyg.html-41"></a> <span class="s">&quot;clear any outstanding subscriptions and publications&quot;</span>
<a name="Brokers.py-pyg.html-42"></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">se</span><span class="o">.</span><span class="n">getRetainedTopics</span><span class="p">(</span><span class="s">&quot;#&quot;</span><span class="p">))</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
<a name="Brokers.py-pyg.html-43"></a> <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s">&quot;[MQTT-3.1.2-7] retained messages not cleaned up as part of session state for client </span><span class="si">%s</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">aClientid</span><span class="p">)</span>
<a name="Brokers.py-pyg.html-44"></a> <span class="bp">self</span><span class="o">.</span><span class="n">se</span><span class="o">.</span><span class="n">clearSubscriptions</span><span class="p">(</span><span class="n">aClientid</span><span class="p">)</span>
<a name="Brokers.py-pyg.html-45"></a>
<a name="Brokers.py-pyg.html-46"></a> <span class="k">def</span> <span class="nf">connect</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">aClient</span><span class="p">):</span>
<a name="Brokers.py-pyg.html-47"></a> <span class="n">aClient</span><span class="o">.</span><span class="n">connected</span> <span class="o">=</span> <span class="bp">True</span>
<a name="Brokers.py-pyg.html-48"></a> <span class="n">aClient</span><span class="o">.</span><span class="n">timestamp</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">clock</span><span class="p">()</span>
<a name="Brokers.py-pyg.html-49"></a> <span class="bp">self</span><span class="o">.</span><span class="n">__clients</span><span class="p">[</span><span class="n">aClient</span><span class="o">.</span><span class="n">id</span><span class="p">]</span> <span class="o">=</span> <span class="n">aClient</span>
<a name="Brokers.py-pyg.html-50"></a> <span class="k">if</span> <span class="n">aClient</span><span class="o">.</span><span class="n">cleansession</span><span class="p">:</span>
<a name="Brokers.py-pyg.html-51"></a> <span class="bp">self</span><span class="o">.</span><span class="n">cleanSession</span><span class="p">(</span><span class="n">aClient</span><span class="o">.</span><span class="n">id</span><span class="p">)</span>
<a name="Brokers.py-pyg.html-52"></a>
<a name="Brokers.py-pyg.html-53"></a> <span class="k">def</span> <span class="nf">terminate</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">aClientid</span><span class="p">):</span>
<a name="Brokers.py-pyg.html-54"></a> <span class="s">&quot;Abrupt disconnect which also causes a will msg to be sent out&quot;</span>
<a name="Brokers.py-pyg.html-55"></a> <span class="k">if</span> <span class="n">aClientid</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__clients</span><span class="o">.</span><span class="n">keys</span><span class="p">()</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">__clients</span><span class="p">[</span><span class="n">aClientid</span><span class="p">]</span><span class="o">.</span><span class="n">connected</span><span class="p">:</span>
<a name="Brokers.py-pyg.html-56"></a> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">__clients</span><span class="p">[</span><span class="n">aClientid</span><span class="p">]</span><span class="o">.</span><span class="n">will</span> <span class="o">!=</span> <span class="bp">None</span><span class="p">:</span>
<a name="Brokers.py-pyg.html-57"></a> <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s">&quot;[MQTT-3.1.2-8] sending will message for client </span><span class="si">%s</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">aClientid</span><span class="p">)</span>
<a name="Brokers.py-pyg.html-58"></a> <span class="n">willtopic</span><span class="p">,</span> <span class="n">willQoS</span><span class="p">,</span> <span class="n">willmsg</span><span class="p">,</span> <span class="n">willRetain</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__clients</span><span class="p">[</span><span class="n">aClientid</span><span class="p">]</span><span class="o">.</span><span class="n">will</span>
<a name="Brokers.py-pyg.html-59"></a> <span class="k">if</span> <span class="n">willRetain</span><span class="p">:</span>
<a name="Brokers.py-pyg.html-60"></a> <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s">&quot;[MQTT-3.1.2-15] sending will message retained for client </span><span class="si">%s</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">aClientid</span><span class="p">)</span>
<a name="Brokers.py-pyg.html-61"></a> <span class="k">else</span><span class="p">:</span>
<a name="Brokers.py-pyg.html-62"></a> <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s">&quot;[MQTT-3.1.2-14] sending will message non-retained for client </span><span class="si">%s</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">aClientid</span><span class="p">)</span>
<a name="Brokers.py-pyg.html-63"></a> <span class="bp">self</span><span class="o">.</span><span class="n">publish</span><span class="p">(</span><span class="n">aClientid</span><span class="p">,</span> <span class="n">willtopic</span><span class="p">,</span> <span class="n">willmsg</span><span class="p">,</span> <span class="n">willQoS</span><span class="p">,</span> <span class="n">willRetain</span><span class="p">)</span>
<a name="Brokers.py-pyg.html-64"></a> <span class="bp">self</span><span class="o">.</span><span class="n">disconnect</span><span class="p">(</span><span class="n">aClientid</span><span class="p">)</span>
<a name="Brokers.py-pyg.html-65"></a>
<a name="Brokers.py-pyg.html-66"></a> <span class="k">def</span> <span class="nf">disconnect</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">aClientid</span><span class="p">):</span>
<a name="Brokers.py-pyg.html-67"></a> <span class="k">if</span> <span class="n">aClientid</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__clients</span><span class="o">.</span><span class="n">keys</span><span class="p">():</span>
<a name="Brokers.py-pyg.html-68"></a> <span class="bp">self</span><span class="o">.</span><span class="n">__clients</span><span class="p">[</span><span class="n">aClientid</span><span class="p">]</span><span class="o">.</span><span class="n">connected</span> <span class="o">=</span> <span class="bp">False</span>
<a name="Brokers.py-pyg.html-69"></a> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">__clients</span><span class="p">[</span><span class="n">aClientid</span><span class="p">]</span><span class="o">.</span><span class="n">cleansession</span><span class="p">:</span>
<a name="Brokers.py-pyg.html-70"></a> <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s">&quot;[MQTT-3.1.2-6] broker must discard the session data for client </span><span class="si">%s</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">aClientid</span><span class="p">)</span>
<a name="Brokers.py-pyg.html-71"></a> <span class="bp">self</span><span class="o">.</span><span class="n">cleanSession</span><span class="p">(</span><span class="n">aClientid</span><span class="p">)</span>
<a name="Brokers.py-pyg.html-72"></a> <span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">__clients</span><span class="p">[</span><span class="n">aClientid</span><span class="p">]</span>
<a name="Brokers.py-pyg.html-73"></a> <span class="k">else</span><span class="p">:</span>
<a name="Brokers.py-pyg.html-74"></a> <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s">&quot;[MQTT-3.1.2-4] broker must store the session data for client </span><span class="si">%s</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">aClientid</span><span class="p">)</span>
<a name="Brokers.py-pyg.html-75"></a> <span class="bp">self</span><span class="o">.</span><span class="n">__clients</span><span class="p">[</span><span class="n">aClientid</span><span class="p">]</span><span class="o">.</span><span class="n">timestamp</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">clock</span><span class="p">()</span>
<a name="Brokers.py-pyg.html-76"></a> <span class="bp">self</span><span class="o">.</span><span class="n">__clients</span><span class="p">[</span><span class="n">aClientid</span><span class="p">]</span><span class="o">.</span><span class="n">connected</span> <span class="o">=</span> <span class="bp">False</span>
<a name="Brokers.py-pyg.html-77"></a> <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s">&quot;[MQTT-3.1.2-10] will message is deleted after use or disconnect, for client </span><span class="si">%s</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">aClientid</span><span class="p">)</span>
<a name="Brokers.py-pyg.html-78"></a> <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s">&quot;[MQTT-3.14.4-3] on receipt of disconnect, will message is deleted&quot;</span><span class="p">)</span>
<a name="Brokers.py-pyg.html-79"></a> <span class="bp">self</span><span class="o">.</span><span class="n">__clients</span><span class="p">[</span><span class="n">aClientid</span><span class="p">]</span><span class="o">.</span><span class="n">will</span> <span class="o">=</span> <span class="bp">None</span>
<a name="Brokers.py-pyg.html-80"></a>
<a name="Brokers.py-pyg.html-81"></a> <span class="k">def</span> <span class="nf">disconnectAll</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<a name="Brokers.py-pyg.html-82"></a> <span class="k">for</span> <span class="n">c</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__clients</span><span class="o">.</span><span class="n">keys</span><span class="p">()[:]:</span> <span class="c"># copy the array because disconnect will remove an element</span>
<a name="Brokers.py-pyg.html-83"></a> <span class="bp">self</span><span class="o">.</span><span class="n">disconnect</span><span class="p">(</span><span class="n">c</span><span class="p">)</span>
<a name="Brokers.py-pyg.html-84"></a>
<a name="Brokers.py-pyg.html-85"></a> <span class="k">def</span> <span class="nf">publish</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">aClientid</span><span class="p">,</span> <span class="n">topic</span><span class="p">,</span> <span class="n">message</span><span class="p">,</span> <span class="n">qos</span><span class="p">,</span> <span class="n">retained</span><span class="o">=</span><span class="bp">False</span><span class="p">):</span>
<a name="Brokers.py-pyg.html-86"></a> <span class="sd">&quot;&quot;&quot;publish to all subscribed connected clients</span>
<a name="Brokers.py-pyg.html-87"></a><span class="sd"> also to any disconnected non-cleansession clients with qos in [1,2]</span>
<a name="Brokers.py-pyg.html-88"></a><span class="sd"> &quot;&quot;&quot;</span>
<a name="Brokers.py-pyg.html-89"></a> <span class="k">if</span> <span class="n">retained</span><span class="p">:</span>
<a name="Brokers.py-pyg.html-90"></a> <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s">&quot;[MQTT-2.1.2-6] store retained message and QoS&quot;</span><span class="p">)</span>
<a name="Brokers.py-pyg.html-91"></a> <span class="bp">self</span><span class="o">.</span><span class="n">se</span><span class="o">.</span><span class="n">setRetained</span><span class="p">(</span><span class="n">topic</span><span class="p">,</span> <span class="n">message</span><span class="p">,</span> <span class="n">qos</span><span class="p">)</span>
<a name="Brokers.py-pyg.html-92"></a> <span class="k">else</span><span class="p">:</span>
<a name="Brokers.py-pyg.html-93"></a> <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s">&quot;[MQTT-2.1.2-12] non-retained message - do not store&quot;</span><span class="p">)</span>
<a name="Brokers.py-pyg.html-94"></a>
<a name="Brokers.py-pyg.html-95"></a> <span class="k">for</span> <span class="n">subscriber</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">se</span><span class="o">.</span><span class="n">subscribers</span><span class="p">(</span><span class="n">topic</span><span class="p">):</span> <span class="c"># all subscribed clients</span>
<a name="Brokers.py-pyg.html-96"></a> <span class="c"># qos is lower of publication and subscription</span>
<a name="Brokers.py-pyg.html-97"></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">se</span><span class="o">.</span><span class="n">getSubscriptions</span><span class="p">(</span><span class="n">topic</span><span class="p">,</span> <span class="n">subscriber</span><span class="p">))</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">:</span>
<a name="Brokers.py-pyg.html-98"></a> <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s">&quot;[MQTT-3.3.5-1] overlapping subscriptions&quot;</span><span class="p">)</span>
<a name="Brokers.py-pyg.html-99"></a> <span class="k">if</span> <span class="n">retained</span><span class="p">:</span>
<a name="Brokers.py-pyg.html-100"></a> <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s">&quot;[MQTT-2.1.2-10] outgoing publish does not have retained flag set&quot;</span><span class="p">)</span>
<a name="Brokers.py-pyg.html-101"></a> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">overlapping_single</span><span class="p">:</span>
<a name="Brokers.py-pyg.html-102"></a> <span class="n">out_qos</span> <span class="o">=</span> <span class="nb">min</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">se</span><span class="o">.</span><span class="n">qosOf</span><span class="p">(</span><span class="n">subscriber</span><span class="p">,</span> <span class="n">topic</span><span class="p">),</span> <span class="n">qos</span><span class="p">)</span>
<a name="Brokers.py-pyg.html-103"></a> <span class="bp">self</span><span class="o">.</span><span class="n">__clients</span><span class="p">[</span><span class="n">subscriber</span><span class="p">]</span><span class="o">.</span><span class="n">publishArrived</span><span class="p">(</span><span class="n">topic</span><span class="p">,</span> <span class="n">message</span><span class="p">,</span> <span class="n">out_qos</span><span class="p">)</span>
<a name="Brokers.py-pyg.html-104"></a> <span class="k">else</span><span class="p">:</span>
<a name="Brokers.py-pyg.html-105"></a> <span class="k">for</span> <span class="n">subscription</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">se</span><span class="o">.</span><span class="n">getSubscriptions</span><span class="p">(</span><span class="n">topic</span><span class="p">,</span> <span class="n">subscriber</span><span class="p">):</span>
<a name="Brokers.py-pyg.html-106"></a> <span class="n">out_qos</span> <span class="o">=</span> <span class="nb">min</span><span class="p">(</span><span class="n">subscription</span><span class="o">.</span><span class="n">getQoS</span><span class="p">(),</span> <span class="n">qos</span><span class="p">)</span>
<a name="Brokers.py-pyg.html-107"></a> <span class="bp">self</span><span class="o">.</span><span class="n">__clients</span><span class="p">[</span><span class="n">subscriber</span><span class="p">]</span><span class="o">.</span><span class="n">publishArrived</span><span class="p">(</span><span class="n">topic</span><span class="p">,</span> <span class="n">message</span><span class="p">,</span> <span class="n">out_qos</span><span class="p">)</span>
<a name="Brokers.py-pyg.html-108"></a>
<a name="Brokers.py-pyg.html-109"></a> <span class="k">def</span> <span class="nf">__doRetained__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">aClientid</span><span class="p">,</span> <span class="n">topic</span><span class="p">,</span> <span class="n">qos</span><span class="p">):</span>
<a name="Brokers.py-pyg.html-110"></a> <span class="c"># topic can be single, or a list</span>
<a name="Brokers.py-pyg.html-111"></a> <span class="k">if</span> <span class="nb">type</span><span class="p">(</span><span class="n">topic</span><span class="p">)</span> <span class="o">!=</span> <span class="nb">type</span><span class="p">([]):</span>
<a name="Brokers.py-pyg.html-112"></a> <span class="n">topic</span> <span class="o">=</span> <span class="p">[</span><span class="n">topic</span><span class="p">]</span>
<a name="Brokers.py-pyg.html-113"></a> <span class="n">qos</span> <span class="o">=</span> <span class="p">[</span><span class="n">qos</span><span class="p">]</span>
<a name="Brokers.py-pyg.html-114"></a> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span>
<a name="Brokers.py-pyg.html-115"></a> <span class="k">for</span> <span class="n">t</span> <span class="ow">in</span> <span class="n">topic</span><span class="p">:</span> <span class="c"># t is a wildcard subscription topic</span>
<a name="Brokers.py-pyg.html-116"></a> <span class="n">topicsUsed</span> <span class="o">=</span> <span class="p">[]</span>
<a name="Brokers.py-pyg.html-117"></a> <span class="k">for</span> <span class="n">s</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">se</span><span class="o">.</span><span class="n">getRetainedTopics</span><span class="p">(</span><span class="n">topic</span><span class="p">):</span> <span class="c"># s is a non-wildcard retained topic</span>
<a name="Brokers.py-pyg.html-118"></a> <span class="k">if</span> <span class="n">s</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">topicsUsed</span> <span class="ow">and</span> <span class="n">Topics</span><span class="o">.</span><span class="n">topicMatches</span><span class="p">(</span><span class="n">t</span><span class="p">,</span> <span class="n">s</span><span class="p">):</span>
<a name="Brokers.py-pyg.html-119"></a> <span class="c"># topic has retained publication</span>
<a name="Brokers.py-pyg.html-120"></a> <span class="n">topicsUsed</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">s</span><span class="p">)</span>
<a name="Brokers.py-pyg.html-121"></a> <span class="p">(</span><span class="n">ret_msg</span><span class="p">,</span> <span class="n">ret_qos</span><span class="p">)</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">se</span><span class="o">.</span><span class="n">getRetained</span><span class="p">(</span><span class="n">s</span><span class="p">)</span>
<a name="Brokers.py-pyg.html-122"></a> <span class="n">thisqos</span> <span class="o">=</span> <span class="nb">min</span><span class="p">(</span><span class="n">ret_qos</span><span class="p">,</span> <span class="n">qos</span><span class="p">[</span><span class="n">i</span><span class="p">])</span>
<a name="Brokers.py-pyg.html-123"></a> <span class="bp">self</span><span class="o">.</span><span class="n">__clients</span><span class="p">[</span><span class="n">aClientid</span><span class="p">]</span><span class="o">.</span><span class="n">publishArrived</span><span class="p">(</span><span class="n">s</span><span class="p">,</span> <span class="n">ret_msg</span><span class="p">,</span> <span class="n">thisqos</span><span class="p">,</span> <span class="bp">True</span><span class="p">)</span>
<a name="Brokers.py-pyg.html-124"></a> <span class="n">i</span> <span class="o">+=</span> <span class="mi">1</span>
<a name="Brokers.py-pyg.html-125"></a>
<a name="Brokers.py-pyg.html-126"></a> <span class="k">def</span> <span class="nf">subscribe</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">aClientid</span><span class="p">,</span> <span class="n">topic</span><span class="p">,</span> <span class="n">qos</span><span class="p">):</span>
<a name="Brokers.py-pyg.html-127"></a> <span class="n">rc</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">se</span><span class="o">.</span><span class="n">subscribe</span><span class="p">(</span><span class="n">aClientid</span><span class="p">,</span> <span class="n">topic</span><span class="p">,</span> <span class="n">qos</span><span class="p">)</span>
<a name="Brokers.py-pyg.html-128"></a> <span class="bp">self</span><span class="o">.</span><span class="n">__doRetained__</span><span class="p">(</span><span class="n">aClientid</span><span class="p">,</span> <span class="n">topic</span><span class="p">,</span> <span class="n">qos</span><span class="p">)</span>
<a name="Brokers.py-pyg.html-129"></a> <span class="k">return</span> <span class="n">rc</span>
<a name="Brokers.py-pyg.html-130"></a>
<a name="Brokers.py-pyg.html-131"></a> <span class="k">def</span> <span class="nf">unsubscribe</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">aClientid</span><span class="p">,</span> <span class="n">topic</span><span class="p">):</span>
<a name="Brokers.py-pyg.html-132"></a> <span class="bp">self</span><span class="o">.</span><span class="n">se</span><span class="o">.</span><span class="n">unsubscribe</span><span class="p">(</span><span class="n">aClientid</span><span class="p">,</span> <span class="n">topic</span><span class="p">)</span>
<a name="Brokers.py-pyg.html-133"></a>
<a name="Brokers.py-pyg.html-134"></a> <span class="k">def</span> <span class="nf">getSubscriptions</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">aClientid</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
<a name="Brokers.py-pyg.html-135"></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">se</span><span class="o">.</span><span class="n">getSubscriptions</span><span class="p">(</span><span class="n">aClientid</span><span class="p">)</span>
<a name="Brokers.py-pyg.html-136"></a>
<a name="Brokers.py-pyg.html-137"></a>
<a name="Brokers.py-pyg.html-138"></a>
<a name="Brokers.py-pyg.html-139"></a>
<a name="Brokers.py-pyg.html-140"></a>
</pre></div>
</pre>
</body>
</html>