Skip to content

Commit e90b799

Browse files
committed
Adde tut 9
1 parent 25ddc8d commit e90b799

File tree

3 files changed

+47
-34
lines changed

3 files changed

+47
-34
lines changed

README.md

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -14,21 +14,17 @@ Later we will get onto more complicated topics such as reaching a consensus of w
1414

1515
Questions comments and suggestions can be raised the specific blog post or by using issues here.
1616

17-
## Tutorial 8 - Slave Helper Functions
17+
## Tutorial 9 - Multi Slave Master
1818

19-
This tutorial focuses on creating a number of slave helper functions
20-
to begin the process of fully automating the slaves.
21-
22-
A few simple commands such as shutting down a node and rebooting
23-
it along with updating the operating system are added ready for
24-
implementation.
19+
This tutorial focuses on changing the master so that it accepts
20+
multiple slaves connecting to it.
2521

26-
The next tutorial will focus on converting the master script
27-
to accept any number of slave nodes.
22+
Currently there is no error handling for nodes connecting and disconnecting.
23+
The next tutorial will focus on hardening the master and slaves connection/disconnection code.
2824

2925
The full details for
30-
[Tutorial 08 - Slave Helper Functions is available on my blog](
31-
https://chewett.co.uk/blog/1839/raspberry-pi-cluster-node-08-slave-helper-functions/
26+
[Tutorial 09 - Multi Slave Master is available on my blog](
27+
https://chewett.co.uk/blog/1872/raspberry-pi-cluster-node-09-multi-slave-master/
3228
)
3329

3430
## Requirements

RpiCluster/RpiClusterClient.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import json
2+
import threading
3+
from DataPackager import get_message, create_payload
4+
from MachineInfo import get_base_machine_info
5+
from MainLogger import logger
6+
7+
8+
class RpiClusterClient(threading.Thread):
9+
10+
def __init__(self, clientsocket, address):
11+
threading.Thread.__init__(self)
12+
self.clientsocket = clientsocket
13+
self.address = address
14+
15+
def run(self):
16+
message = True
17+
while message:
18+
message = get_message(self.clientsocket)
19+
if message:
20+
if message['type'] == 'message':
21+
logger.info("Received message: " + message['payload'])
22+
elif message['type'] == 'computer_details':
23+
logger.info("Computer specifications: " + json.dumps(message['payload']))
24+
elif message['type'] == 'info':
25+
logger.info("Slave wants to know my info about " + message['payload'])
26+
if message['payload'] == 'computer_details':
27+
self.clientsocket.send(create_payload(get_base_machine_info(), "master_info"))
28+
else:
29+
self.clientsocket.send(create_payload("unknown", "bad_message"))
30+
31+
else:
32+
logger.info("Client disconnected at address {addr}".format(addr=self.address))
33+

basic_master.py

Lines changed: 7 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,8 @@
22

33
import socket
44
import ConfigParser
5-
import json
65
from RpiCluster.MainLogger import add_file_logger, logger
7-
from RpiCluster.DataPackager import get_message, create_payload
8-
from RpiCluster.MachineInfo import get_base_machine_info
6+
from RpiCluster.RpiClusterClient import RpiClusterClient
97

108
config = ConfigParser.ConfigParser()
119
config.read('rpicluster.cfg')
@@ -18,25 +16,11 @@
1816

1917
socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
2018
socket.bind((socket_bind_ip, socket_port))
21-
socket.listen(1)
2219

23-
(clientsocket, address) = socket.accept()
24-
logger.info("Got client at {address}".format(address=address))
20+
socket.listen(10) #listen to 10 connects
21+
while True:
22+
(clientsocket, address) = socket.accept()
23+
logger.info("Got client at {address}".format(address=address))
2524

26-
message = True
27-
while message:
28-
message = get_message(clientsocket)
29-
if message:
30-
if message['type'] == 'message':
31-
logger.info("Received message: " + message['payload'])
32-
elif message['type'] == 'computer_details':
33-
logger.info("Computer specifications: " + json.dumps(message['payload']))
34-
elif message['type'] == 'info':
35-
logger.info("Slave wants to know my info about " + message['payload'])
36-
if message['payload'] == 'computer_details':
37-
clientsocket.send(create_payload(get_base_machine_info(), "master_info"))
38-
else:
39-
clientsocket.send(create_payload("unknown", "bad_message"))
40-
41-
else:
42-
logger.info("Client disconnected")
25+
rpiClient = RpiClusterClient(clientsocket, address)
26+
rpiClient.start()

0 commit comments

Comments
 (0)