UBUS 通信接口的使用——添加一个object对象(ubus call)
1,引入
ubus提供了一种多进程通信的机制。存在一个守护进程ubusd,所以进程都注册到ubusd,ubusd进行消息的接收、分发管理。
ubus对多线程支持的不好,例如在多个线程中去请求同一个服务,就有可能出现不可预知的结果。
ubus通信一共有三种实现方式:①端对端通信 ②订阅/通知 ③事件(广播)
2,ubus命令的使用
ubus list :列出所有对象 ubus -v list network.interface.lan : 查看指定对象的详细信息
ubus call network.interface.lan status :执行指定对象的方法并获取返回结果
ubus listen [事件类型]: 实时接收指定或所有 ubus 事件
ubus send test.event '{"message":"Hello World"}' : 发送自定义事件
ubus subscribe mytest : 订阅mytest事件
3,向UBUS注册一个对象
主要步骤:uloop_init(); ubus_connect(NULL);ubus_add_uloop(ser_ctx);初始化object,ubus_add_object(ser_ctx, &sub_object);
代码实现:
int get_no_arg_info(struct ubus_context *ctx, struct ubus_object *obj,struct ubus_request_data *req, const char *method,struct blob_attr *msg)
{struct blob_buf b = {};blob_buf_init(&b, 0);blobmsg_add_string(&b, "obj_name", obj->name);blobmsg_add_u32(&b, "pid", (uint32_t)getpid());blobmsg_add_u32(&b, "uptime", (uint32_t)time(NULL));ubus_send_reply(ctx, req, b.head);blob_buf_free(&b);return 0;
}enum parm_num {T_ID = 0,T_NAME,T_AGE,T_MAX
};static const struct blobmsg_policy t_policy[] = {[T_ID] = { .name = "id", .type = BLOBMSG_TYPE_INT32 },[T_NAME] = { .name = "name", .type = BLOBMSG_TYPE_STRING },[T_AGE] = { .name = "age", .type = BLOBMSG_TYPE_INT32 },
};int get_arg_info(struct ubus_context *ctx, struct ubus_object *obj,struct ubus_request_data *req, const char *method,struct blob_attr *msg)
{int i = 0;struct blob_attr *tb[T_MAX];blobmsg_parse(t_policy, ARRAY_SIZE(t_policy), tb, blob_data(msg), blob_len(msg));for(i = 0; i < T_MAX; i++){if(!tb[i]){fprintf(stderr, "Failed to parse arg '%d'.\n", i);return -1;}}printf("-->id: %d\n", blobmsg_get_u32(tb[T_ID]));printf("-->name: %s\n", blobmsg_get_string(tb[T_NAME]));printf("-->age: %d\n", blobmsg_get_u32(tb[T_AGE]));return 0;
}static const struct ubus_method test_obj_methods[] = {UBUS_METHOD_NOARG("get_no_arg_info", get_no_arg_info),UBUS_METHOD( "get_arg_info", get_arg_info, t_policy),
};static struct ubus_object_type test_obj_type = UBUS_OBJECT_TYPE("test.service", test_obj_methods);static struct ubus_object test_object = {.name = "test.service",.type = &test_obj_type,.methods = test_obj_methods,.n_methods = ARRAY_SIZE(test_obj_methods),
};int main()
{int ret = 0;struct ubus_context *mytest_ctx = NULL;uloop_init();mytest_ctx = ubus_connect(NULL);if(!mytest_ctx) {fprintf(stderr, "Failed to connect ubus.\n");return ERROR;}ret = ubus_add_object(mytest_ctx, &test_object);if(ret) {fprintf(stderr, "Failed to add 'mytest' obj.\n");return ERROR;}ubus_add_uloop(mytest_ctx);uloop_run();ubus_free(mytest_ctx);uloop_done();
}
测试:
补充:实现了ubus call 去获取test.service
void mytest_reply_cb(struct ubus_request *req, int type, struct blob_attr *msg)
{struct blob_buf buf = {};char *str;if (!msg) {printf("No response received\n");return;}str = blobmsg_format_json(msg, true);if (str) {printf("\nReceived response:\n%s\n", str);free(str);}
}int main()
{int ret = 0;int i = 0;int mydemo_id = 0;struct ubus_context *myclient_ctx = NULL;struct ubus_request req;uloop_init();myclient_ctx = ubus_connect(NULL);if(!myclient_ctx) {fprintf(stderr, "Failed to connect ubus.\n");return ERROR;}ret = ubus_lookup_id(myclient_ctx, "test.service", &mydemo_id);if (ret) {fprintf(stderr, "Failed to lookup test object: %s\n", ubus_strerror(ret));return ERROR;}ubus_add_uloop(myclient_ctx);#if 0 //不带参数请求test.service ->get_no_arg_info方法ret = ubus_invoke(myclient_ctx, mydemo_id, "get_no_arg_info", NULL, mytest_reply_cb, &req, 1000);if (ret) {fprintf(stderr, "Failed to call get_no_arg_info: %s\n", ubus_strerror(ret));return ret;}//ubus_complete_request(myclient_ctx, &req, 1000);#else //带参数请求test.service ->get_no_arg_info方法struct blob_buf msg = {};blob_buf_init(&msg, 0);blobmsg_add_string(&msg, "name", "Hello");blobmsg_add_u32(&msg, "id", 12);blobmsg_add_u32(&msg, "age", 36);memset( &req, 0, sizeof(req));ret = ubus_invoke(myclient_ctx, mydemo_id, "get_arg_info", msg.head, mytest_reply_cb, &req, 1000);if (ret) {fprintf(stderr, "Failed to call get_no_arg_info: %s\n", ubus_strerror(ret));return ret;}//ubus_complete_request(myclient_ctx, &req, 1000);blob_buf_free(&msg);#endifuloop_run();ubus_free(myclient_ctx);uloop_done();}
结果:
该打印由get_arg_info打印,我发送过去的msg。
总结:
1,实现了向UBUS添加一个object的代码,需要依赖Ubus头文件:#include <libubox/blobmsg_json.h> #include <libubus.h>
2,比较繁琐的点是在test_object这个结构体的初始化,无参数调用使用UBUS_METHOD_NOARG, 有参数调用使用:UBUS_METHOD,此时UBUS_METHOD的后两个参数不能填NULL,否则段错误。
3,使用UBUS 命令call,其内部ubus_invoke,实现UBUS端到端通信。
相关文章:
UBUS 通信接口的使用——添加一个object对象(ubus call)
1,引入 ubus提供了一种多进程通信的机制。存在一个守护进程ubusd,所以进程都注册到ubusd,ubusd进行消息的接收、分发管理。 ubus对多线程支持的不好,例如在多个线程中去请求同一个服务,就有可能出现不可预知的结果。 …...
强化学习贝尔曼方程推导
引言 强化学习中贝尔曼方程的重要性就不说了,本文利用高中生都能看懂的数学知识推导贝尔曼方程。 回报 折扣回报 G t G_t Gt的定义为: G t R t 1 γ R t 2 γ 2 R t 3 ⋯ ∑ k 0 ∞ γ k R t k 1 (1) G_t R_{t1} \gamma R_{t2} \gamm…...
【MCP Node.js SDK 全栈进阶指南】高级篇(2):MCP高性能服务优化
前言 随着MCP应用规模的扩大和用户量的增加,性能优化成为系统稳定运行的关键因素。高性能的MCP服务不仅能提供更好的用户体验,还能降低运营成本,提高系统的可扩展性。本文将深入探讨MCP TypeScript-SDK的性能优化策略,帮助开发者构建高效、稳定的MCP服务。 1. 性能瓶颈识…...
图片识别为提示词,背景信息提取 -从头设计数字生命第7课, demucs——仙盟创梦IDE
1. 图像内容理解与标注 用途:在大规模图像数据集的整理和标注工作中,通过特定提示词可引导图片识别系统更准确地提取图像中的背景信息,并进行标注。例如在医学图像库标注中,使用 “疾病相关背景特征” 作为提示词,系统…...
域对齐是什么
域对齐(Domain Alignment)是在机器学习和计算机视觉等领域中常用的技术 定义 域对齐旨在将不同域(Domain)的数据映射到一个共同的特征空间中,使得来自不同域的数据在该空间中具有相似的分布。这里的“域”可以指代不…...
opencv 直方图均衡化
直方图均衡化 1. 啥叫直方图2. 绘制直方图3. 直方图均衡化3.1 自适应直方图均衡化(cv2.equalizeHist())3.2 对比度受限的自适应直方图均衡化(cv2.createCLAHE()) 1. 啥叫直方图 直方图是对数据进行统计的一种方法,并且将统计值组织到一系列实…...
JDK 8 函数式接口全集
JDK 8 函数式接口全集 函数式接口如何定义关于注解 FunctionalInterface 函数式接口的分类与简单使用生产型接口 Supplier使用 消费型接口 Consumer使用 函数型接口(Function)实例(合并字符串) 断言型接口(Predicate)…...
网站防护无惧DDoS攻击:2025年实战指南
在数字化时代,DDoS攻击已成为企业生存的“生死线”。2024年全球日均攻击峰值突破5.4Tbps(Cloudflare数据),电商、金融行业更是重灾区。本文将结合最新技术趋势和实战案例,为你提供一套低成本、高可靠的防御方案。 一、…...
【AI论文】BitNet v2:针对1位LLM的原生4位激活和哈达玛变换
摘要:激活异常值阻碍了1位大型语言模型(LLM)的有效部署,这使得低比特宽度的量化变得复杂。 我们介绍了BitNet v2,这是一个新的框架,支持1位LLM的原生4位激活量化。 为了解决注意力和前馈网络激活中的异常值…...
windows 使用 FFmpeg 放大视频原声
问题:原视频声音太小,就算把视频音量调到最大,声音也听不太清 一、下载 下载地址:Download FFmpeg 根据需要选择合适版本下载解压,如浏览器下载速度慢,可使用迅雷下载 二、配置环境变量 1.把解压的文件放…...
RHCE第七章:SElinux
一、SElinux SELinux 是一套安全策略系统 1.作用: (1)SELinux 域限制:对服务程序的功能进行限制,以确保服务程序做不了出格的事 (2)SELinux 安全上下文:对文件资源的访问限制&am…...
一文简单记录打通K8s+Kibana流程如何启动(Windows下的Docker版本)
为ES和Kibana组建Docker网络 docker network create elastic下载8.18.0版本镜像Es并启动 docker run --name es-node01 --net elastic -p 9200:9200 -p 9300:9300 -t docker.elastic.co/elasticsearch/elasticsearch:8.18.0启动Kibana(简单一些直接咯和ES对应版本…...
【系统参数合法性校验】spring-boot-starter-validation
JSR303校验 统一校验的需求 前端请求后端接口传输参数,是在controller中校验还是在Service中校验? 答案是都需要校验,只是分工不同。 Contoller中校验请求参数的合法性,包括:必填项校验,数据格式校验&…...
蓝桥杯 10. 凯撒加密
凯撒加密 原题目链接 题目描述 给定一个单词,请使用凯撒密码将这个单词加密。 凯撒密码是一种替换加密的技术,单词中的所有字母都在字母表上向后偏移 3 位后被替换成密文。 即: a → db → e⋯w → zx → ay → bz → c 输入描述 输入…...
Discord多账号注册登录:如何同时管理多个账户?
Discord是许多人、特别是游戏玩家和社区管理者的重要沟通工具。随着用户需求的增长,越来越多的人开始在Discord上注册多个账号进行管理。例如,个人和工作账号的区分,多个游戏社区的参与,或者通过不同的身份进行更灵活的社交互动。…...
Harbor默认Redis与Notary组件弱口令漏洞分析与修复指南
一、 背景 某资源池控制面和运行面生产环境部署的harbor被漏扫出弱口令需要进行整改,主要涉及 default、server、signer用户存在弱口令。 二、 分析与处理 首先需求确认这三个用户是harbor那个组件使用,最好确认的是default这个用户,它是r…...
【Prometheus-Postgres Exporter安装配置指南,开机自启】
目录 内容概述 一、安装步骤1. 安装 PostgreSQL Exporter2. 创建 PostgreSQL 监控用户3. 配置 Systemd 服务4. 启动并验证服务5. 集成到 Prometheus 内容概述 本教程详细指导如何安装 PostgreSQL Exporter(版本 0.15.0),包括: 软…...
leetcode:3005. 最大频率元素计数(python3解法)
难度:简单 给你一个由 正整数 组成的数组 nums 。 返回数组 nums 中所有具有 最大 频率的元素的 总频率 。 元素的 频率 是指该元素在数组中出现的次数。 示例 1: 输入:nums [1,2,2,3,1,4] 输出:4 解释:元素 1 和 2 的…...
论文导读 - 基于特征融合的电子鼻多任务深度学习模型研究
基于特征融合的电子鼻多任务深度学习模型研究 原论文地址:https://www.sciencedirect.com/science/article/pii/S0925400524009365 引用此论文(GB/T 7714-2015): NI W, WANG T, WU Y, et al. Multi-task deep learning model f…...
VSCode突然连接不上服务器(已解决)
可恶,不知道昨天还好好的VSCode还可以连接到服务器,今天打开就连接不上了,搜了一圈很多都说是服务端的vscode-server这个文件里面保存的commitID与当前我们VSCode上的ID不一致导致连接失败(据说是因为VSCode自动更新导致的&#x…...
解决Ollama run qwen3:32b: Error: unable to load model问题
问题描述 在尝试使用Ollama部署Qwen3模型时,许多用户遇到了以下错误: ollama run qwen3:32b Error: unable to load model: /Users/xxxx/.ollama/models/blobs/sha256-3291abe70f16ee9682de7bfae08db5373ea9d6497e614aaad63340ad421d6312这个错误通常会…...
C++ 单例对象自动释放(保姆级讲解)
目录 单例对象自动释放(重点*) 方式一:利用另一个对象的生命周期管理资源 方式二:嵌套类 静态对象(重点) 方式三:atexit destroy 方式四:atexit pthread_once 单例对象自动释…...
李录谈卖出股票的时机:价值投资的动态决策框架
作为最贴近芒格与巴菲特投资理念的中国投资人,李录对卖出时机的思考融合了价值投资的核心逻辑与实战经验。通过其在哥伦比亚大学的多场演讲及访谈(主要集中于2006年、2013年及后续公开内容),我们可以将其观点归纳为以下五个维度&a…...
Docker的简单使用(不全)
Docker Hello World Docker 允许在容器内运行应用程序,使用docker run命令来在容器内运行一个应用程序 输出Hello World runoobrunoob:~$ docker run ubuntu:15.10 /bin/echo "Hello world"Hello world docker:Docker的二进制执行文件 run…...
A2A与MCP:理解它们的区别以及何时使用
随着AI不断深入到商业工作流中,多个AI代理(Agent)之间的无缝协作成为了一个主要挑战。 为了解决这个问题,Google Cloud推出了一种名为Agent2Agent(A2A)的开放协议,旨在使不同平台和系统中的AI代…...
AI Agent开源技术栈
构建和编排Agent的框架 如果您是从头开始构建,请从这里开始。这些工具可以帮助您构建Agent的逻辑——做什么、何时做以及如何处理工具。您可以将其视为将原始语言模型转化为更自主的模型的核心大脑。 2. 计算机和浏览器的使用 一旦你的Agent能够规划,…...
判断用户选择的Excel单元格区域是否跨页?
VBA应用程序开发过程中,经常需要处理用户选中的单元格区域,有的应用场景中,需要限制用户选中区域位于同一页中(以打印预览显示的分页划分),但是VBA对象模型中并没有提供相应的接口,用于快速查询…...
驱动开发硬核特训 · Day 24(上篇):走进Linux内核时钟子系统 —— 硬件基础全解析
一、前言 在 SoC(System on Chip)设计中,“时钟(Clock)”不仅是信号同步的基石,也是各个模块协调运作的前提。没有合理的时钟体系,CPU无法运行,外设无法通信,存储器无法…...
【GPU 微架构技术】Pending Request Table(PRT)技术详解
PRT(Pending Request Table)是 GPU 中用于管理 未完成内存请求(outstanding memory requests)的一种硬件结构,旨在高效处理大规模并行线程的内存访问需求。与传统的 MSHR(Miss Status Handling Registers&a…...
角度(degrees)和弧度(radians)转换关系
目录 1.从角度转换到弧度: 2.从弧度转换到角度: 示例 将90度转换为弧度: 将π/3弧度转换为角度: 角度(degrees)和弧度(radians)之间的转换关系可以通过以下公式来实现ÿ…...
【大语言模型DeepSeek+ChatGPT+GIS+Python】AI大语言模型驱动的地质灾害全流程智能防治:风险评估、易发性分析与灾后重建多技术融合应用
地质灾害是指全球地壳自然地质演化过程中,由于地球内动力、外动力或者人为地质动力作用下导致的自然地质和人类的自然灾害突发事件。在降水、地震等自然诱因的作用下,地质灾害在全球范围内频繁发生。我国不仅常见滑坡灾害,还包括崩塌、泥石流…...
第十六届蓝桥杯 2025 C/C++组 25之和
目录 题目: 题目描述: 题目链接: 思路: 思路详解: 代码: 代码详解: 题目: 题目描述: 题目链接: P12339 [蓝桥杯 2025 省 B/Python B 第二场] 25 之和…...
万界星空科技QMS质量管理系统几大核心功能详解
QMS质量管理系统(Quality Management System)是一款专为现代企业设计的、全面且高效的质量管理工具,融合了现代质量管理理念与前沿的信息技术,旨在帮助企业构建完善的质量管理体系,确保产品和服务质量。以下为你详细介…...
SSR同构渲染深度解析
同构渲染(Isomorphic Rendering)是SSR(服务器端渲染)的核心概念,指同一套代码既能在服务器端运行,也能在客户端运行。下面我将从原理到实践全面介绍SSR同构渲染。 一、同构渲染核心原理 1. 基本工作流程 …...
【论文阅读/复现】RT-DETR的网络结构/训练/推理/验证/导出模型
利用ultralytics仓库,复现RT-DETR官方实验环境。 使用基于ResNet50和ResNet101的RT-DETR。 目录 一 RT-DETR的网络结构 1 编码器结构 2 RT-DETR 3 CCFF中的融合块 4 实验结果 二 RT-DETR的安装/训练/推理/验证/导出模型 1 安装 2 配置文件 3 训练 4 推理 …...
KUKA机器人关机时冷启动介绍
KUKA机器人在正常关机时,可以从示教器上操作。在示教器上操作时需要选择“冷启动”方式关闭计算机。等示教器屏幕关闭之后,再把主开关旋钮关闭。 一、先登录【管理员】权限,再在【主菜单】下选择【关机】。 二、在关机的默认中,…...
MCP Java SDK 介绍与使用指南
MCP与MCP Java SDK 概念 MCP 是什么? 模型上下文协议(Model Context Protocol, MCP)是用于标准化AI模型与工具间通信的规范。通过定义通用接口,确保不同AI组件(如模型推理服务、工具插件)能无缝协作。MCP …...
【Java核心】一文理解Java面向对象(超级详细!)
一:概述 1.1Java类及类的成员 属性、方法、构造器、代码块、内部类 1.2 面向对象的特征 封装、继承、多态(抽象) 1.3 其它关键字的使用 This、super、package、import、static、final、interface、abstract 1.4 面向对象和面向过程 &…...
2025年DDoS攻击防御全解析:应对超大流量的实战策略
一、2025年DDoS攻击的新趋势 超大规模攻击常态化:攻击流量突破300Gbps,部分案例甚至达到T级规模,传统单点防御已无法应对。 混合攻击模式盛行:攻击者结合应用层(HTTP Flood、CC攻击)与网络层(U…...
【动态导通电阻】 GaN PiN二极管电导调制对动态 RON 的影响
2020 年,浙江大学电气工程学院的Shaowen Han等人采用实验研究的方法,对垂直 GaN-on-GaN PiN 二极管中电导调制的瞬态行为及其对动态导通电阻(RON)的影响进行了深入探究。他们基于高质量的 GaN 基板开发的垂直 GaN-on-GaN 功率器件具有高电流容量和高击穿电压等优势,而与间…...
第十六届蓝桥杯 2025 C/C++B组第一轮省赛 全部题解(未完结)
目录 前言: 试题A:移动距离 试题C:可分解的正整数 试题D:产值调整 试题E:画展布置 前言: 我参加的是第一轮省赛,说实话第一次参加还是比较紧张的,真到考场上看啥都想打暴力&…...
MySQL 实战 45 讲 笔记 ----来源《极客时间》
01 | 基础架构:一条SQL查询语句是如何执行的? 1. MySQL 可以分为 Server层 和 存储引擎层 两部分。Server 层包括连接器、查询缓存、分析器、优化器、执行器等。存储引擎层支持 InnoDB、MyISAM等. (1) 连接器:管理连接,权限认证…...
海思SD3403边缘计算AI核心设备概述
1、海思SD3403边缘计算AI设备4TOPS算力(SD3403模组) 2、AI训练服务器 (≥60TOPS算力 INT8 算力越高AI训练速度越快) 3、普通监控IPC摄像机(低成本,批量化安装项目) 4、AI数据标定工作终端 (≥10TOPS算力 IN…...
算法设计:回溯法的基础原理与应用
目录 一、基本概念 二、适用问题 三、基本步骤 四、算法模式 递归回溯算法模式(求一个解) 非递归回溯算法模式(求一个解) 非递归回溯算法模式(求所有解) 五、经典应用 1数字组合问题 2数字排列问题…...
PyTorch 深度学习实战(23):多任务强化学习(Multi-Task RL)之扩展
之前的PyTorch 深度学习实战(23):多任务强化学习(Multi-Task RL)总结扩展运用代码如下: import torch import torch.nn as nn import torch.optim as optim import numpy as np from torch.distributions import Norm…...
音视频开发---视频编码基础
一、视频编码的必要性 1. 存储与传输成本高 未经编码压缩的原始视频的数据量极大,例如:一般电影的亮度信号采样频率为13.5MHz;色度信号的频带通常为亮度信号的一半或更少,为6.75MHz或3.375MHz。以4:2:2的采样频率为例,Y信号采用13.5MHz,色度信号U和V采用6.75MHz采样,…...
深入蜂窝物联网 第四章 Cat-1 与 5G RedCap:带宽、低时延与未来趋势
1. 前言与应用场景 随着物联网对带宽与时延的需求不断增长,LTE Cat-1 和 5G RedCap(Reduced Capability)应运而生: Cat-1:在传统 LTE 网络上提供最高 10 Mbps 下行、5 Mbps 上行,兼容性佳; 5G RedCap:在 5G NSA/SA 网络中提供 1–20 Mbps,时延可降至 10 ms 级,且模组…...
FPGA 39 ,FPGA 网络通信协议栈进阶,RGMII、ARP 与 UDP 协议与模块设计( RGMII、ARP、UDP原理与模块设计 )
目录 目录 一、核心原理 1.1 RGMII 接口:高效数据传输的物理桥梁 1.2 ARP 协议:IP 与 MAC 地址的动态映射引擎 1.3 UDP 协议:轻量级数据传输的高效选择 1.4 FPGA 实现流程 二、时序约束 2.1 时序约束理论…...
《系统分析师-第三阶段—总结(七)》
背景 采用三遍读书法进行阅读,此阶段是第三遍。 过程 本篇总结第13章第14章的内容 第13章 第14章 总结 系统设计分为概要设计与详细设计,然后重点讲解了处理流程设计,输入输出原型设计,面向对象设计、人机交互设计࿱…...
Lightroom 2025手机版:专业编辑,轻松上手
在摄影和图像编辑的世界里,Adobe Lightroom一直是一个不可或缺的工具。无论是专业摄影师还是摄影爱好者,都依赖它来提升照片的质量和视觉效果。今天,我们要介绍的 Lightroom 2025手机版,是Adobe公司为移动设备量身定制的照片编辑器…...