Page 1 of 1

Send/riceve UDP message

Posted: Sun Nov 01, 2020 9:39 am
by Spectre.68
Hi!

is it possible to send and receive UDP messages with scripts at the same time?
I tried but I keep getting an "import soked" error.
The goal is to pause the photo session and then resume it with a UDP message.


import socket
UDP_IP = "xxx.xxx.xxx.xxx"
UDP_PORT = 12000
sock = socket.socket(socket.AF_INET, # Internet
socket.SOCK_DGRAM) # UDP
sock.bind((UDP_IP, UDP_PORT))
while True:
data, addr = sock.recvfrom(1024) # buffer size is 1024 bytes
if ="SUSPEND"
***code for suspension***


I also have to send a command (for close observatory) when the photo session is end, so a trigger would be needed to fire at the end of the photo session


end session code

import socket
UDP_IP = "xxx.xxx.xxx.xxx"
UDP_PORT = 12000
MESSAGE = "CLOSE""
print("UDP target IP: %s" % UDP_IP)
print("UDP target port: %s" % UDP_PORT)
print("message: %s" % MESSAGE)
sock = socket.socket(socket.AF_INET, # Internet
socket.SOCK_DGRAM) # UDP
sock.sendto(MESSAGE, (UDP_IP, UDP_PORT))

Re: Send/riceve UDP message

Posted: Sun Nov 01, 2020 2:56 pm
by admin
Hi,

not something that I've tried, but I can't see why it couldn't be made to work.

Your first block of code loops forever, so if you are going to start that running then you need to start it in a separate thread otherwise you will block the Python interpreter thread forever and won't be able to run any other code.

You could also consider something a bit more structured that has been made to work in the past – using the Pyro remoting engine

viewtopic.php?t=302

Cheers, Robin

Re: Send/riceve UDP message

Posted: Mon Nov 02, 2020 8:47 am
by Spectre.68
Hi!
Thanks for the answer. I also have another solution but I don't know if it can be done.
Are there APIs that can be used with Visul C or Vb.net to communicate with sharp?
If that's not possible I'll go ahead with the scripts.

Riccardo.

Re: Send/riceve UDP message

Posted: Mon Nov 02, 2020 8:50 am
by Spectre.68

Code: Select all

SyntaxError: expected an indented block>>> 
Traceback (most recent call last):
  File "<string>", line 1, in <module>
ImportError: No module named socket

error I get

Re: Send/riceve UDP message

Posted: Mon Nov 02, 2020 3:28 pm
by Spectre.68

Code: Select all

import socket
import string
import clr
import time

UDP_IP = "xxx.xxx.xxx.xxx"
UDP_PORT = 11000
MESSAGE = b"CLOSEOSS"

def executeSomething():
	camera = str(SharpCap.SelectedCamera)
	print(camera) 
	if ('None' in camera):
			print("Not Camera connect")
			time.sleep(60)
	else:
			print("UDP target IP: %s" % UDP_IP)
			print("UDP target port: %s" % UDP_PORT)
			print("message: %s" % MESSAGE)	
			sock = socket.socket(socket.AF_INET, # Internet
			                      socket.SOCK_DGRAM) # UDP
			sock.sendto(MESSAGE, (UDP_IP, UDP_PORT))
			time.sleep(60)

while True: AttributeError: 'NoneType' object has no attribute 'Controls'

I'm experimenting, now I have this error: with this command: SharpCap.SelectedCamera.Controls.Exposure.AutoAvailable

Re: Send/riceve UDP message

Posted: Mon Nov 02, 2020 6:19 pm
by oopfan
Spectre,

I use TCP/IP for communication between the client (SharpCap) and the server (Raspberry PI), which controls a stepper motor. It has worked flawlessly for two years. I've copied snippets that you should be able to get working:

Brian

Code: Select all

import socket

class MySocket:
	def __init__(self, sock = None, delimiter = "|"):
		if sock is None:
			self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
		else:
			self.sock = sock
		self.delimiter = delimiter
		self.recv_buffer = ""

	def connect(self, host, port):
		self.sock.connect((host, port))

	def send(self, msg):
		msg = self.delimiter + msg + self.delimiter
		total_length = len(msg)
		total_sent = 0
		while total_sent < total_length:
			sent = self.sock.send(msg[total_sent:])
			if sent == 0:
				raise RuntimeError("socket connection broken")
			total_sent = total_sent + sent

	def receive(self):
		while True:
			if len(self.recv_buffer) > 0:
				if self.recv_buffer[0] != self.delimiter:
					raise RuntimeError("expected delimiter in message")
				end_delim = self.recv_buffer.find(self.delimiter, 1)
				if end_delim != -1:
					result = self.recv_buffer[1:end_delim]
					self.recv_buffer = self.recv_buffer[end_delim+1:]
					return result
			chunk = self.sock.recv(4096)
			if chunk == '':
				raise RuntimeError("socket connection broken")
			self.recv_buffer = self.recv_buffer + chunk

	def close(self):
		self.sock.close()


# --------------------------------------------------------------
# Windows
# IronPython Client:

comm = MySocket()
host = '192.168.0.200'
port = 12345
comm.connect(host, port)
comm.send("pec_start")
msg = comm.receive()
if msg == "wait":
	time.sleep(2)
comm.close()


# --------------------------------------------------------------
# Raspberry PI
# Python Server:

server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
host = '192.168.0.200'
port = 12345
server_socket.bind((host, port))
server_socket.listen(0)
while quitter.is_set() == False:
	print('Listening for client connection')
	(client_socket, address) = server_socket.accept()
	print "Got connection from %s:%d" % (address[0], address[1])
	client_thread = ClientThread(client_socket, quitter)
	client_thread.start()
	client_thread.join()
print "Main terminating"

class ClientThread(Thread):
    def __init__(self, client_socket, quitter):
        Thread.__init__(self)
        self.socket = MySocket(client_socket)
        self.quitter = quitter

    def run(self):
        print "ClientThread started"
        while self.quitter.is_set() == False:
            msg = self.socket.receive()
            if msg == "":
                print "Socket connection broken"
                break
            cmd = msg.split(',')
            print "Command: %s" % cmd[0]
            if cmd[0] == "shutdown":
            elif cmd[0] == "enable_stepper":
            elif cmd[0] == "get_status":
		response = "%r,%s,%f,%d,%d,%d,%d" % self.tracking.get_status()
		self.socket.send(response)
            elif cmd[0] == "set_rate_multiplier":
                value = float(cmd[1])
                self.tracking.scale(value)
            elif cmd[0] == "pec_start":
            elif cmd[0] == "pec_mark":
            elif cmd[0] == "pec_data":
            elif cmd[0] == "ppec_init":
            elif cmd[0] == "ppec_data":
            elif cmd[0] == "ppec_boot":
            elif cmd[0] == "pulse":
        print "Closing socket"
        self.socket.close()
        print "ClientThread ended"

Re: Send/riceve UDP message

Posted: Mon Nov 02, 2020 9:38 pm
by Spectre.68
Hi, thanks for the code which is very useful.
But the problem is (see error on previous post) when I try to use the properties of the camera, to understand if the session is still in progress or end.
See:

Code: Select all

AttributeError: 'NoneType' object has no attribute 'Controls
Sorry.

Re: Send/riceve UDP message

Posted: Tue Nov 03, 2020 7:31 pm
by admin
Hi,

it sounds as though you don't have a camera open at that point in time, so there's no camera object to ask for the controls from. Basically SharpCap.SelectedCamera will be 'None' when no cameras open.

Cheers, Robin

Re: Send/riceve UDP message

Posted: Wed Nov 04, 2020 12:46 pm
by Spectre.68
Perfect.... :D :D :D