当前位置: 首页 > news >正文

低成本嵌入式Linux开发方案:通过配置文件实现参数设置

在产品出厂时通常会默认一套基本参数配置,但为了尽可能适配每个用户的不同应用场景,最好有一个建议的修改配置的方式而不需要修改核心系统。

通常情况下,通过设置一个config.json的配置文件,让用户修改这个文件即可完成系统参数配置。

本文实现了一个简易的配置功能,即系统上电之后从TF卡中读取config.json配置文件,然后根据配置文件更新系统配置

逐步配置

配置/mnt/sdcard/config.json文件

{"Network": {"address": "192.168.137.10","netmask": "255.255.255.0","gateway": "192.168.137.1","dns": ["192.168.137.1", "8.8.8.8", "8.8.4.4"]}
}

配置/usr/bin/configure_network.sh文件

nano /usr/bin/configure_network.sh
#!/bin/sh# 配置文件路径
CONFIG_FILE="/mnt/sdcard/config.json"
LOG_FILE="/var/log/network_config.log"# 创建日志函数
log() {echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
}# 检查配置文件是否存在
if [ ! -f "$CONFIG_FILE" ]; thenlog "错误:配置文件 $CONFIG_FILE 不存在!"exit 1
fi# 提取配置值的函数
get_config_value() {# $1 = JSON 键名grep "\"$1\":" "$CONFIG_FILE" | \awk -F': ' '{print $2}' | \sed 's/[",]//g' | \tr -d ' '
}# 提取DNS服务器列表 - 修复版本
get_dns_servers() {# 提取dns数组部分awk '/"dns": \[/,/\]/' "$CONFIG_FILE" | \grep -Eo '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+'
}# 提取配置
log "从配置文件提取网络设置..."
ADDRESS=$(get_config_value "address")
NETMASK=$(get_config_value "netmask")
GATEWAY=$(get_config_value "gateway")
DNS_SERVERS=$(get_dns_servers)log "解析的配置:"
log "  IP地址: ${ADDRESS:-未找到}"
log "  子网掩码: ${NETMASK:-未找到}"
log "  网关: ${GATEWAY:-未找到}"
log "  DNS服务器: ${DNS_SERVERS:-未找到}"# 验证配置是否可用
if [ -z "$ADDRESS" ] || [ -z "$NETMASK" ] || [ -z "$GATEWAY" ] || [ -z "$DNS_SERVERS" ]; thenlog "错误:关键网络参数缺失!"exit 2
fi# 配置网络接口
log "配置 eth0..."
ifconfig eth0 "$ADDRESS" netmask "$NETMASK"# 配置网关
log "设置默认网关..."
route add default gw "$GATEWAY" >/dev/null 2>&1# 配置DNS
log "更新 DNS 配置..."
echo "# Generated by network config script" > /etc/resolv.conf
for server in $DNS_SERVERS; doecho "nameserver $server" >> /etc/resolv.conf
done# 验证配置
log "验证网络配置:"
ifconfig eth0 | grep -q "inet addr:$ADDRESS" && log "IP地址配置成功" || log "IP地址配置失败"
ip route | grep -q "default via $GATEWAY" && log "网关配置成功" || log "网关配置失败"
grep -q "$GATEWAY" /etc/resolv.conf && log "DNS配置成功" || log "DNS配置失败"log "网络配置完成!"

添加权限

chmod +x /usr/bin/configure_network.sh

创建日志文件

mkdir -p /var/log

测试运行脚本

/usr/bin/configure_network.sh

创建自启动文件

nano /etc/init.d/S99network-config
#!/bin/shstart() {echo "Starting network configuration"# 等待网络接口可用while [ ! -e /sys/class/net/eth0 ]; dosleep 1done# 等待TF卡挂载sleep 3/usr/bin/configure_network.sh
}stop() {echo "Stopping network configuration service"
}case "$1" instart)start;;stop)stop;;restart|reload)stopstart;;*)echo "Usage: $0 {start|stop|restart}"exit 1
esacexit 0

加权限

chmod +x /etc/init.d/S99network-config

创建目录

mkdir -p /etc/rc.d

链接文件

ln -s /etc/init.d/S99network-config /etc/rc.d/S99network-config

测试自启动

/etc/init.d/S99network-config start

一键脚本

nano setup.sh
#!/bin/sh# 创建并配置网络设置脚本
cat > /usr/bin/configure_network.sh << 'EOF'
#!/bin/sh# 配置文件路径
CONFIG_FILE="/mnt/sdcard/config.json"
LOG_FILE="/var/log/network_config.log"# 创建日志函数
log() {echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
}# 检查配置文件是否存在
if [ ! -f "$CONFIG_FILE" ]; thenlog "错误:配置文件 $CONFIG_FILE 不存在!"exit 1
fi# 提取配置值的函数
get_config_value() {# $1 = JSON 键名grep "\"$1\":" "$CONFIG_FILE" | \awk -F': ' '{print $2}' | \sed 's/[",]//g' | \tr -d ' '
}# 提取DNS服务器列表
get_dns_servers() {# 提取dns数组部分awk '/"dns": \[/,/\]/' "$CONFIG_FILE" | \grep -Eo '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+'
}# 提取配置
log "从配置文件提取网络设置..."
ADDRESS=$(get_config_value "address")
NETMASK=$(get_config_value "netmask")
GATEWAY=$(get_config_value "gateway")
DNS_SERVERS=$(get_dns_servers)log "解析的配置:"
log "  IP地址: ${ADDRESS:-未找到}"
log "  子网掩码: ${NETMASK:-未找到}"
log "  网关: ${GATEWAY:-未找到}"
log "  DNS服务器: ${DNS_SERVERS:-未找到}"# 验证配置是否可用
if [ -z "$ADDRESS" ] || [ -z "$NETMASK" ] || [ -z "$GATEWAY" ] || [ -z "$DNS_SERVERS" ]; thenlog "错误:关键网络参数缺失!"exit 2
fi# 配置网络接口
log "配置 eth0..."
ifconfig eth0 "$ADDRESS" netmask "$NETMASK"# 配置网关
log "设置默认网关..."
route add default gw "$GATEWAY" >/dev/null 2>&1# 配置DNS
log "更新 DNS 配置..."
echo "# Generated by network config script" > /etc/resolv.conf
for server in $DNS_SERVERS; doecho "nameserver $server" >> /etc/resolv.conf
done# 验证配置
log "验证网络配置:"
ifconfig eth0 | grep -q "inet addr:$ADDRESS" && log "IP地址配置成功" || log "IP地址配置失败"
ip route | grep -q "default via $GATEWAY" && log "网关配置成功" || log "网关配置失败"
grep -q "$GATEWAY" /etc/resolv.conf && log "DNS配置成功" || log "DNS配置失败"log "网络配置完成!"
EOF# 设置权限
chmod +x /usr/bin/configure_network.sh# 创建日志目录
mkdir -p /var/log# 创建自启动服务文件
cat > /etc/init.d/S99network-config << 'EOF'
#!/bin/shstart() {echo "Starting network configuration"# 等待网络接口可用while [ ! -e /sys/class/net/eth0 ]; dosleep 1done# 等待TF卡挂载sleep 3/usr/bin/configure_network.sh
}stop() {echo "Stopping network configuration service"
}case "$1" instart)start;;stop)stop;;restart|reload)stopstart;;*)echo "Usage: $0 {start|stop|restart}"exit 1
esacexit 0
EOF# 设置服务权限
chmod +x /etc/init.d/S99network-config# 创建rc.d目录(如果不存在)
mkdir -p /etc/rc.d# 创建符号链接
ln -sf /etc/init.d/S99network-config /etc/rc.d/S99network-config# 测试服务
echo "正在测试网络配置服务..."
/etc/init.d/S99network-config startecho "所有配置已完成!"
echo "网络配置脚本已安装到 /usr/bin/configure_network.sh"
echo "自启动服务已安装到 /etc/init.d/S99network-config"
chmod +x setup.sh
./setup.sh
http://www.dtcms.com/a/302263.html

相关文章:

  • LeetCode 68:文本左右对齐
  • 如何解决pip安装报错ModuleNotFoundError: No module named ‘papermill’问题
  • Docker搭建Hadoop集群
  • 进程管理(systemd)
  • 企业微信服务商创建第三方应用配置数据回调url和指令回调url的java代码实现
  • Python系统交互库全解析
  • Entity Framework Core (EF Core) 中Database
  • 归雁思维:解锁自然规律与人类智慧的桥梁
  • Online Proofing System(OPS)在线校样系统使用说明
  • Linux进程概念(五)进程地址空间
  • Leaflet 综合案例 - 路径规划
  • 医疗领域非结构化数据处理技术突破与未来演进
  • svn与git Merge重要区别讲解
  • C# 提取字符串 指定开始和结尾字符
  • 人机交互打字游戏
  • C#高级:通过修改注册表实现系统代理服务器的启用、编辑和禁用
  • 【计算机网络】计算机网络中光猫、交换机、路由器、网关、MAC地址是什么?两台电脑是如何联通的?
  • 承装修试二级承包范围
  • 3DGRUT: 革命性的3D高斯粒子光线追踪与混合光栅化技术深度解析
  • mac电脑如何关闭防火墙
  • 反欺诈系统:Oracle 到 ES 迁移实战
  • keepalive
  • 8.异常处理--Exceptions
  • 代码随想录Day32:动态规划(斐波那契数、爬楼梯、使用最小花费爬楼梯)
  • 字节跳动开源Coze,开启AI Agent开发新时代?
  • 我从 Web2 转型到 Web3 的 9 条经验总结
  • linux命令grep的实际应用
  • Leetcode——11. 盛最多水的容器
  • kubectl中的yaml配置详解
  • 前段面试题新版