23 jpeg->bitstream.link(script->inputs[
"jpeg"]);
29 from socketserver import ThreadingMixIn
30 from http.server import BaseHTTPRequestHandler, HTTPServer
34 def get_ip_address(ifname):
35 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
36 return socket.inet_ntoa(fcntl.ioctl(
38 -1071617759, # SIOCGIFADDR
39 struct.pack('256s', ifname[:15].encode())
42 class ThreadingSimpleServer(ThreadingMixIn, HTTPServer):
45 class HTTPHandler(BaseHTTPRequestHandler):
48 self.send_response(200)
50 self.wfile.write(b'<h1>[DepthAI] Hello, world!</h1><p>Click <a href="img">here</a> for an image</p>')
51 elif self.path == '/img':
53 self.send_response(200)
54 self.send_header('Content-type', 'multipart/x-mixed-replace; boundary=--jpgboundary')
57 timeCounter = time.time()
59 jpegImage = node.io['jpeg'].get()
60 self.wfile.write("--jpgboundary".encode())
61 self.wfile.write(bytes([13, 10]))
62 self.send_header('Content-type', 'image/jpeg')
63 self.send_header('Content-length', str(len(jpegImage.getData())))
65 self.wfile.write(jpegImage.getData())
68 fpsCounter = fpsCounter + 1
69 if time.time() - timeCounter > 1:
70 node.warn(f'FPS: {fpsCounter}')
72 timeCounter = time.time()
73 except Exception as ex:
76 with ThreadingSimpleServer(("", PORT), HTTPHandler) as httpd:
77 node.warn(f"Serving at {get_ip_address('re0')}:{PORT}")
84 this_thread::sleep_for(chrono::milliseconds(1000));