使用Qt上位机获取esp8266nodemcu的相关数据并插入数据库中,旨在实现相关控制与插入功能,后续的数据可视化可以参考大佬们的demo
通信协议采用UDP(TCP同理),通过ip地址与端口实现数据获取与显示,主要用到socket。
por文件添加network、与sql。
QT += core gui network
QT += sql
cpp文件。
void Widget::on_pushButton_2_clicked()
{
My_Port = ui->MyPort_Edit->text();
//My_Port为string类型,bind为int型
//绑定端口号,监听发送到端口的所有信息
m_udpSocket->bind(My_Port.toUInt());
}
这里的m_udpSocket为自定义的QUdpSocket指针
f1 udpsocket了解udp通信下的接受信号与槽,连接信号与槽实现数据显示;
参考
注意socket套接字触发的信号。
// 接受信息代码:
//接受信息
void Widget::recevMsg()
{
QHostAddress clientIP;
quint16 clientPort;
char buf[1024]={0};
while (m_udpSocket->hasPendingDatagrams()) {
m_udpSocket->readDatagram(buf,sizeof(buf),&clientIP,&clientPort);
//定义数据格式
QString str = QString("[%1,%2] %3").arg(clientIP.toString()).arg(clientPort).arg(buf);
ui->textEdit->setPlainText(str);
}
// ui->textEdit->clear();
//参考csdn大佬方式
// QByteArray ba;
// while(m_udpSocket->hasPendingDatagrams())
// {
// ba.resize(m_udpSocket->pendingDatagramSize());
// m_udpSocket->readDatagram(ba.data(), ba.size());
// }
}
下面展示一些 内联代码片
。注意:socket通信下port为int型,所以要用qint!!!.
void Widget::on_pushButton_clicked()
{
//获取发送内容
QString Data = ui->lineEdit->text();
//获取IP号
qDebug()<<Data;
QString Any_IP = ui->AnyIP_Edit->text();
//获取目标端口
qint16 Any_Port = ui->AnyPort_Edit->text().toUInt();
if(ui->MyPort_Edit->text()=="")
{
QMessageBox::warning(this,"erro","pesale open your listen port");
}
else{
m_udpSocket->writeDatagram(Data.toUtf8(),QHostAddress(Any_IP),Any_Port);
}
}
使用到简单的udp通信,并无扩展,在arduino,端进行简单的数据处理及可实现无线控制。非常简单。下面为测试效果。
1、QT界面设计
2、 Udpsocket通信
3、 信号和槽的复习
后期目标实习对视频流数据的接受,实现无线视频传输。
下面展示一些 内联代码片
。
// A code block
以下是简单的arduino程序
// An highlighted block
#include <ESP8266WiFi.h>
#include <string.h>
//#include
int a = 0;
const char *ssid = "yunyida_2020"; //wifi名称
const char *password = "yunyidakeji2020";//WiFi密码
const IPAddress serverIP(192, 168, 0, 125); //与访问的地址
uint16_t serverPort = 8080; //服务器端口
WiFiClient client; //声明一个客户端对象,用于与服务器进行连接
void setup() {
Serial.begin(115200);
// put your setup code here, to run once:
//引脚设置
//控制
pinMode(16, OUTPUT); //D0
pinMode(5, OUTPUT); //D1
//指示灯
pinMode(2, OUTPUT); //D5
//初始化
digitalWrite(16, LOW);
digitalWrite(5, LOW);
digitalWrite(2, LOW);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
Serial.println("Connected");
Serial.print("IP Adress:");
Serial.println(WiFi.localIP());
Serial.println(serverIP);
}
void loop() {
// put your main code here, to run repeatedly:
Serial.println("尝试访问服务器");
Serial.println(serverIP);
Serial.println(serverPort);
LEDsate();
connectserver();
sendserialdata();
}
//检测连接状态
void LEDsate()
{
if (client.connected())
{
a = 1;
}
if (a == 0) {
digitalWrite(2, HIGH);
delay(500);
digitalWrite(2, LOW);
delay(500);
// Serial.println("no");
} else {
digitalWrite(2, LOW);
}
}
void connectserver()
{
if (client.connect(serverIP, serverPort)) //尝试访问目标地址
{
digitalWrite(2, HIGH);
Serial.println("访问成功");
// client.print("Hello world!");
//向服务器发送数据
client.print("2077.11");
while (client.connected() || client.available()) //如果已连接或有收到的未读取的数据
{
if (client.available()) //如果有数据可读取
{
String line = client.readStringUntil('\n'); //读取数据到换行符
// String id(line.substr(2,2));
Serial.print("读取到数据:");
Serial.println(line);
/*把string数组转变为char[]以便对数组拆分
*/
//转换
char str[20];
int i;
for (i = 0; i < line.length(); ++i)
{
str[i] = line[i];
}
str[i] = '\0';
// Serial.println(str);
//拆分
char *Id_str, *Action_str;
Id_str = strtok(str, ".");
Action_str = strtok(NULL, ".");
String ID = Id_str;
String ACTION = Action_str;
Serial.print("ID号:");
Serial.println(ID);
Serial.print("动作:");
Serial.println(ACTION);
if (ID == "2077")
{
if (ACTION == "00")
{
digitalWrite(16, LOW);
digitalWrite(5, LOW);
client.write("all close!!");
}
else if (ACTION == "01")
{
digitalWrite(16, LOW);
digitalWrite(5, HIGH);
client.write("Only right open!!");
}
else if (ACTION == "10")
{
digitalWrite(16, HIGH);
digitalWrite(5, LOW);
client.write("Only left open!!");
}
else if (ACTION == "11")
{
digitalWrite(16, HIGH);
digitalWrite(5, HIGH);
client.write("all open!!");
}
else
{
client.write("input erro!!,please Check the input instructions(^_^)");
}
}
else
{
Serial.println("关我屁事!!");
}
}
}
Serial.println("关闭当前连接");
client.stop(); //关闭客户端
}
else
{
Serial.println("访问失败");
client.stop(); //关闭客户端
}
}
//串口数据发送到服务器
void sendserialdata()
{
if(Serial.available()){ //串口读取到的转发wifi,因为串口是一位一位的发送,所以先缓存再发送
size_t counti = Serial.available();
uint8_t sbuf[counti];
Serial.readBytes(sbuf,counti);
if(client.connected())
{
client.write(sbuf,counti);
delay(200);
}
}
}