我遇到了一个问题,即使用数据库将值写入特征之间的时间
[peripheral writeValue:dataPacket forCharacteristic:writeChar type:CBCharacteristicWithResponse]
Run Code Online (Sandbox Code Playgroud)
实际上物理发送蓝牙数据包的iOS设备正在逐渐变得越来越长.
这可以在调试器的以下输出中说明:
2013-10-23 14:12:17.510 Test App iOS[1561:60b] Packet sent
2013-10-23 14:12:17.595 Test App iOS[1561:60b] Packet sent confirmation, error = (null)
2013-10-23 14:12:17.598 Test App iOS[1561:60b] Packet response received
2013-10-23 14:12:17.611 Test App iOS[1561:60b] Packet sent
2013-10-23 14:12:17.656 Test App iOS[1561:60b] Packet sent confirmation, error = (null)
2013-10-23 14:12:17.657 Test App iOS[1561:60b] Packet response received
2013-10-23 14:12:22.601 Test App iOS[1561:60b] Packet sent
2013-10-23 14:12:23.123 Test App iOS[1561:60b] Packet sent confirmation, error = (null)
2013-10-23 14:12:23.125 Test …
Run Code Online (Sandbox Code Playgroud) 我是一位多年经验丰富的MFC程序员,近年来他一直在使用Objective C for Mac和iOS开发商业应用程序 - 我正在努力加快.Net和C#的速度(我很快就会这样做)需要将我的一个商业应用程序从Mac转换为PC).
我现在已经完成了几本书的练习,并且为了更熟悉.Net(和C#),我决定将我的一个非商业应用程序转换为.Net作为学习练习一切顺利(界面正常,数据结构都很好)但我需要能够播放音频.
我的Mac应用程序从一系列数学公式生成音频 - 想象一个波浪发生器 - 不完全相同但相似.在Mac上,我将音频生成为16位带符号的原始音频,使用Core Audio设置音频输出路由,然后在音频路由需要新的音频缓冲区时进行回调(这样我就可以动态生成音频) .
我需要在PC上做同样的事情.不幸的是,我发现MSDN文档是"无法看到树木"的案例,因为有大量的文档.我可以找到能让我加载和播放mp3/wav等文件的类,但我需要实时生成音频.任何人都可以指出我正确的方向找到一些东西,可以让我在播放时动态填充缓冲区吗?
谢谢
我有两个应用程序,一个作为外围设备(在运行iOS 7的iPad第四代)和一个作为中心(运行iOS7的iPhone 5c).
我希望在外围设备中具有可写特性,中央将少量字节写入(大约4个字节但可能因执行而异).
我正在配置外设如下:
-(void)startPeripheral
{
CBMutableService *service = [[CBMutableService alloc]initWithType:[CBUUID UUIDWithString:kMyServiceUUID] primary:YES];
CBMutableCharacteristic *ch = [[CBMutableCharacteristic alloc]initWithType:[CBUUID UUIDWithString:kMyWriteUUID] properties:CBCharacteristicPropertyWrite value:nil permissions:CBAttributePermissionsWriteable];
service.characteristics = @[ch];
NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:@[[CBUUID UUIDWithString:kMyServiceUUID]], CBAdvertisementDataServiceUUIDsKey, @"My Peripheral", CBAdvertisementDataLocalNameKey, nil];
[self.peripheralManager addService:service];
[self.peripheralManager startAdvertising:dict];
NSLog(@"Service = %@",service);
}
Run Code Online (Sandbox Code Playgroud)
这一切似乎都起作用,外围设备宣传服务,我的中心可以扫描,查找,发现服务和特征,并找到它感兴趣的特性.当我尝试写入特性时出现问题.
在中央我有以下方法:
-(void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error
{
NSLog(@"Service/Characteristics = %@",service.characteristics);
for(CBCharacteristic *ch in service.characteristics)
{
NSLog(@"Characteristic properties = %x",ch.properties);
NSLog(@"Characterisctic = %@",ch.UUID);
if([ch.UUID isEqual:[CBUUID UUIDWithString:kMyWriteUUID]])
{
// We've found our write characteristic
NSLog(@"Writing …
Run Code Online (Sandbox Code Playgroud) 我想知道是否有人可以提供任何帮助,这是一个专家问题.
我有一个应用程序需要读取和分析许多USB设备(不是同时,它们分别在单独的测试中运行,理论上可以在不同的机器上运行).
每个USB设备都基于USB HID类,由不同的公司制造,这些USB设备都不是设计在PC上运行,而是用于不同的平台,但是为了测试设备的目的,客户端已请求从PC运行测试应用程序.
一些设备将启动,被Windows识别,它们将使用内置于Windows中的通用HID类驱动程序初始化并正确启动它们,然后设备将开始发送要测试的数据的正确数据包.
一些设备将启动,被Windows识别,它们会尝试启动它们,但无法完全初始化它们,使它们处于半初始化状态.这是好的,因为我可以用我的小猎犬协议分析仪从真正的平台捕捉初始化分组,然后使用LibUSBDotNet库复制在初始化序列滞留分组,让他们正确地开始发送数据包.
我遇到的问题是使用一个特定的设备(虽然还有一些我还没有测试过,所以很可能其中一个也可能出现同样的问题).问题是Windows HID类驱动程序识别设备并尝试初始化和启动它,这在时尚之后工作并且设备开始发送数据.
问题是发送的数据与发送到真实平台的数据不同(仅包含完整数据的子集).就好像Windows已将设备初始化为不同的模式.
当我使用USB协议分析器从PC和真实平台捕获初始化数据包时,我发现Windows正在发送一些略有不同的初始化数据包.一旦Windows启动,使用LibUSBDotNet重新发送正确的数据包该设备似乎没有任何效果.
我的问题是我需要阻止Windows尝试使用标准HID类驱动程序初始化设备,我尝试在设备管理器中删除驱动程序,但它仍然初始化它(并且驱动程序在设备管理器中神奇地重新分配).我做了一些调查,有可能的选择:
创建一个特定的驱动程序,窗口将分配给设备的特定VID/PID,但什么都不做,然后我可以使用LibUSBDotNet从我自己的代码中向设备发送正确的初始化序列.
使用像WinUSB这样的东西为设备创建一个合适的驱动程序(或者可能创建一个像"死"的驱动程序.
Windows中是否会使用具有特定VID/PID的驱动程序,而不是内置的USB HID类驱动程序?如果没有,那么我会浪费时间沿着这条路走?
请注意,我的mac正确地初始化了问题设备,并且我已经询问了客户端是否可以为Mac开发应用程序的问题,他们的答案仅令Windows感到沮丧.
我没有编写正确的Windows驱动程序的经验,尽管我有相对较低级别与USB通信的经验(因此该部分不会太担心).任何人都可以建议一个良好的行动方案(在我可能浪费数周之前调查如何为PC编写驱动程序,但却发现我选择的行动方案无法满足我的要求).
任何帮助或建议非常感谢.
谢谢,Rich
尝试以下建议后添加:
我尝试使用LibUsbDotNet INF向导创建必要的文件和安装它们,这似乎工作 - 当然,该设备现在是出现在设备管理器中作为的libusb-win32的设备 - 不HID设备和相关的驱动程序的libusb驱动程序.即使在这样做之后,设备似乎仍然会被初始化并开始发送错误类型的数据包,尽管现在这些数据包不再由类驱动程序处理而且只是丢失了.
我也遇到了Zadig,它有一个类似于WinUSB的inf创建向导,它有完全相同的结果.
一位同事建议,将设备切换到此模式可能不是Windows本身,而是设备识别它已连接到Windows机器并将其自身切换到此模式.我怀疑是这种情况,在这种情况下我被困住了 - 是时候与客户进行另一次对话了.
非常感谢您的帮助.
我对.net/C#相对较新(虽然在Win32/MFC和其他平台上非常有经验)并且需要编写一个实用程序来与自定义USB HID设备通信.该协议非常简单,我已经有了一个用MFC编写的工作实用程序,但我更愿意在.Net/C#中编写该实用程序,因为我试图随着时间的推移而离开MFC.
我做了一些调查,发现这篇文章似乎有助于我理解如何从.Net/C#访问HID设备,特别是因为它只是调用了我已经熟悉的Win32 API调用:
http://www.developerfusion.com/article/84338/making-usb-c-friendly/
提供的示例代码给了我一个很好的介绍,如何访问Win32 API调用与USB设备通信(就像我以前的MFC代码一样),这一切都适用于Windows Vista或7的32位安装,但是当我尝试在64位安装上运行相同的代码,但它失败了.即使我尝试创建专用的64位应用程序,它仍然会失败.
我很确定问题是Marshal如何将参数(在堆栈上?)传递给Win32 API,但是我在这个阶段对.Net/C#的知识和经验还不够准确地理解问题是如何解决它 - 问题可能比我目前的水平更先进.
在我达到指令之前,一切似乎都在代码中正常工作......
while (SetupDiEnumDeviceInterfaces(hInfoSet, 0, ref gHid, (uint)nIndex, ref oInterface)) // this gets the device interface information for a device at index 'nIndex' in the memory block
Run Code Online (Sandbox Code Playgroud)
其中SetupDI ...在32位系统上返回true,然后遍历所有连接的USB设备,但在64位系统上返回false.我很确定这可能是参数如何传递到Win32 API函数的问题,但我不明白究竟是什么问题.该函数的DLLImport定义是:
[DllImport("setupapi.dll", SetLastError = true)] protected static extern bool SetupDiEnumDeviceInterfaces(IntPtr lpDeviceInfoSet, uint nDeviceInfoData, ref Guid gClass, uint nIndex, ref DeviceInterfaceData oInterfaceData);
Run Code Online (Sandbox Code Playgroud)
我想知道是否有人能够建议可能的违规参数是什么以及我如何解决它?
在此先感谢您提供的任何帮助,如果需要更多信息,请提出要求!丰富