source: remote_control/puzzlebox_brainstorms_server.py @ 48

Last change on this file since 48 was 48, checked in by sc, 11 years ago

client:

  • Switched to JSON from Pickle for message encodings
  • Fixed but with command line client not respecting custom server host/port settings

configuration.ini:

  • thinkgear server settings added

configuration.py

  • thinkgear server settings added

server:

  • Switched to JSON from Pickle for message encodings

client_thinkgear:

File size: 4.5 KB
Line 
1#!/usr/bin/env python
2# -*- coding: utf-8 -*-
3#
4# Puzzlebox - Brainstorms - Server
5#
6# Copyright Puzzlebox Productions, LLC (2010)
7#
8# This code is released under the GNU Pulic License (GPL) version 2
9# For more information please refer to http://www.gnu.org/copyleft/gpl.html
10#
11# Last Update: 2010.06.16
12#
13#####################################################################
14
15import os, signal, sys, time
16#import cPickle as pickle
17import simplejson as json
18
19from twisted.internet import reactor, protocol, defer
20
21import puzzlebox_brainstorms_configuration as configuration
22import puzzlebox_brainstorms_client
23import puzzlebox_brainstorms_remote_control as remote_control
24#import puzzlebox_logger
25
26#####################################################################
27# Globals
28#####################################################################
29
30DEBUG = 1
31
32DISCRETE_CONTROL_COMMANDS = configuration.DISCRETE_CONTROL_COMMANDS
33
34SERVER_INTERFACE = configuration.SERVER_INTERFACE
35SERVER_PORT = configuration.SERVER_PORT
36
37#####################################################################
38# Classes
39#####################################################################
40
41class puzzlebox_brainstorms_server(protocol.ServerFactory):
42       
43        def __init__(self, log, DEBUG=DEBUG):
44               
45                self.log = log
46                self.DEBUG = DEBUG
47               
48                self.protocol = puzzlebox_brainstorms_server_protocol
49       
50       
51        ##################################################################
52       
53        def process_command(self, command):
54               
55                d = defer.Deferred()
56               
57                response = '%s command received' % command
58               
59                if self.DEBUG:
60                        print '--> [Server] %s' % response
61               
62               
63                if DISCRETE_CONTROL_COMMANDS:
64                       
65                        self.execute_command(command)
66               
67               
68                if response:
69                        d.callback(response)
70               
71               
72                return d
73       
74       
75        ##################################################################
76       
77        def execute_command(self, command):
78               
79                #command_line = 'python puzzlebox_brainstorms_remote_control.py --command=%s' % command
80               
81                #os.system(command_line)
82               
83                rc = remote_control.puzzlebox_brainstorms_rc( \
84                        device=configuration.BLUETOOTH_DEVICE, \
85                        command=command, \
86                        DEBUG=DEBUG)
87               
88                if rc.connection != None:
89                        rc.run(rc.command)
90                        rc.stop()
91       
92       
93        ##################################################################
94       
95        def process_connection_lost(self, command):
96               
97                if not command:
98                       
99                        #self.log.debug("Connection lost with no command")
100                       
101                        if self.DEBUG:
102                                print "--> [Server] Connection lost with no command"
103               
104               
105                else:
106                       
107                        #self.log.debug("Connection lost")
108                       
109                        #if self.DEBUG:
110                                #print "--> [Server] Connection lost"
111                       
112                        pass
113
114
115#####################################################################
116# Protocol
117#####################################################################
118
119class puzzlebox_brainstorms_server_protocol(protocol.Protocol):
120       
121        def __init__(self):
122               
123                self.command = None
124                self.data_chunk = ""
125       
126       
127        ##################################################################
128       
129        def dataReceived(self, data):
130               
131                self.data_chunk += data
132               
133                try:
134                        #self.command = pickle.loads(self.data_chunk)
135                        self.command = json.loads(self.data_chunk)
136               
137                except Exception, e:
138                        self.factory.log.error("Partial data received (or error: %s)." % e)
139               
140                else:
141                        self.data_chunk = ""
142                       
143                        d = self.factory.process_command("%s" % self.command)
144                        d.addCallback(self.send_response)
145       
146       
147        ##################################################################
148       
149        def send_response(self, response):
150               
151                #response = pickle.dumps(response)
152                response = json.dumps(response)
153               
154                self.transport.write(response)
155       
156       
157        ##################################################################
158       
159        def connectionLost(self, reason):
160               
161                self.factory.process_connection_lost(self.command)
162
163
164#####################################################################
165# Main
166#####################################################################
167
168if __name__ == '__main__':
169       
170        #log = puzzlebox_logger.puzzlebox_logger(logfile='master_control')
171        log = None
172       
173        # Collect default settings and command line parameters
174        server_interface = SERVER_INTERFACE
175        server_port = SERVER_PORT
176       
177        for each in sys.argv:
178               
179                if each.startswith("--interface="):
180                        server_interface = each[ len("--interface="): ]
181                if each.startswith("--port="):
182                        server_port = each[ len("--port="): ]
183       
184       
185        server = puzzlebox_brainstorms_server(log, DEBUG=DEBUG)
186       
187        if DEBUG:
188                print "--> [Server] Initializing server on %s:%i" % \
189                        (server_interface, server_port)
190       
191        reactor.listenTCP(interface=server_interface, port=server_port, factory=server)
192       
193        reactor.run()
194
Note: See TracBrowser for help on using the repository browser.