前提・実現したいこと
ソケット通信を用いてリアルタイムでグラフを変化させたい
現在,私はPC-RaspberryPi間におけるソケット通信プログラムを作成しております。作成したプログラムは,PCからRaspberryPiに数値情報を送り,RaspberryPi側で受け取った数値をグラフにリアルタイムで表示するというものです。
ソースコードは以下のようになっています。
しかし,このプログラムではRaspberryPi側は数値情報を1回しか受信できないため,グラフを途中で変化させることができません(図1のようにyの値が一定のグラフしか出力できない)。このプログラムを複数回の送受信ができるように改良し,グラフをリアルタイムで変化させるにはどうすれば良いでしょうか?(図2のようにyの値を変化させたい)
説明が下手で申し訳ありません。よろしくお願いいたします。(現在のプログラムでは1回しか送受信ができないため,図1のようなグラフしか出力できません。これをリアルタイムで複数回の送受信ができるようにし,図2のようなグラフを作成したいです。)
PC側のソースコード(言語:C言語,開発環境:Visual Studio2017)
#include <winsock2.h> #include <windows.h> #include <stdio.h> #include <conio.h> #pragma warning(disable : 4996) WSADATA wsaData; struct sockaddr_in addr; int sockw; #define IP_ADD_TEMP "0.0.0."//IPアドレステンプレ(同じネットワーク下なら使える) #define PORT_TEMP 1234 //PORT番号設定(クライアント/サーバで必ず合わせる) int main() { char buf[40]; int n, i; char aaa[] = "127.0.0.1"; // winsock2の初期化 if (WSAStartup(MAKEWORD(2, 0), &wsaData)) { puts("reset winsock failed"); return -1; } // Server に connect して COMMAND を送信する // ソケットの作成 sockw = socket(AF_INET, SOCK_STREAM, 0); if (sockw == INVALID_SOCKET) { puts("make socket failed"); return -1; } // IPアドレス作成(defineを使う場合) /* char ip_add[30] = IP_ADD_TEMP; strcat(ip_add, argv[1]); */ //IPアドレス作成(すべて打ち込み) char ip_add[30]; for (int i = 0; i < 30; i++) ip_add[i] = NULL; strcpy_s(ip_add, aaa); // 接続先指定用構造体の準備 addr.sin_family = AF_INET; addr.sin_port = htons(PORT_TEMP); addr.sin_addr.S_un.S_addr = inet_addr(ip_add); // サーバーに接続 if (connect(sockw, (struct sockaddr*)&addr, sizeof(addr))) { puts("connect failed"); return -1; } // RaspberryPiに数値情報を送る n = send(sockw, "50", strlen("50"), 0); if (n < 0) { puts("send failed"); return -1; } // サーバーからデータを受信 memset(buf, 0, 40); n = recv(sockw, buf, 40, 0); if (n < 0) { puts("recv failed"); return -1; } puts(buf); while (1) { if (kbhit() != 0) { break; } } // ソケットのクローズ closesocket(sockw); // winsock2 の終了処理 WSACleanup(); return 0; }
RaspberryPi側のソースコード(言語:Python)
#ソケット通信プログラム import socket host = "127.0.0.1" port = 1234 serversock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) serversock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) serversock.bind((host,port)) #IPとPORTを指定してバインドします serversock.listen(10) #接続の待ち受けをします(キューの最大数を指定) print('Waiting for connections...') clientsock, client_address = serversock.accept() #接続されればデータを格納 for i in range ( 1 ): rcvmsg = clientsock.recv(1024).decode() print('Received : %s' % (rcvmsg)) s_msg = "def" print('Send : %s' % s_msg) clientsock.sendall(s_msg.encode()) clientsock.close() #ここから下はグラフ表示プログラム import numpy as np from matplotlib import pyplot as plt import random plt.figure() #x軸の幅を100にする xlim = [0, 100] X, Y = [], [] while True: #画面をクリア plt.cla() Y.append(int(rcvmsg)) X.append(len(Y)) #xに100個以上格納されたら if len(X) > 100: xlim[0] += 1 xlim[1] += 1 plt.plot(X, Y) #x軸、y軸方向の表示範囲を設定 plt.ylim(-1, 100) plt.xlim(xlim[0], xlim[1]) #描写 plt.pause(0.1)
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。