我正在构建一个控制三个飞利浦色调RGB LED灯泡的应用程序。我希望能够使用UISlider更改亮度。目前我有一个UISlider在每次更改时都调用一个方法,但是,这种方法远远超过philips hue bridge的每秒10个命令限制。这是我调用UI滑块更改的方法。
- (void) changeBulbBrightness: (NSNumber *)currentBrightness
{
NSTimeInterval timeInterval = [self.timeLastCommandSent timeIntervalSinceNow];
NSLog(@"Time Since Last command: %f", timeInterval);
if (timeInterval < -0.3)
{
NSLog(@"COMMAND SENT!!!!");
PHBridgeResourcesCache *cache = [PHBridgeResourcesReader readBridgeResourcesCache];
PHBridgeSendAPI *bridgeSendAPI = [[PHBridgeSendAPI alloc] init];
for (PHLight *light in cache.lights.allValues)
{
PHLightState *lightState = light.lightState;
//PHLightState *lightState = [[PHLightState alloc] init];
if (lightState.on)
{
[lightState setBrightness:currentBrightness];
// Send lightstate to light
[bridgeSendAPI updateLightStateForId:light.identifier withLightState:lightState completionHandler:^(NSArray *errors) {
/*if (errors != nil) {
NSString *message = [NSString stringWithFormat:@"%@: %@", NSLocalizedString(@"Errors", @""), errors != nil ? errors : NSLocalizedString(@"none", @"")];
if (self.loggingOn)
{
NSLog(@"Brightness Change Response: %@",message);
}
}
*/
}];
}
self.timeLastCommandSent = [[NSDate alloc]init];
}
}
self.appDelegate.currentSetup.brightnessSetting = currentBrightness;
NSLog(@"Brightness Now = %@", currentBrightness);
我已尝试制作一个计时器,将命令数量限制为每秒10次,但桥接器仍然采用与命令淹没时相同的方式(停止接受所有命令)。任何帮助或方向将不胜感激。提前谢谢!
答案 0 :(得分:0)
一个原因可能是你的多个灯。您正在为每个灯发送更新命令。因此,如果您在Hue入门套件中连接了3个灯泡,如果有一些不幸的缓存涉及将更新从2秒打包到1秒发送,您可能仍会发送10或更多。因此,我建议您进一步减少发送的更新数量(尝试0.5或甚至1.0)作为间隔,看看它是否会变好。
另请注意,SDK对速率限制非常模糊。它说:
如果你大致大约每秒10个命令
由于飞利浦Hue SDK通常没有得到很好的支持(请查看开放的GitHub问题),请花一点时间进行自己的实验。一旦我有时间自己检查,我会在这里发布更新。
更新1:我刚刚发现了Hue SDK github repo(也许是飞利浦员工)的贡献者之一this remark,建议每秒只发送2个命令:
如前所述,在循环中执行大量请求时要小心,因为对PHBridgeSendAPI的调用没有阻塞,请求会被保留,直到它们得到响应或超时。每秒两个呼叫似乎是一个安全的速率,如果你想要更高的速率,建议用你自己的排队机制链接请求(以确保在新请求被调用之前释放内存)。