diff options
Diffstat (limited to 'examples')
-rwxr-xr-x | examples/IoT_TestDevice.py | 203 | ||||
-rwxr-xr-x | examples/custom_stanzas/custom_stanza_provider.py | 2 | ||||
-rwxr-xr-x[-rw-r--r--] | examples/download_avatars.py | 0 | ||||
-rwxr-xr-x | examples/ibb_transfer/ibb_receiver.py | 10 | ||||
-rwxr-xr-x | examples/migrate_roster.py | 120 | ||||
-rwxr-xr-x | examples/ping.py | 24 | ||||
-rwxr-xr-x[-rw-r--r--] | examples/pubsub_client.py | 7 | ||||
-rwxr-xr-x[-rw-r--r--] | examples/pubsub_events.py | 5 | ||||
-rwxr-xr-x[-rw-r--r--] | examples/register_account.py | 8 | ||||
-rwxr-xr-x[-rw-r--r--] | examples/roster_browser.py | 2 | ||||
-rwxr-xr-x[-rw-r--r--] | examples/rpc_async.py | 29 | ||||
-rwxr-xr-x[-rw-r--r--] | examples/rpc_client_side.py | 29 | ||||
-rwxr-xr-x[-rw-r--r--] | examples/rpc_server_side.py | 31 | ||||
-rwxr-xr-x[-rw-r--r--] | examples/set_avatar.py | 2 | ||||
-rwxr-xr-x[-rw-r--r--] | examples/thirdparty_auth.py | 0 | ||||
-rwxr-xr-x[-rw-r--r--] | examples/user_location.py | 0 | ||||
-rwxr-xr-x[-rw-r--r--] | examples/user_tune.py | 0 |
17 files changed, 407 insertions, 65 deletions
diff --git a/examples/IoT_TestDevice.py b/examples/IoT_TestDevice.py new file mode 100755 index 00000000..cd80cee2 --- /dev/null +++ b/examples/IoT_TestDevice.py @@ -0,0 +1,203 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +""" + SleekXMPP: The Sleek XMPP Library + Implementation of xeps for Internet of Things + http://wiki.xmpp.org/web/Tech_pages/IoT_systems + Copyright (C) 2013 Sustainable Innovation, Joachim.lindborg@sust.se + This file is part of SleekXMPP. + + See the file LICENSE for copying permission. +""" + +import os +import sys +# This can be used when you are in a test environment and need to make paths right +sys.path=['/Users/jocke/Dropbox/06_dev/SleekXMPP']+sys.path + +import logging +import unittest +import distutils.core +import datetime + +from glob import glob +from os.path import splitext, basename, join as pjoin +from optparse import OptionParser +from urllib import urlopen + +import sleekxmpp +# Python versions before 3.0 do not use UTF-8 encoding +# by default. To ensure that Unicode is handled properly +# throughout SleekXMPP, we will set the default encoding +# ourselves to UTF-8. +if sys.version_info < (3, 0): + from sleekxmpp.util.misc_ops import setdefaultencoding + setdefaultencoding('utf8') +else: + raw_input = input + +from sleekxmpp.plugins.xep_0323.device import Device + +#from sleekxmpp.exceptions import IqError, IqTimeout + +class IoT_TestDevice(sleekxmpp.ClientXMPP): + + """ + A simple IoT device that can act as server or client + """ + def __init__(self, jid, password): + sleekxmpp.ClientXMPP.__init__(self, jid, password) + self.add_event_handler("session_start", self.session_start) + self.add_event_handler("message", self.message) + self.device=None + self.releaseMe=False + self.beServer=True + self.clientJID=None + + def datacallback(self,from_jid,result,nodeId=None,timestamp=None,fields=None,error_msg=None): + """ + This method will be called when you ask another IoT device for data with the xep_0323 + se script below for the registration of the callback + """ + logging.debug("we got data %s from %s",str(result),from_jid) + + def beClientOrServer(self,server=True,clientJID=None ): + if server: + self.beServer=True + self.clientJID=None + else: + self.beServer=False + self.clientJID=clientJID + + def testForRelease(self): + # todo thread safe + return self.releaseMe + + def doReleaseMe(self): + # todo thread safe + self.releaseMe=True + + def addDevice(self, device): + self.device=device + + def session_start(self, event): + self.send_presence() + self.get_roster() + # tell your preffered friend that you are alive + self.send_message(mto='jocke@jabber.sust.se', mbody=self.boundjid.bare +' is now online use xep_323 stanza to talk to me') + + if not(self.beServer): + session=self['xep_0323'].request_data(self.boundjid.full,self.clientJID,self.datacallback) + + def message(self, msg): + if msg['type'] in ('chat', 'normal'): + logging.debug("got normal chat message" + str(msg)) + ip=urlopen('http://icanhazip.com').read() + msg.reply("Hi I am " + self.boundjid.full + " and I am on IP " + ip).send() + else: + logging.debug("got unknown message type %s", str(msg['type'])) + +class TheDevice(Device): + """ + This is the actual device object that you will use to get information from your real hardware + You will be called in the refresh method when someone is requesting information from you + """ + def __init__(self,nodeId): + Device.__init__(self,nodeId) + self.counter=0 + + def refresh(self,fields): + """ + the implementation of the refresh method + """ + self._set_momentary_timestamp(self._get_timestamp()) + self.counter+=self.counter + self._add_field_momentary_data(self, "Temperature", self.counter) + +if __name__ == '__main__': + + # Setup the command line arguments. + # + # This script can act both as + # "server" an IoT device that can provide sensorinformation + # python IoT_TestDevice.py -j "serverjid@yourdomain.com" -p "password" -n "TestIoT" --debug + # + # "client" an IoT device or other party that would like to get data from another device + + optp = OptionParser() + + # Output verbosity options. + optp.add_option('-q', '--quiet', help='set logging to ERROR', + action='store_const', dest='loglevel', + const=logging.ERROR, default=logging.INFO) + optp.add_option('-d', '--debug', help='set logging to DEBUG', + action='store_const', dest='loglevel', + const=logging.DEBUG, default=logging.INFO) + optp.add_option('-v', '--verbose', help='set logging to COMM', + action='store_const', dest='loglevel', + const=5, default=logging.INFO) + optp.add_option('-t', '--pingto', help='set jid to ping', + action='store', type='string', dest='pingjid', + default=None) + + # JID and password options. + optp.add_option("-j", "--jid", dest="jid", + help="JID to use") + optp.add_option("-p", "--password", dest="password", + help="password to use") + + # IoT test + optp.add_option("-c", "--sensorjid", dest="sensorjid", + help="Another device to call for data on", default=None) + optp.add_option("-n", "--nodeid", dest="nodeid", + help="I am a device get ready to be called", default=None) + + opts, args = optp.parse_args() + + # Setup logging. + logging.basicConfig(level=opts.loglevel, + format='%(levelname)-8s %(message)s') + + if opts.jid is None: + opts.jid = raw_input("Username: ") + if opts.password is None: + opts.password = getpass.getpass("Password: ") + + + xmpp = IoT_TestDevice(opts.jid,opts.password) + xmpp.register_plugin('xep_0030') + #xmpp['xep_0030'].add_feature(feature='urn:xmpp:iot:sensordata', + # node=None, + # jid=None) + xmpp.register_plugin('xep_0323') + xmpp.register_plugin('xep_0325') + + if opts.nodeid: + + # xmpp['xep_0030'].add_feature(feature='urn:xmpp:sn', + # node=opts.nodeid, + # jid=xmpp.boundjid.full) + + myDevice = TheDevice(opts.nodeid) + # myDevice._add_field(name="Relay", typename="numeric", unit="Bool"); + myDevice._add_field(name="Temperature", typename="numeric", unit="C") + myDevice._set_momentary_timestamp("2013-03-07T16:24:30") + myDevice._add_field_momentary_data("Temperature", "23.4", flags={"automaticReadout": "true"}) + + xmpp['xep_0323'].register_node(nodeId=opts.nodeid, device=myDevice, commTimeout=10) + xmpp.beClientOrServer(server=True) + while not(xmpp.testForRelease()): + xmpp.connect() + xmpp.process(block=True) + logging.debug("lost connection") + if opts.sensorjid: + logging.debug("will try to call another device for data") + xmpp.beClientOrServer(server=False,clientJID=opts.sensorjid) + xmpp.connect() + xmpp.process(block=True) + logging.debug("ready ending") + + else: + print "noopp didn't happen" + diff --git a/examples/custom_stanzas/custom_stanza_provider.py b/examples/custom_stanzas/custom_stanza_provider.py index b0e00247..0ebdb77e 100755 --- a/examples/custom_stanzas/custom_stanza_provider.py +++ b/examples/custom_stanzas/custom_stanza_provider.py @@ -51,7 +51,7 @@ class ActionBot(sleekxmpp.ClientXMPP): # our roster. self.add_event_handler("session_start", self.start) - self.registerHandler( + self.register_handler( Callback('Some custom iq', StanzaPath('iq@type=set/action'), self._handle_action)) diff --git a/examples/download_avatars.py b/examples/download_avatars.py index 64300cff..64300cff 100644..100755 --- a/examples/download_avatars.py +++ b/examples/download_avatars.py diff --git a/examples/ibb_transfer/ibb_receiver.py b/examples/ibb_transfer/ibb_receiver.py index 0169d63d..6aba98e3 100755 --- a/examples/ibb_transfer/ibb_receiver.py +++ b/examples/ibb_transfer/ibb_receiver.py @@ -38,7 +38,7 @@ class IBBReceiver(sleekxmpp.ClientXMPP): self.register_plugin('xep_0030') # Service Discovery self.register_plugin('xep_0047', { - 'accept_stream': self.accept_stream + 'auto_accept': True }) # In-band Bytestreams # The session_start event will be triggered when @@ -48,7 +48,7 @@ class IBBReceiver(sleekxmpp.ClientXMPP): # our roster. self.add_event_handler("session_start", self.start) - self.add_event_handler("ibb_stream_start", self.stream_opened) + self.add_event_handler("ibb_stream_start", self.stream_opened, threaded=True) self.add_event_handler("ibb_stream_data", self.stream_data) def start(self, event): @@ -69,7 +69,7 @@ class IBBReceiver(sleekxmpp.ClientXMPP): def accept_stream(self, iq): """ - Check that it is ok to accept a stream request. + Check that it is ok to accept a stream request. Controlling stream acceptance can be done via either: - setting 'auto_accept' to False in the plugin @@ -83,9 +83,7 @@ class IBBReceiver(sleekxmpp.ClientXMPP): return True def stream_opened(self, stream): - # NOTE: IBB streams are bi-directional, so the original sender is - # now the opened stream's receiver. - print('Stream opened: %s from %s' % (stream.sid, stream.receiver)) + print('Stream opened: %s from %s' % (stream.sid, stream.peer_jid)) # You could run a loop reading from the stream using stream.recv(), # or use the ibb_stream_data event. diff --git a/examples/migrate_roster.py b/examples/migrate_roster.py new file mode 100755 index 00000000..797e4f44 --- /dev/null +++ b/examples/migrate_roster.py @@ -0,0 +1,120 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import sys +import logging +import getpass +from optparse import OptionParser + +import sleekxmpp + +# Python versions before 3.0 do not use UTF-8 encoding +# by default. To ensure that Unicode is handled properly +# throughout SleekXMPP, we will set the default encoding +# ourselves to UTF-8. +if sys.version_info < (3, 0): + from sleekxmpp.util.misc_ops import setdefaultencoding + setdefaultencoding('utf8') +else: + raw_input = input + + +# Setup the command line arguments. +optp = OptionParser() + +# Output verbosity options. +optp.add_option('-q', '--quiet', help='set logging to ERROR', + action='store_const', dest='loglevel', + const=logging.ERROR, default=logging.INFO) +optp.add_option('-d', '--debug', help='set logging to DEBUG', + action='store_const', dest='loglevel', + const=logging.DEBUG, default=logging.INFO) +optp.add_option('-v', '--verbose', help='set logging to COMM', + action='store_const', dest='loglevel', + const=5, default=logging.INFO) + +# JID and password options. +optp.add_option("--oldjid", dest="old_jid", + help="JID of the old account") +optp.add_option("--oldpassword", dest="old_password", + help="password of the old account") + +optp.add_option("--newjid", dest="new_jid", + help="JID of the old account") +optp.add_option("--newpassword", dest="new_password", + help="password of the old account") + + +opts, args = optp.parse_args() + +# Setup logging. +logging.basicConfig(level=opts.loglevel, + format='%(levelname)-8s %(message)s') + +if opts.old_jid is None: + opts.old_jid = raw_input("Old JID: ") +if opts.old_password is None: + opts.old_password = getpass.getpass("Old Password: ") + +if opts.new_jid is None: + opts.new_jid = raw_input("New JID: ") +if opts.new_password is None: + opts.new_password = getpass.getpass("New Password: ") + + +old_xmpp = sleekxmpp.ClientXMPP(opts.old_jid, opts.old_password) + +# If you are connecting to Facebook and wish to use the +# X-FACEBOOK-PLATFORM authentication mechanism, you will need +# your API key and an access token. Then you'll set: +# xmpp.credentials['api_key'] = 'THE_API_KEY' +# xmpp.credentials['access_token'] = 'THE_ACCESS_TOKEN' + +# If you are connecting to MSN, then you will need an +# access token, and it does not matter what JID you +# specify other than that the domain is 'messenger.live.com', +# so '_@messenger.live.com' will work. You can specify +# the access token as so: +# xmpp.credentials['access_token'] = 'THE_ACCESS_TOKEN' + +# If you are working with an OpenFire server, you may need +# to adjust the SSL version used: +# xmpp.ssl_version = ssl.PROTOCOL_SSLv3 + +# If you want to verify the SSL certificates offered by a server: +# xmpp.ca_certs = "path/to/ca/cert" + +roster = [] + +def on_session(event): + roster.append(old_xmpp.get_roster()) + old_xmpp.disconnect() +old_xmpp.add_event_handler('session_start', on_session) + +if old_xmpp.connect(): + old_xmpp.process(block=True) + +if not roster: + print('No roster to migrate') + sys.exit() + +new_xmpp = sleekxmpp.ClientXMPP(opts.new_jid, opts.new_password) +def on_session2(event): + new_xmpp.get_roster() + new_xmpp.send_presence() + + logging.info(roster[0]) + data = roster[0]['roster']['items'] + logging.info(data) + + for jid, item in data.items(): + if item['subscription'] != 'none': + new_xmpp.send_presence(ptype='subscribe', pto=jid) + new_xmpp.update_roster(jid, + name = item['name'], + groups = item['groups']) + new_xmpp.disconnect() +new_xmpp.add_event_handler('session_start', on_session2) + +if new_xmpp.connect(): + new_xmpp.process(block=True) diff --git a/examples/ping.py b/examples/ping.py index 0e53b1dd..1a1c2e94 100755 --- a/examples/ping.py +++ b/examples/ping.py @@ -37,7 +37,7 @@ class PingTest(sleekxmpp.ClientXMPP): def __init__(self, jid, password, pingjid): sleekxmpp.ClientXMPP.__init__(self, jid, password) if pingjid is None: - pingjid = self.jid + pingjid = self.boundjid.bare self.pingjid = pingjid # The session_start event will be triggered when @@ -62,16 +62,18 @@ class PingTest(sleekxmpp.ClientXMPP): """ self.send_presence() self.get_roster() - result = self['xep_0199'].send_ping(self.pingjid, - timeout=10, - errorfalse=True) - logging.info("Pinging...") - if result is False: - logging.info("Couldn't ping.") - self.disconnect() - sys.exit(1) - else: - logging.info("Success! RTT: %s", str(result)) + + try: + rtt = self['xep_0199'].ping(self.pingjid, + timeout=10) + logging.info("Success! RTT: %s", rtt) + except IqError as e: + logging.info("Error pinging %s: %s", + self.pingjid, + e.iq['error']['condition']) + except IqTimeout: + logging.info("No response from %s", self.pingjid) + finally: self.disconnect() diff --git a/examples/pubsub_client.py b/examples/pubsub_client.py index 2fa419fb..9a65553b 100644..100755 --- a/examples/pubsub_client.py +++ b/examples/pubsub_client.py @@ -1,3 +1,6 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + import sys import logging import getpass @@ -20,7 +23,7 @@ else: class PubsubClient(sleekxmpp.ClientXMPP): - def __init__(self, jid, password, server, + def __init__(self, jid, password, server, node=None, action='list', data=''): super(PubsubClient, self).__init__(jid, password) @@ -28,7 +31,7 @@ class PubsubClient(sleekxmpp.ClientXMPP): self.register_plugin('xep_0059') self.register_plugin('xep_0060') - self.actions = ['nodes', 'create', 'delete', + self.actions = ['nodes', 'create', 'delete', 'publish', 'get', 'retract', 'purge', 'subscribe', 'unsubscribe'] diff --git a/examples/pubsub_events.py b/examples/pubsub_events.py index 0dfb6c65..12c33a76 100644..100755 --- a/examples/pubsub_events.py +++ b/examples/pubsub_events.py @@ -1,3 +1,6 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + import sys import logging import getpass @@ -77,7 +80,7 @@ class PubsubEvents(sleekxmpp.ClientXMPP): """Handle receiving a node deletion event.""" print('Deleted node %s' % ( msg['pubsub_event']['delete']['node'])) - + def _config(self, msg): """Handle receiving a node configuration event.""" print('Configured node %s:' % ( diff --git a/examples/register_account.py b/examples/register_account.py index bd9b1160..422e5602 100644..100755 --- a/examples/register_account.py +++ b/examples/register_account.py @@ -51,7 +51,7 @@ class RegisterBot(sleekxmpp.ClientXMPP): # The register event provides an Iq result stanza with # a registration form from the server. This may include - # the basic registration fields, a data form, an + # the basic registration fields, a data form, an # out-of-band URL, or any combination. For more advanced # cases, you will need to examine the fields provided # and respond accordingly. SleekXMPP provides plugins @@ -104,7 +104,7 @@ class RegisterBot(sleekxmpp.ClientXMPP): resp.send(now=True) logging.info("Account created for %s!" % self.boundjid) except IqError as e: - logging.error("Could not register account: %s" % + logging.error("Could not register account: %s" % e.iq['error']['text']) self.disconnect() except IqTimeout: @@ -153,6 +153,10 @@ if __name__ == '__main__': xmpp.register_plugin('xep_0066') # Out-of-band Data xmpp.register_plugin('xep_0077') # In-band Registration + # Some servers don't advertise support for inband registration, even + # though they allow it. If this applies to your server, use: + xmpp['xep_0077'].force_registration = True + # If you are working with an OpenFire server, you may need # to adjust the SSL version used: # xmpp.ssl_version = ssl.PROTOCOL_SSLv3 diff --git a/examples/roster_browser.py b/examples/roster_browser.py index 485ac941..a16de24c 100644..100755 --- a/examples/roster_browser.py +++ b/examples/roster_browser.py @@ -68,7 +68,7 @@ class RosterBrowser(sleekxmpp.ClientXMPP): try: self.get_roster() except IqError as err: - print('Error: %' % err.iq['error']['condition']) + print('Error: %s' % err.iq['error']['condition']) except IqTimeout: print('Error: Request timed out') self.send_presence() diff --git a/examples/rpc_async.py b/examples/rpc_async.py index 0b6d1936..e3e23b69 100644..100755 --- a/examples/rpc_async.py +++ b/examples/rpc_async.py @@ -1,3 +1,6 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + """ SleekXMPP: The Sleek XMPP Library Copyright (C) 2011 Dann Martens @@ -11,34 +14,34 @@ from sleekxmpp.plugins.xep_0009.remote import Endpoint, remote, Remote, \ import time class Boomerang(Endpoint): - + def FQN(self): return 'boomerang' - + @remote def throw(self): print "Duck!" - + def main(): session = Remote.new_session('kangaroo@xmpp.org/rpc', '*****') - session.new_handler(ANY_ALL, Boomerang) - + session.new_handler(ANY_ALL, Boomerang) + boomerang = session.new_proxy('kangaroo@xmpp.org/rpc', Boomerang) - + callback = Future() - + boomerang.async(callback).throw() - + time.sleep(10) - + session.close() - - - + + + if __name__ == '__main__': main() -
\ No newline at end of file + diff --git a/examples/rpc_client_side.py b/examples/rpc_client_side.py index 135d6237..e792fc94 100644..100755 --- a/examples/rpc_client_side.py +++ b/examples/rpc_client_side.py @@ -1,3 +1,6 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + """ SleekXMPP: The Sleek XMPP Library Copyright (C) 2011 Dann Martens @@ -12,18 +15,18 @@ import threading import time class Thermostat(Endpoint): - + def FQN(self): return 'thermostat' - + def __init__(self, initial_temperature): self._temperature = initial_temperature - self._event = threading.Event() - + self._event = threading.Event() + @remote def set_temperature(self, temperature): return NotImplemented - + @remote def get_temperature(self): return NotImplemented @@ -31,23 +34,23 @@ class Thermostat(Endpoint): @remote(False) def release(self): return NotImplemented - + def main(): session = Remote.new_session('operator@xmpp.org/rpc', '*****') - + thermostat = session.new_proxy('thermostat@xmpp.org/rpc', Thermostat) - + print("Current temperature is %s" % thermostat.get_temperature()) - + thermostat.set_temperature(20) - + time.sleep(10) - + session.close() - + if __name__ == '__main__': main() - + diff --git a/examples/rpc_server_side.py b/examples/rpc_server_side.py index d1a11c17..9e8b48d6 100644..100755 --- a/examples/rpc_server_side.py +++ b/examples/rpc_server_side.py @@ -1,3 +1,6 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + """ SleekXMPP: The Sleek XMPP Library Copyright (C) 2011 Dann Martens @@ -11,42 +14,42 @@ from sleekxmpp.plugins.xep_0009.remote import Endpoint, remote, Remote, \ import threading class Thermostat(Endpoint): - + def FQN(self): return 'thermostat' - + def __init__(self, initial_temperature): self._temperature = initial_temperature - self._event = threading.Event() - + self._event = threading.Event() + @remote def set_temperature(self, temperature): print("Setting temperature to %s" % temperature) self._temperature = temperature - + @remote def get_temperature(self): return self._temperature @remote(False) def release(self): - self._event.set() - + self._event.set() + def wait_for_release(self): - self._event.wait() - + self._event.wait() + def main(): session = Remote.new_session('sleek@xmpp.org/rpc', '*****') - + thermostat = session.new_handler(ANY_ALL, Thermostat, 18) - + thermostat.wait_for_release() - + session.close() - + if __name__ == '__main__': main() - + diff --git a/examples/set_avatar.py b/examples/set_avatar.py index cae93c99..08e0b664 100644..100755 --- a/examples/set_avatar.py +++ b/examples/set_avatar.py @@ -63,7 +63,7 @@ class AvatarSetter(sleekxmpp.ClientXMPP): avatar_file = None try: - avatar_file = open(os.path.expanduser(self.filepath)) + avatar_file = open(os.path.expanduser(self.filepath), 'rb') except IOError: print('Could not find file: %s' % self.filepath) return self.disconnect() diff --git a/examples/thirdparty_auth.py b/examples/thirdparty_auth.py index f4d5c400..f4d5c400 100644..100755 --- a/examples/thirdparty_auth.py +++ b/examples/thirdparty_auth.py diff --git a/examples/user_location.py b/examples/user_location.py index 2a64cada..2a64cada 100644..100755 --- a/examples/user_location.py +++ b/examples/user_location.py diff --git a/examples/user_tune.py b/examples/user_tune.py index 09e050f0..09e050f0 100644..100755 --- a/examples/user_tune.py +++ b/examples/user_tune.py |