rudestan / broadlink-api
Broadlink RM 设备 API 库
Requires
- php: >=7.2.0
- ext-json: *
- ext-openssl: *
- ext-sockets: *
Requires (Dev)
- phpstan/phpstan: ^0.11.2
This package is not auto-updated.
Last update: 2024-09-18 11:20:34 UTC
README
一个用于控制红外和无线433MHz控制器(例如RM设备)、智能插座(例如SP2/SP3)的PHP 7库,来自Broadlink。协议参考:mjg59/python-broadlink
原始代码参考:ThePHPGuys/broadlink。
与"ThePHPGuys"的原版实现有什么不同?
- 增加了RM3 Pro Plus的全功能支持(学习模式、接收和发送命令),因此可以在api中完全使用
- 增加了SP2/SP3设备的支持(开关电源、开关夜灯、获取电源/夜灯状态)
- 代码重构,逻辑稍简化
- 代码格式化并清理,以便易于理解流程
使用方法
发现设备
use BroadlinkApi\Device\NetDevice; $discovered = (NetDevice::create())->discover();
代码将生成一个数组,包含相应的Authenticatable(扩展自AbstractAuthenticatableDevice::class
)设备实例或/和包含UnknownIndetifiedDevice::class
实例的数组,如果没有发现未知设备或发现了一些未知设备。
授权设备(获取密钥)
要控制之前发现的RM设备,它必须经过认证。假设$discovered
数组中的第一个设备是RMDevice
类的实例(或任何扩展自AbstractAuthenticatableDevice::class
的类)。代码将类似于以下内容
use BroadlinkApi\Device\AuthenticatableDeviceInterface; use BroadlinkApi\Exception\ProtocolException; /** @var AuthenticatableDeviceInterface $device */ $device = $discovered[0]; try { $device->authenticate(); } catch(ProtocolException $e) { echo $e->getMessage(); }
将设备设置为学习模式
在RM设备经过认证后,我们可以将其设置为学习模式以接收来自任何遥控器的命令。以下代码将设置设备为学习模式,前提是设备类是RMDevice的实例。
use BroadlinkApi\Device\Authenticatable\RMDevice; if ($device instanceof RMDevice) { try { $device->enterLearning(); } catch(ProtocolException $e) { echo $e->getMessage(); } }
从设备接收最后学习到的命令
一旦RM设备处于学习模式,我们就可以接收最后学习到的命令。我们还需要等待命令到达,因此示例代码可能如下所示
$command = null; while(true) { $command = $device->getLearnedCommand(); sleep(1); if ($command !== null) { break; } } var_dump($command->toArray());
一旦收到命令,将返回一个Packet::class
的实例。
向设备发送命令
从RMDevice::getLearnedCommad()
收到数据包后,可以通过调用Packet::toArray()
方法将其转换为数组。转换后的数组可以轻松存储在例如JSON文件或数据库中,以后可以重新使用以在设备上重现此命令。要发送之前学习到的命令,可以使用以下代码
use BroadlinkApi\Exception\ProtocolException; try { $device->sendCommand($command); } catch (ProtocolException $e) { echo $e->getMessage(); }
其他使用示例
如果设备的IP和MAC地址以及命令(例如从JSON加载)已知(例如之前已保存),则可以轻松使用该设备来触发此命令。可能的代码如下所示
use BroadlinkApi\Device\Authenticatable\RMDevice; use BroadlinkApi\Exception\ProtocolException; use BroadlinkApi\Packet\Packet; // Let's assume that $commandJson is json encoded array with received command $commandCode = json_decode($commandJson, true); $command = Packet::fromArray($commandCode); $rmDevice = new RMDevice('192.168.1.1', '77:0f:71:b9:5e:82'); try { $device->authenticate(); $device->sendCommand($command); } catch(ProtocolException $e) { echo $e->getMessage(); }
用例
以下API可以用于连接Google Home或Alexa与Broadlink RM Pro(例如通过Raspberry PI作为代理中心)。或者另一种用法可以创建一些Android的Web小部件,而不是使用有限的官方Broadlink应用。此API扩展了设备的限制,使其变得更有趣。