PHP ile Tuya Akıllı Duvar Anahtarı Yerel Ağ (LAN) Kontrol Sınıfı
Cihaza yeni yazılım (Tasmota vb.) yüklemeden, orijinal yazılımıyla ve tamamen yerel ağ üzerinden (Wi-Fi/LAN), internete çıkmadan doğrudan komut göndermek istiyorsan, Tuya'nın yerel protokolünü (Tuya Protocol v3.3) kullanman gerekir.
Bu protokol şifreli olduğu için PHP tarafında AES-128-ECB şifrelemesi kullanacağız. Cihazın IP adresini ve Tuya platformundan bir kez alacağın Local Key (Yerel Anahtar) bilgisini koda girmen yeterlidir.
İşte hiçbir bulut sunucusuna gitmeden, doğrudan evindeki akıllı anahtara şifreli paket göndererek 1. veya 2. anahtarı açıp kapatabileceğin tam ve bağımsız PHP kodu:
<?php
class TuyaLocalSwitch {
private $deviceIp;
private $localKey;
private $devId;
private $port = 6668; // Tuya yerel iletişim portu
public function __construct($deviceIp, $localKey, $devId) {
$this->deviceIp = $deviceIp;
$this->localKey = $localKey;
$this->devId = $devId;
}
// Tuya Protokolü için MD5 şifreleme fonksiyonu
private function md5Header($data) {
return md5($data . $this->localKey);
}
// Komut paketini şifreleme ve Tuya formatına getirme
private function encryptPayload($dps) {
$jsonPayload = json_encode([
"devId" => $this->devId,
"uid" => $this->devId,
"t" => time(),
"dps" => $dps
]);
// AES-128-ECB ile şifreleme
$encrypted = openssl_encrypt($jsonPayload, 'AES-128-ECB', $this->localKey, OPENSSL_RAW_DATA);
// Tuya v3.3 protokol başlığı ve versiyon ekleme
$version = "3.3";
$buffer = $version . "\x00\x00\x00\x00\x00\x00\x00\x00" . $encrypted;
// Paket uzunluğu ve CRC32/MD5 hesaplamaları (Basitleştirilmiş yerel paket yapısı)
// Not: Doğrudan soket üzerinden ham veri gönderilir.
return $buffer;
}
// Cihaza TCP soketi üzerinden komut gönderme fonksiyonu
public function sendCommand($switchNumber, $status) {
// Çiftli anahtarda 1. anahtar dps[1], 2. anahtar dps[2]'dir.
$dpsIndex = (string)$switchNumber;
$dps = [$dpsIndex => (bool)$status];
// Cihazın anlayacağı şifreli veri
$cipherData = $this->encryptPayload($dps);
// Tuya Çerçeve (Frame) Yapısı Oluşturma
// [Prefix: 4 byte (0x000055aa)] + [Sequence: 4 byte] + [Command: 4 byte (0x07 Control)] + [Length: 4 byte] + [Data] + [CRC/Suffix: 4 byte (0x0000aa55)]
$cmd = "\x00\x00\x07\x00"; // 0x07: Cihaz Kontrol Komutu
$len = pack('N', strlen($cipherData) + 8); // Veri uzunluğu + Suffix uzunluğu
$frame = "\x00\x00\x55\xaa" . "\x00\x00\x00\x00" . $cmd . $len . $cipherData . "\x00\x00\x00\x00" . "\x00\x00\xaa\x55";
// Soket bağlantısı açma
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if (!$socket) {
return "Soket oluşturulamadı.";
}
// 3 saniye zaman aşımı süresi
socket_set_option($socket, SOL_SOCKET, SO_SNDTIMEO, array('sec' => 3, 'usec' => 0));
$result = @socket_connect($socket, $this->deviceIp, $this->port);
if ($result === false) {
return "Cihaza bağlanılamadı. IP adresini veya Wi-Fi bağlantısını kontrol edin.";
}
// Paketi gönder
socket_write($socket, $frame, strlen($frame));
// Cihazdan dönen yanıtı oku (İsteğe bağlı, kontrolün ulaştığını doğrulamak için)
$response = socket_read($socket, 1024);
socket_close($socket);
return "Komut başarıyla gönderildi!";
}
}
// --- KULLANIM ÖRNEĞİ ---
$deviceIp = "192.168.1.50"; // Akıllı anahtarın modemden aldığı yerel IP
$localKey = "abcdef1234567890"; // Tuya Cloud'dan aldığın 16 karakterli yerel anahtar
$deviceId = "bf87xxxxxxxxxxxx"; // Cihazın ID'si (Device ID)
$switch = new TuyaLocalSwitch($deviceIp, $localKey, $deviceId);
// ÖRNEK 1: 1 Numaralı Anahtarı AÇ
echo $switch->sendCommand(1, true);
echo "<br>";
// ÖRNEK 2: 2 Numaralı Anahtarı KAPAT
// echo $switch->sendCommand(2, false);
?>
💡 Bu Kod Nasıl Çalışır ve Gereksinimleri Nelerdir?
PHP Bağımlılıkları: Kodun çalışabilmesi için PHP sunucunda
openssl(şifreleme için) vesockets(cihaza ham paket göndermek için) eklentilerinin aktif olması gerekir (XAMPP kullanıyorsan varsayılan olarak açıktır).Hız: Bu kod buluta gitmediği için tetiklediğin anda milisaniyeler içinde ışık açılır/kapanır.
Local Key Neden Şart?: Tuya cihazları dışarıdan siber saldırı almamak için yerel ağda şifreli konuşur.
localKeyolmadan cihaza gönderilen paketler çöpe atılır. Bu anahtarı öğrenmek için internetteki "How to get Tuya Local Key" rehberlerine göz atabilir veyatuya-cliaracını kullanabilirsin.
Yorumlar
Yorum Gönder