102 lines
2.5 KiB
Bash
102 lines
2.5 KiB
Bash
#!/bin/sh
|
|
|
|
# Configuration
|
|
DEVICE_FILE="/dev/smd7"
|
|
ICCID_FILE="/path/to/iccid_master_file" # Path to the ICCID-APN-IPType master file
|
|
TMP_DIR="/tmp"
|
|
TIMEOUT=4
|
|
|
|
# Start listening to device file
|
|
start_listening() {
|
|
cat "$DEVICE_FILE" > "$TMP_DIR/device_readout" &
|
|
CAT_PID=$!
|
|
}
|
|
|
|
# Send AT command
|
|
send_at_command() {
|
|
local command=$1
|
|
echo -e "${command}\r" > "$DEVICE_FILE"
|
|
}
|
|
|
|
# Wait for and process response
|
|
wait_for_response() {
|
|
local start_time=$(date +%s)
|
|
local current_time
|
|
local elapsed_time
|
|
|
|
while true; do
|
|
if grep -q "OK" "$TMP_DIR/device_readout" || grep -q "ERROR" "$TMP_DIR/device_readout"; then
|
|
RESPONSE=$(cat "$TMP_DIR/device_readout")
|
|
echo "Response received: $RESPONSE"
|
|
return 0
|
|
fi
|
|
current_time=$(date +%s)
|
|
elapsed_time=$((current_time - start_time))
|
|
if [ "$elapsed_time" -ge "$TIMEOUT" ]; then
|
|
echo "Error: Response timed out."
|
|
return 1
|
|
fi
|
|
sleep 1
|
|
done
|
|
}
|
|
|
|
# Cleanup function
|
|
cleanup() {
|
|
kill "$CAT_PID"
|
|
wait "$CAT_PID" 2>/dev/null
|
|
rm -f "$TMP_DIR/device_readout"
|
|
}
|
|
|
|
# Function to send AT command and wait for response
|
|
send_and_wait() {
|
|
send_at_command "$1"
|
|
wait_for_response
|
|
}
|
|
|
|
# Function to update the APN
|
|
update_apn() {
|
|
local slot=$1
|
|
local apn=$2
|
|
local iptype=$3
|
|
send_and_wait "AT+CGDCONT=$slot,\"$iptype\",\"$apn\""
|
|
if [ $? -eq 0 ]; then
|
|
echo "APN updated successfully."
|
|
else
|
|
echo "Failed to update APN."
|
|
fi
|
|
}
|
|
|
|
# Main Execution
|
|
if [ -c "$DEVICE_FILE" ]; then
|
|
start_listening
|
|
|
|
# Get ICCID
|
|
send_and_wait "AT+CCID"
|
|
ICCID=$(echo "$RESPONSE" | grep "+CCID" | cut -d ':' -f2 | tr -d '[:space:]')
|
|
echo "ICCID: $ICCID"
|
|
|
|
# Check ICCID in master file
|
|
if grep -q "$ICCID" "$ICCID_FILE"; then
|
|
APN=$(grep "$ICCID" "$ICCID_FILE" | cut -d ',' -f2)
|
|
IP_TYPE=$(grep "$ICCID" "$ICCID_FILE" | cut -d ',' -f3)
|
|
IP_TYPE=${IP_TYPE:-"IPV4V6"} # Default to IPV4V6 if not specified
|
|
|
|
# Get current APN settings
|
|
send_and_wait "AT+CGDCONT?"
|
|
CURRENT_APN=$(echo "$RESPONSE" | grep "+CGDCONT: 1" | cut -d ',' -f3 | tr -d '"')
|
|
|
|
# Compare and update APN if necessary
|
|
if [ "$APN" != "$CURRENT_APN" ]; then
|
|
update_apn 1 "$APN" "$IP_TYPE"
|
|
else
|
|
echo "No APN update needed."
|
|
fi
|
|
else
|
|
echo "ICCID not found in the master file."
|
|
fi
|
|
|
|
cleanup
|
|
else
|
|
echo "Error: Device $DEVICE_FILE does not exist or is not a character special file."
|
|
fi
|