https://github.com/ghdrl95/CShapeWinFormNetwork

 

ghdrl95/CShapeWinFormNetwork

c# 윈폼을 활용한 네트워크 통신 예제. Contribute to ghdrl95/CShapeWinFormNetwork development by creating an account on GitHub.

github.com

c# 윈폼을 활용한 네트워크 통신 예제

 

  • Test : 웹캠 영상 불러오는 예제 및 TCP 통신 기반의 영상 송수신 서버 구현
  • Test_Client : TCP통신 기반의 영상 송수신 클라이언트 구현
  • udpMicStream : UDP통신 기반의 음성 데이터 송수신 프로그램 구현.
  • ScreenStreaming : 모니터 화면 캡쳐 기본. TCP 기반의 화면 스트리밍 서버 구현 및 클라이언트의 마우스 입력 데이터로 원격제어 기능 구현
  • ScreenStreaming_client : 화면 스트리밍을 수신받는 클라이언트. 스트리밍 화면을 마우스로 클릭시 서버에게 마우스 클릭 정보 전송

'프로그래밍 > C#' 카테고리의 다른 글

c#기반의 네트워크 통신 예제 소스 모음  (0) 2019.08.03
(C#) get, set 접근자  (0) 2016.07.09
(C#) Head First - 캡슐화 PartyPlaner  (0) 2016.07.09
(C#) Head First - 캡슐화  (0) 2016.07.09
(C#) head first - MessageBox 사용  (0) 2016.07.09

https://github.com/ghdrl95/CShapeNetwork

 

ghdrl95/CShapeNetwork

Contribute to ghdrl95/CShapeNetwork development by creating an account on GitHub.

github.com

C# 네트워크 통신 소스 모음. 

TCP는 서버와 클라이언트 구조를 띄고 있고, UDP는 송신자와 수신자 구조로 예제소스를 구성함.

TCP와 UDP 항목은 Server파일과 Client파일을 한쌍으로 확인할것

ex) TCP_1 : TCP_Server_1.cs + TCP_Client_1.cs 소스 확인

 

Data : 데이터 통신용 클래스 저장 파일. 네임스페이스와 클래스이름이 동일해야 객체전달이 가능함.
TCP_1 : c# TCP통신 기본 예제. byte데이터 송수신
TCP_2 : c# TCP통신 예제. Serialize와 Deserialize를 통한 객체 송수신
TCP_3 : c# TCP통신 기반 가위바위보 게임. 하나의 서버에 두개의 클라이언트가 접속해 가위바위보 게임을 진행
TCP_4 : c# TCP통신 기반 파일 송수신예제
TCP_5 : c# TCP통신 기반 심플 클라우드. 서버의 하드디스크 공간에 파일 업로드/다운로드. 서버의 실행파일이 있는 위치에 files폴더가 있어야함
TCP_6 : 멀티쓰레드 기반 1 Room 멀티채팅 서버/클라이언트
UDP_1 : c# UDP통신 기본 예제. 바이트단위 데이터 송수신
UDP_2 : c# UDP통신 기본 예제. MemoryStream으로 Serialize, Deserialize 기능 사용하기
UDP_3 : c# UDP통신으로 송신자의 IP/PORT 전달 예제
UDP_4 : c# UDP통신 브로드캐스트 예제.
UDP_5 : c# UDP통신 멀티캐스트 예제
UDP_6 : c# UDP통신 멀티캐스트와 멀티스레드 기반의 채팅프로그램
Thread_1 : c# 멀티쓰레드 사용법 예제
Thread_2 : c# 경마프로그램
Thread_3 : c# NAudio 라이브러리 기반 음악 재생 프로그램

'프로그래밍 > C#' 카테고리의 다른 글

c#기반의 윈폼 + 네트워크 예제  (0) 2019.08.03
(C#) get, set 접근자  (0) 2016.07.09
(C#) Head First - 캡슐화 PartyPlaner  (0) 2016.07.09
(C#) Head First - 캡슐화  (0) 2016.07.09
(C#) head first - MessageBox 사용  (0) 2016.07.09

프로젝트 소스 링크

https://github.com/ghdrl95/voied_chat

 

ghdrl95/voied_chat

Contribute to ghdrl95/voied_chat development by creating an account on GitHub.

github.com

환경 구축

설치환경

설치버전 

python 

3.6 

pyaudio

0.2.11

마이크와 스피커

USB 장치로 연결하는 마이크 / Audio 잭에 연결한 스피커

기능 설명

  • 서버 컴퓨터와 클라이언트 컴퓨터 간의 음성채팅 프로그램
  • 서버 컴퓨터와 클라이언트 컴퓨터에 마이크와 스피커가 연결되있어야함
  • 서버와 클라이언트는 pyaudio 라이브러리를 통해 마이크의 입력 데이터와 스피커로 데이터 출력을 할 수 있음
  • 서버와 클라이언트는 마이크의 입력 데이터를 TCP 통신으로 송수신함

 

파일 설명

mic_info.py : 마이크와 스피커 장치의 인덱스를 알 수 있는 프로그램. 컴퓨터에 마이크와 스피커 장치가 연결된 상태에서 해당 파일을 실행해 장치의 인덱스를 추출

chat_server.py : TCP 통신의 서버역할 코드. 프로그램 실행 전 마이크/스피어 장치 인덱스와 컴퓨터의 IP를 수정해야함

chat_client.py : TCP 통신의 클라이언트 역할 코드. 프로그램 실행 전 컴퓨터의 마이크/스피어 장치 인덱스 및 서버 컴퓨터의 IP 주소로 수정해야함

'프로그래밍 > python' 카테고리의 다른 글

파이썬으로 웹서버 만들기 (django 모듈사용)  (0) 2019.05.27

https://github.com/ghdrl95/pythondjango

 

파이썬 기반의 웹서버 구축 방법 중 django 모듈을 활용해 웹서버를 만드는 방법에 대해 주석과 프로젝트 소스입니다.

 

환경구축은 아래 표와 같이 진행했습니다

설치파일 설치버전
python 3.6
django 모듈 2.1
이클립스 oxygen
pydev 플러그인 이클립스 실행 후 마켓플레이스에서 다운로드

폴더 별 추가된 기능

/project1 : 프로젝트 생성 후 bookmark 어플리케이션 생성모델템플릿 구조를 확인

/project2 : django튜토리얼 어플리케이션을 개발(vote 어플리케이션)

/project3 : vote어플리케이션 확장 (form 기반의 모델 객체 추가/수정/삭제)

/project4 : customlogin 어플리케이션 생성 (django의 회원관리 어플리케이션을 바탕으로 회원가입로그인로그아웃 기능 추가), 템플릿 확장기능으로 효율적으로 html 관리

/project5 : blog 어플리케이션(게시판 형태의 어플리케이션파일 및 이미지 업로드 기능을 사용할 수 있도록 모델 정의)social-auth-app-django 모듈 기반의 소셜로그인 기능 구현

/project6 : blog 어플리케이션의 템플릿검색 기능 추가




'프로그래밍 > python' 카테고리의 다른 글

파이썬으로 음성채팅 프로그램 만들기  (2) 2019.05.27

라즈베리파이 vncserver 설치

sudo apt-get install tightvncserver

vncserver 실행

vncserver

비밀번호 설정 -> 처음 설정시 1이 뜨는데 VNCViewer에서 접속할때 사용됨



접속할 곳(PC)에서 VNCViewer 설치

https://www.realvnc.com/download/viewer/


라즈베리파이 IP:번호 입력후 Connect

설정한 비밀번호 입력




정상적으로 접속이되면 라즈베리파이의 GUI화면이 뜸

해상도나 전체화면 옵션을 사용하고 싶을 경우 화면 가운데 상단의 메뉴를 이용하면 됨


이방법을 사용할 경우 라즈베리파이를 실행할 때마다 vncserver를 실행해야함








외부라이브러리까지 묶어서 export하기 위해선 FatJar라는 플러그인을 설치해야함


Help/Install New Software 클릭

Work With에 http://kurucz-grafika.de/fatjar 입력후 엔터치면 아래 그림과 같이 설치할 수 있는 게 뜸.

열심히 Next 누르면 설치 준비하는데 라즈베리파이3 기준 굉장히 오래걸림...

다음화면으로 넘어가면 동의하기 누르고 피니쉬를 누르면 설치를 함.(설치또한 오래걸림)



설치가 끝나고 File -> export 를 선택하고 other/Fat Jar Exporter 를 선택 후 Next



Export할 프로젝트 선택




Jar-Name : Export 된 jar파일을 어디에 어떤이름으로 생성할지 경로와 파일이름 지정

Main-Class : Main 문이 있는 클래스 지정



프로젝트에 포함할 외부라이브러리 항목 체크후 Finish 하면 jar파일을 만들어줌




명령 프롬프트, 터미널에서 jar 파일을 실행하고 싶을 경우 

java -jar jar파일이름 입력하면 실행이 됨.


라즈베리파이 usb포트 - 아두이노 TX RX 시리얼 연결 사진

usb to serial로 사용할 수 있는 모듈을 통해 아두이노의 TX, RX, 5V, GND에 연결

아두이노에 프로그램을 업로드할 때 컴퓨터와 TX,RX 통신을 하므로, 소스 업로드를 마치고 나서 연결해야 정상적으로 소스가 업로드 되니 주의



usb를 꽂은 뒤 터미널에서 'dmesg|tail' 명령어로 현재 연결된 USB포트의 이름을 알아내기




라즈베리파이(wiringPi 라이브러리 사용)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include<stdio.h>
#include<string.h>
#include<errno.h>
 
#include<wiringSerial.h>
 
int main(){
    int fd;
    if((fd=serialOpen("/dev/ttyUSB0",115200))<0){
        fprintf(stderr,"Unable to open serial device: %s\n", strerror(errno));
        return 1;
    }
    for(;;){
        putchar(serialGetchar(fd));
        fflush(stdout);
    }
}
 
cs

9~12줄

터미널에서 연결된 디바이스 정보를 serialOpen함수에 문자열로 입력, 2번째 매개변수는 serial 통신의 스피드를 입력.

(아두이노 쪽 통신속도와 일치해야 데이터를 정확히 받을 수 있음)

정상적으로 시리얼 접속이 안될경우 장치 이름이 동일한지 확인해야함

13~16줄

아두이노에서 보낸 데이터를 결과창에 출력

char serialGetchar(int id) : 연결된 시리얼 장치로부터 문자를 반환받는 함수

fflush() : 버퍼를 비우는 함수



아두이노

1
2
3
4
5
6
7
8
9
void setup(){  
  Serial.begin(115200);
 
void loop(){
  Serial.println("Hello World");
  delay(1000);
}
 
cs

프로그램이 실행될때 시리얼 연결을 하고 1초마다 Hello World 문자열을 전송하는 소스




컨버터를 이용하지 않고 아두이노 RX/TX와 라즈베리파이 RX/TX를 연결할 경우 라즈베리파이에서 구동되는 서비스 때문에 아래와 같은 내용이 주기적으로 뜨고, 아두이노가 메시지를 전송할 때 로그인 실패 문장이 추가적으로 들어감




라즈베리파이에서 일시적으로 멈추고 싶을 때는 터미널에 다음과 같이 입력하면 해당 서비스를 멈출 수 있음

systemctl stop serial-getty@ttyAMA0
systemctl disable serial-getty@ttyAMA0

부팅을 해도 해당 서비스를 막고 싶으면 아래와 같은 명령을 터미널에 입력하면됨.

systemctl mask serial-getty@ttyAMA0.service

(퍼미션 문제 뜨면 앞에 sudo를 붙이면 됨)


구글 검색 (라즈베리파이 systemctl ttyAMA0, sudo systemctl disable hciuart, 라즈베리파이3 uart pin, raspberry pi3 ttyama0 restore)

사용 방법
  1. 빈 GameObject에 DynamicDataSetLoader.cs(아래 스크립트)를 추가한다.
  2. Inspector에 멤버 변수를 채운다
    Augmentation Object - 마커 하위 오브젝트로 추가될 오브젝트를 넣는 곳
    Data Set Name - DataSet의 이름을 적는 곳
사용 결과
씬이 프로그램이 실행될 때 활성화 되지 않은 DataSet을 로드 시키고, 그안에 있는 마커를 하나씩 로딩한다.
단, 1000개 이상의 마커는 1000개만 생성됨)

응용 방법
마커가 많을 경우 기능별 분류를 통해 DataSet을 분류 해놓고 특정 상황마다 DataSet을 로딩하면 된다.
DynamicDataSetLoader.cs
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
using UnityEngine;
using System.Collections;
 
using Vuforia;
using System.Collections.Generic;
 
 
public class DynamicDataSetLoader : MonoBehaviour
{
    // specify these in Unity Inspector
    public GameObject augmentationObject = null;  // you can use teapot or other object
    public string dataSetName = "";  //  Assets/StreamingAssets/QCAR/DataSetName
 
    // Use this for initialization
    void Start()
    {
        // Vuforia 6.2+
        VuforiaARController vac = VuforiaARController.Instance;
        vac.RegisterVuforiaStartedCallback(LoadDataSet);
    }
 
    void LoadDataSet()
    {
 
        ObjectTracker objectTracker = TrackerManager.Instance.GetTracker<ObjectTracker>();
 
        DataSet dataSet = objectTracker.CreateDataSet();
 
        if (dataSet.Load(dataSetName))
        {
 
            objectTracker.Stop();  // stop tracker so that we can add new dataset
 
            if (!objectTracker.ActivateDataSet(dataSet))
            {
                // Note: ImageTracker cannot have more than 100 total targets activated
                Debug.Log("<color=yellow>Failed to Activate DataSet: " + dataSetName + "</color>");
            }
 
            if (!objectTracker.Start())
            {
                Debug.Log("<color=yellow>Tracker Failed to Start.</color>");
            }
 
            int counter = 0;
 
            IEnumerable<TrackableBehaviour> tbs = TrackerManager.Instance.GetStateManager().GetTrackableBehaviours();
            foreach (TrackableBehaviour tb in tbs)
            {
                if (tb.name == "New Game Object")
                {
 
                    // change generic name to include trackable name
                    tb.gameObject.name = ++counter + ":DynamicImageTarget-" + tb.TrackableName;
 
                    // add additional script components for trackable
                    tb.gameObject.AddComponent<DefaultTrackableEventHandler>();
                    tb.gameObject.AddComponent<TurnOffBehaviour>();
 
                    if (augmentationObject != null)
                    {
                        // instantiate augmentation object and parent to trackable
                        GameObject augmentation = (GameObject)GameObject.Instantiate(augmentationObject);
                        augmentation.transform.parent = tb.gameObject.transform;
                        augmentation.transform.localPosition = new Vector3(0f, 0f, 0f);
                        augmentation.transform.localRotation = Quaternion.identity;
                        augmentation.transform.localScale = new Vector3(0.005f, 0.005f, 0.005f);
                        augmentation.gameObject.SetActive(true);
                    }
                    else
                    {
                        Debug.Log("<color=yellow>Warning: No augmentation object specified for: " + tb.TrackableName + "</color>");
                    }
                }
            }
        }
        else
        {
            Debug.LogError("<color=yellow>Failed to load dataset: '" + dataSetName + "'</color>");
        }
    }
}
cs




지페가 구겨져있어서 그런지 몰라도 간혈적으로 내부 라이브러리가 마커가 잡힌 이벤트를 연속으로 보내서 오브젝트가 번갈아 보이는 현상이 발생함

테스트를 다른것으로 해봐야 될듯

+ Recent posts