-
Notifications
You must be signed in to change notification settings - Fork 53
/
plasma-pull.py
executable file
·108 lines (91 loc) · 3.03 KB
/
plasma-pull.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
#!/usr/bin/env python
#
# Copyright 2018 SenX S.A.S.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
import getopt
import sys
import time
from ws4py.client.threadedclient import WebSocketClient
class PlasmaPullClient(WebSocketClient):
def __init__(self, scheme, protocols, subscriptions, refresh, sample):
WebSocketClient.__init__(self, scheme, protocols)
self._subscriptions = subscriptions
self._refresh = refresh
self._sample = sample
def opened(self):
#self.send('SAMPLE %f' % (self._sample))
for subscription in self._subscriptions:
print subscription[0],subscription[1]
self.send('SUBSCRIBE %s %s' % (subscription[0], subscription[1]))
time.sleep(0.01)
self.send('SUBSCRIPTIONS')
def closed(self, code, reason=None):
print "Closed down", code, reason
def received_message(self, m):
print m
def run_forever(self):
now = time.time()
while not self.terminated:
self._th.join(timeout=0.5)
if not self._refresh:
continue
if (time.time() - now) > self._refresh:
# We've reached the refresh period, re-issue the subscriptions
for subscription in self._subscriptions:
self.send('SUBSCRIBE %s %s' % (subscription[0], subscription[1]))
time.sleep(0.01)
now = time.time()
#
# Usage: python plasma-pull.py -u 'ws://127.0.0.1:8080/api/v0/plasma' -t 'READ' -s '~rgb.*{}'
#
def main():
try:
opts, args = getopt.getopt(sys.argv[1:], "t:u:s:r:S:", ['token=','url=','subscription=', 'refresh=', 'sample='])
except getopt.GetoptError as err:
print str(err)
sys.exit(-1)
subscriptions = []
token = None
url = None
refresh = None
sample = 1.0
for o,a in opts:
if o in ('-t', '--token'):
token = a
elif o in ('-u', '--url'):
url = a
elif o in ('-s', '--subscription'):
if None == token:
print '--token xxx MUST appear before the first occurrence of --subscription'
sys.exit(-1)
subscriptions.append((token, a))
elif o in ('-r', '--refresh'):
refresh = long(a)
elif o in ('-S', '--sample'):
sample = float(a)
if None == url:
print '--url xxx MUST be specified'
sys.exit(-1)
if [] == subscriptions:
print '--token xxx AND --subscription xxx MUST be specified'
sys.exit(-1)
try:
ws = PlasmaPullClient(url, protocols=['http-only', 'chat'], subscriptions=subscriptions, refresh=refresh, sample=sample)
ws.connect()
ws.run_forever()
except KeyboardInterrupt:
ws.close()
if __name__ == "__main__":
main()