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 小时前
Netty(26)如何实现基于Netty的RPC框架?
网络·网络协议·rpc
前端程序猿之路7 小时前
模型应用开发的基础工具与原理之Web 框架
前端·python·语言模型·学习方法·web·ai编程·改行学it
曲幽8 小时前
FastAPI入门:从简介到实战,对比Flask帮你选对框架
python·flask·fastapi·web·route·uv·uvicorn·docs
码界奇点9 小时前
基于Go语言的Web管理面板系统设计与实现
开发语言·后端·golang·毕业设计·web·go语言·源代码管理
chen_ever2 天前
Protobuf详解(从安装到实战)
c++·rpc·信息与通信
pinesawfly2 天前
[强网杯 2019]upload
web·buu·文件上传·php反序列化
道法自然|~2 天前
【建站】网站使用天地图
html·web·js
小肖爱笑不爱笑3 天前
JavaScript
java·javascript·json·web
深海的鲸同学 luvi3 天前
什么是 NexServer 共处数据
web·harmonyos sdk