Initial commit: Alpine 5G Router with Fibocom FM350-GL modem configuration
- Complete working configuration for FM350-GL modem - CYTA Cyprus APN setup (internet) - AT command reference and troubleshooting guide - Configuration scripts and documentation - RNDIS mode working with manual IP configuration
This commit is contained in:
242
configure_fm350_5g.sh
Executable file
242
configure_fm350_5g.sh
Executable file
@@ -0,0 +1,242 @@
|
||||
#!/bin/bash
|
||||
# Fibocom FM350-GL 5G Modem Configuration Script
|
||||
# For Alpine Linux with CYTA Cyprus SIM card
|
||||
#
|
||||
# This script configures the 5G modem and establishes a connection
|
||||
# Usage: ./configure_fm350_5g.sh
|
||||
|
||||
set -e
|
||||
|
||||
# Configuration
|
||||
AT_PORT="/dev/ttyUSB1"
|
||||
APN="internet"
|
||||
WAN_IF="eth1"
|
||||
LAN_IF="eth0.100"
|
||||
|
||||
# Colors for output
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
log_info() { echo -e "${GREEN}[INFO]${NC} $1"; }
|
||||
log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
|
||||
log_error() { echo -e "${RED}[ERROR]${NC} $1"; }
|
||||
|
||||
send_at_cmd() {
|
||||
local cmd="$1"
|
||||
local wait="${2:-2}"
|
||||
|
||||
cat $AT_PORT 2>/dev/null &
|
||||
local CAT_PID=$!
|
||||
sleep 0.3
|
||||
echo -e "${cmd}\r" > $AT_PORT
|
||||
sleep $wait
|
||||
kill $CAT_PID 2>/dev/null || true
|
||||
}
|
||||
|
||||
get_at_response() {
|
||||
local cmd="$1"
|
||||
local wait="${2:-2}"
|
||||
|
||||
timeout $((wait + 3)) sh -c "
|
||||
cat $AT_PORT 2>/dev/null &
|
||||
CAT_PID=\$!
|
||||
sleep 0.3
|
||||
echo -e '${cmd}\r' > $AT_PORT
|
||||
sleep $wait
|
||||
kill \$CAT_PID 2>/dev/null
|
||||
" 2>&1
|
||||
}
|
||||
|
||||
check_modem() {
|
||||
log_info "Checking for FM350-GL modem..."
|
||||
|
||||
if ! lsusb | grep -qi "fibocom"; then
|
||||
log_error "Fibocom modem not detected via USB"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
local usb_id=$(lsusb | grep -i fibocom | grep -oE '0e8d:[0-9a-f]+')
|
||||
log_info "Modem detected: $usb_id"
|
||||
|
||||
if [ "$usb_id" = "0e8d:7127" ]; then
|
||||
log_warn "Modem is in Mode 41 (7127). AT commands may not work."
|
||||
log_warn "Attempting to switch to Mode 40..."
|
||||
fi
|
||||
|
||||
if [ ! -c "$AT_PORT" ]; then
|
||||
log_error "AT port $AT_PORT not available"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
log_info "AT port available: $AT_PORT"
|
||||
}
|
||||
|
||||
test_at_commands() {
|
||||
log_info "Testing AT command communication..."
|
||||
|
||||
local response=$(get_at_response "AT" 1)
|
||||
|
||||
if echo "$response" | grep -q "OK"; then
|
||||
log_info "AT communication working"
|
||||
return 0
|
||||
else
|
||||
log_error "AT commands not responding"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
check_signal() {
|
||||
log_info "Checking signal strength..."
|
||||
|
||||
local response=$(get_at_response "AT+CSQ" 1)
|
||||
local csq=$(echo "$response" | grep "+CSQ:" | grep -oE '[0-9]+' | head -1)
|
||||
|
||||
if [ -n "$csq" ]; then
|
||||
if [ "$csq" -lt 10 ]; then
|
||||
log_warn "Signal strength: $csq (weak)"
|
||||
elif [ "$csq" -lt 20 ]; then
|
||||
log_info "Signal strength: $csq (moderate)"
|
||||
else
|
||||
log_info "Signal strength: $csq (good)"
|
||||
fi
|
||||
else
|
||||
log_warn "Could not read signal strength"
|
||||
fi
|
||||
}
|
||||
|
||||
configure_apn() {
|
||||
log_info "Configuring APN: $APN"
|
||||
|
||||
local response=$(get_at_response "AT+CGDCONT=1,\"IP\",\"$APN\"" 2)
|
||||
|
||||
if echo "$response" | grep -q "OK"; then
|
||||
log_info "APN configured successfully"
|
||||
else
|
||||
log_warn "APN configuration may have failed"
|
||||
fi
|
||||
}
|
||||
|
||||
activate_pdp() {
|
||||
log_info "Activating PDP context..."
|
||||
|
||||
local response=$(get_at_response "AT+CGACT=1,1" 3)
|
||||
|
||||
if echo "$response" | grep -qE "(OK|CGEV)"; then
|
||||
log_info "PDP context activated"
|
||||
else
|
||||
log_warn "PDP activation response: $response"
|
||||
fi
|
||||
}
|
||||
|
||||
get_modem_ip() {
|
||||
log_info "Getting modem IP address..."
|
||||
|
||||
local response=$(get_at_response "AT+CGPADDR=1" 2)
|
||||
local ip=$(echo "$response" | grep "+CGPADDR:" | grep -oE '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' | head -1)
|
||||
|
||||
if [ -n "$ip" ]; then
|
||||
log_info "Modem IP: $ip"
|
||||
echo "$ip"
|
||||
else
|
||||
log_error "Could not get modem IP"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
configure_interface() {
|
||||
local ip="$1"
|
||||
|
||||
log_info "Configuring network interface $WAN_IF..."
|
||||
|
||||
ip link set $WAN_IF up 2>/dev/null || true
|
||||
ip addr flush dev $WAN_IF 2>/dev/null || true
|
||||
ip addr add $ip/32 dev $WAN_IF
|
||||
ip route add default dev $WAN_IF metric 50 2>/dev/null || true
|
||||
|
||||
log_info "Interface configured with IP: $ip"
|
||||
}
|
||||
|
||||
setup_nat() {
|
||||
log_info "Setting up NAT for LAN ($LAN_IF)..."
|
||||
|
||||
# Enable IP forwarding
|
||||
echo 1 > /proc/sys/net/ipv4/ip_forward
|
||||
|
||||
# Add NAT rules (check if they exist first)
|
||||
iptables -t nat -C POSTROUTING -o $WAN_IF -j MASQUERADE 2>/dev/null || \
|
||||
iptables -t nat -A POSTROUTING -o $WAN_IF -j MASQUERADE
|
||||
|
||||
iptables -C FORWARD -i $LAN_IF -o $WAN_IF -j ACCEPT 2>/dev/null || \
|
||||
iptables -A FORWARD -i $LAN_IF -o $WAN_IF -j ACCEPT
|
||||
|
||||
iptables -C FORWARD -i $WAN_IF -o $LAN_IF -m state --state RELATED,ESTABLISHED -j ACCEPT 2>/dev/null || \
|
||||
iptables -A FORWARD -i $WAN_IF -o $LAN_IF -m state --state RELATED,ESTABLISHED -j ACCEPT
|
||||
|
||||
log_info "NAT configured"
|
||||
}
|
||||
|
||||
test_connectivity() {
|
||||
log_info "Testing internet connectivity..."
|
||||
|
||||
if ping -c 3 8.8.8.8 >/dev/null 2>&1; then
|
||||
log_info "Ping to 8.8.8.8: SUCCESS"
|
||||
else
|
||||
log_error "Ping to 8.8.8.8: FAILED"
|
||||
return 1
|
||||
fi
|
||||
|
||||
if ping -c 2 google.com >/dev/null 2>&1; then
|
||||
log_info "DNS resolution: SUCCESS"
|
||||
else
|
||||
log_warn "DNS resolution failed - check /etc/resolv.conf"
|
||||
fi
|
||||
}
|
||||
|
||||
show_status() {
|
||||
echo ""
|
||||
echo "========================================="
|
||||
echo " 5G Modem Configuration Summary "
|
||||
echo "========================================="
|
||||
echo ""
|
||||
echo "Modem: $(lsusb | grep -i fibocom | cut -d' ' -f6-)"
|
||||
echo "AT Port: $AT_PORT"
|
||||
echo "APN: $APN"
|
||||
echo ""
|
||||
echo "Interface: $WAN_IF"
|
||||
ip addr show $WAN_IF 2>/dev/null | grep -E "(state|inet )" | sed 's/^/ /'
|
||||
echo ""
|
||||
echo "Routing:"
|
||||
ip route show | grep -E "(default|$WAN_IF)" | sed 's/^/ /'
|
||||
echo ""
|
||||
echo "========================================="
|
||||
}
|
||||
|
||||
# Main execution
|
||||
main() {
|
||||
log_info "Starting FM350-GL 5G modem configuration..."
|
||||
echo ""
|
||||
|
||||
check_modem
|
||||
test_at_commands || exit 1
|
||||
check_signal
|
||||
configure_apn
|
||||
activate_pdp
|
||||
|
||||
local modem_ip=$(get_modem_ip)
|
||||
if [ -z "$modem_ip" ]; then
|
||||
log_error "Failed to get modem IP. Exiting."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
configure_interface "$modem_ip"
|
||||
setup_nat
|
||||
test_connectivity
|
||||
|
||||
show_status
|
||||
|
||||
log_info "5G modem configuration complete!"
|
||||
}
|
||||
|
||||
main "$@"
|
||||
Reference in New Issue
Block a user