Luci操作创龙(Tronlong)T113-i开发板GPIO

第一步:验证GPIO控制

shell 复制代码
# 关闭LED
echo 0 > /sys/class/leds/user-led0/brightness
# 打开LED
echo 1 > /sys/class/leds/user-led0/brightness
# 查询LED状态
cat /sys/class/leds/user-led0/brightness

第二步:创建rpcd 插件

创建 /usr/libexec/rpcd/t113_led 文件

shell 复制代码
#!/bin/sh
. /usr/share/libubox/jshn.sh

case "$1" in
    list)
        echo '{ "set": {"value": 0} }'
        ;;
    call)
        if [ "$2" = "set" ]; then
            # ubus通过标准输入传递JSON,而不是命令行参数
            # 读取标准输入中的JSON数据
            json_input=$(cat)
            
            # 如果没有读取到数据,尝试使用命令行参数(用于直接调用)
            if [ -z "$json_input" ] && [ -n "$3" ]; then
                json_input="$3"
            fi
            
            if [ -z "$json_input" ]; then
                echo '{ "error": "No JSON input provided" }'
                exit 1
            fi
            
            json_load "$json_input" || {
                echo '{ "error": "Invalid JSON" }'
                exit 1
            }
            
            json_get_var value value

            case "$value" in
                0|1|"0"|"1") : ;;
                *)
                    echo '{ "error": "value must be 0 or 1" }'
                    exit 1
                    ;;
            esac

            echo "$value" > /sys/class/leds/user-led0/brightness 2>/dev/null
            if [ $? -eq 0 ]; then
                echo '{ "status": "ok" }'
            else
                echo '{ "error": "Failed to write to LED" }'
            fi
        else
            echo '{ "error": "Method not found" }'
            exit 1
        fi
        ;;
    *)
        echo '{ "error": "Invalid command" }'
        exit 1
        ;;
esac

赋予执行权限

shell 复制代码
chmod +x /usr/libexec/rpcd/t113_led

第三步:重启rpcd服务

shell 复制代码
/etc/init.d/rpcd restart

第四步:验证ubus服务是否注册成功

shell 复制代码
ubus list | grep t113
# 应输出: t113_led

ubus call t113_led set '{"value":1}'
# 应返回: { "status": "ok" }

第五步:创建luci页面

  1. controller: /usr/lib/luci/controller/t113_led.lua
lua 复制代码
module("luci.controller.greeting", package.seeall)

function index()
    -- 使用 'view' 而非 'cbi',就是使用js来渲染
    -- entry({"admin", "system", "greeting"}, cbi("greeting"), _("Greeting"), 99)
    entry({"admin", "system", "greeting"}, view("eboy_light/greeting"), _("Greeting"), 99)
    entry({"admin", "system", "t113_led"}, view("eboy_light/t113_led"), _("T113_LED"), 98)
end
  1. view: /www/luci-static/resources/view/eboy_light/t113_led.js
js 复制代码
'use strict';
'require rpc';
'require view';
'require uci';

var callGPIOSet = rpc.declare({
    object: 't113_led',
    method: 'set',
    params: ['value'],
    expect: { '': {} }
});

return view.extend({
    render: function() {

        var btnOn = E('button', {
            'class': 'cbi-button cbi-button-apply',
            'click': function() {
                callGPIOSet(1).then(function(res) {
                    console.log(res)
                    if (res.status === 'ok') {
                        alert(_('灯已开启'));
                    } else {
                        alert(_('Error: %s').format(res.error || 'Unknown'));
                    }
                });
            }
        }, _('开灯'));

        var btnOff = E('button', {
            'class': 'cbi-button cbi-button-reset',
            'click': function() {
                callGPIOSet(0).then(function(res) {
                    if (res.status === 'ok') {
                        alert(_('灯已关闭'));
                    } else {
                        alert(_('Error: %s').format(res.error || 'Unknown'));
                    }
                });
            }
        }, _('关灯'));

        return E('div', {}, [
            E('h2', {}, _('T113 LED 控制')),
            E('p', {}, _('控制 GPIO')),
            E('div', {'style': 'margin: 10px 0;'}, [btnOn, ' ', btnOff])
        ]);
    }
});

第六步:配置权限

创建 /usr/share/rpcd/acl.d/t113_led.json

json 复制代码
{
    "t113_led": {
        "description": "T113 LED control",
        "read": {
            "ubus": {
                "t113_led": [ "list" ]
            }
        },
        "write": {
            "ubus": {
                "t113_led": [ "set" ]
            }
        }
    }
}

重启rpcd服务

shell 复制代码
/etc/init.d/rpcd restart
#or service rpcd restart
相关推荐
曲幽3 天前
你的REST接口还在“过度投喂”数据吗?——FastAPI + GraphQL实战避坑指南
python·fastapi·web·graphql·route·cors·rest·strawberry
AsulTop4 天前
精简版 OpenWrt/LEDE uhttpd/rpc/mod-rpc/ Ubus Json-RPC 从0修复直到可用
rpc·路由器·openwrt·lede·uhttpd·ubus修复
带刺的坐椅5 天前
Spring Boot → Solon 注解迁移实战指南:一张对照表说清楚
java·springboot·web·solon
曲幽9 天前
刚部署的 LibreTranslate 频频翻车?我掏出了 20 年前的 StarDict 词典,用 FastAPI 搭了个本地词典翻译 API
python·fastapi·web·translate·goldendict·libretranslate·stardict·pystardict
曲幽10 天前
别再用网页翻译看源码了!你的私人翻译神器LibreTranslate,部署避坑指南来了
python·docker·web·pot·translate·libretranslate·arogstranslate
小胖xiaopangss15 天前
BRpc使用
c++·rpc
zhuzicc15 天前
Dubbo @Autowired 注入同模块接口,到底走的是本地调用还是 RPC?源码给你答案(Dubbo @Service注解的双重注册机制)
rpc·autowired·dubbo·依赖注入·java面试·spring ioc·dubbo源码分析
llz_11215 天前
web-第四次课后作业
前端·spring boot·web
leo_yu_yty15 天前
Go语言分布式计算(RPC入门)
网络·网络协议·rpc
衣乌安、16 天前
JSON-RPC协议
网络协议·rpc·json