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?

  1. PHP Bağımlılıkları: Kodun çalışabilmesi için PHP sunucunda openssl (şifreleme için) ve sockets (cihaza ham paket göndermek için) eklentilerinin aktif olması gerekir (XAMPP kullanıyorsan varsayılan olarak açıktır).

  2. Hız: Bu kod buluta gitmediği için tetiklediğin anda milisaniyeler içinde ışık açılır/kapanır.

  3. Local Key Neden Şart?: Tuya cihazları dışarıdan siber saldırı almamak için yerel ağda şifreli konuşur. localKey olmadan cihaza gönderilen paketler çöpe atılır. Bu anahtarı öğrenmek için internetteki "How to get Tuya Local Key" rehberlerine göz atabilir veya tuya-cli aracını kullanabilirsin.

Yorumlar

Bu blogdaki popüler yayınlar

Kablosuz Mikrofon FM Verici Modülü, 88-108MHz FM Verici Modül Kiti, Yüksek Frekanslı Elektronik Devre Deneyleri Ve Testleri Için Devre Kartı

Radyo vericisi

Radyo dalgaları