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
相关推荐
可爱系程序猿1 天前
添加网络打印机提示 0x000006ba:从 RPC 服务、Print Spooler 到主机发现排查
网络·网络协议·rpc
岁岁的O泡奶2 天前
[NSSCTF 2022 Spring Recruit]babyphp
经验分享·web·ctf
可爱系程序猿3 天前
Windows 11 添加共享打印机提示 0x00000bc4:从 RPC 发现到策略配置排查
windows·网络协议·rpc
里欧跑得慢4 天前
AI 驱动的 UI 国际化方案自动适配:从单一语言到多语言布局的智能转换
前端·css·flutter·web
里欧跑得慢6 天前
Flutter 像素级还原:设计稿到代码的视觉无损转换技巧
前端·css·flutter·web
Patrick_Wilson6 天前
RPC 与 REST 的本质区别看这一篇就够了:别再只看 URL 里有没有动词
http·rpc·restful
catino6 天前
spring-IOC、DI
java·spring·rpc
头茬韭菜7 天前
功能点 11-12:客户端、RPC 通信、监控与安全
网络协议·安全·rpc·fluss
深念Y7 天前
# CC-Switch + Claude/Codex 折腾教训记录
运维·服务器·网络·ai·agent·web·ccsiwtch
钛态8 天前
Vite 中的 CSS 工程化:从 CSS Modules 到 UnoCSS 的渐进式迁移
前端·vue·react·web