티스토리 뷰

Unity

unity_TD_udp통신

잉_민 2022. 11. 7. 21:35

<이거 실패 ..>

udp 통신과정에서 중간에 멈춰서

값 한번 밖에 안 들어옴 .. 

 


touchdesigner 에서 udp 통신 (소켓)을 통해 unity에 값을 보내보자.

using UnityEngine;
using System.Collections;
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;

public class client3 : MonoBehaviour
{
    public string recvStr;
    public string UDPClientIP = "192.168.0.81";
    string str = "   01    ";
    Socket socket;
    EndPoint serverEnd;
    IPEndPoint ipEnd;

    byte[] recvData = new byte[1024];
    byte[] sendData = new byte[1024];
    int recvLen = 0;
    Thread connectThread;

    void Start()
    {
        UDPClientIP = "192.168.0.81";
        UDPClientIP = UDPClientIP.Trim();

        InitSocket();
    }

    void InitSocket()
    {
        print(UDPClientIP);
        //ip연결 포트연결
        //ipEnd = new IPEndPoint(IPAddress.Parse(UDPClientIP), 7400);
        ipEnd = new IPEndPoint(IPAddress.Parse(UDPClientIP), 7400);

        //소켓 udp
        socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
        //전송
        IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
        serverEnd = (EndPoint)sender;
        print("send");
        SocketSend(str);
        print(str+"end");

        //받기 : 쓰레드        
        connectThread = new Thread(new ThreadStart(SocketReceive));
        connectThread.Start();
    }
    void SocketSend(string sendStr)
    {
        //  스트링 보낸다
        sendData = new byte[1024];
        //    
        sendData = Encoding.UTF8.GetBytes(sendStr);
        //        
        socket.SendTo(sendData, sendData.Length, SocketFlags.None, ipEnd);
    }

    //       
    void SocketReceive()
    {
        //받는다
        while (true)
        {
            print('-');
            recvData = new byte[1024];
            try
            {
                recvLen = socket.ReceiveFrom(recvData, ref serverEnd);
                print(recvLen);
            }
            catch (Exception e)
            {
                //error
                print(e);
            }


            //receive print#####
            print("  what#####  : " + serverEnd.ToString());

            if (recvLen > 0)
            {
                recvStr = Encoding.UTF8.GetString(recvData, 0, recvLen);
            }

            print(recvStr);
        }
    }

    //    
    void SocketQuit()
    {
        //    
        if (connectThread != null)
        {
            connectThread.Interrupt();
            connectThread.Abort();
        }
        //    socket
        if (socket != null)
            socket.Close();
    }
    void OnApplicationQuit()
    {
        SocketQuit();
    }

    void Update()
    {

    }
}

unity 가 client야 

client와 sever의 차이

client는 값을 달라고 요청해 ! 

그래서 코드를 보면 send와 receive가 있는데

값을 보낼때 send를 쓰고 receive는 쓰레드를 사용해서 항상 값이 있으면 받게 해놨어.

 

server는 값을 계속 보내고있어. 그니까 데이터를 갖고있는 애야.

여기에 값을 달라고 하면 서버가 보내줄수있어.

나는 터디에서 값을 5초마다 보내게 해놨고, 유니티에서 값이 전송되면 프린트해주라고 해놨어.

 

빈 오브젝트에 스크립트를 넣으면돼 !

여기서 중요한점은

IP주소와 port번호야

IP주소 때문에 고생을 좀 했음..

명령 프롬트에서

ipconfig해서

81저걸로 해야 값이 들어오더라고

1로했더니 안됐음 무슨차이인지 사실 모르겠어

 

암튼  터디에서는

udp out이랑 udp in을 만들었음.

out은 타이머를 통해서 5초마다 내보낼거라 timer1_callbacks에 연결했어

# me - this DAT
# timerOp - the connected Timer CHOP
# cycle - the cycle index
# interrupt - True if the user initiated a premature
#                     False if a result of a normal timeout
# fraction - the time in 0-1 fractional form
#
# segment - an object describing the segment:
#
#    can be automatically cast to its index: e.g.:  segment+3, segment==2, etc      
#    
#  members of segment object:
#      index     numeric order of the segment, from 0
#      owner    Timer CHOP it belongs to
#
#      lengthSeconds, lengthSamples, lengthFrames
#      delaySeconds, delaySamples, delayFrames
#      beginSeconds, beginSamples, beginFrames
#      speed
#      cycle, cycleLimit, maxCycles
#      cycleEndAlertSeconds, cycleEndAlertSamples, cycleEndAlertFrames
#
#      row - one validly named member per column:
#            column headings used to override parameters:
#                          length, delay, speed, cyclelimit, maxcycles, cycleendalert
#            special column headings:
#                          begin (time at which to start, independent of delays/lengths, overrides delay)
#
#    custom - dictionary of all columns that don't map to a built-in feature
#

# onInitialize(): if return value > 0, it will be
# called again after the returned number of frames.
# callCount increments with each attempt, starting at 1

a= op('text1')

def onInitialize(timerOp, callCount):
	return 0

def onReady(timerOp):
	return
	
def onStart(timerOp):
	return
	
def onTimerPulse(timerOp, segment):
	return

def whileTimerActive(timerOp, segment, cycle, fraction):
	return

def onSegmentEnter(timerOp, segment, interrupt):
	return
	
def onSegmentExit(timerOp, segment, interrupt):
	return

def onCycleStart(timerOp, segment, cycle):
	return

def onCycleEndAlert(timerOp, segment, cycle, alertSegment, alertDone, interrupt):
	return
	
def onCycle(timerOp, segment, cycle):
	return

def onDone(timerOp, segment, interrupt):
	#여기가 중요 !!! a=text send라는 함수를 사용해서 a를 보냄 (타이머가 done될때마다)
	op('udpout1').send(a)
	print(a)
	return

def onSubrangeStart(timerOp):
	return

udpout을 살펴보면

로컬어드레스에 ip주소를 써주고 포트도 메뉴얼로 지정해줬더니 값 제대로 들어왔어 !!!!! 아래부분이 중요한듯 .. 

 

 

값 들어오는것도 확인하려고 udpin도 만들었음

여기도 아래쪽에 local address에 ip주소 잘 적어주는게 중요 ...

# me - this DAT
#
# dat - the DAT that received the data
# rowIndex - is the row number the data was placed into
# message - an ascii representation of the data
#           Unprintable characters and unicode characters will
#           not be preserved. Use the 'bytes' parameter to get
#           the raw bytes that were sent.
# bytes - a byte array of the data received
# peer - a Peer object describing the originating message
#   peer.close()    #close the connection
#   peer.owner  #the operator to whom the peer belongs
#   peer.address    #network address associated with the peer
#   peer.port       #network port associated with the peer
#

def onReceive(dat, rowIndex, message, bytes, peer):
	print('000')
	return

값 들어오는거 확인하려고 000만 찍어놨어

 

콘솔창 보고싶으면

여기서 보면됨 !!!!!

 

유니티에서 값 들어오는거는 

이렇게 프린트 됩니다 !

 

오류

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=doksajokyo&logNo=220830400811 

 

Socket Error 10054 오류

최근에 C#에서 socket을 이용한 간편본인확인/문자본인확인 서비스를 구현하는 중에 Service Vender와 ...

blog.naver.com

참고

https://computer-art.tistory.com/entry/TD%EC%97%90%EC%84%9C-udp-%EC%8B%A0%ED%98%B8-%EB%B3%B4%EB%82%B4%EA%B8%B0-%EB%B0%9B%EA%B8%B0

 

TD에서 udp 신호 보내기 / 받기

udp 신호 보내기 udp 신호 받기

computer-art.tistory.com

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함