import os
import re
import netifaces
from wsdiscovery.discovery import ThreadedWSDiscovery as WSDiscovery
from fastapi import FastAPI
import uvicorn
app = FastAPI()
class OnvifCamera:
def __init__(self):
self.started = False
self.ips = list()
for iface in netifaces.interfaces():
if netifaces.AF_INET in netifaces.ifaddresses(iface):
self.ips.append(
netifaces.ifaddresses(iface)[netifaces.AF_INET][0]["addr"]
)
self.scope = [".".join(ip.split(".")[:2]) for ip in self.ips]
self.wsd = WSDiscovery()
def start(self):
self.wsd.start()
self.ret = self.wsd.searchServices()
self.onvif_services = [
s for s in self.ret if str(s.getTypes()).find("onvif") >= 0
]
self.urls = [ip for s in self.onvif_services for ip in s.getXAddrs()]
self.ips = [
ip for url in self.urls for ip in re.findall(r"\d+\.\d+\.\d+\.\d+", url)
]
self.lst = [ip for ip in self.ips if ip.startswith("192.168.1.")]
return self.lst
onvif_camera = OnvifCamera()
@app.get("/")
def get_cameras():
result = onvif_camera.start()
return {"cameras": result}
if __name__ == "__main__":
uvicorn.run(app, port=8800)
Код выше выводит список всех ip камер подключенных к сети с поддержкой onvif. Код работает но только без докера, начав использовать докер возникает проблема, что мой код пытается обнаружить IP-камеры в сети, но работает внутри контейнера Docker, который имеет собственный сетевой стек. В результате он не может видеть IP-камеры в хост-сети.