私は非常によく似た質問をたくさん検索したようですが、うまくいくものはまったく見つかりませんでした。 Raspberry Pi(第2世代)を使用してWifiOBDIIセンサーと通信しようとしています。次のコマンドを使用できます
nc -C 192.168.0.10 35000
192.168.0.10は車のセンサーで、35000はポートです。接続は問題ないように思われるので、それほど関連性はありません。とにかく、ncインスタンスを開いて、たとえば「0145」(センサーコード)と入力すると、代わりにncセッションの出力(たとえば、エンジンのRPM)でそのセンサーの値が返されます。 )。それはうまくいきます。私がやりたいのは、プロットの目的で、テキストファイルからncセッションにコマンドをパイプすることです。したがって、私の理想的な結果は、RPM値の一定のストリームと関連する時間がテキストファイルにダンプされることです。そこから仕事ができます。しかし、私はそれを行う方法を正確に知りません。数千行の「0145」であるcommands.txtを設定しました。そのファイルを読み取り、1行ずつncに渡します(おそらくスリープでサンプリング間隔を制御できます)。出力を出力し、それらをテキストファイルに隠します。この問題がstdin、stdout、およびpipingに関係していることはわかっていますが、何らかの理由で、完全に把握することはできませんでした。私は決してそれらのマスターではありません。また、プロセス全体のスクリプトを作成したいと思います。
今、走れば
cat <(echo 0145) - | nc -C 192.168.0.10 35000
これにより、必要な端末での出力が得られますが、単一の値に対してのみ機能します。しかし、それをループに入れようとするとすぐに、その0145をスクリプトの$コマンドに入れて、txtファイルから1行ずつ$コマンドを取得すると、機能しなくなります。実際、0145のままにして変数を使用しなくても、ループ内またはブロックの場合は機能しなくなります。
つまり、簡単に言うと、txtファイルを1行ずつnc接続に送信するスクリプトを作成してから、各応答を別のファイルに抽出したいと思います。スクリプト化されていない場合は、そのnc接続を開き、1秒ごとに0145を送信して、それらの応答を取得できます(ファイルに渡す方法はまだわかりません)が、効率はほとんどありません。これを行うもっと簡単な方法があるはずだと思います。私はやや初心者ですが、ここで試してみてください。どんな助けでも大歓迎です
これを行うにはおそらく多くの方法があります。
netcatを使用
netcatの問題は、ファイルの終わりを検出するとすぐに接続を閉じることです。 GNUnetcatの実装にはいくつかのオプションがあります(-k または-w -1)リスニングインスタンスを無期限に開いたままにしますが、どちらも機能しません。機能するのはnmapのnetcatのバージョン、ncat =。
PCに、nmapパッケージをインストールしてから、以下を発行します。
mkfifo return_pipe
ncat -k -l 12345 0<return_pipe| ncat -C 192.168.0.10 35000 1>return_pipe &
今、あなたは多くの異なる束で、あなたが好きなものすべてを転送することができます
echo Ciao | ncat localhost 12345
cat somefile.txt | ncat localhost 12345
リスナーが協力していれば、接続が切断されることはありません(つまり、最初のファイルの終わりの後でリスニングを終了しません)。または、名前付きパイプを使用して、この部分を単純化することもできます。最初のコマンドを発行した端末とは異なる端末から、
mkfifo mypipe
tail -f mypipe | ncat localhost 12345 &
echo Ciao > mypipe
cat somefile.txt > mypipe
デバイスからのリターンメッセージは、名前付きパイプreturn_pipeにあります。コマンド
tail -f return_pipe >> responses
responsesというファイルにデバイスの応答を追加します。
netcatなし
これはIpor Sircer(Nice!、+1 from me)によって指摘されています。しかし、私はそれを少し違う方法で行います、
exec 3>/dev/tcp/192.168.0.10/35000
exec 4</dev/tcp/192.168.0.10/35000
exec 4>>somefile.out
echo "Ciao" >&3
cat somefile.txt >&3
コマンドも追跡したい場合は、
echo Ciao | tee -a file_with_my_commands 1>&3
cat somefile.txt | tee -a file_with_my_commands 1>&3
そして、あなたがこのコミュニケーションを終えたとき、
exec 3>&-
exec 4>&-
なぜnetcat
を使用するのですか? Bash
は、エイリアスが組み込まれたtcpソケットを処理できます。
n=0
while read -r line;do
((n++))
exec 3<>/dev/tcp/192.168.0.10/35000
echo -e "$line" >&3
cat <&3 > response.$n
exec 3<&-
exec 3>&-
done < data.txt