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

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

我正在尝试制作一个主要针对移动设备的 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/

相关文章:

c# - 如何使用子类制作由数据模板实现的基础数据模板?

c# - 如果一个对象没有静态字段,我是否需要担心它是线程安全的?

c# - 使用 SqlCommand 返回值

c# - 如何使用 webkit 浏览器引擎构建 web 浏览器 for windows

android - Google Maps API - 从郊区的起点到终点标记一条街道

c# - 创建和使用我自己的纹理图集的 mipmap

.net - 如何获得机器的正常运行时间?

c# - 后台 Excel 线程未被杀死 C#

ios - 使用 Xamarin 捕获 iOS UITextField 清除事件

ios - 在 xamarin 中调整单元格大小