Module pantools.net

Expand source code
from time import sleep
from socket import socket, AF_INET, SOCK_DGRAM, SOL_SOCKET, SO_BROADCAST, SO_REUSEADDR, gethostbyname, gethostbyname_ex, gethostname
#import socket
import logging
import numpy as np

def get_local_ip():
#    addr = [l for l in ([ip for ip in gethostbyname_ex(gethostname())[2] if not ip.startswith("127.")][:1], [
#                        [(s.connect(('8.8.8.8', 53)), s.getsockname()[0], s.close()) for s in [socket(AF_INET, SOCK_DGRAM)]][0][1]]) if l][0][0]

    addr = [l for l in ([ip for ip in gethostbyname_ex(gethostname())[2] if not ip.startswith("127.")][:1], [[(s.connect(('8.8.8.8', 53)), s.getsockname()[0], s.close()) for s in [socket(AF_INET, SOCK_DGRAM)]][0][1]]) if l][0][0]
    return addr


logging.basicConfig(
    format='%(asctime)s,%(msecs)d %(levelname)-8s [%(filename)s:%(lineno)d in function %(funcName)s] %(message)s',
    datefmt='%Y-%m-%d:%H:%M:%S',
    level=logging.INFO
)

logger = logging.getLogger(__name__)


def get_net_version():
    return "1.0"
    



def announce_service(adv_magic, adv_port, service_host, service_port):

    s = socket(AF_INET, SOCK_DGRAM)  # create UDP socket
    s.setsockopt(SOL_SOCKET, SO_BROADCAST, 1)  # this is a broadcast socket
    s.bind(('', 0))

    # format id <magicstring>#<ip>#<port> !
    data = adv_magic+'#' + service_host + '#'+str(service_port)

    data = data.encode('utf-8')
    s.sendto(data, ('<broadcast>', adv_port))
    # print("sent service announcement:", data, " on UDP port ", adv_port)

    s.close()


def wait_for_announcement(port, magic):
    s = socket(AF_INET, SOCK_DGRAM)  # create UDP socket
    s.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
    s.bind(('', port))

    found = False
    str = ""
    ip = ""
    port = 0

    while not found:
        data, addr = s.recvfrom(1024)  # wait for a packet
        str = data.decode('utf-8')
        if str.startswith(magic):
            found = True
            (m, ip, port) = str.split('#')
            logger.debug("got service announcement from {}, with ip {} and port {}".format(str[len(magic):], ip, port))

    s.close()
    return (ip, int(port))


def haversine(lon1: float, lat1: float, lon2: float, lat2: float) -> float:
    """
    Calculate the great circle distance between two points on the 
    earth (specified in decimal degrees), returns the distance in
    meters.
    All arguments must be of equal length.
    :param lon1: longitude of first place
    :param lat1: latitude of first place
    :param lon2: longitude of second place
    :param lat2: latitude of second place
    :return: distance in meters between the two sets of coordinates
    """
    # Convert decimal degrees to radians
    lon1, lat1, lon2, lat2 = map(np.radians, [lon1, lat1, lon2, lat2])
    # Haversine formula
    dlon = lon2 - lon1
    dlat = lat2 - lat1
    a = np.sin(dlat/2.0)**2 + np.cos(lat1) * np.cos(lat2) * np.sin(dlon/2.0)**2
    c = 2 * np.arcsin(np.sqrt(a))
    km = 6367 * c
    return km * 1000


if __name__ == "__main__":
    PORT = 50000
    MAGIC = "0xBOOBBOOB"  # to make sure we don't confuse or get confused by other programs
    while 1:
        announce_service(PORT, MAGIC)
        sleep(5)

Functions

def announce_service(adv_magic, adv_port, service_host, service_port)
Expand source code
def announce_service(adv_magic, adv_port, service_host, service_port):

    s = socket(AF_INET, SOCK_DGRAM)  # create UDP socket
    s.setsockopt(SOL_SOCKET, SO_BROADCAST, 1)  # this is a broadcast socket
    s.bind(('', 0))

    # format id <magicstring>#<ip>#<port> !
    data = adv_magic+'#' + service_host + '#'+str(service_port)

    data = data.encode('utf-8')
    s.sendto(data, ('<broadcast>', adv_port))
    # print("sent service announcement:", data, " on UDP port ", adv_port)

    s.close()
def get_local_ip()
Expand source code
def get_local_ip():
#    addr = [l for l in ([ip for ip in gethostbyname_ex(gethostname())[2] if not ip.startswith("127.")][:1], [
#                        [(s.connect(('8.8.8.8', 53)), s.getsockname()[0], s.close()) for s in [socket(AF_INET, SOCK_DGRAM)]][0][1]]) if l][0][0]

    addr = [l for l in ([ip for ip in gethostbyname_ex(gethostname())[2] if not ip.startswith("127.")][:1], [[(s.connect(('8.8.8.8', 53)), s.getsockname()[0], s.close()) for s in [socket(AF_INET, SOCK_DGRAM)]][0][1]]) if l][0][0]
    return addr
def get_net_version()
Expand source code
def get_net_version():
    return "1.0"
def haversine(lon1: float, lat1: float, lon2: float, lat2: float) ‑> float

Calculate the great circle distance between two points on the earth (specified in decimal degrees), returns the distance in meters. All arguments must be of equal length. :param lon1: longitude of first place :param lat1: latitude of first place :param lon2: longitude of second place :param lat2: latitude of second place :return: distance in meters between the two sets of coordinates

Expand source code
def haversine(lon1: float, lat1: float, lon2: float, lat2: float) -> float:
    """
    Calculate the great circle distance between two points on the 
    earth (specified in decimal degrees), returns the distance in
    meters.
    All arguments must be of equal length.
    :param lon1: longitude of first place
    :param lat1: latitude of first place
    :param lon2: longitude of second place
    :param lat2: latitude of second place
    :return: distance in meters between the two sets of coordinates
    """
    # Convert decimal degrees to radians
    lon1, lat1, lon2, lat2 = map(np.radians, [lon1, lat1, lon2, lat2])
    # Haversine formula
    dlon = lon2 - lon1
    dlat = lat2 - lat1
    a = np.sin(dlat/2.0)**2 + np.cos(lat1) * np.cos(lat2) * np.sin(dlon/2.0)**2
    c = 2 * np.arcsin(np.sqrt(a))
    km = 6367 * c
    return km * 1000
def wait_for_announcement(port, magic)
Expand source code
def wait_for_announcement(port, magic):
    s = socket(AF_INET, SOCK_DGRAM)  # create UDP socket
    s.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
    s.bind(('', port))

    found = False
    str = ""
    ip = ""
    port = 0

    while not found:
        data, addr = s.recvfrom(1024)  # wait for a packet
        str = data.decode('utf-8')
        if str.startswith(magic):
            found = True
            (m, ip, port) = str.split('#')
            logger.debug("got service announcement from {}, with ip {} and port {}".format(str[len(magic):], ip, port))

    s.close()
    return (ip, int(port))