この記事では、手書きのネットワーク デバッガーを簡単に紹介し、ESP8266 モジュールを接続します。
Previous : STM32+ESP8266をコンピュータQtネットワークホストコンピュータに接続 - 準備作業
目次
2. 実装プロセス - ESP8266 を使用してホストに接続する
1. Qt コードと実装プロセスの一部
最終的な効果
ホストコンピュータは、ホストとサーバーの 2 つのモードを組み合わせ、切断時にモードを切り替えることができます。サーバーとして使用する場合、ローカル コンピューターのIP はホスト コンピューターのIPであり、ipconfigを使用してIPアドレスを表示できます。最後に、接続状態のリアリティが追加されます. 次のベクトル図はすべてアリからのものです. ソースコードを送信するには、以下にコメントしてください - >自分で電子メールを送信するか、Git をダウンロードします -> https://gitee.com/guo-lingran/tcp_-server-and-client https://gitee.com/guo-lingran/tcp_-server -および- クライアントBaidu ネットワーク ディスク ダウンロード: https://pan.baidu.com/s/1sSVkUJrMqN9fP4x1uSrDtA 抽出コード: qt92
コード部分
QT での TCP ベースの通信には、次の 2 つのクラスが使用されます。
- QTcpServer: クライアント接続を監視し、クライアントと接続するために使用されるサーバー クラス
- QTcpSocket: クライアントとサーバーの両方を使用する必要があります
コンストラクタ
コンストラクターに接続操作を追加します. 新しい接続がある場合、tcpServer はnewConnectionのシグナルを受け取り、スロット関数 ( newConnection_Slot() ) を実行します。以下は、インターフェースの初期化です。
Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) { ui->setupUi(this); tcpServer = new QTcpServer(this); tcpSocket = new QTcpSocket(this); //默认使用主机模式,等待新的连接 connect(tcpServer,SIGNAL(newConnection()),this,SLOT(newConnection_Slot())); setFixedSize(480,420); //默认端口号 8080 ui->portEdit->setText("8080"); ui->ipED->setText("192.168.3.13"); setWindowTitle("--局域网络调试器-- 测试版 V4.0 22-0905 制作:拾贰"); }
newConnection_Slot スロット関数
新しい接続を取得したら、 nextPendingConnection を呼び出して待機中の接続を受信し、インターフェイスのステータス アイコンを「オンライン」に変更します。tcpServer がreadyReadシグナルを送信すると、データが受信され、受信スロット関数 ( readyRead_Slot() ) によって処理されます。
ここにもう一度接続を書きます. 接続が切断された場合、tcpServer は切断シグナルを送信し、切断のためのスロット関数も同様に処理されます。
void Widget::newConnection_Slot(){ tcpSocket=tcpServer->nextPendingConnection();//得到通信的套接字对象 connect(tcpSocket,SIGNAL(readyRead()),this,SLOT(readyRead_Slot())); connect(tcpSocket,SIGNAL(disconnected()),this,SLOT(disconnected_Slot())); //建立连接后,修改界面的状态的信息——在线的图标 ui->label_3->setStyleSheet("border-image: url(:/new/prefix1/connect.png)"); }
readyRead_Slot スロット関数
ここで文字化けを防ぐため、受信データをすべて読み込み、受信データを変換します。tcpSocket->readAll()はクライアントから送信されたデータで、最終的に受け入れボックスに表示されます。
void Widget::readyRead_Slot(){ QByteArray receiveDate; QTextCodec *tc = QTextCodec::codecForName("GBK"); while(!tcpSocket->atEnd()){ receiveDate = tcpSocket->readAll(); } if (!receiveDate.isEmpty()) { QString strBuf=tc->toUnicode(receiveDate); ui->RecvEdit->appendPlainText(strBuf); } receiveDate.clear(); }
disconnected_Slot スロット関数
接続が切断された後、tcpSocket は閉じられ、変更されたインターフェースのステータス アイコンは同様に「オフライン」になります。
//服务器或客户机连接状态 void Widget::disconnected_Slot(){ tcpSocket->close(); ui->label_3->setStyleSheet("border-image: url(:/new/prefix1/discon.png)"); }
ネットワーク監視
コントロールでポートを取得し、リッスン インターフェイスを呼び出します。最初のパラメーターQHostAddress::Any : サーバーはすべてのネットワーク インターフェイスをリッスンします。2 番目のパラメーター: ポート番号。現在の状態がクライアントの場合、connectToHost はターゲット ホストに接続を作成し、接続がある場合はconnect_Slot()スロット関数を実行します。残りはインターフェースを最適化するための操作です。
//打开网络/关闭网络 void Widget::on_openBt_clicked() { flag_Sw=!flag_Sw; if(flag_Sw){ //选择主机 if(MS) { tcpServer->listen(QHostAddress::Any,ui->portEdit->text().toUInt()); } else//客户机 { tcpSocket->connectToHost(ui->ipED->text(),ui->portEdit->text().toUInt()); connect(tcpSocket,SIGNAL(connected()),this,SLOT(connected_Slot())); } ui->openBt->setStyleSheet("border-image: url(:/new/prefix1/open.png)"); ui->wifi->setStyleSheet("border-image: url(:/new/prefix1/wifi_on.png)"); } else{ tcpServer->close(); tcpSocket->close(); ui->openBt->setStyleSheet("border-image: url(:/new/prefix1/close.png)"); ui->wifi->setStyleSheet("border-image: url(:/new/prefix1/wifi_off.png)"); } }
connect_Slot スロット関数
//客户机连接 void Widget::connected_Slot(){ connect(tcpSocket,SIGNAL(readyRead()),this,SLOT(readyRead_Slot())); ui->label_3->setStyleSheet("border-image: url(:/new/prefix1/connect.png)"); connect(tcpSocket,SIGNAL(disconnected()),this,SLOT(disconnected_Slot())); }
ホスト\クライアント切り替え機能
//主副机切换 void Widget::on_ms_clicked() { if(!flag_Sw){ tcpServer->close(); tcpSocket->close(); if(MS){ MS=false; ui->label->setText("客户机模式"); ui->ms->setStyleSheet("border-image: url(:/new/prefix1/client.png);"); } else { MS=true; ui->label->setText("主机模式"); ui->ms->setStyleSheet("border-image: url(:/new/prefix1/server.png);"); } } else QMessageBox::critical(this,"提示","请先关闭网络,再切换模式类型"); }
データを送る
tcpSocketインターフェースのwrite関数 を介してデータを送信する
void Widget::on_sendBt_clicked() { QString SendCon = ui->sendEdit->text().toLocal8Bit().data(); if(flag_Sw){ if(SendCon!=""){ //封装编码 QByteArray receiveDate; QTextCodec *tc = QTextCodec::codecForName("GBK"); //对发送框编码 receiveDate = ui->sendEdit->text().toLocal8Bit().data(); QString strBuf=tc->toUnicode(receiveDate); //整合符号 -> QString str="->"; QString str2 =str.append(strBuf); //向输出框打印发送的数据 ui->RecvEdit->appendPlainText(str2); tcpSocket->write(ui->sendEdit->text().toLocal8Bit().data()); } else QMessageBox::critical(this,"警告","不能发送空白信息"); } else QMessageBox::critical(this,"提示","发送失败,网络尚未连接"); }
他のスロット機能は順次紹介しません...
2. 実装プロセス - ESP8266 を使用してホスト コンピューターに接続します。
道具:
CH340 シリアルポートデバッガ
ネットワークデバッガ
ESP8266 (ここでは punctual atom の ESP-12F を使用します。効果は同じです)
目標:
ATコマンドを使用してESP8266をホストコンピューターに接続し、ホストコンピューターが使いやすいかどうかをテストして、将来STM32との通信を容易にします
次に、ネットワーク デバッガーに段階的に接続します。
ここでは、上位のコンピューターをサーバーとして使用し、IP アドレスは 192.168.3.13、クライアント コンピューターとして 8266 を使用して、コンピューターのホットスポットに接続し、サーバーにアクセスします。
- AT をテストして OK を返し、モジュールに問題がないことを確認します。
- コンピューターのホットスポットをオンにする
3. AT+CWJAP="Lng","12345678" で現在のホットスポットに接続
4. AT+CIPSTART="TCP","192.168.3.13",8080 でサーバーとの TCP 接続を確立します
5. AT+CIPMODE=1 伝送モードは透過伝送
6. AT+CIPSNED は 透過伝送モードを有効にし、データをサーバーに送信します
この時点で、8266 はネットワーク アシスタントに接続されており、ここに任意の文字を入力できます。テスト結果は次のとおりです。
この時点で、ESP8266 モジュールはホスト コンピュータと正常に通信しており、次は STM32 を搭載する予定ですので、ご期待ください...