Skip to content

AidConnect

简介

Aidlux作为Android-Linux融合系统,具有处理流媒体,AI推理加速等能力。随着产品迭代发展,有客户需要将Aidlux作为服务载体,借助Aidlux的能力,将Aidlux处理之后的数据发送给三方(客户自己)的应用,同时Aidlux处理的数据源也可能来源三方(客户自己)的应用。所以AidConnect应运而生。AidConnect基于AidIPC,支持Aidlux和三方应用进行自定义数据大小高速率传输。开发者可以手动配置也可以通过SDK接口添加通信管道名称和大小,在设置完成之后,开发者可以在Android/Linux 中获取对应的管道,并进行读写。 以三方应用想要借助Aidlux AI能力,将源数据传输到Aidlux进行AI推理,推理完成之后,将数据传回三方应用。完整的调用实例参考流程为:用户在Aidlux App配置通信管道名称和大小,或者通过Android SDK添加通信管道名称和大小接口进行配置。如果是手动配置,重启Aidlux App让通信管道生效,通过接口添加的通信管道无需重启Aidlux App,添加即生效。Android App获取已配置的通道,并向通道写数据源,在Aidlux App的Linux中获取已配置的通道,进行读取数据,后续进行AI操作,将AI处理完的数据,写入到已配置的通道中,比如另一个传输通道,在Android App通过另一个传输通道获取AI处理的结果数据,并进行后续Android App的逻辑处理。

开发流程

alt text

支持情况

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对象包含传输的管道名称和管道的大小。💡注意:大小是以兆为单位 例如: {"cap":6,"m":3,"n":5,"size":5,"block":5,"customer_block_array":[{"name":"test","size":1}]} 定义了test管道,大小为1M

使用 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")
}