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
구독 출력에 한 줄로 표시됩니다.
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>
빈 줄은 string 에 echo
하나가 추가되었기 때문입니다. 그런 다음 다음과 같은 것으로 교체 \n
해야합니다 .cat
while read data && [ "$data" != "" ]
do echo "Got $data"
done
게시되는 내용을 제어할 수 있으므로 한 줄의 데이터를 보내거나 쉽게 찾을 수 있는 특수 문자열로 메시지를 끝내는 것을 선호할 수 있습니다 ===eof===
.