OpenWrt的rpcd的使用

OpenWrt的rpcd在系统中扮演关键角色,它被uhttpd用于处理网页配置更新,通过rpcd通知procd管理服务。此外,用户可以创建自定义的ubus接口,将脚本放在/usr/libexec/rpcd/目录下,rpcd启动时会加载这些接口。不过,新接口需重启rpcd服务后方能生效。

 OpenWrt中rpcd比较重要

目前用过的地方有

1. rpcd被uhttpd调用,网页修改配置后 ,由rpcd通知procd调用相应的服务。

2. 可以使用rpcd注册ubus接口,在/usr/libexec/rpcd/目前下,用脚本实现自己的ubus接口,rpcd启动后会遍历/usr/libexec/rpcd/添加ubus。 新添加ubus后,要重启rpcd服务才能生效。

注意:文件名为ubus对象的名字。

openwrt官网的示例,例如 cat /usr/libexec/rpcd/foo

#!/bin/sh

case "$1" in
	list)
		echo '{ "bar": { "arg1": true, "arg2": 32, "arg3": "str" }, "toto": { } }'
	;;
	call)
		case "$2" in
			bar)
				# read the arguments
				read input;

				# optionally log the call
				logger -t "foo" "call" "$2" "$input"

				# return json object or an array
				echo '{ "hello": "world" }'
			;;
			toto)
				# return json object or an array
				echo '[ "item1", "item2", "item3" ]'
			;;
		esac
	;;
esac
加载完成后,可以使用ubus命令调试

$ ubus list -v
...
'foo' @686f0592
	"bar":{"arg1":"Boolean","arg2":"Integer","arg3":"String"}
	"toto":{}
...
$ ubus call -S foo bar '{"arg1": true }'
{{"hello":"world"}}
$ ubus -S call foo toto
{["item1","item2","item3"]}

### **在 OpenWrt使用 `ubus` 查看 `dsd` 模块的注册方法** `dsd`(Dynamic Service Discovery)是 OpenWrt 中用于动态服务发现的模块(如 mDNS、Bonjour)。以下是详细步骤: --- ## **1. 确认 `dsd` 模块是否注册到 `ubus`** ```bash ubus list | grep dsd ``` - 如果输出 `dsd` 或类似名称(如 `dnsmasq.dsd`),说明模块已注册。 - 若无输出,可能未安装或未运行相关服务(如 `dnsmasq` 或 `avahi`)。 --- ## **2. 查看 `dsd` 模块的详细方法** ```bash ubus list dsd -v # 替换 dsd 为实际模块名 ``` **输出示例**: ```json 'dsd' @a1b2c3d4 "reload":{} "list_services":{} "query":{"service":"string","timeout":"int"} "register":{"name":"string","type":"string","port":"int","txt":"array"} ``` - **方法说明**: - `reload`:重新加载配置。 - `list_services`:列出当前发现的本地服务。 - `query`:查询特定服务(如 `_http._tcp`)。 - `register`:注册一个新服务(需参数)。 --- ## **3. 调用 `dsd` 模块的方法** ### **(1) 列出所有发现的本地服务** ```bash ubus call dsd list_services ``` **输出示例**: ```json { "services": [ {"name": "my-printer", "type": "_ipp._tcp", "port": 631}, {"name": "home-assistant", "type": "_http._tcp", "port": 8123} ] } ``` ### **(2) 查询特定服务** ```bash ubus call dsd query '{"service":"_http._tcp", "timeout":5}' ``` ### **(3) 手动注册一个服务** ```bash ubus call dsd register '{ "name": "my-web", "type": "_http._tcp", "port": 8080, "txt": ["path=/"] }' ``` --- ## **4. 调试与常见问题** ### **问题 1:`dsd` 模块不存在** - **原因**:未安装 `dnsmasq` 或 `avahi`(提供 mDNS/Bonjour 支持)。 - **解决**: ```bash opkg update opkg install dnsmasq avahi-daemon /etc/init.d/dnsmasq restart ``` ### **问题 2:方法调用返回空** - **原因**:网络未广播或未发现服务。 - **调试**: ```bash ubus monitor & # 监听事件 ubus call dsd reload # 触发重新发现 ``` ### **问题 3:权限拒绝** - **解决**:检查 `ubus` ACL 权限文件: ```bash cat /usr/share/rpcd/acl.d/*.json | grep dsd ``` --- ## **5. 扩展:`dsd` 与 `mDNS` 的关系** - `dsd` 通常是 OpenWrt 对 mDNS/Bonjour 的封装,底层依赖 `avahi-daemon` 或 `dnsmasq`。 - 直接通过 `avahi-browse` 查看原始 mDNS 数据: ```bash avahi-browse -a -r # 列出所有服务 ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值