rudestan/broadlink-api

Broadlink RM 设备 API 库

v1.1.0 2019-03-06 23:06 UTC

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扩展了设备的限制,使其变得更有趣。