我正在尝试制作一个主要针对移动设备的PTP(图片传输协议)库。最终目标是创建一个应用程序(使用Xamarin或类似工具),该应用程序可在Windows 10(电话),Android和iOS上使用PTP与相机进行通信。主要目标是进行基于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替代品吗?
最佳答案
我一直在研究使用套接字的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);