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
相关推荐
qianyuqiye119 小时前
NFS 网络文件系统完整实战|原理 + RPC 架构 + 多 Web 集群共享存储
运维·网络·安全·rpc·架构·php
小小龙学IT2 天前
gRPC 开源高性能 RPC 框架深度解析:从 HTTP/2 到跨语言微服务实战
http·rpc·开源
IKUN家族2 天前
Spring IoC&DI
java·spring·rpc
snow@li4 天前
SpringBoot:全套生命周期全景详解/应用级+Bean级
java·spring boot·rpc
瑞码空间6 天前
Web应用的多端部署之道:浏览器 · Electron · Docker
前端·docker·electron·浏览器·web
way_hj7 天前
Flask笔记(2)快速web项目
笔记·flask·vue·web
老虎海子8 天前
Dockerfile 零基础:指令详解 + Compose 对比 + 前端镜像实战
开发语言·前端·docker·rpc
snow@li8 天前
SpringBoot:依赖注入(DI)全景深度梳理与实战分析/@Autowired、@Resource、@Qualifier
java·spring boot·rpc
snow@li8 天前
SpringBoot:RPC 接口与 Web 接口全景深度分析
spring boot·rpc·架构
钛态8 天前
AI 辅助:前端框架反模式:过度封装、状态滥用与副作用失控
前端·vue·react·web