This commit is contained in:
E 2021-03-07 19:17:05 -07:00
commit d08a6e77f4
9 changed files with 347 additions and 3 deletions

1
client/build/index.html Normal file
View File

@ -0,0 +1 @@
hello world

105
server/.gitignore vendored Normal file
View 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
View 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
View 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
View 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
View 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
View 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
View 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',
]

View File

@ -1,3 +0,0 @@
import socket
import sys
import time