我应该怎么做才能在firebase中更改或请求令牌?firebase根据设备信息生成的唯一令牌.
device-instance-id ios firebase swift firebase-cloud-messaging
我已经使用RegisterDeviceNotification注册了一个窗口,并且可以成功接收DEV_BROADCAST_DEVICEINTERFACE消息.但是,dbcc_name返回的结构中的字段始终为空.我所拥有的结构定义如下:
[StructLayout(LayoutKind.Sequential)]
public struct DEV_BROADCAST_DEVICEINTERFACE
{
public int dbcc_size;
public int dbcc_devicetype;
public int dbcc_reserved;
public Guid dbcc_classguid;
[MarshalAs(UnmanagedType.LPStr)]
public string dbcc_name;
}
Run Code Online (Sandbox Code Playgroud)
我正在使用WM_DEVICECHANGE消息Marshal.PtrToStructure的LParam.
这应该有用吗?
或者甚至更好......是否有另一种方法可以在连接时获取设备的名称?
编辑(02/05/2010 20:56GMT):
我发现如何通过执行以下操作来填充dbcc_name字段:
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public struct DEV_BROADCAST_DEVICEINTERFACE
{
public int dbcc_size;
public int dbcc_devicetype;
public int dbcc_reserved;
public Guid dbcc_classguid;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst=255)]
public string dbcc_name;
}
Run Code Online (Sandbox Code Playgroud)
但我仍然需要一种从int dbcc_name获取"友好"名称的方法.它看起来如下:
\?\ USB#VID_05AC&PID_1294&MI_00#0#{6bdd1fc6-810f-11D0-BEC7-08002BE2092F}
而我真的只想说"苹果iPhone"(在这种情况下就是设备).
给定网卡的设备实例ID,我想知道它的MAC地址.集成Intel千兆卡的系统上的设备实例ID示例:
PCI\VEN_8086&DEV_10CC&SUBSYS_00008086&REV_00\3&33FD14CA&0&C8
Run Code Online (Sandbox Code Playgroud)
到目前为止,我使用的算法的工作原理如下:
SetupDiGetClassDevs给DIGCF_DEVICEINTERFACE.SetupDiEnumDeviceInfo以获取返回的设备SP_DEVINFO_DATA.SetupDiEnumDeviceInterfaces与GUID_NDIS_LAN_CLASS得到一个设备接口.SetupDiGetDeviceInterfaceDetail此返回的设备接口.这使我们将设备路径作为字符串: \\?\pci#ven_8086&dev_10cc&subsys_00008086&rev_00#3&33fd14ca&0&c8#{ad498944-762f-11d0-8dcb-00c04fc3358c}\{28fd5409-15bd-4c06-b62f-004d3a06f852}CreateFile使用#4的结果打开它.DeviceIoControl使用IOCTL_NDIS_QUERY_GLOBAL_STATS和OID 调用OID_802_3_PERMANENT_ADDRESS以获取MAC地址.这通常有效,并已在相当多的机器上成功使用.但是,似乎很少有机器的网络驱动程序DeviceIoControl在步骤#6 中没有对请求做出正确响应; 即使将网卡驱动程序更新到最新版本后问题仍然存在.这些是较新的基于Windows 7的计算机.具体来说,DeviceIoControl成功完成,但返回零字节而不是包含MAC地址的预期六个字节.
一条线索似乎在MSDN页面上IOCTL_NDIS_QUERY_GLOBAL_STATS:
此IOCTL将在以后的操作系统版本中弃用.您应该使用WMI接口来查询微型端口驱动程序信息.有关更多信息,请参阅NDIS对WMI的支持.
- 也许更新的网卡驱动程序不再实现这个IOCTL?
那么,我应该怎么做呢?是否有可能在我的方法中存在疏忽并且我做了一些稍微错误的事情?或者我需要采取更加不同的方法吗?一些替代方法似乎包括:
Win32_NetworkAdapterWMI类:提供所需信息但由于性能糟糕而被拒绝.请参阅Win32_NetworkAdapter WMI类的快速替换以获取本地计算机的MAC地址MSNdis_EthernetPermanentAddressWMI类:似乎是WMI的替代品,IOCTL_NDIS_QUERY_GLOBAL_STATS并直接从驱动程序查询OID - 这个工作在麻烦的网络驱动程序上.不幸的是,返回的类实例只提供MAC地址和InstanceName,这是一个本地化的字符串Intel(R) 82567LM-2 Gigabit Network Connection.查询MSNdis_EnumerateAdapter产生其涉及的一个列表InstanceName到DeviceName,像\DEVICE\{28FD5409-15BD-4C06-B62F-004D3A06F852}.我不知道如何从DeviceName即插即用设备实例ID(PCI\VEN_8086...... …我得到一个设备实例路径,例如
L"\\\\?\\USB#VID_0403&PID_6001#6&2cc2d230&0&2#{219d0508-57a8-4ff5-97a1-bd86587c6c7e}"
Run Code Online (Sandbox Code Playgroud)
来自IWDFRemoteInterfaceInitialize::RetrieveSymbolicLink。
但对于CM_Get_Parent我需要设备的 DEVINST/DWORD 这让我发疯。
我试过例如
instancePath = L"\\\\?\\USB#VID_0403&PID_6001#6&2cc2d230&0&2#{219d0508-57a8-4ff5-97a1-bd86587c6c7e}";
HDEVINFO hinfo = SetupDiGetClassDevs(NULL, instancePath, NULL, DIGCF_DEVICEINTERFACE | DIGCF_ALLCLASSES);
Run Code Online (Sandbox Code Playgroud)
和其他一些SetupDi...巫毒没有成功。非常感谢任何帮助,因为 - 正如所提到的 - 我现在几个小时都无法解决这种疯狂问题,尽管有数十个相反的示例(devid->实例路径),但我还没有找到任何实例路径->DEVINST。
我有两个USB设备ID,例如USB\VID_E4F1&PID_0661\00000115FA9CE7750000000000000000和USB\VID_E4F1&PID_0661&MI_00\7&B5A5DDF&0&0000
如何验证2号设备是1号设备的直接子代(实际上它们是同一USB复合设备的不同部分)?
在现实生活中,将有许多连接到相同的USB控制器。而且,它们可能具有相同的制造商和型号。这就是为什么我无法验证VID,PID,并无法使用Win32_USBControllerDeviceWMI查询来验证它们是否已插入相同的USB控制器-我需要以某种方式验证父子关系,而不仅仅是它们已插入同一控制器的事实。
如果有问题,我只需要支持Windows 8+。
我正在尝试在 Windows 系统上唯一地识别 USB 设备。由于序列号是可选的(并且在大多数设备上为空),我正在查看实例 ID。的领域,就像USB\VID_03F0&PID_094A\6&24b73976&0&2。
我已经知道如果我将同一设备插入不同的端口,这个 ID 会发生变化,但这对我来说没问题。问题是:如果我使用相同的设备(在我的示例中为鼠标)并将其插入,它会获得相同还是不同的实例 ID?
我做了一些研究,似乎没有人完全知道 VID 和 PID 背后的部分是什么。它们似乎可以识别端口和/或集线器,但是如果我将不同的设备插入同一个插槽,我不仅会看到不同的 VID 和 PID,还会看到不同的垃圾。例如,这是插入同一端口的键盘:USB\VID_046D&PID_C328&MI_00\7&3f9ff46&0&0000
Microsoft 文档和此处的相关问题均未回答此问题。
如果我有两个相似的鼠标(或键盘,或其他),即相同的制造商和型号,如果我将它们插入相同的端口,它们会获得相同或不同的实例 ID?
我是否有机会唯一标识特定设备(不仅仅是型号)?
我正在开发一个 MFC 工具,用于检查已连接 USB 设备的一些驱动程序信息,例如位置信息、父设备、硬件 ID 等。我已经获得了我想要的所有其他信息,但我一直在获取设备父设备信息。
我已经使用Setupapi.dll在我的代码中获取设备信息。使用SetupDiGetClassDevs函数获取 USB 设备信息句柄。使用SetupDiEnumDeviceInfo函数获取特定设备信息数据。使用SetupDiGetDeviceRegistryProperty函数获取设备描述和硬件 ID 。
// List all connected USB devices
hDevInfo = SetupDiGetClassDevs(pClassGuid, pszEnumerator,
NULL, pClassGuid != NULL ? DIGCF_PRESENT : DIGCF_ALLCLASSES |
DIGCF_PRESENT);
// Get device info data
SetupDiEnumDeviceInfo(hDevInfo, i, &DeviceInfoData);
// Get device instance id
CM_Get_Device_ID(DeviceInfoData.DevInst, szDeviceInstanceID, MAX_PATH,
0);
// Get device description
SetupDiGetDeviceRegistryProperty(hDevInfo, &DeviceInfoData,
SPDRP_DEVICEDESC,
&dwPropertyRegDataType, (BYTE*)szDesc, sizeof(szDesc), &dwSize);
#define DEFINE_DEVPROPKEY(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, …Run Code Online (Sandbox Code Playgroud) 如何从驱动器号获取设备实例ID?
我的过程从设备到达消息开始。我已经成功地从到达消息中获取了驱动器号并打开了DVD托盘。
我搜索了各种Setup API项目;但是我还没有发现任何让我从驱动器号到设备实例ID的东西。
使用C#或VB.NET的解决方案将是理想的,但是只要我能看到API调用,我愿意从任何其他语言中找出解决方案。
提前致谢...