.NET可移植类库中的USB访问

时间:2015-06-06 13:06:21

标签: c# .net xamarin portable-class-library

我正在尝试制作一个主要关注移动设备的PTP(图片传输协议)库。最终目标是创建一个应用程序(使用Xamarin或类似的东西),适用于使用PTP与摄像头通信的Windows 10(手机),Android和iOS。主要目标是通过IP进行PTP(用于无线控制和远程拍摄),但在我使用时,我想通过USB添加对PTP的支持,因此它也可以连接到USB连接的摄像头。

我发现mfptp似乎是这样做的,但它使用的是.NET Micro Framework和第三方USB库。我怀疑这是可移植到.NET可移植类库。

我也找到了this question about a .NET MTP/PTP wrapper,但其中的链接也没有那么有希望。到目前为止我发现的最有希望的是WPD API,但这似乎非常集中在Windows桌面上,并且需要使用COM来启动。

真正的问题是,有没有办法以跨平台的方式可靠地做到这一点?如果没有,GitHub上有.NET WPD Wrapper的替代品吗?

1 个答案:

答案 0 :(得分:0)

我一直在使用套接字对PTP / IP进行一些调查。将摄像机作为接入点连接后,即可向摄像机发送命令。 PTP / IP遵循PTP命令,您必须遵循初始化过程。您需要两个插槽,一个用于命令,另一个用于事件。我已经能够初始化连接但不能发出命令,我试图做的第一个是GetDeviceInfo。我发现这个链接有助于开始。

http://www.cipa.jp/ptp-ip/documents_e/CIPA_DC-005_Whitepaper_ENG.pdf

这是我在C#中使用套接字发送InitCMD的方式

// Length, 4  
// Type, 4  
// Initiator GUID, 16  
// Friendly Name, variable  
// Protocol Version, 4  
byte[] type = BitConverter.GetBytes(1);  
Guid g = Guid.NewGuid();  
byte[] guid = g.ToByteArray();  
byte[] host = Encoding.UTF8.GetBytes("HostName\0");  
byte[] version = BitConverter.GetBytes(1 << 16);  
int len = 4 + type.Length + guid.Length + host.Length + version.Length;  
byte[] length = BitConverter.GetBytes(len);  

byte[] data = length.Concat(type).Concat(guid).Concat(host).Concat(version).ToArray();  

s.Send(data);  

byte[] responseLen = new byte[4];  
int recvLen = s.Receive(responseLen, 4, SocketFlags.None);  
len = BitConverter.ToInt32(responseLen, 0) - 4;  

byte[] responseData = new byte[len];  
recvLen = s.Receive(responseData, len, SocketFlags.None);