Skip to content

AidConnect 开发者文档

简介

AidLux 是一款融合 Android 与 Linux 的系统,具备流媒体处理和 AI 推理加速等能力。随着产品的迭代发展,部分客户希望将 AidLux 作为服务载体,利用其处理能力与第三方(客户自有)应用进行数据交互。为满足这一需求,AidConnect 应运而生。

AidConnect 基于 AidIPC 构建,支持 AidLux 与第三方应用之间进行自定义大小的高速数据传输。开发者可通过 SDK 接口 或 手动配置 的方式添加通信管道的名称和大小。配置完成后,通信管道即可在 Android 或 Linux 环境中被访问,用于数据读写。

以第三方应用调用 AidLux 的 AI 推理能力为例,完整流程如下:

  1. 在 AidLux App 中通过界面或 SDK 添加通信管道名称和大小;

  2. 若为手动配置,需重启 AidLux App 以生效;通过 SDK 添加的通道则可立即生效;

  3. Android 应用通过已配置的通道写入源数据;

  4. AidLux Linux 端从对应通道读取数据并进行 AI 推理;

  5. 推理完成后,将结果数据写入另一条通道;

  6. Android 应用从该通道读取推理结果并执行后续逻辑。

通过 AidConnect,AidLux 能够在 Android 与 Linux、以及第三方应用之间实现高效、灵活的数据流转与 AI 能力共享。

开发流程

AidConnect-io

支持情况

LinuxAndroid
C++
Python🚧
Kotlin/Java

✅: 已支持 🚧: 计划支持

快速开始

安装

bash
 sudo aid-pkg update

 ## ubuntu 20.04
 sudo aid-pkg -i -d  aidconnect_1.0.0.2_arm64_ub2004.aid.gpg
 ## ubuntu 22.04
 sudo aid-pkg -i -d  aidconnect_1.0.0.2_arm64_ub2204.aid.gpg
bash
 联系阿加犀获取AidConnect Android SDK,并集成到Android项目工程中

开始示例

以下示例是展示 AidConnect Linux 和 Android 如何进行数据传输,传输需要提前定义传输管道,或者通过 AidConnect Android SDK进行接口添加,两者选其一。传输管道配置存放在 AidLux App 里 /etc/opt/aidlux/memory_config

如果手动配置传输通道,规则如下:

  • 打开 memory_config 文件,手动在 customer_block_array 节点下添加 json 对象,json 对象包含传输的管道名称和管道的大小 (以兆为单位)。例如:
bash
# 定义了test管道,大小为1M
{"cap":6,"m":3,"n":5,"size":5,"block":5,"customer_block_array":[{"name":"test","size":1}]}

提示

使用 AidConnect SDK C++ 开发需要了解如下事项::

  • 在安装完AidConnect C++ sdk,头文件存放路径 /usr/local/include/aidlux/aidconnect/aidconnect.hpp
  • 在安装完AidConnect C++ sdk,动态库存放路径 /usr/local/lib/aidlux/aidconnect/libaidconnect.so
  • 在安装完AidConnect C++ sdk,示例程序存放路径 /usr/local/share/aidconnect/examples
C++
//AidConnect 初始化
Aidlux::AidConnect aidconnect;
int status = aidconnect.init();
if(EXIT_SUCCESS != status){
    printf("aidconnect.init failed !\n");
    return EXIT_FAILURE;
}
//获取管道
status = aidconnect.aidconnect_with_name("test");
if(EXIT_SUCCESS != status){
    printf("aidconnect.aidkv_with_id failed !\n");
    return EXIT_FAILURE;
}
//写数据到管道中
char aaa[] = "Hello Cpp";
printf("Set string[%s], length[%d]\n", aaa, (int)sizeof(aaa));
status = aidconnect.set_bytes(aaa, sizeof(aaa));
if(EXIT_SUCCESS != status){
    printf("aidconnect.set_bytes failed !\n");
    return EXIT_FAILURE;
}
//从管道读取数据
char* result = new char[10000];
uint64_t length = 0;
status = aidconnect.get_bytes(&result, &length);
if(EXIT_SUCCESS != status){
    printf("aidconnect.get_bytes failed !\n");
    return EXIT_FAILURE;
}

printf("Result string[%s], length[%ld]\n", result, length);
Java
//AidConnect 初始化
AidConntect.initialize(application,true,object : AidConnectCallback {
            override fun initCallback(isInitSuccess: Boolean, keys: Set<String>?) {
                if (isInitSuccess){

                }else {

                }

            }
        });
//添加管道,名为test,大小1M      
val channels = AidConntect.addChannelWithName("test", 1)
if (channels==null){
    Log.e("Activity","addChannelWithName failed")
}
//移除管道
val channels =  AidConntect.removeChannelWithName("test")
if (channels==null){
    Log.e("Activity","removeChannelWithName failed")
}
//获取管道
val aidConn = AidConntect.aidConnectWithName("test")
if (aidConn!=null){
    Log.e("Activity","aidConnectWithName failed")
}else {
}
//写数据到管道中
val buffer = ByteArray(3840*2160*3) 
val setFlag = aidConn.setBytes(buffer)
if (setFlag==true){
    Log.i("Activity","setBytes successfully")
}else {
    Log.e("Activity","setBytes failed")
}
//从管道读取数据
val buffer = ByteArray(3840*2160*3) 
val bytes = aidConn?.getBytes(buffer,3840*2160*3)
if (bytes!=null){
    Log.e("Activity","getBytes failed")
}else {
}
//AidConnect 释放
val ret = AidConntect.release()
if (ret==0){
    Log.i("Activity","release successfully")
}else {
    Log.e("Activity","release failed")
}