From 57c4b8590e1e5c128d55e56c96b0c02669c304a9 Mon Sep 17 00:00:00 2001 From: "Jaewon.A.C" Date: Mon, 19 Oct 2020 16:47:22 +0900 Subject: [PATCH] Modified ControlPoint to support binding socket to specific network interface --- examples/bind_socket_iface.py | 22 ++++++++++++++++++++++ src/pysony.py | 4 +++- 2 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 examples/bind_socket_iface.py diff --git a/examples/bind_socket_iface.py b/examples/bind_socket_iface.py new file mode 100644 index 0000000..045d68d --- /dev/null +++ b/examples/bind_socket_iface.py @@ -0,0 +1,22 @@ +#!/usr/bin/env python +''' +this example is for those who use multiple network interface +In my case, I connected my Raspberry pi's interface + eth0 : to internet + wlan0 : to sony camera, a5100 specifically +Normally pysony doesn't work in this case. Because socket sends ssdp only to eth0 +I modified ControlPoint's init function so socket object in ControlPoint to be bound to wlan0 +''' + +import pysony + +print("Searching for camera...") + +search = pysony.ControlPoint(interface='wlan0') +cameras = search.discover() + +if len(cameras): + camera = pysony.SonyAPI(QX_ADDR=cameras[0]) +else: + print("No camera found, aborting") + quit() \ No newline at end of file diff --git a/src/pysony.py b/src/pysony.py index a31609d..9d85708 100755 --- a/src/pysony.py +++ b/src/pysony.py @@ -38,12 +38,14 @@ # Improved with code from 'https://github.com/storborg/sonypy' under MIT license. class ControlPoint(object): - def __init__(self, addr=SSDP_ADDR, port=SSDP_PORT): + def __init__(self, addr=SSDP_ADDR, port=SSDP_PORT, interface=None): self.addr, self.port = addr, port sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock.settimeout(0.1) # Set the socket to broadcast mode. sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2) + if interface: + sock.setsockopt(socket.SOL_SOCKET, 25, str(interface + '\0').encode('utf-8')) self._udp_socket = sock def close(self):