作者|傅宽,单位:中国移动智能家居运营中心实验室指南OpenWrt提供了系统总线ubus,类似于Linux桌面操作系统的d-Bus。提供系统级进程间通信(IPC)功能。ubus的设计理念与d-Bus基本相同。提供系统级总线功能,与d-Bus相比减少了系统内存占用,可适应嵌入式Linux操作系统的低内存和低端CPU性能。特殊环境。ubus在openwrt平台开发中提供了进程间通信的通用框架。它使得进程间通信的实现变得非常简单。ubus实现的基础是unixsocket,即localsocket,比用于网络通信的inetsocket更高效、更可靠。Unix套接字客户端和服务器的实现方式与网络套接字类似。Part01如何实现一个简单的unixsocketserver和client首先,创建一个socketserver,将其绑定到本地socket文件,并启用对客户端连接的监听。其次,建立一个或多个套接字客户端并连接到服务器。客户端和服务器相互发送消息。客户端或服务器收到对方的消息后,对具体的消息进行相应的处理。Part02ubus通信框架ubus同样实现了上述组件,并对socket连接、消息传输和处理进行了封装。ubus提供了一个套接字服务器:ubusd。因此,开发者不需要自己去实现服务端。ubus提供了创建socket客户端的接口,提供给用户直接使用的客户端。ubus的内部框架大致如下:UbusDaemon是ubusd,它是一个服务管理服务器。上图右下角的组件是一个Client,用于向ubusd请求服务。而左下角是一个服务提供者(相对于ubusd,它其实是一个Client,这里所说的Server其实是相对于服务请求者Client而言的,不要搞混了)。上图中Server和Client之间通信的消息是JSON格式的。Part03ubus消息格式及有效通信方式客户端与服务器通信的ubus消息为json格式。Ubus从客户端的消息处理中抽象出“对象”和“方法”的概念。一个对象包含多个方法,客户端需要向服务器注册自己的处理方法。对象和方法都有自己的名称,请求者只需在消息中指定要调用的对象和方法的名称即可。Part04ubus引用的一些动态库libubus.so:创建socket、监听连接、发送消息等接口函数。libubox.so:等待和阅读消息。libblobmsg.so、libjson.so:提供封装和解析json数据的接口。编程时不需要直接使用libjson.so,而是使用libblobmsg.so提供的更灵活的接口函数。使用ubus进行进程间通信不需要写很多代码,按照固定的方式调用ubus提供的API接口即可。
