我正在尝试制作一个主要针对移动设备的 PTP(图片传输协议(protocol))库。最终目标是创建一个可在 Windows 10(手机)、Android 和 iOS 上使用 PTP 与相机通信的应用程序(使用 Xamarin 或类似软件)。主要目标是通过 IP 进行 PTP(用于无线控制和远程拍摄),但在我这样做的同时,我想添加对通过 USB 的 PTP 的支持,这样也可以连接到 USB 连接的相机。
我找到了 mfptp这似乎是这样做的,但它使用了 .NET Micro Framework 和第三方 USB 库。我怀疑这是否可移植到 .NET 可移植类库。
我还找到了 this question about a .NET MTP/PTP wrapper ,但其中的链接也不是那么有前途。到目前为止我发现的最有希望的是 WPD API但这似乎主要针对 Windows 桌面,并且需要使用 COM 来启动。
真正的问题是,有没有办法以跨平台的方式可靠地做到这一点?如果没有,是否有 .NET WPD Wrapper 的替代方案?在 GitHub 上?
最佳答案
我一直在使用套接字对 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);
关于c# - .NET 可移植类库中的 USB 访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30683221/