mosquitto_sub呼び出しの出力を処理するためのbashスクリプトを作成しています。
function testPipe(){
read foo
IFS=' ' read -ra ARRAY <<< "$foo"
topic=${ARRAY[0]}
cmd=${ARRAY[1]}
echo "topic = $topic cmd = $cmd"
cat
}
function pipeTee(){
tee -a mqtt_broker.log
}
mosquitto_sub -h $HOST -p $PORT -t $TOPIC \
-u $USER -P $PASS -v | pipeTee | testPipe
フォローしてみました。デモ出力を関数にパイプ。しかし、これが私が観察したものです。最初のメッセージがネットワーク経由で到着し、testPipe 関数が呼び出され、その行が解析されることがわかります。その後のすべてのメッセージは、元の形式でコンソールに印刷されます。つまり、ネットワークからのメッセージです。
私は何を間違えることができましたか? 「foo読み取り」はSTDINの入力を使用しませんか?
答え1
ブローカーを起動したら、mosquitto
次のようにmy/test
トピックを購読します。
mosquitto_sub -t my/test -v
その後、簡単なメッセージを投稿して何を受け取るかを確認できます。例えば、
mosquitto_pub -t my/test -m inline
サブスクリプション出力に1行で表示されます。
my/test inline
すべてのメッセージがこのタイプの場合は、関数を呼び出すループを実行するだけです。
... | pipeTee | while testPipe; do : ; done
しかし、あなたの関数は使用できません。cat
それ以外の場合は決して返されません。複数行のメッセージを送信するには、何らかの方法でcat
メッセージの終わりを検出する別のwhileループを読み取ることに置き換える必要があります。たとえば、投稿する場合
echo -e 'my multi\nline test' | mosquitto_pub -t my/test -s
3行が表示されます。
my/test my multi
line test
<there is a blank line here>
空行は文字列にecho
1つが追加されたためです。その後、次のものと交換する必要が\n
あります。cat
while read data && [ "$data" != "" ]
do echo "Got $data"
done
公開される内容を制御できるため、1行のデータを送信したり、簡単に見つけることができる特殊文字列でメッセージを終了したりすることをお勧めします===eof===
。