#はじめに.socket通信とは?
「TCP/IPのソケット通信」を簡単にする手法を紹介します.
そもそもsocket通信とは,主にプログラム部とTCP/IP部をつなぐ特別な出入り口のことを意味し,TCP/IPのトランスポート層を指す.まあ単純にいうと,同じネットワーク下にある複数のパソコンのデータの共有をする手法です.
ちなみに私は大学院時代にAIロボット系のことをやっていたのですが、その時使用していたロボットのメモリが少なすぎたか私の技量が足りなすぎたか(笑)で,tensorflowの環境をロボット付属のメモリに格納できませんでした.そこでロボットのPCと高性能PCをEthernetハブで通信接続することで,画像とロボット情報の処理を送受信できるようにすることを試みました.その時に使用したのがsocket通信であり,それをpython(numpy)で容易にしたのがnpsocketというモジュールです.gitに天才様が作ってくださったこれがなければ私は卒業できませんでした笑
とりあえず
[今回紹介:npsocketのURL]
https://github.com/ekbanasolutions/numpy-using-socket
[参考:socket通信の正しい使い方]
https://qiita.com/nadechin/items/28fc8970d93dbf16e81b
#インストール
-
git cloneする.
git clone https://github.com/ekbanasolutions/numpy-using-socket.git
-
クローンしたディレクトリに入る.
cd numpy-using-socket-master
-
python実行してモジュールをインストール.
python setup.py
-
インストール確認
>>> import npsocket >>> from npsocket import SocketNumpyArray >>> exit()
#使用方法
送信と受信でそれぞれ二種類のコードを用意します.
ちなみに以下のコードは「画像をファイルから読み送信⇒受信して表示」を繰り返します.
# -*- coding:utf-8
#!/usr/bin/env python
from npsocket import SocketNumpyArray
#ソケット通信の準備とportの設定
sock_receiver = SocketNumpyArray()
sock_receiver.initalize_receiver(8888)
while True:
#データ受信
frame = sock_receiver.receive_array()
#画像表示
cv2.imshow('frame', frame)
cv2.waitKey(1)
# -*- coding:utf-8
#!/usr/bin/env python
from npsocket import SocketNumpyArray
import cv2
#ソケット通信の準備とip/portの設定
sock_sender = SocketNumpyArray()
sock_sender.initialize_sender('[receiver.pyを実行している機器のIPアドレス]', 8888)
while True:
#画像の準備⇒numpy変換
img = cv2.imread('[画像ファイル]')
frame = cv2.resize(frame, (128, 128))
#画像データ送信
sock_sender.send_numpy_array(frame)
注意
- 送受信でポートの番号を必ずそろえる
- 送信側はIPアドレスを間違えないようにする
- データの送受信は複数回可能だが,必ず回数を合わせる.しないと片方がずっと待ち続けて動かなくなる.
応用
A.pyとB.pyがあるとして以下のフローをすることも可能です.
A -> B : 画像データをBへ送信
B内 : 画像処理
B -> A : 処理済み画像データをAへ送信
このようにしたい場合は,以下のように書きます(色々省略)
#
# 省略(他のインポートなど)
#
sock_sender.initialize_sender('[B.pyの機器のIPアドレス]', 8888)
sock_receiver.initalize_receiver(7777)
#
# 省略(処理,画像取得など)
#
# 送信
sock_sender.send_numpy_array(frame)
# 受信(待機)
frame = sock_receiver.receive_array()
#
# 省略(他のインポートなど)
#
sock_receiver.initalize_receiver(8888)
sock_sender.initialize_sender('[[A.pyの機器のIPアドレス]', 7777)
#
# 省略(処理)
#
# 受信
frame = sock_receiver.receive_array()
#
# 画像処理など
#
# 送信
sock_sender.send_numpy_array(frame)
以上です.