@@ -24,6 +24,10 @@ PASSWORD="${PASSWORD:-sayaganteng}"
2424HTTP_HOST_OVERRIDE=" ${HTTP_HOST:- } "
2525MQTT_HOST_OVERRIDE=" ${MQTT_HOST:- } "
2626HOST_IP_OVERRIDE=" ${HOST_IP:- } "
27+ HTTP_TARGET_PORT=" ${HTTP_TARGET_PORT:- ${HTTP_PORT} } "
28+ MQTT_TARGET_PORT=" ${MQTT_TARGET_PORT:- ${MQTT_PORT} } "
29+ HTTP_BIND_PORT=" ${HTTP_BIND_PORT:- } "
30+ MQTT_BIND_PORT=" ${MQTT_BIND_PORT:- } "
2731HTTP_CAPTURE_SECONDS=" ${HTTP_CAPTURE_SECONDS:- 14} "
2832CAPTURE_START_DELAY=" ${CAPTURE_START_DELAY:- 2} "
2933MQTT_CAPTURE_COUNT=" ${MQTT_CAPTURE_COUNT:- 50} "
@@ -32,6 +36,26 @@ MQTT_SUB_PID=""
3236
3337mkdir -p " ${WORK_DIR} "
3438
39+ find_free_port () {
40+ local start_port=" $1 "
41+ python3 - " $start_port " << 'PY '
42+ import socket
43+ import sys
44+
45+ start = int(sys.argv[1])
46+ for port in range(start, start + 64):
47+ with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
48+ sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
49+ try:
50+ sock.bind(("127.0.0.1", port))
51+ except OSError:
52+ continue
53+ print(port)
54+ raise SystemExit(0)
55+ raise SystemExit(1)
56+ PY
57+ }
58+
3559if [[ ! -x " ${ARDUINO_CLI} " ]]; then
3660 echo " arduino-cli not found at ${ARDUINO_CLI} " >&2
3761 exit 1
@@ -42,6 +66,13 @@ if ! command -v docker >/dev/null 2>&1; then
4266 exit 1
4367fi
4468
69+ if [[ -z " ${HTTP_BIND_PORT} " ]]; then
70+ HTTP_BIND_PORT=" $( find_free_port " ${HTTP_PORT} " ) "
71+ fi
72+ if [[ -z " ${MQTT_BIND_PORT} " ]]; then
73+ MQTT_BIND_PORT=" $( find_free_port " ${MQTT_PORT} " ) "
74+ fi
75+
4576case " ${BOARD} " in
4677 esp32)
4778 PORT=" ${PORT_OVERRIDE:-/ dev/ ttyUSB0} "
@@ -91,6 +122,13 @@ if [[ -z "${HTTP_HOST_OVERRIDE}" && -z "${MQTT_HOST_OVERRIDE}" && -n "${ACTIVE_W
91122 echo " warning: set HOST_IP/HTTP_HOST/MQTT_HOST explicitly or join the laptop to the target SSID for true end-to-end validation." >&2
92123fi
93124
125+ if command -v nmcli > /dev/null 2>&1 ; then
126+ if ! nmcli -t -f SSID dev wifi list 2> /dev/null | rg -Fxq " ${SSID} " ; then
127+ echo " warning: target SSID '${SSID} ' is not visible in the current local Wi-Fi scan." >&2
128+ echo " warning: the SSID may be hidden, out of range, 5 GHz only, or otherwise unsuitable for the board." >&2
129+ fi
130+ fi
131+
94132write_secrets () {
95133 local target=" $1 "
96134 cat > " ${target} " << EOF
@@ -100,10 +138,10 @@ write_secrets() {
100138static const char* kWiFiSsid = "${SSID} ";
101139static const char* kWiFiPassword = "${PASSWORD} ";
102140static const char* kHttpHost = "${HTTP_HOST_VALUE} ";
103- static const uint16_t kHttpPort = ${HTTP_PORT } ;
141+ static const uint16_t kHttpPort = ${HTTP_TARGET_PORT } ;
104142static const char* kHttpPath = "/api/data";
105143static const char* kMqttHost = "${MQTT_HOST_VALUE} ";
106- static const uint16_t kMqttPort = ${MQTT_PORT } ;
144+ static const uint16_t kMqttPort = ${MQTT_TARGET_PORT } ;
107145static const char* kMqttTopic = "${MQTT_TOPIC} ";
108146
109147#endif
@@ -126,15 +164,15 @@ write_secrets "${ROOT_DIR}/examples/LiveNetworkNode/LocalSecrets.h"
126164
127165python3 " ${ROOT_DIR} /scripts/live_http_receiver.py" \
128166 --host 0.0.0.0 \
129- --port " ${HTTP_PORT } " \
167+ --port " ${HTTP_BIND_PORT } " \
130168 --status-file " ${HTTP_STATUS_FILE} " \
131169 > " ${HTTP_LOG} " 2>&1 &
132170HTTP_SERVER_PID=$!
133171sleep 1
134172
135173MQTT_CONFIG=" ${WORK_DIR} /mosquitto.conf"
136174cat > " ${MQTT_CONFIG} " << EOF
137- listener ${MQTT_PORT } 0.0.0.0
175+ listener ${MQTT_BIND_PORT } 0.0.0.0
138176allow_anonymous true
139177persistence false
140178EOF
@@ -146,7 +184,7 @@ docker run -d --name zerokernel-mqtt-broker --network host \
146184sleep 2
147185
148186docker run --rm --network host eclipse-mosquitto:2 \
149- mosquitto_sub -h 127.0.0.1 -p " ${MQTT_PORT } " -t " ${MQTT_TOPIC} " -v \
187+ mosquitto_sub -h 127.0.0.1 -p " ${MQTT_BIND_PORT } " -t " ${MQTT_TOPIC} " -v \
150188 > " ${MQTT_LOG} " 2>&1 &
151189MQTT_SUB_PID=$!
152190
@@ -211,7 +249,10 @@ raise SystemExit(1)
211249PY
212250}
213251
214- echo " Using host targets HTTP=${HTTP_HOST_VALUE} :${HTTP_PORT} MQTT=${MQTT_HOST_VALUE} :${MQTT_PORT} "
252+ echo " Using host targets HTTP=${HTTP_HOST_VALUE} :${HTTP_TARGET_PORT} MQTT=${MQTT_HOST_VALUE} :${MQTT_TARGET_PORT} "
253+ if [[ " ${HTTP_BIND_PORT} " != " ${HTTP_TARGET_PORT} " || " ${MQTT_BIND_PORT} " != " ${MQTT_TARGET_PORT} " ]]; then
254+ echo " Using local bind ports HTTP=${HTTP_BIND_PORT} MQTT=${MQTT_BIND_PORT} for validation helpers"
255+ fi
215256
216257echo " Running live baseline on ${BOARD} (${PORT} )"
217258compile_and_upload " ${ROOT_DIR} /examples/LiveNetworkBaseline" " ${BASELINE_BUILD_LOG} "
@@ -226,7 +267,7 @@ NODE_LINE="$(parse_last_line "LIVE_NETMODULES window_ms=" "${NODE_LOG}")"
226267echo " ${NODE_LINE} "
227268
228269sleep 1
229- HTTP_STATUS=" $( curl -m 3 -fsS " http://127.0.0.1:${HTTP_PORT } /api/status" ) "
270+ HTTP_STATUS=" $( curl -m 3 -fsS " http://127.0.0.1:${HTTP_BIND_PORT } /api/status" ) "
230271MQTT_MESSAGES=" $( wc -l < " ${MQTT_LOG} " | tr -d ' ' ) "
231272
232273restore_safe
0 commit comments