성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[정성태] Java - How to use the Foreign Funct...
[정성태] 제가 큰 실수를 했군요. ^^; Delegate를 통한 Bein...
[정성태] Working with Rust Libraries from C#...
[정성태] Detecting blocking calls using asyn...
[정성태] 아쉽게도, 커뮤니티는 아니고 개인 블로그입니다. ^^
[정성태] 질문이 잘 이해가 안 됩니다. 우선, 해당 소스코드에서 ILis...
[양승조
] var대신 dinamic으로 선언해서 해결은 했습니다. 맞는 해...
[양승조
] 또 막혔습니다. ㅠㅠ var list = props[i].Ge...
[양승조
] 아. 감사합니다. 어제는 안됐던것 같은데....정신을 차려야겠네...
[정성태] "props[i].GetValue(props[i])" 코드에서 ...
글쓰기
제목
이름
암호
전자우편
HTML
홈페이지
유형
제니퍼 .NET
닷넷
COM 개체 관련
스크립트
VC++
VS.NET IDE
Windows
Team Foundation Server
디버깅 기술
오류 유형
개발 환경 구성
웹
기타
Linux
Java
DDK
Math
Phone
Graphics
사물인터넷
부모글 보이기/감추기
내용
<div style='display: inline'> <h1 style='font-family: Malgun Gothic, Consolas; font-size: 20pt; color: #006699; text-align: center; font-weight: bold'>USB/IP PROJECT를 이용해 C#으로 USB Keyboard 가상 장치 만들기</h1> <p> 지난 글에서,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > (User-mode 코드로 가상 USB 장치를 만들 수 있는) USB/IP PROJECT 소개 ; <a target='tab' href='https://www.sysnet.pe.kr/2/0/12213'>https://www.sysnet.pe.kr/2/0/12213</a> </pre> <br /> <a target='tab' href='http://usbip.sourceforge.net'>USB/IP PROJECT</a>에 버그가 있어 가상 장치를 detach 시 BSOD가 발생한다고 했는데요, 현재 해당 프로젝트는 종료되었으므로 더 이상 업데이트를 기대할 수 없지만 그 바통을 이어받은 프로젝트가 다행히 아직 살아 있습니다. ^^<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > cezanne / usbip-win ; <a target='tab' href='https://github.com/cezanne/usbip-win'>https://github.com/cezanne/usbip-win</a> USB/IP for Windows ; <a target='tab' href='https://github.com/cezanne/usbip-win/blob/master/README.md'>https://github.com/cezanne/usbip-win/blob/master/README.md</a> (게다가 저 repo의 주인장인 cezanne라는 분은 한국인입니다. ^^) </pre> <br /> 따라서, 위의 repo에 있는 device driver를 빌드한 usbip_vhci.sys를 윈도우 10에 설치하면 BSOD 없는 안정적인 "USB/IP VHCI" 장치를 사용할 수 있습니다.<br /> <br /> <hr style='width: 50%' /><br /> <br /> 자, 그럼 usbip_vhci.sys에서 나열해 줄 가상 장치 역할을 할 클라이언트 코드가 필요한데 이것도 이미 전의 글에서 소개한,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > lcgamboa / USBIP-Virtual-USB-Device ; <a target='tab' href='https://github.com/lcgamboa/USBIP-Virtual-USB-Device'>https://github.com/lcgamboa/USBIP-Virtual-USB-Device</a> </pre> <br /> repo에 C 언어와 파이썬으로 구현한 코드를 함께 제공하고 있으니, C#에서는 그저 해당 기능들을 그대로 포팅만 하면 됩니다. 아래의 프로젝트는 그래서 만들어진 것이고,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > USBIP-Virtual-USB-Device/dotnet/UsbipDevice/ ; <a target='tab' href='https://github.com/stjeong/USBIP-Virtual-USB-Device/tree/master/dotnet/UsbipDevice'>https://github.com/stjeong/USBIP-Virtual-USB-Device/tree/master/dotnet/UsbipDevice</a> </pre> <br /> 위의 라이브러리를 바탕으로 예전에 Raspberry pi zero로 구현해 두었던 키보드 제어 방식을,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > stjeong / rasp_vusb ; <a target='tab' href='https://github.com/stjeong/rasp_vusb'>https://github.com/stjeong/rasp_vusb</a> </pre> <br /> 동일하게 구현한 예제 프로젝트를 함께 실어 두었습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > USBIP-Virtual-USB-Device/dotnet/cs-hid-keyboard/ ; <a target='tab' href='https://github.com/stjeong/USBIP-Virtual-USB-Device/tree/master/dotnet/cs-hid-keyboard'>https://github.com/stjeong/USBIP-Virtual-USB-Device/tree/master/dotnet/cs-hid-keyboard</a> </pre> <br /> 사용 방법은 아래의 코드를 보면 대충 눈치채실 수 있을 것입니다. ^^<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > using System; using System.Collections.Generic; using System.Diagnostics; using System.Threading; using UsbipDevice; namespace cs_hid_keyboard { class Program { static void Main(string[] args) { Console.WriteLine("cs-hid-keyboard"); bool waitLocalHost = true; if (args.Length >= 1) { if (args[0] == "-w") { waitLocalHost = false; } } byte[] reportBuffer = KeyboardDescriptors.Report; <span style='color: blue; font-weight: bold'>using (Usbip device = new Usbip(UsbDescriptors.Device, KeyboardDescriptors.Hid, reportBuffer))</span> { <span style='color: blue; font-weight: bold'>KeyboardDevice keyboard = new KeyboardDevice(device, reportBuffer);</span> device.Run(); if (waitLocalHost == true) { Thread usbipServer = new Thread(usbipServer_Run); usbipServer.IsBackground = true; usbipServer.Start(); } KeyboardTest(keyboard); } } private static void usbipServer_Run(object obj) { foreach (Process process in Process.GetProcessesByName("usbip")) { process.Kill(); } // usbip attach -r 127.0.0.1 -b 1-1 Process.Start("usbip", "attach -r 127.0.0.1 -b 1-1"); } private static void KeyboardTest(KeyboardDevice keyboard) { //{ // string txt = "abc+*()<ime>xptmxm<ime>"; // _usbController.SendText(txt + Environment.NewLine); //} //{ // string txt = "<shift_down>abc<shift_up>"; // _usbController.SendText(txt + Environment.NewLine); //} //{ // string txt = "<ctrl_down><esc><ctrl_up>"; // _usbController.SendText(txt); //} //{ // string txt = "<capslock>test is good<capslock><return>"; // _usbController.SendText(txt); //} //{ // string txt = "<ctrl_down><shift_down><esc><shift_up><ctrl_up>"; // _usbController.SendText(txt); //} Console.WriteLine("Wait for usbip..."); while (true) { Console.Write("."); if (keyboard.Connected == true) { break; } Thread.Sleep(1000); } while (true) { Console.Write("Keyboard> "); string text = Console.ReadLine(); Thread.Sleep(2000); if (text == "quit") { keyboard.Dispose(); break; } keyboard.SendText(text); } } } } </pre> <br /> 빌드하고 실행하면, "장치 관리자"에 새로운 "HID Keyboard Device" 장치가 생기고 "keyboard.SendText(text);"에 넣는 글자에 따라 키 입력이 그대로 되는 것을 확인할 수 있습니다. (이제 더 이상 "Raspberry PI Zero"가 없어도 소프트웨어적으로 완벽하게 제어할 수 있는 USB 가상 키보드를 얻게 되었습니다. ^^)<br /> <br /> <hr style='width: 50%' /><br /> <br /> 참고로, "<a target='tab' href='https://github.com/cezanne/usbip-win'>cezanne / usbip-win</a>" 소스 코드를 빌드하면 당연히 테스트 인증서로 서명되므로 윈도우 10의 <a target='tab' href='https://www.sysnet.pe.kr/2/0/2914'>testsigning 옵션을 켜야</a> 합니다. 그런 후 "usbip.exe"로 다음과 같이 실행해 주면,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > c:\temp> <span style='color: blue; font-weight: bold'>usbip install</span> </pre> <br /> 설치가 됩니다. (물론, INF 파일을 이용해 장치 관리자에서 설치해도 됩니다.)<br /> <br /> 마지막으로, 제가 가지고 있던 책에서 관련 자료가 나오는데,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > 윈도우즈 드라이버 모델 : Writing Windows WDM Device Drivers ; <a target='tab' href='http://www.yes24.com/Product/goods/53240347'>http://www.yes24.com/Product/goods/53240347</a> </pre> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Test 6 Kbd report 1 0 0 0 0 0 0 0 Ctrl Kbd report 5 0 0 0 0 0 0 0 Ctrl+Alt Kbd report 5 0 63 0 0 0 0 0 Ctrl+Alt+Del Kbd report 4 0 0 0 0 0 0 0 Alt Kbd report 0 0 4 0 0 0 0 0 A Kbd report 0 0 5 0 0 0 0 0 B Kbd report 0 0 6 0 0 0 0 0 C Kbd report 0 0 29 0 0 0 0 0 Esc </pre> <br /> 위에서 보면, 제어 키는 0번, 문자 키는 2번 바이트에 할당됩니다. 즉, keyboard.SendText는 문자에 맞는 값으로 저 바이트 배열을 보내기만 하면 되는 것입니다. (실제로는 <a target='tab' href='https://www.sysnet.pe.kr/2/0/11369#reportid'>Report id</a> 값도 보내기 때문에 약간 다르긴 합니다.)<br /> </p><br /> <br /><hr /><span style='color: Maroon'>[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]</span> </div>
첨부파일
스팸 방지용 인증 번호
1639
(왼쪽의 숫자를 입력해야 합니다.)