mirror of
https://github.com/moparisthebest/xeps
synced 2025-02-17 15:40:30 -05:00
ProtoXEP IoT - Discovery v0.0.3 < see revision log >
This commit is contained in:
parent
92f03abf00
commit
f291286ae5
@ -23,6 +23,7 @@
|
|||||||
<spec>XEP-0001</spec>
|
<spec>XEP-0001</spec>
|
||||||
<spec>XEP-0030</spec>
|
<spec>XEP-0030</spec>
|
||||||
<spec>XEP-0077</spec>
|
<spec>XEP-0077</spec>
|
||||||
|
<spec>XEP-0114</spec>
|
||||||
<spec>XEP-0174</spec>
|
<spec>XEP-0174</spec>
|
||||||
<spec>XEP-0323</spec>
|
<spec>XEP-0323</spec>
|
||||||
<spec>XEP-0324</spec>
|
<spec>XEP-0324</spec>
|
||||||
@ -46,6 +47,19 @@
|
|||||||
<jid>TBD</jid>
|
<jid>TBD</jid>
|
||||||
<uri>http://www-rnks.informatik.tu-cottbus.de/~rklauck</uri>
|
<uri>http://www-rnks.informatik.tu-cottbus.de/~rklauck</uri>
|
||||||
</author>
|
</author>
|
||||||
|
<revision>
|
||||||
|
<version>0.0.3</version>
|
||||||
|
<date>2014-04-09</date>
|
||||||
|
<initials>pw</initials>
|
||||||
|
<remark>
|
||||||
|
<p>Introduced possibility for hosting Thing Registry as a Jabber Server Component, using XEP-0114.</p>
|
||||||
|
<p>
|
||||||
|
Expanded de section <link url='#support'>Determining Support</link>, explaining how to search through server components.
|
||||||
|
</p>
|
||||||
|
<p>Removed the possibility to search for nick names, as a way of finding Thing Registries.</p>
|
||||||
|
<p>Added Security and Implementation Notes describing the pros and cons of hosting a Thing Registry as a Server Component vs. as a Client.</p>
|
||||||
|
</remark>
|
||||||
|
</revision>
|
||||||
<revision>
|
<revision>
|
||||||
<version>0.0.2</version>
|
<version>0.0.2</version>
|
||||||
<date>2014-04-07</date>
|
<date>2014-04-07</date>
|
||||||
@ -541,29 +555,27 @@
|
|||||||
</section2>
|
</section2>
|
||||||
<section2 topic='Finding Thing Registry'>
|
<section2 topic='Finding Thing Registry'>
|
||||||
<p>
|
<p>
|
||||||
If a Thing Registry is not preconfigured, one must be found. The following lists methods to obtaining the JID for the Thing Registry. Note that the last two
|
If a Thing Registry is not preconfigured, one must be found. A Thing Registry can be hosted either as a server component using &xep0114; or as an XMPP Client accessible through
|
||||||
have <link url='#security'>security considerations</link> that need to be taken into account.
|
a JID. The following lists methods to obtaining the Component Address or JID for the Thing Registry. Note that the last one has <link url='#security'>security considerations</link>
|
||||||
|
that need to be taken into account, if implemented.
|
||||||
</p>
|
</p>
|
||||||
<ol>
|
<ol>
|
||||||
<li>
|
<li>
|
||||||
Preconfigured JID to Thing Registry.
|
Preconfigured Component Address of Thing Registry. A Component address is normally a subdomain to the domain of the XMPP Server that hosts the component.
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
Preconfigured user name only, on the same XMPP domain as the XMPP Server connected to.
|
Preconfigured bare JID of Thing Registry.
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
XMPP Server itself. This can be found out by sending a discovery request to the server,
|
Preconfigured subdomain part of Component Address. This will be added to the domain of the XMPP Server used to connet to.
|
||||||
as described in <link url='#support'>Determining Support</link>.
|
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
Search for accounts on the XMPP server with nick-name "discovery". Search is performed using &xep0055;
|
Preconfigured user name of JID. This will be added to the domain of the XMPP Server used to connected to.
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
Searching through Server Components on the XMPP Server currently connected to, as described in <link url='#support'>Determining Support</link>.
|
||||||
</li>
|
</li>
|
||||||
</ol>
|
</ol>
|
||||||
<p>
|
|
||||||
<strong>Note:</strong> The above methods might yield multiple JIDs. Each should in turn be checked if the <link url='#support'>support the discovery extension</link>.
|
|
||||||
Note also that the last two have <link url='#security'>security considerations</link> that need to be taken into account. These methods might be
|
|
||||||
skipped, to avoid the possibility that an external user pretends to be a thing registry to hijack new Things installed into the network.
|
|
||||||
</p>
|
|
||||||
</section2>
|
</section2>
|
||||||
<section2 topic='Registering Thing'>
|
<section2 topic='Registering Thing'>
|
||||||
<p>
|
<p>
|
||||||
@ -573,7 +585,7 @@
|
|||||||
<![CDATA[
|
<![CDATA[
|
||||||
<iq type='set'
|
<iq type='set'
|
||||||
from='thing@clayster.com/imc'
|
from='thing@clayster.com/imc'
|
||||||
to='discovery@clayster.com'
|
to='discovery.clayster.com'
|
||||||
id='1'>
|
id='1'>
|
||||||
<register xmlns='urn:xmpp:iot:discovery'>
|
<register xmlns='urn:xmpp:iot:discovery'>
|
||||||
<str name='SN' value='394872348732948723'/>
|
<str name='SN' value='394872348732948723'/>
|
||||||
@ -585,7 +597,7 @@
|
|||||||
</iq>
|
</iq>
|
||||||
|
|
||||||
<iq type='result'
|
<iq type='result'
|
||||||
from='discovery@clayster.com'
|
from='discovery.clayster.com'
|
||||||
to='thing@clayster.com/imc'
|
to='thing@clayster.com/imc'
|
||||||
id='1'/>]]>
|
id='1'/>]]>
|
||||||
</example>
|
</example>
|
||||||
@ -611,7 +623,7 @@
|
|||||||
<example caption='Registration response when alrady claimed'>
|
<example caption='Registration response when alrady claimed'>
|
||||||
<![CDATA[
|
<![CDATA[
|
||||||
<iq type='result'
|
<iq type='result'
|
||||||
from='discovery@clayster.com'
|
from='discovery.clayster.com'
|
||||||
to='thing@clayster.com/imc'
|
to='thing@clayster.com/imc'
|
||||||
id='1'>
|
id='1'>
|
||||||
<claimed xmlns='urn:xmpp:iot:discovery' jid='owner@clayster.com'/>
|
<claimed xmlns='urn:xmpp:iot:discovery' jid='owner@clayster.com'/>
|
||||||
@ -631,7 +643,7 @@
|
|||||||
<![CDATA[
|
<![CDATA[
|
||||||
<iq type='set'
|
<iq type='set'
|
||||||
from='thing@clayster.com/imc'
|
from='thing@clayster.com/imc'
|
||||||
to='discovery@clayster.com'
|
to='discovery.clayster.com'
|
||||||
id='2'>
|
id='2'>
|
||||||
<register xmlns='urn:xmpp:iot:discovery' selfOwned='true'>
|
<register xmlns='urn:xmpp:iot:discovery' selfOwned='true'>
|
||||||
<str name='SN' value='394872348732948723'/>
|
<str name='SN' value='394872348732948723'/>
|
||||||
@ -643,7 +655,7 @@
|
|||||||
</iq>
|
</iq>
|
||||||
|
|
||||||
<iq type='result'
|
<iq type='result'
|
||||||
from='discovery@clayster.com'
|
from='discovery.clayster.com'
|
||||||
to='thing@clayster.com/imc'
|
to='thing@clayster.com/imc'
|
||||||
id='2'/>]]>
|
id='2'/>]]>
|
||||||
</example>
|
</example>
|
||||||
@ -665,7 +677,7 @@
|
|||||||
<![CDATA[
|
<![CDATA[
|
||||||
<iq type='set'
|
<iq type='set'
|
||||||
from='rack@clayster.com/plcs'
|
from='rack@clayster.com/plcs'
|
||||||
to='discovery@clayster.com'
|
to='discovery.clayster.com'
|
||||||
id='3'>
|
id='3'>
|
||||||
<register xmlns='urn:xmpp:iot:discovery' nodeId='imc1' sourceId='MeteringTopology'>
|
<register xmlns='urn:xmpp:iot:discovery' nodeId='imc1' sourceId='MeteringTopology'>
|
||||||
<str name='SN' value='394872348732948723'/>
|
<str name='SN' value='394872348732948723'/>
|
||||||
@ -677,7 +689,7 @@
|
|||||||
</iq>
|
</iq>
|
||||||
|
|
||||||
<iq type='result'
|
<iq type='result'
|
||||||
from='discovery@clayster.com'
|
from='discovery.clayster.com'
|
||||||
to='rack@clayster.com/plcs'
|
to='rack@clayster.com/plcs'
|
||||||
id='3'/>]]>
|
id='3'/>]]>
|
||||||
</example>
|
</example>
|
||||||
@ -722,7 +734,7 @@
|
|||||||
<![CDATA[
|
<![CDATA[
|
||||||
<iq type='set'
|
<iq type='set'
|
||||||
from='owner@clayster.com/phone'
|
from='owner@clayster.com/phone'
|
||||||
to='discovery@clayster.com'
|
to='discovery.clayster.com'
|
||||||
id='4'>
|
id='4'>
|
||||||
<mine xmlns='urn:xmpp:iot:discovery'>
|
<mine xmlns='urn:xmpp:iot:discovery'>
|
||||||
<str name='SN' value='394872348732948723'/>
|
<str name='SN' value='394872348732948723'/>
|
||||||
@ -741,7 +753,7 @@
|
|||||||
<![CDATA[
|
<![CDATA[
|
||||||
<iq type='set'
|
<iq type='set'
|
||||||
from='owner@clayster.com/phone'
|
from='owner@clayster.com/phone'
|
||||||
to='discovery@clayster.com'
|
to='discovery.clayster.com'
|
||||||
id='4'>
|
id='4'>
|
||||||
<mine xmlns='urn:xmpp:iot:discovery' public='false'>
|
<mine xmlns='urn:xmpp:iot:discovery' public='false'>
|
||||||
<str name='SN' value='394872348732948723'/>
|
<str name='SN' value='394872348732948723'/>
|
||||||
@ -764,7 +776,7 @@
|
|||||||
<example caption='Ownership claim successful'>
|
<example caption='Ownership claim successful'>
|
||||||
<![CDATA[
|
<![CDATA[
|
||||||
<iq type='result'
|
<iq type='result'
|
||||||
from='discovery@clayster.com'
|
from='discovery.clayster.com'
|
||||||
to='owner@clayster.com/phone'
|
to='owner@clayster.com/phone'
|
||||||
id='4'>
|
id='4'>
|
||||||
<claimed xmlns='urn:xmpp:iot:discovery' jid='thing@clayster.com'/>
|
<claimed xmlns='urn:xmpp:iot:discovery' jid='thing@clayster.com'/>
|
||||||
@ -778,7 +790,7 @@
|
|||||||
<example caption='Ownership claim of a Thing behind a concentrator successful'>
|
<example caption='Ownership claim of a Thing behind a concentrator successful'>
|
||||||
<![CDATA[
|
<![CDATA[
|
||||||
<iq type='result'
|
<iq type='result'
|
||||||
from='discovery@clayster.com'
|
from='discovery.clayster.com'
|
||||||
to='owner@clayster.com/phone'
|
to='owner@clayster.com/phone'
|
||||||
id='4'>
|
id='4'>
|
||||||
<claimed xmlns='urn:xmpp:iot:discovery' jid='rack@clayster.com/plcs' nodeId='imc1' sourceId='MeteringTopology'/>
|
<claimed xmlns='urn:xmpp:iot:discovery' jid='rack@clayster.com/plcs' nodeId='imc1' sourceId='MeteringTopology'/>
|
||||||
@ -791,7 +803,7 @@
|
|||||||
<example caption='Ownership claim failure'>
|
<example caption='Ownership claim failure'>
|
||||||
<![CDATA[
|
<![CDATA[
|
||||||
<iq type='error'
|
<iq type='error'
|
||||||
from='discovery@clayster.com'
|
from='discovery.clayster.com'
|
||||||
to='owner@clayster.com/phone'
|
to='owner@clayster.com/phone'
|
||||||
id='4'>
|
id='4'>
|
||||||
<error type='cancel'>
|
<error type='cancel'>
|
||||||
@ -806,7 +818,7 @@
|
|||||||
<example caption='Ownership claimed'>
|
<example caption='Ownership claimed'>
|
||||||
<![CDATA[
|
<![CDATA[
|
||||||
<iq type='set'
|
<iq type='set'
|
||||||
from='discovery@clayster.com'
|
from='discovery.clayster.com'
|
||||||
to='thing@clayster.com/imc'
|
to='thing@clayster.com/imc'
|
||||||
id='5'>
|
id='5'>
|
||||||
<claimed xmlns='urn:xmpp:iot:discovery' jid='owner@clayster.com'/>
|
<claimed xmlns='urn:xmpp:iot:discovery' jid='owner@clayster.com'/>
|
||||||
@ -818,7 +830,7 @@
|
|||||||
<example caption='Ownership claim of private Thing successful'>
|
<example caption='Ownership claim of private Thing successful'>
|
||||||
<![CDATA[
|
<![CDATA[
|
||||||
<iq type='set'
|
<iq type='set'
|
||||||
from='discovery@clayster.com'
|
from='discovery.clayster.com'
|
||||||
to='thing@clayster.com/imc'
|
to='thing@clayster.com/imc'
|
||||||
id='5'>
|
id='5'>
|
||||||
<claimed xmlns='urn:xmpp:iot:discovery' jid='owner@clayster.com' public='false'/>
|
<claimed xmlns='urn:xmpp:iot:discovery' jid='owner@clayster.com' public='false'/>
|
||||||
@ -835,7 +847,7 @@
|
|||||||
<example caption='Ownership of Thing behind concentrator claimed'>
|
<example caption='Ownership of Thing behind concentrator claimed'>
|
||||||
<![CDATA[
|
<![CDATA[
|
||||||
<iq type='set'
|
<iq type='set'
|
||||||
from='discovery@clayster.com'
|
from='discovery.clayster.com'
|
||||||
to='rack@clayster.com/plcs'
|
to='rack@clayster.com/plcs'
|
||||||
id='5'>
|
id='5'>
|
||||||
<claimed xmlns='urn:xmpp:iot:discovery' jid='owner@clayster.com' nodeId='imc1' sourceId='MeteringTopology'/>
|
<claimed xmlns='urn:xmpp:iot:discovery' jid='owner@clayster.com' nodeId='imc1' sourceId='MeteringTopology'/>
|
||||||
@ -848,7 +860,7 @@
|
|||||||
<![CDATA[
|
<![CDATA[
|
||||||
<iq type='result'
|
<iq type='result'
|
||||||
from='thing@clayster.com/imc'
|
from='thing@clayster.com/imc'
|
||||||
to='discovery@clayster.com'
|
to='discovery.clayster.com'
|
||||||
id='5'/>]]>
|
id='5'/>]]>
|
||||||
</example>
|
</example>
|
||||||
<p>
|
<p>
|
||||||
@ -868,7 +880,7 @@
|
|||||||
<![CDATA[
|
<![CDATA[
|
||||||
<iq type='set'
|
<iq type='set'
|
||||||
from='owner@clayster.com/phone'
|
from='owner@clayster.com/phone'
|
||||||
to='discovery@clayster.com'
|
to='discovery.clayster.com'
|
||||||
id='6'>
|
id='6'>
|
||||||
<remove xmlns='urn:xmpp:iot:discovery' jid='thing@clayster.com'/>
|
<remove xmlns='urn:xmpp:iot:discovery' jid='thing@clayster.com'/>
|
||||||
</iq>]]>
|
</iq>]]>
|
||||||
@ -881,7 +893,7 @@
|
|||||||
<![CDATA[
|
<![CDATA[
|
||||||
<iq type='set'
|
<iq type='set'
|
||||||
from='owner@clayster.com/phone'
|
from='owner@clayster.com/phone'
|
||||||
to='discovery@clayster.com'
|
to='discovery.clayster.com'
|
||||||
id='6'>
|
id='6'>
|
||||||
<remove xmlns='urn:xmpp:iot:discovery' jid='rack@clayster.com/plcs' nodeId='imc1' sourceId='MeteringTopology'/>
|
<remove xmlns='urn:xmpp:iot:discovery' jid='rack@clayster.com/plcs' nodeId='imc1' sourceId='MeteringTopology'/>
|
||||||
</iq>]]>
|
</iq>]]>
|
||||||
@ -893,7 +905,7 @@
|
|||||||
<example caption='Thing removed'>
|
<example caption='Thing removed'>
|
||||||
<![CDATA[
|
<![CDATA[
|
||||||
<iq type='result'
|
<iq type='result'
|
||||||
from='discovery@clayster.com'
|
from='discovery.clayster.com'
|
||||||
to='owner@clayster.com/phone'
|
to='owner@clayster.com/phone'
|
||||||
id='6'/>]]>
|
id='6'/>]]>
|
||||||
</example>
|
</example>
|
||||||
@ -903,7 +915,7 @@
|
|||||||
<example caption='Removal failure'>
|
<example caption='Removal failure'>
|
||||||
<![CDATA[
|
<![CDATA[
|
||||||
<iq type='error'
|
<iq type='error'
|
||||||
from='discovery@clayster.com'
|
from='discovery.clayster.com'
|
||||||
to='owner@clayster.com/phone'
|
to='owner@clayster.com/phone'
|
||||||
id='6'>
|
id='6'>
|
||||||
<error type='cancel'>
|
<error type='cancel'>
|
||||||
@ -918,7 +930,7 @@
|
|||||||
<example caption='Thing removed from registry by owner'>
|
<example caption='Thing removed from registry by owner'>
|
||||||
<![CDATA[
|
<![CDATA[
|
||||||
<iq type='set'
|
<iq type='set'
|
||||||
from='discovery@clayster.com'
|
from='discovery.clayster.com'
|
||||||
to='thing@clayster.com/imc'
|
to='thing@clayster.com/imc'
|
||||||
id='7'>
|
id='7'>
|
||||||
<removed xmlns='urn:xmpp:iot:discovery'/>
|
<removed xmlns='urn:xmpp:iot:discovery'/>
|
||||||
@ -926,7 +938,7 @@
|
|||||||
|
|
||||||
<iq type='result'
|
<iq type='result'
|
||||||
from='thing@clayster.com/imc'
|
from='thing@clayster.com/imc'
|
||||||
to='discovery@clayster.com'
|
to='discovery.clayster.com'
|
||||||
id='7'/>]]>
|
id='7'/>]]>
|
||||||
</example>
|
</example>
|
||||||
<p>
|
<p>
|
||||||
@ -935,7 +947,7 @@
|
|||||||
<example caption='Thing behind concentrator removed from registry by owner'>
|
<example caption='Thing behind concentrator removed from registry by owner'>
|
||||||
<![CDATA[
|
<![CDATA[
|
||||||
<iq type='set'
|
<iq type='set'
|
||||||
from='discovery@clayster.com'
|
from='discovery.clayster.com'
|
||||||
to='rack@clayster.com/plcs'
|
to='rack@clayster.com/plcs'
|
||||||
id='7'>
|
id='7'>
|
||||||
<removed xmlns='urn:xmpp:iot:discovery' nodeId='imc1' sourceId='MeteringTopology'/>
|
<removed xmlns='urn:xmpp:iot:discovery' nodeId='imc1' sourceId='MeteringTopology'/>
|
||||||
@ -948,7 +960,7 @@
|
|||||||
<![CDATA[
|
<![CDATA[
|
||||||
<iq type='result'
|
<iq type='result'
|
||||||
from='thing@clayster.com/imc'
|
from='thing@clayster.com/imc'
|
||||||
to='discovery@clayster.com'
|
to='discovery.clayster.com'
|
||||||
id='7'/>]]>
|
id='7'/>]]>
|
||||||
</example>
|
</example>
|
||||||
</section2>
|
</section2>
|
||||||
@ -956,37 +968,33 @@
|
|||||||
<p>
|
<p>
|
||||||
Up to this point only basic configuration and ownership and visibility of a Thing has been covered. For more advanced operations, a Thing might be required to
|
Up to this point only basic configuration and ownership and visibility of a Thing has been covered. For more advanced operations, a Thing might be required to
|
||||||
use a Provisioning Server to whom it can delegate trust and allow making decisions, controlling access rights and privileges for the Thing, as described in &xep0324;.
|
use a Provisioning Server to whom it can delegate trust and allow making decisions, controlling access rights and privileges for the Thing, as described in &xep0324;.
|
||||||
If a Provisioning Server is not preconfigured, one must be found. The following lists methods to obtaining the JID for the Provisioning Server. Note that the last two
|
If a Provisioning Server is not preconfigured, one must be found. The following lists methods to obtaining the JID for the Provisioning Server.
|
||||||
have <link url='#security'>security considerations</link> that need to be taken into account.
|
|
||||||
</p>
|
</p>
|
||||||
<ol>
|
<ol>
|
||||||
<li>
|
<li>
|
||||||
Preconfigured JID to Provisioning Server.
|
Preconfigured Component Address of Provisioning Server. A Component address is normally a subdomain to the domain of the XMPP Server that hosts the component.
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
Preconfigured user name only, on the same XMPP domain as the XMPP Server connected to.
|
Preconfigured bare JID of Provisioning Server.
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
The XMPP Server itself can be a Provisioning Server. This can be found out by sending a discovery request to the server,
|
Preconfigured subdomain part of Component Address. This will be added to the domain of the XMPP Server used to connet to.
|
||||||
as described in <link url='#support'>Determining Support</link>.
|
</li>
|
||||||
|
<li>
|
||||||
|
Preconfigured user name of JID. This will be added to the domain of the XMPP Server used to connected to.
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
The Thing Registry itself can be a Provisioning Server. This can be found out by sending a discovery request to the Thing Registry,
|
The Thing Registry itself can be a Provisioning Server. This can be found out by sending a discovery request to the Thing Registry,
|
||||||
as described in <link url='#support'>Determining Support</link>.
|
as described in <link url='#support'>Determining Support</link>.
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
The Owner itself can be a Provisioning Server. This can be found out by sending a discovery request to the Thing Registry,
|
The Owner itself can be a Provisioning Server. This can be found out by sending a discovery request to the Owner,
|
||||||
as described in <link url='#support'>Determining Support</link>.
|
as described in <link url='#support'>Determining Support</link>.
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
Search for accounts on the XMPP server with nick-name "provisioning". Search is performed using &xep0055;
|
Searching through Server Components on the XMPP Server currently connected to, as described in <link url='#support'>Determining Support</link>.
|
||||||
</li>
|
</li>
|
||||||
</ol>
|
</ol>
|
||||||
<p>
|
|
||||||
<strong>Note:</strong> The above methods might yield multiple JIDs. Each should in turn be checked if the <link url='#support'>support the discovery extension</link>.
|
|
||||||
Note also that the last two have <link url='#security'>security considerations</link> that need to be taken into account. These methods might be
|
|
||||||
skipped, to avoid the possibility that an external user pretends to be a thing registry to hijack new Things installed into the network.
|
|
||||||
</p>
|
|
||||||
</section2>
|
</section2>
|
||||||
<section2 topic='Delegating Trust'>
|
<section2 topic='Delegating Trust'>
|
||||||
<p>
|
<p>
|
||||||
@ -1012,7 +1020,7 @@
|
|||||||
<![CDATA[
|
<![CDATA[
|
||||||
<iq type='set'
|
<iq type='set'
|
||||||
from='thing@clayster.com/imc'
|
from='thing@clayster.com/imc'
|
||||||
to='discovery@clayster.com'
|
to='discovery.clayster.com'
|
||||||
id='8'>
|
id='8'>
|
||||||
<update xmlns='urn:xmpp:iot:discovery'>
|
<update xmlns='urn:xmpp:iot:discovery'>
|
||||||
<str name='KEY' value=''/>
|
<str name='KEY' value=''/>
|
||||||
@ -1030,7 +1038,7 @@
|
|||||||
<![CDATA[
|
<![CDATA[
|
||||||
<iq type='set'
|
<iq type='set'
|
||||||
from='rack@clayster.com/plcs'
|
from='rack@clayster.com/plcs'
|
||||||
to='discovery@clayster.com'
|
to='discovery.clayster.com'
|
||||||
id='8'>
|
id='8'>
|
||||||
<update xmlns='urn:xmpp:iot:discovery' nodeId='imc1' sourceId='MeteringTopology'>
|
<update xmlns='urn:xmpp:iot:discovery' nodeId='imc1' sourceId='MeteringTopology'>
|
||||||
<str name='KEY' value=''/>
|
<str name='KEY' value=''/>
|
||||||
@ -1046,7 +1054,7 @@
|
|||||||
<example caption='Update Meta Data request acknowledgement'>
|
<example caption='Update Meta Data request acknowledgement'>
|
||||||
<![CDATA[
|
<![CDATA[
|
||||||
<iq type='result'
|
<iq type='result'
|
||||||
from='discovery@clayster.com'
|
from='discovery.clayster.com'
|
||||||
to='thing@clayster.com/imc'
|
to='thing@clayster.com/imc'
|
||||||
id='8'/>]]>
|
id='8'/>]]>
|
||||||
</example>
|
</example>
|
||||||
@ -1058,7 +1066,7 @@
|
|||||||
<example caption='Update Meta Data request failure'>
|
<example caption='Update Meta Data request failure'>
|
||||||
<![CDATA[
|
<![CDATA[
|
||||||
<iq type='error'
|
<iq type='error'
|
||||||
from='discovery@clayster.com'
|
from='discovery.clayster.com'
|
||||||
to='thing@clayster.com/imc'
|
to='thing@clayster.com/imc'
|
||||||
id='8'>
|
id='8'>
|
||||||
<error type='cancel'>
|
<error type='cancel'>
|
||||||
@ -1074,7 +1082,7 @@
|
|||||||
<example caption='Update Meta Data response to request from disowned Thing'>
|
<example caption='Update Meta Data response to request from disowned Thing'>
|
||||||
<![CDATA[
|
<![CDATA[
|
||||||
<iq type='result'
|
<iq type='result'
|
||||||
from='discovery@clayster.com'
|
from='discovery.clayster.com'
|
||||||
to='thing@clayster.com/imc'
|
to='thing@clayster.com/imc'
|
||||||
id='8'>
|
id='8'>
|
||||||
<disowned xmlns='urn:xmpp:iot:discovery'/>
|
<disowned xmlns='urn:xmpp:iot:discovery'/>
|
||||||
@ -1216,7 +1224,7 @@
|
|||||||
<![CDATA[
|
<![CDATA[
|
||||||
<iq type='get'
|
<iq type='get'
|
||||||
from='curious@clayster.com/client'
|
from='curious@clayster.com/client'
|
||||||
to='discovery@clayster.com'
|
to='discovery.clayster.com'
|
||||||
id='9'>
|
id='9'>
|
||||||
<search xmlns='urn:xmpp:iot:discovery' offset='0' maxCount='20'>
|
<search xmlns='urn:xmpp:iot:discovery' offset='0' maxCount='20'>
|
||||||
<strEq name='MAN' value='www.ktc.se'/>
|
<strEq name='MAN' value='www.ktc.se'/>
|
||||||
@ -1244,7 +1252,7 @@
|
|||||||
<example caption='Search result'>
|
<example caption='Search result'>
|
||||||
<![CDATA[
|
<![CDATA[
|
||||||
<iq type='result'
|
<iq type='result'
|
||||||
from='discovery@clayster.com'
|
from='discovery.clayster.com'
|
||||||
to='curious@clayster.com/client'
|
to='curious@clayster.com/client'
|
||||||
id='9'>
|
id='9'>
|
||||||
<found xmlns='urn:xmpp:iot:discovery' more='false'>
|
<found xmlns='urn:xmpp:iot:discovery' more='false'>
|
||||||
@ -1268,7 +1276,7 @@
|
|||||||
<example caption='Search result containing Thing behind a concentrator'>
|
<example caption='Search result containing Thing behind a concentrator'>
|
||||||
<![CDATA[
|
<![CDATA[
|
||||||
<iq type='result'
|
<iq type='result'
|
||||||
from='discovery@clayster.com'
|
from='discovery.clayster.com'
|
||||||
to='curious@clayster.com/client'
|
to='curious@clayster.com/client'
|
||||||
id='9'>
|
id='9'>
|
||||||
<found xmlns='urn:xmpp:iot:discovery' more='false'>
|
<found xmlns='urn:xmpp:iot:discovery' more='false'>
|
||||||
@ -1302,7 +1310,7 @@
|
|||||||
<![CDATA[
|
<![CDATA[
|
||||||
<iq type='set'
|
<iq type='set'
|
||||||
from='thing@clayster.com/imc'
|
from='thing@clayster.com/imc'
|
||||||
to='discovery@clayster.com'
|
to='discovery.clayster.com'
|
||||||
id='10'>
|
id='10'>
|
||||||
<unregister xmlns='urn:xmpp:iot:discovery'/>
|
<unregister xmlns='urn:xmpp:iot:discovery'/>
|
||||||
</iq>]]>
|
</iq>]]>
|
||||||
@ -1315,7 +1323,7 @@
|
|||||||
<![CDATA[
|
<![CDATA[
|
||||||
<iq type='set'
|
<iq type='set'
|
||||||
from='rack@clayster.com/plcs'
|
from='rack@clayster.com/plcs'
|
||||||
to='discovery@clayster.com'
|
to='discovery.clayster.com'
|
||||||
id='10'>
|
id='10'>
|
||||||
<unregister xmlns='urn:xmpp:iot:discovery' nodeId='imc1' sourceId='MeteringTopology'/>
|
<unregister xmlns='urn:xmpp:iot:discovery' nodeId='imc1' sourceId='MeteringTopology'/>
|
||||||
</iq>]]>
|
</iq>]]>
|
||||||
@ -1326,7 +1334,7 @@
|
|||||||
<example caption='Unregister Thing acknowledgement'>
|
<example caption='Unregister Thing acknowledgement'>
|
||||||
<![CDATA[
|
<![CDATA[
|
||||||
<iq type='result'
|
<iq type='result'
|
||||||
from='discovery@clayster.com'
|
from='discovery.clayster.com'
|
||||||
to='thing@clayster.com/imc'
|
to='thing@clayster.com/imc'
|
||||||
id='10'/>]]>
|
id='10'/>]]>
|
||||||
</example>
|
</example>
|
||||||
@ -1339,7 +1347,7 @@
|
|||||||
<![CDATA[
|
<![CDATA[
|
||||||
<iq type='set'
|
<iq type='set'
|
||||||
from='owner@clayster.com/phone'
|
from='owner@clayster.com/phone'
|
||||||
to='discovery@clayster.com'
|
to='discovery.clayster.com'
|
||||||
id='11'>
|
id='11'>
|
||||||
<disown xmlns='urn:xmpp:iot:discovery' jid='thing@clayster.com'/>
|
<disown xmlns='urn:xmpp:iot:discovery' jid='thing@clayster.com'/>
|
||||||
</iq>]]>
|
</iq>]]>
|
||||||
@ -1352,7 +1360,7 @@
|
|||||||
<![CDATA[
|
<![CDATA[
|
||||||
<iq type='set'
|
<iq type='set'
|
||||||
from='owner@clayster.com/phone'
|
from='owner@clayster.com/phone'
|
||||||
to='discovery@clayster.com'
|
to='discovery.clayster.com'
|
||||||
id='11'>
|
id='11'>
|
||||||
<disown xmlns='urn:xmpp:iot:discovery' jid='rack@clayster.com/plcs' nodeId='imc1' sourceId='MeteringTopology'/>
|
<disown xmlns='urn:xmpp:iot:discovery' jid='rack@clayster.com/plcs' nodeId='imc1' sourceId='MeteringTopology'/>
|
||||||
</iq>]]>
|
</iq>]]>
|
||||||
@ -1363,7 +1371,7 @@
|
|||||||
<example caption='Failure to disown Thing - Not Found'>
|
<example caption='Failure to disown Thing - Not Found'>
|
||||||
<![CDATA[
|
<![CDATA[
|
||||||
<iq type='error'
|
<iq type='error'
|
||||||
from='discovery@clayster.com'
|
from='discovery.clayster.com'
|
||||||
to='owner@clayster.com/phone'
|
to='owner@clayster.com/phone'
|
||||||
id='11'>
|
id='11'>
|
||||||
<error type='cancel'>
|
<error type='cancel'>
|
||||||
@ -1378,7 +1386,7 @@
|
|||||||
<example caption='Failure to disown Thing - Offline'>
|
<example caption='Failure to disown Thing - Offline'>
|
||||||
<![CDATA[
|
<![CDATA[
|
||||||
<iq type='error'
|
<iq type='error'
|
||||||
from='discovery@clayster.com'
|
from='discovery.clayster.com'
|
||||||
to='owner@clayster.com/phone'
|
to='owner@clayster.com/phone'
|
||||||
id='11'>
|
id='11'>
|
||||||
<error type='cancel'>
|
<error type='cancel'>
|
||||||
@ -1393,7 +1401,7 @@
|
|||||||
<example caption='Thing disowned in registry by owner'>
|
<example caption='Thing disowned in registry by owner'>
|
||||||
<![CDATA[
|
<![CDATA[
|
||||||
<iq type='set'
|
<iq type='set'
|
||||||
from='discovery@clayster.com'
|
from='discovery.clayster.com'
|
||||||
to='thing@clayster.com/imc'
|
to='thing@clayster.com/imc'
|
||||||
id='12'>
|
id='12'>
|
||||||
<disowned xmlns='urn:xmpp:iot:discovery'/>
|
<disowned xmlns='urn:xmpp:iot:discovery'/>
|
||||||
@ -1405,7 +1413,7 @@
|
|||||||
<example caption='Thing behind concentrator disowned in registry by owner'>
|
<example caption='Thing behind concentrator disowned in registry by owner'>
|
||||||
<![CDATA[
|
<![CDATA[
|
||||||
<iq type='set'
|
<iq type='set'
|
||||||
from='discovery@clayster.com'
|
from='discovery.clayster.com'
|
||||||
to='rack@clayster.com/plcs'
|
to='rack@clayster.com/plcs'
|
||||||
id='12'>
|
id='12'>
|
||||||
<disowned xmlns='urn:xmpp:iot:discovery' nodeId='imc1' sourceId='MeteringTopology'/>
|
<disowned xmlns='urn:xmpp:iot:discovery' nodeId='imc1' sourceId='MeteringTopology'/>
|
||||||
@ -1418,7 +1426,7 @@
|
|||||||
<![CDATA[
|
<![CDATA[
|
||||||
<iq type='result'
|
<iq type='result'
|
||||||
from='thing@clayster.com/imc'
|
from='thing@clayster.com/imc'
|
||||||
to='discovery@clayster.com'
|
to='discovery.clayster.com'
|
||||||
id='12'/>]]>
|
id='12'/>]]>
|
||||||
</example>
|
</example>
|
||||||
<p>
|
<p>
|
||||||
@ -1429,7 +1437,7 @@
|
|||||||
<example caption='Thing disowned'>
|
<example caption='Thing disowned'>
|
||||||
<![CDATA[
|
<![CDATA[
|
||||||
<iq type='result'
|
<iq type='result'
|
||||||
from='discovery@clayster.com'
|
from='discovery.clayster.com'
|
||||||
to='owner@clayster.com/phone'
|
to='owner@clayster.com/phone'
|
||||||
id='11'/>]]>
|
id='11'/>]]>
|
||||||
</example>
|
</example>
|
||||||
@ -1445,32 +1453,99 @@
|
|||||||
</p>
|
</p>
|
||||||
<example caption="Service discovery information request">
|
<example caption="Service discovery information request">
|
||||||
<![CDATA[
|
<![CDATA[
|
||||||
<iq type='get'
|
<iq type='get'
|
||||||
from='device@clayster.com/device'
|
from='device@clayster.com/device'
|
||||||
to='provisioning@clayster.com'
|
to='provisioning@clayster.com'
|
||||||
id='disco1'>
|
id='13'>
|
||||||
<query xmlns='http://jabber.org/protocol/disco#info'/>
|
<query xmlns='http://jabber.org/protocol/disco#info'/>
|
||||||
</iq>]]>
|
</iq>]]>
|
||||||
</example>
|
</example>
|
||||||
<example caption="Service discovery information response">
|
<example caption="Service discovery information response">
|
||||||
<![CDATA[
|
<![CDATA[
|
||||||
<iq type='result'
|
<iq type='result'
|
||||||
from='provisioning@clayster.com'
|
from='provisioning@clayster.com'
|
||||||
to='device@clayster.com/device'
|
to='device@clayster.com/device'
|
||||||
id='disco1'>
|
id='13'>
|
||||||
<query xmlns='http://jabber.org/protocol/disco#info'>
|
<query xmlns='http://jabber.org/protocol/disco#info'>
|
||||||
...
|
...
|
||||||
<feature var='urn:xmpp:iot:discovery'/>
|
<feature var='urn:xmpp:iot:discovery'/>
|
||||||
...
|
...
|
||||||
</query>
|
</query>
|
||||||
</iq>]]>
|
</iq>]]>
|
||||||
</example>
|
</example>
|
||||||
<p>
|
<p>
|
||||||
In order for an application to determine whether an entity supports this protocol, where possible it SHOULD use the dynamic, presence-based profile of service discovery defined
|
To search for a Thing Registry hosted as a component on an XMPP Server, you first request a list of available components, as follows:
|
||||||
in &xep0115;. However, if an application has not received entity capabilities information from an entity, it SHOULD use explicit service discovery instead.
|
|
||||||
</p>
|
</p>
|
||||||
|
<example caption="Checking if server supports components">
|
||||||
|
<![CDATA[
|
||||||
|
<iq from='device@clayster.com/device' to='clayster.com' type='get' id='14'>
|
||||||
|
<query xmlns="http://jabber.org/protocol/disco#info"/>
|
||||||
|
</iq>]]>
|
||||||
|
</example>
|
||||||
|
<example caption="Response confirming support for components">
|
||||||
|
<![CDATA[
|
||||||
|
<iq type="result" id="14" from="clayster.com" to="device@clayster.com/device">
|
||||||
|
<query xmlns="http://jabber.org/protocol/disco#info">
|
||||||
|
...
|
||||||
|
<feature var="http://jabber.org/protocol/disco#items"/>
|
||||||
|
...
|
||||||
|
</query>
|
||||||
|
</iq>]]>
|
||||||
|
</example>
|
||||||
|
<p>
|
||||||
|
If components (items) are supported, a request for available components is made:
|
||||||
|
</p>
|
||||||
|
<example caption="Requesting list of server components">
|
||||||
|
<![CDATA[
|
||||||
|
<iq from='device@clayster.com/device' to='clayster.com' type='get' id='15'>
|
||||||
|
<query xmlns="http://jabber.org/protocol/disco#items"/>
|
||||||
|
</iq>]]>
|
||||||
|
</example>
|
||||||
|
<example caption="Response containing list of server components">
|
||||||
|
<![CDATA[
|
||||||
|
<iq type="result" id="15" from="clayster.com" to="995fab3dd759452ca9c370647323af0c@clayster.com/ebe2348e">
|
||||||
|
<query xmlns="http://jabber.org/protocol/disco#items">
|
||||||
|
...
|
||||||
|
<item jid="discovery.clayster.com" name="Registro de cosas"/>
|
||||||
|
...
|
||||||
|
</query>
|
||||||
|
</iq>]]>
|
||||||
|
</example>
|
||||||
|
<p>
|
||||||
|
The client then loops through all components (items) and checks what features they support, until a Thing Registry is found:
|
||||||
|
</p>
|
||||||
|
<example caption="Service discovery information request made to each component">
|
||||||
|
<![CDATA[
|
||||||
|
<iq type='get'
|
||||||
|
from='device@clayster.com/device'
|
||||||
|
to='discovery.clayster.com'
|
||||||
|
id='16'>
|
||||||
|
<query xmlns='http://jabber.org/protocol/disco#info'/>
|
||||||
|
</iq>]]>
|
||||||
|
</example>
|
||||||
|
<example caption="Service discovery information response from each component">
|
||||||
|
<![CDATA[
|
||||||
|
<iq type='result'
|
||||||
|
from='provisioning@clayster.com'
|
||||||
|
to='device@clayster.com/device'
|
||||||
|
id='16'>
|
||||||
|
<query xmlns='http://jabber.org/protocol/disco#info'>
|
||||||
|
...
|
||||||
|
<feature var='urn:xmpp:iot:discovery'/>
|
||||||
|
...
|
||||||
|
</query>
|
||||||
|
</iq>]]>
|
||||||
|
</example>
|
||||||
</section1>
|
</section1>
|
||||||
<section1 topic='Implementation Notes' anchor='impl'>
|
<section1 topic='Implementation Notes' anchor='impl'>
|
||||||
|
<section2 topic='JID vs Component Thing Registries' anchor='jidvscomponent'>
|
||||||
|
<p>
|
||||||
|
A client must treat the connection between a Thing Registry differently if it is hosted as a client, having a JID, or if it is hosted as a Jabber Server Component.
|
||||||
|
If it is hosted as a server component, there's no need for the thing to become friends with the Thing Registry. Messages and requests can be made directly to the
|
||||||
|
server component without having to add it to the roster or request presence subscriptions. If the Thing Registry is hosted as a client, having a JID (@ in the address),
|
||||||
|
the Thing Registry must be added to the roster of the client before the client can communicate with the Thing Registry.
|
||||||
|
</p>
|
||||||
|
</section2>
|
||||||
<section2 topic='Meta Tags' anchor='tags'>
|
<section2 topic='Meta Tags' anchor='tags'>
|
||||||
<p>
|
<p>
|
||||||
This document does not limit the number or names of tags used by Things to register meta information about themselves. However, it provides some general limits and defines
|
This document does not limit the number or names of tags used by Things to register meta information about themselves. However, it provides some general limits and defines
|
||||||
@ -1613,6 +1688,28 @@
|
|||||||
</section2>
|
</section2>
|
||||||
</section1>
|
</section1>
|
||||||
<section1 topic='Security Considerations' anchor='security'>
|
<section1 topic='Security Considerations' anchor='security'>
|
||||||
|
<section2 topic='Jabber Components Protocol' anchor='jcp'>
|
||||||
|
<p>
|
||||||
|
The &xep0114; provides an elegant way to introduce external services as server components using a third port into the server (the first two being the client-to-server port
|
||||||
|
and the server-to-server port). But since XEP-0114 is historical, meaning it is not guaranteed to conform to v1.0 of the XMPP specification, it has some serious security
|
||||||
|
issues:
|
||||||
|
</p>
|
||||||
|
<ol>
|
||||||
|
<li>It lacks SSL/TLS support, or the starttls element to switch to TLS after connecting. This makes it possible to sniff traffic in this port.</li>
|
||||||
|
<li>It lacks SASL authentication. Instead a simple handshake is performed</li>
|
||||||
|
<li>There is no way to actually verify that the server is the server. This makes it possible to create a simple Man-in-the-middle attack.</li>
|
||||||
|
</ol>
|
||||||
|
<p>
|
||||||
|
For these reasons, it is not recommended that a Thing Registry service, publishing itself as a Jabber Server Component, does so from outside of the network. Instead,
|
||||||
|
the Thing Registry should be installed on the same server or on a server in the same local area network, so that the Jabber Component protocol port is closed to the
|
||||||
|
Internet.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Since it is not guaranteed that an XMPP Server operator allows installation of third party products (such as a Thing Registry), the option to host a Thing Registry using
|
||||||
|
a normal JID is still available. It can be used in proof of concepts, etc. For scalability issues it is recommended that the Thing Registry be hosted as a Jabber Server
|
||||||
|
Component when the population of Things grows.
|
||||||
|
</p>
|
||||||
|
</section2>
|
||||||
<section2 topic='Hijacking predefined JIDs'>
|
<section2 topic='Hijacking predefined JIDs'>
|
||||||
<p>
|
<p>
|
||||||
If using predefined user names when searching for a Thing Registry or Provisioning Server, care must be taken to which XMPP Server things connect.
|
If using predefined user names when searching for a Thing Registry or Provisioning Server, care must be taken to which XMPP Server things connect.
|
||||||
@ -1621,14 +1718,6 @@
|
|||||||
sure the things cannot be hijacked.
|
sure the things cannot be hijacked.
|
||||||
</p>
|
</p>
|
||||||
</section2>
|
</section2>
|
||||||
<section2 topic='Hijacking nicknames'>
|
|
||||||
<p>
|
|
||||||
If searching for accounts with predefined nick names when searching for a Thing Registry or Provisioning Server, care must be taken to which XMPP Server things connect.
|
|
||||||
It might be possible for third parties to register accounts with similar nicknames and pretend to be a Thing Registry or Provisioning Server and in this way hijack unsuspecting Things.
|
|
||||||
If installing things using this method of finding a Thing Registry or Provisioning Server, care must be taken so that undesired third parties are not allowed to create accounts
|
|
||||||
on the server.
|
|
||||||
</p>
|
|
||||||
</section2>
|
|
||||||
<section2 topic='Hijacking things in public areas'>
|
<section2 topic='Hijacking things in public areas'>
|
||||||
<p>
|
<p>
|
||||||
The combination of visible key meta information (perhaps in a visible QR-code) and a factory default reset button on a Thing, opens up the possibility to hijack the Thing.
|
The combination of visible key meta information (perhaps in a visible QR-code) and a factory default reset button on a Thing, opens up the possibility to hijack the Thing.
|
||||||
@ -1894,7 +1983,7 @@
|
|||||||
</section1>
|
</section1>
|
||||||
<section1 topic='Acknowledgements' anchor='ack'>
|
<section1 topic='Acknowledgements' anchor='ack'>
|
||||||
<p>
|
<p>
|
||||||
Thanks to Henrik Svedlund, Ivan Vučica, Joachim Lindborg, Joakim Eriksson, Joakim Ramberg, Johannes Hund, Karin Forsell, Kevin Smith, Lars Åkerskog, Olof Zandrén,
|
Thanks to Henrik Svedlund, Ivan Vučica, Joachim Lindborg, Joakim Eriksson, Joakim Ramberg, Johannes Hund, Karin Forsell, Kevin Smith, Lance Stout, Lars Åkerskog, Olof Zandrén,
|
||||||
Philipp Hancke, Steffen Larsen, Teemu Väisänen and Yusuke Doi for all valuable feedback.
|
Philipp Hancke, Steffen Larsen, Teemu Väisänen and Yusuke Doi for all valuable feedback.
|
||||||
</p>
|
</p>
|
||||||
</section1>
|
</section1>
|
||||||
|
Loading…
Reference in New Issue
Block a user