小米智能家居之Yeelight智能灯开放API开发尝试
·
这两年,智能家居发展变慢了,似乎是泡沫后的沉淀。各方协议不统一,也限制了智能家居的普及。
小米旗下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
更多推荐
所有评论(0)