mosquitto_pub returns 4 一段时间后
mosquitto_pub returns 4 after some time
我有一个具有专有协议的 UPS,所以我唯一的选择是采用他们 8 年前的 32 位程序并通过 awk 脚本将其传输。
ups_status 每两秒左右生成一个这样的屏幕。
----------===-----Welcome to ups_manager System!-----===-----
Copyright(C) 2004 Richcomm Technologies, Inc. May 16 2013 ver 1.1
+-----------------------------------------------------------------------------+
| UPS Factory: UPS Model: UPS Version: |
|---------------------------------++------------------------------------------|
| UPS Type : StandBY || UPS Input Voltage: 227.00 Volt |
| UPS Rating Voltage : 220.00 Volt|| |>>>>>>>>>>>>>>>>>>>>>>>-|----|----|----|
| UPS Rating Current : 3.00 || 180 190 200 210 220 230 240 250 |
| UPS Line Frequency : 50.00 Hz || |
| Communication Port : 2 || UPS Output Voltage: 229.00 Volt |
| || |>>>>>>>>>>>>>>>>>>>>>>>>|----|----|----|
| Input AC Power : Normal || 180 190 200 210 220 230 240 250 |
| Battery Status : Normal || |
| UPS Status : Normal || UPS Power Loading: 18.00 |
| Boost/Buck : Buck || |>>>>|----|----|----|----|----|----|----|
| UPS Temperature: 30.80 || 0 20 40 60 80 100 120 140 |
| UPS Self-Test : Normal || |
| Beeper Status : ON || UPS Battery Level: 100.00 |
| || |>>>>>>>>>>>>>>>>>>>>>>>>>----|----|----|
| || 0 20 40 60 80 100 120 140 |
| || |
| || UPS Input Frequency : 49.00 Hz |
| ACfail Shutdown Delay : 3600 s || |>>>>>>>>>>>>>>>>>>>>>>>>|----|----|----|
| UPS Turn Off Delay : 2 min|| 0 10 20 30 40 50 60 70 |
+---------------------------------++------------------------------------------+
我愿意ups_status | awk -f parseUPS.awk
parseUPS.awk 解析值并生成一个 json 字符串(命名为)并执行
/Turn Off/ {
out=sprintf(....);
print out | "mosquitto_pub -h mqtt.local.net -t ups -l"
}
这工作了一天左右,然后 mosquitto_pub 切换到返回 4,无效的用户或密码。
如果我重新启动命令,它会正常运行。
可能发生了什么?
我还可以从管道中捕获错误代码,退出 awk 并将该行放入 do while true 循环中吗?
Ed Morton 指出了正确的方向,将 mosquitto_pub 放入管道而不是 awk。
我试过了ups_status |gawk -f parse.awk|mosquitto_pub -h mqtt.local.net -t ups2 -l
这仅在 4096 个字符后向 mqtt 输出。
啊哈,正在缓冲。所以我在 awk
中的 printf 之后添加了 fflush("/dev/stdout");
这导致一次输出两行。原因:在 ups_status 和 awk.
之间缓冲
expect
包中的 unbuffer
-命令解决了这个问题。
最终命令:
unbuffer ups_status |gawk -f parse.awk|mosquitto_pub -h mqtt.local.net -t ups2 -l
这会每 3 秒提供一个不错的 mqtt 消息。
我有一个具有专有协议的 UPS,所以我唯一的选择是采用他们 8 年前的 32 位程序并通过 awk 脚本将其传输。 ups_status 每两秒左右生成一个这样的屏幕。
----------===-----Welcome to ups_manager System!-----===-----
Copyright(C) 2004 Richcomm Technologies, Inc. May 16 2013 ver 1.1
+-----------------------------------------------------------------------------+
| UPS Factory: UPS Model: UPS Version: |
|---------------------------------++------------------------------------------|
| UPS Type : StandBY || UPS Input Voltage: 227.00 Volt |
| UPS Rating Voltage : 220.00 Volt|| |>>>>>>>>>>>>>>>>>>>>>>>-|----|----|----|
| UPS Rating Current : 3.00 || 180 190 200 210 220 230 240 250 |
| UPS Line Frequency : 50.00 Hz || |
| Communication Port : 2 || UPS Output Voltage: 229.00 Volt |
| || |>>>>>>>>>>>>>>>>>>>>>>>>|----|----|----|
| Input AC Power : Normal || 180 190 200 210 220 230 240 250 |
| Battery Status : Normal || |
| UPS Status : Normal || UPS Power Loading: 18.00 |
| Boost/Buck : Buck || |>>>>|----|----|----|----|----|----|----|
| UPS Temperature: 30.80 || 0 20 40 60 80 100 120 140 |
| UPS Self-Test : Normal || |
| Beeper Status : ON || UPS Battery Level: 100.00 |
| || |>>>>>>>>>>>>>>>>>>>>>>>>>----|----|----|
| || 0 20 40 60 80 100 120 140 |
| || |
| || UPS Input Frequency : 49.00 Hz |
| ACfail Shutdown Delay : 3600 s || |>>>>>>>>>>>>>>>>>>>>>>>>|----|----|----|
| UPS Turn Off Delay : 2 min|| 0 10 20 30 40 50 60 70 |
+---------------------------------++------------------------------------------+
我愿意ups_status | awk -f parseUPS.awk
parseUPS.awk 解析值并生成一个 json 字符串(命名为)并执行
/Turn Off/ {
out=sprintf(....);
print out | "mosquitto_pub -h mqtt.local.net -t ups -l"
}
这工作了一天左右,然后 mosquitto_pub 切换到返回 4,无效的用户或密码。
如果我重新启动命令,它会正常运行。
可能发生了什么?
我还可以从管道中捕获错误代码,退出 awk 并将该行放入 do while true 循环中吗?
Ed Morton 指出了正确的方向,将 mosquitto_pub 放入管道而不是 awk。
我试过了ups_status |gawk -f parse.awk|mosquitto_pub -h mqtt.local.net -t ups2 -l
这仅在 4096 个字符后向 mqtt 输出。
啊哈,正在缓冲。所以我在 awk
中的 printf 之后添加了fflush("/dev/stdout");
这导致一次输出两行。原因:在 ups_status 和 awk.
之间缓冲expect
包中的 unbuffer
-命令解决了这个问题。
最终命令:
unbuffer ups_status |gawk -f parse.awk|mosquitto_pub -h mqtt.local.net -t ups2 -l
这会每 3 秒提供一个不错的 mqtt 消息。