这两年,智能家居发展变慢了,似乎是泡沫后的沉淀。各方协议不统一,也限制了智能家居的普及。

小米旗下Yeelight开放了API,好兴奋,赶紧来写个程序试试。协议下载:http://download.csdn.net/detail/syrchina/9591516,下面介绍下用QT来写个程序控制灯。灯包括灯泡灯带

按照通信协议,控制Yeelight灯需要如下步骤:

1. App UDP广播特定字符串;

2. 灯收到上述广播后回应字符串,包含IP、ID;

3. App拿到上述灯信息后,建立TCP连接;

4. App按照通信协议中的命令,即可控制灯的开关、亮度、颜色等。


Demo:

//UDP广播,探测设备
    QByteArray datagram = "M-SEARCH * HTTP/1.1\r\n\
HOST: 239.255.255.250:1982\r\n\
MAN: \"ssdp:discover\"\r\n\
ST: wifi_bulb";

    int ret = udp_socket.writeDatagram(datagram.data(), datagram.size(), mcast_addr, udp_port);
    qDebug()<<"udp write "<<ret<<" bytes";

//分析收到灯的回应信息,提取IP、ID
// 是否有待处理的信号
        qDebug()<<"udp receive data";
        udp_datagram_recv.resize(udp_socket.pendingDatagramSize()); //以数据包的大小初始化datagram
        udp_socket.readDatagram(udp_datagram_recv.data(), udp_datagram_recv.size()); //读取数据
        qDebug()<<udp_datagram_recv.data();

        QByteArray start_str;
        QByteArray end_str;
        QByteArray rtn_str;

        //提取bulb_ip
        start_str.clear(); end_str.clear(); rtn_str.clear();
        start_str.append("Location: yeelight://");
        end_str.append(":");
        sub_string(start_str, end_str, rtn_str);
        if(rtn_str.isEmpty() == false)
        {
            bulb_ip = rtn_str;
        }

        //提取bulb_id
        start_str.clear(); end_str.clear(); rtn_str.clear();
        start_str.append("id: ");
        end_str.append("\r\n");
        sub_string(start_str, end_str, rtn_str);
        if(rtn_str.isEmpty() == false)
        {
            bulb_id_str = rtn_str;
        }

        //过滤重复探测到的bulb
        bulb_t bulb_tmp(bulb_ip.toStdString(), bulb_id_str.toStdString());
        ib = std::find(bulb.begin(), bulb.end(), bulb_tmp);
        if (ib == bulb.end())
        {
            bulb.push_back(bulb_tmp);

            QStringList items;
            QString tmp;
            tmp = bulb_ip;
            items << tmp;
            ui->comboBox->addItems(items);
        }
//建立TCP连接
    tcp_socket.close();//关闭上次的连接
    int device_idx = ui->comboBox->currentIndex();
    if(bulb.size() > 0)
    {
        tcp_socket.connectToHost(QHostAddress(bulb[device_idx].get_ip_str().c_str()), bulb[device_idx].get_port());
    }
    else
    {
        qDebug()<<"Bulb is empty";
    }

//发送控制命令
    QByteArray *cmd_str =new QByteArray;
    cmd_str->clear();
    cmd_str->append("{\"id\":");

    int device_idx = ui->comboBox->currentIndex();
    if(bulb.size() > 0)
    {
        cmd_str->append(bulb[device_idx].get_id_str().c_str());
        qDebug() << "combox index  = " << device_idx;

        cmd_str->append(",\"method\":\"toggle\",\"params\":[]}\r\n");
        tcp_socket.write(cmd_str->data());
        qDebug() << cmd_str->data();
    }
    else
    {
        qDebug()<<"Bulb is empty";
    }

本QT程序是跨平台的,可以编译成Win/Android等平台可执行程序,完整源代码下载: http://download.csdn.net/detail/syrchina/9592080

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐