我正在尝试制作一个主要关注移动设备的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的替代品吗?
答案 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);