Merge branch 'master' of https://git.tannercollin.com/tanner/3Dshock
This commit is contained in:
		
							
								
								
									
										1
									
								
								client/build/index.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								client/build/index.html
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | ||||
| hello world | ||||
							
								
								
									
										105
									
								
								server/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										105
									
								
								server/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,105 @@ | ||||
| # Byte-compiled / optimized / DLL files | ||||
| __pycache__/ | ||||
| *.py[cod] | ||||
| *$py.class | ||||
|  | ||||
| # C extensions | ||||
| *.so | ||||
|  | ||||
| # Distribution / packaging | ||||
| .Python | ||||
| build/ | ||||
| develop-eggs/ | ||||
| dist/ | ||||
| downloads/ | ||||
| eggs/ | ||||
| .eggs/ | ||||
| lib/ | ||||
| lib64/ | ||||
| parts/ | ||||
| sdist/ | ||||
| var/ | ||||
| wheels/ | ||||
| *.egg-info/ | ||||
| .installed.cfg | ||||
| *.egg | ||||
|  | ||||
| # PyInstaller | ||||
| #  Usually these files are written by a python script from a template | ||||
| #  before PyInstaller builds the exe, so as to inject date/other infos into it. | ||||
| *.manifest | ||||
| *.spec | ||||
|  | ||||
| # Installer logs | ||||
| pip-log.txt | ||||
| pip-delete-this-directory.txt | ||||
|  | ||||
| # Unit test / coverage reports | ||||
| htmlcov/ | ||||
| .tox/ | ||||
| .coverage | ||||
| .coverage.* | ||||
| .cache | ||||
| nosetests.xml | ||||
| coverage.xml | ||||
| *.cover | ||||
| .hypothesis/ | ||||
|  | ||||
| # Translations | ||||
| *.mo | ||||
| *.pot | ||||
|  | ||||
| # Django stuff: | ||||
| *.log | ||||
| local_settings.py | ||||
|  | ||||
| # Flask stuff: | ||||
| instance/ | ||||
| .webassets-cache | ||||
|  | ||||
| # Scrapy stuff: | ||||
| .scrapy | ||||
|  | ||||
| # Sphinx documentation | ||||
| docs/_build/ | ||||
|  | ||||
| # PyBuilder | ||||
| target/ | ||||
|  | ||||
| # Jupyter Notebook | ||||
| .ipynb_checkpoints | ||||
|  | ||||
| # pyenv | ||||
| .python-version | ||||
|  | ||||
| # celery beat schedule file | ||||
| celerybeat-schedule | ||||
|  | ||||
| # SageMath parsed files | ||||
| *.sage.py | ||||
|  | ||||
| # Environments | ||||
| .env | ||||
| .venv | ||||
| env/ | ||||
| venv/ | ||||
| ENV/ | ||||
|  | ||||
| # Spyder project settings | ||||
| .spyderproject | ||||
| .spyproject | ||||
|  | ||||
| # Rope project settings | ||||
| .ropeproject | ||||
|  | ||||
| # mkdocs documentation | ||||
| /site | ||||
|  | ||||
| # mypy | ||||
| .mypy_cache/ | ||||
|  | ||||
| # Editor | ||||
| *.swp | ||||
| *.swo | ||||
|  | ||||
| paramiko.log | ||||
							
								
								
									
										30
									
								
								server/capture.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								server/capture.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,30 @@ | ||||
| import socket | ||||
| import sys | ||||
| import time | ||||
|  | ||||
| # make sure multicast is being routed to the right interface ie. | ||||
| # sudo route add -net 224.0.0.0 netmask 240.0.0.0 dev enx00249b649e67 | ||||
|  | ||||
| def trigger_capture(): | ||||
|     charid = 1 | ||||
|     unitid = 1 | ||||
|     groupid = 1 | ||||
|  | ||||
|     gtdate = time.gmtime() | ||||
|     now = str(gtdate.tm_year) + str(gtdate.tm_mon) + str(gtdate.tm_mday) + str(gtdate.tm_hour) + str(gtdate.tm_min) + str(gtdate.tm_sec) | ||||
|  | ||||
|     SDATA = str(now) | ||||
|  | ||||
|     print('Sending: ' + SDATA) | ||||
|     MCAST_GRP = '224.1.1.1' | ||||
|     MCAST_PORT = 5007 | ||||
|     SCMD = chr(charid) | ||||
|     SUNIT = chr(unitid) | ||||
|     SGROUP = chr(groupid) | ||||
|     SEND = SCMD+SUNIT+SGROUP+SDATA | ||||
|     sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP) | ||||
|     dev = 'eth0' + '\0' | ||||
|     sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2) | ||||
|     sock.sendto(SEND.encode('utf-8'), (MCAST_GRP, MCAST_PORT)) | ||||
|     sock.close() | ||||
|     print('Sent.') | ||||
							
								
								
									
										42
									
								
								server/download.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								server/download.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,42 @@ | ||||
| import os | ||||
| import settings | ||||
| import threading | ||||
| import paramiko | ||||
| import time | ||||
| paramiko.util.log_to_file('paramiko.log') | ||||
|  | ||||
| def download(ip, dest): | ||||
|     print('Downloading from', ip) | ||||
|  | ||||
|     port = 22 | ||||
|     transport = paramiko.Transport((ip, port)) | ||||
|     transport.connect(None, settings.RASPBERRY_USER, settings.RASPBERRY_PASS) | ||||
|  | ||||
|     sftp = paramiko.SFTPClient.from_transport(transport) | ||||
|  | ||||
|     files = sftp.listdir('/3dscan/') | ||||
|  | ||||
|     for f in files: | ||||
|         source_file = '/3dscan/' + f | ||||
|         dest_file = dest + f | ||||
|         print('Grabbing file', source_file) | ||||
|         sftp.get(source_file, dest_file) | ||||
|         sftp.remove(source_file) | ||||
|  | ||||
|     if sftp: sftp.close() | ||||
|     if transport: transport.close() | ||||
|  | ||||
|     print('Finished downloading from', ip) | ||||
|  | ||||
| def download_all_photos(dest): | ||||
|     if not dest.endswith('/'): | ||||
|         raise Exception('Destination must end with /') | ||||
|  | ||||
|     if not os.path.exists(dest): | ||||
|         raise Exception('Destination does not exist') | ||||
|  | ||||
|     print('Downloading all photos to', dest) | ||||
|  | ||||
|     for ip in settings.RASPBERRY_IPS: | ||||
|         t = threading.Thread(target=download, args=(ip, dest)) | ||||
|         t.start() | ||||
							
								
								
									
										12
									
								
								server/main.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								server/main.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,12 @@ | ||||
| from flask import Flask | ||||
| from flask_cors import CORS | ||||
|  | ||||
| build_folder = '../client/build' | ||||
| app = Flask(__name__, static_folder=build_folder, static_url_path='') | ||||
| CORS(app) | ||||
|  | ||||
| @app.route('/') | ||||
| def index(): | ||||
|     return app.send_static_file('index.html') | ||||
|  | ||||
| app.run() | ||||
							
								
								
									
										51
									
								
								server/power.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								server/power.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,51 @@ | ||||
| import requests | ||||
| import settings | ||||
| import time | ||||
|  | ||||
| def np_02B_api(ip, username, password, is_on): | ||||
|     if is_on: | ||||
|         endpoint = '/cmd.cgi?grp=0' | ||||
|     else: | ||||
|         endpoint = '/cmd.cgi?grp=30' | ||||
|  | ||||
|     url = 'http://' + ip + endpoint | ||||
|     r = requests.get(url, auth=(username, password), timeout=4) | ||||
|     r.raise_for_status() | ||||
|  | ||||
| def lights_on(): | ||||
|     np_02B_api(settings.LIGHT_IP, settings.LIGHT_USER, settings.LIGHT_PASS, True) | ||||
|  | ||||
| def lights_off(): | ||||
|     np_02B_api(settings.LIGHT_IP, settings.LIGHT_USER, settings.LIGHT_PASS, False) | ||||
|  | ||||
| def grid_on(): | ||||
|     np_02B_api(settings.GRID_IP, settings.GRID_USER, settings.GRID_PASS, True) | ||||
|  | ||||
| def grid_off(): | ||||
|     np_02B_api(settings.GRID_IP, settings.GRID_USER, settings.GRID_PASS, False) | ||||
|  | ||||
|  | ||||
| if __name__ == '__main__': | ||||
|     try: | ||||
|         print('Turning lights on...') | ||||
|         lights_on() | ||||
|  | ||||
|         print('Waiting three seconds...') | ||||
|         time.sleep(3) | ||||
|  | ||||
|         print('Turning lights off...') | ||||
|         lights_off() | ||||
|     except BaseException as e: | ||||
|         print('Problem with lights: {} - {}'.format(e.__class__.__name__, str(e))) | ||||
|  | ||||
|     try: | ||||
|         print('Turning grid on...') | ||||
|         grid_on() | ||||
|  | ||||
|         print('Waiting three seconds...') | ||||
|         time.sleep(3) | ||||
|  | ||||
|         print('Turning grid off...') | ||||
|         grid_off() | ||||
|     except BaseException as e: | ||||
|         print('Problem with grid: {} - {}'.format(e.__class__.__name__, str(e))) | ||||
							
								
								
									
										5
									
								
								server/requirements.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								server/requirements.txt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,5 @@ | ||||
| certifi==2020.12.5 | ||||
| chardet==4.0.0 | ||||
| idna==2.10 | ||||
| requests==2.25.1 | ||||
| urllib3==1.26.3 | ||||
							
								
								
									
										101
									
								
								server/settings.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										101
									
								
								server/settings.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,101 @@ | ||||
| LIGHT_IP = '192.168.99.25' | ||||
| LIGHT_USER = 'admin' | ||||
| LIGHT_PASS = 'admin' | ||||
|  | ||||
| GRID_IP = '192.168.99.20' | ||||
| GRID_USER = 'admin' | ||||
| GRID_PASS = 'admin' | ||||
|  | ||||
| RASPBERRY_USER = 'root' | ||||
| RASPBERRY_PASS = '3dscan' | ||||
| RASPBERRY_IPS = [ | ||||
|     '192.168.99.101', | ||||
|     '192.168.99.103', | ||||
|     '192.168.99.104', | ||||
|     '192.168.99.105', | ||||
|     '192.168.99.106', | ||||
|     '192.168.99.107', | ||||
|     '192.168.99.108', | ||||
|     '192.168.99.109', | ||||
|     '192.168.99.110', | ||||
|     '192.168.99.111', | ||||
|     '192.168.99.112', | ||||
|     '192.168.99.113', | ||||
|     '192.168.99.114', | ||||
|     '192.168.99.115', | ||||
|     '192.168.99.116', | ||||
|     '192.168.99.117', | ||||
|     '192.168.99.118', | ||||
|     '192.168.99.119', | ||||
|     '192.168.99.120', | ||||
|     '192.168.99.121', | ||||
|     '192.168.99.122', | ||||
|     '192.168.99.123', | ||||
|     '192.168.99.124', | ||||
|     '192.168.99.125', | ||||
|     '192.168.99.126', | ||||
|     '192.168.99.127', | ||||
|     '192.168.99.128', | ||||
|     '192.168.99.129', | ||||
|     '192.168.99.130', | ||||
|     '192.168.99.131', | ||||
|     '192.168.99.132', | ||||
|     '192.168.99.133', | ||||
|     '192.168.99.134', | ||||
|     '192.168.99.135', | ||||
|     '192.168.99.136', | ||||
|     '192.168.99.137', | ||||
|     '192.168.99.138', | ||||
|     '192.168.99.139', | ||||
|     '192.168.99.140', | ||||
|     '192.168.99.141', | ||||
|     '192.168.99.142', | ||||
|     '192.168.99.143', | ||||
|     '192.168.99.144', | ||||
|     '192.168.99.145', | ||||
|     '192.168.99.146', | ||||
|     '192.168.99.147', | ||||
|     '192.168.99.148', | ||||
|     '192.168.99.149', | ||||
|     '192.168.99.150', | ||||
|     '192.168.99.151', | ||||
|     '192.168.99.152', | ||||
|     '192.168.99.153', | ||||
|     '192.168.99.154', | ||||
|     '192.168.99.155', | ||||
|     '192.168.99.156', | ||||
|     '192.168.99.157', | ||||
|     '192.168.99.158', | ||||
|     '192.168.99.159', | ||||
|     '192.168.99.160', | ||||
|     '192.168.99.161', | ||||
|     '192.168.99.162', | ||||
|     '192.168.99.163', | ||||
|     '192.168.99.164', | ||||
|     '192.168.99.165', | ||||
|     '192.168.99.166', | ||||
|     '192.168.99.167', | ||||
|     '192.168.99.168', | ||||
|     '192.168.99.169', | ||||
|     '192.168.99.170', | ||||
|     '192.168.99.171', | ||||
|     '192.168.99.172', | ||||
|     '192.168.99.173', | ||||
|     '192.168.99.174', | ||||
|     '192.168.99.175', | ||||
|     '192.168.99.176', | ||||
|     '192.168.99.177', | ||||
|     '192.168.99.178', | ||||
|     '192.168.99.179', | ||||
|     '192.168.99.180', | ||||
|     '192.168.99.181', | ||||
|     '192.168.99.182', | ||||
|     '192.168.99.183', | ||||
|     '192.168.99.184', | ||||
|     '192.168.99.185', | ||||
|     '192.168.99.191', | ||||
|     '192.168.99.192', | ||||
|     '192.168.99.193', | ||||
|     '192.168.99.194', | ||||
|     '192.168.99.195', | ||||
| ] | ||||
| @@ -1,3 +0,0 @@ | ||||
| import socket | ||||
| import sys | ||||
| import time | ||||
		Reference in New Issue
	
	Block a user