FireflyApi2 1.概述 FireflyApi2 提供了部分系统接口以及封装了部分用户需要的功能接口,主要是 为了让用户容易和简单的使用系统常用接口, 此文档只是对接口进行简单的说 明,具体的使用参考 FireflyApi2Demo 的源码。 支持 rk3568/rk3566 Android11 平台所有系列机型 支持 rk3588 Android12 平台所有系列机型 2.资源下载和使用 使用 FireflyApi2 时先检查一下机器的固件是否是最新版本,最新版本的固件 内置了基于 FireflyApi2 实现的 FireflyApi2Demo 应用,可以在 [资源下载] 页面找到对应的机型查看并下载最新固件,同时也可以同步SDK到最新提交,具 体先选择对应机型的 [wiki] ,然后在"Android开发"->"编译Android固件"里面找到同步的方式。 FireflyApi2Demo 源码下载: [FireflyApi2Demo](提取码:1234) Demo 主要包含 fireflyapi2.aar 和 FireFlyApi2Demo 的源码,其结构目录如 下: fireflyapi2demo/ ├── app │   ├── build.gradle │   ├── libs │   │   └── fireflyapi2.aar │   ├── proguard-rules.pro │   └── src ├── build.gradle ├── gradle ├── gradle.properties ├── gradlew ├── gradlew.bat ├── local.properties └── settings.gradle 2.1 FireflyApi2Demo 应用简述 FireflyApi2Demo 是基于 FireflyApi2 的接口实现的 Demo 程序,用户可参考 Demo 的源码实现自己所需的功能。 当使用最新版本的固件时,里面会内置 FireflyApi2Demo 的应用。 应用如图 点击进入应用后会有相应的接口实现列表如图 2.2 FireflyApi2的使用 2.2.1 Android Studio Android Studio 是谷歌推出的一个 Android 集成开发工具,基于IntelliJ IDEA,类似 Eclipse ADT,Android Studio 提供了集成的 Android 开发工具用 于开发和调试。 2.2.2 项目中导入fireflyapi2.aar FireflyApi2Demo 是给用户呈现出接口相应的功能,用户如需要编写自己的应用 程序,可将 fireflyapi2.aar 放在 libs 目录下: app/ ├── build.gradle ├── libs │   └── fireflyapi2.aar 然后配置 build.gradle 文件,即可使用 FireflyApi2 定制应用程序。 dependencies { ...... + implementation files('libs/fireflyapi2.aar') } 3.FireflyApi2 接口说明 要使用 FireflyApi2 的接口需要先导入依赖并获取实例化对象: import com.firefly.api2.FireflyApi2; public class *** { ...... private static FireflyApi2 mFireflyApi2 = FireflyApi2.getInstance(); ...... } 3.1 系统信息 1. FireflyApi2版本信息 函数:public String getFireflyApiVersion() 描述:FireflyApi2 版本信息 范例: String version = mFireflyApi2.getFireflyApiVersion(); 2. 获取设备型号 函数:public String getAndroidModel() 描述:获取设备型号 范例: String model= mFireflyApi2.getAndroidModel(); 3. 获取设备Android系统的版本 函数:public String getAndroidVersion() 描述:获取设备Android系统的版本 范例: String version= mFireflyApi2.getAndroidVersion(); 4. 获取设备RAM大小(MB) 函数:public long getRamSpace() 描述:获取设备RAM大小,单位为MB 返回:返回RAM大小,单位为MB 范例: long ram = mFireflyApi2.getRamSpace(); 5. 获取设备RAM大小(GB) 函数:public String getFormattedRamSpace() 描述:获取设备RAM大小,并格式化为String 返回:设备的RAM大小,String格式(1.5GB) 范例: String ram = mFireflyApi2.getFormattedRamSpace(); 6. 获取设备内置Flash大小(MB) 函数:public long getFlashSpace() 描述:获取设备内置Flash大小,单位为MB 返回:返回Flash大小,单位为MB 范例: long flash = mFireflyApi2.getFlashSpace(); 7. 获取设备内置Flash大小(GB) 函数:public String getFormattedFlashSpace() 描述:获取设备内置Flash大小,并格式化为String 返回:设备的Flash大小,String格式(15.5GB) 范例: String ram = mFireflyApi2.getFormattedFlashSpace(); 8. 获取设备固件内核版本 函数:public String getFormattedKernelVersion() 描述:获取设备固件内核版本 返回:内核版本 范例: String kernel_version= mFireflyApi2.getFormattedKernelVersion(); 9. 获取设备固件系统版本 函数:public String getAndroidDisplay() 描述:获取设备固件系统版本 返回:固件系统版本 范例: String version= mFireflyApi2.getAndroidDisplay(); 3.2 系统设置 1. 系统关机 函数:public void shutDown(boolean showConfirm) 描述:系统关机 参数:showConfirm 是否显示关机框 范例: mFireflyApi2.shutDown(false); 2. 系统重启 函数:public void reboot() 描述:系统重启 范例: mFireflyApi2.reboot(); 3. 系统休眠 函数:public void sleep() 描述:系统休眠 范例: mFireflyApi2.sleep(); 4. 截屏 函数:public boolean takeScreenshot(String path,String name) 描述:截图并存储到指定路径 参数:path 存储路径    name 存储的文件名(暂时只支持png格式) 返回:截图是否成功true/false 范例: mFireflyApi2.takeScreenshot("/sdcard/","123.png"); 5. 屏幕旋转 函数:public boolean setRotation(int rotation) 描述:屏幕旋转 屏幕参数:rotation 屏幕方向    Surface.ROTATION_0    Surface.ROTATION_90    Surface.ROTATION_180    Surface.ROTATION_270   范例:mFireflyApi2.setRotation(Surface.ROTATION_0); 6. 获取屏幕方向 函数:public int getRotation() 描述:获取屏幕方向 返回:rotation 屏幕方向    Surface.ROTATION_0    Surface.ROTATION_90    Surface.ROTATION_180    Surface.ROTATION_270 范例: int rotation = mFireflyApi2.getRotation(); 7. 设置系统日期 函数:public boolean setSysDate( int year, int month, int day) 描述:设置系统日期 参数:year 年    month 月    day 日 返回:为true设置成功,为false设置失败 范例: mFireflyApi2.setSysDate(2022,7,21); 8. 设置系统时间 函数:public boolean setSysTime( int hour,int minute,int second) 描述:设置系统时间 参数:hour 时    minute 分    second 秒 返回:为true设置成功,为false设置失败 范例: mFireflyApi2.setSysTime(5,30,45); 9. 同步NTP服务器时间 函数:public boolean syncNtpTime( String ntpServer, int timeout) 描述:同步NTP服务器时间 参数:ntpServer 服务器    timeout 超时 返回:为true设置成功,为false设置失败 范例: mFireflyApi2.syncNtpTime("time.windows.com", 30000); 10. 静默安装应用 函数:public boolean silentInstal(String path, IPackageInstallObserver observer) 描述:静默安装应用 参数:path apk路径    IPackageInstallObserver 处理返回的安装结果 返回:为true安装成功 范例: mFireflyApi2.silentInstall("/sdcard/***.apk", new IPackageInstallObserver.Stub(){ @Override public void packageInstalled(String packageName, int returnCode) { Log.v("debug", "packageInstalled packageName:" + packageName + ",returnCode:" + returnCode); } }); 11. 静默卸载应用 函数:public boolean silentUnInstall(String package_name, IPackageDeleteObserver observer) 描述:静默卸载应用 参数:package_name 为需要卸载应用的包名    IPackageDeleteObserver 处理返回的卸载结果 返回:卸载成功返回true,卸载失败返回false 备注:只支持卸载安装的应用,不支持卸载内置应用 范例: mFireflyApi2.silentUnInstall("com.android.settings", new IPackageDeleteObserver.Stub() { @Override public void packageDeleted(String packageName, int returnCode) { Log.v("debug", "packageDeleted packageName:" + packageName + ",returnCode:" + returnCode); } }); 12. 运行shell命令 函数:public Command execCmd(String cmd) 描述:运行shell命令 参数:cmd shell命令 返回:Command input 输入命令    output 输出结果    exitStatus shell运行状态,为0是正常退出 范例: mFireflyApi2.execCmd("ls"); 13. su权限运行shell命令 函数:public static Command execSuCmd(String cmd) 描述:su权限运行shell命令 参数:cmd shell命令 返回:Command input 输入命令    output 输出结果    exitStatus shell运行状态,为0是正常退出 范例: mFireflyApi2.execSuCmd("cat init.rk30board.rc");//init.rk30board.rc 默认权限750 14. 应用开机自启动 函数:public void setAppStartup(String packageName) 描述:第三方应用开机自启动 参数:packageName app 包名 范例: mFireflyApi2.setAppStartup("com.tchip.testscheduleonoff"); 15. 取消应用开机自启动 函数:public void cleanAppStartup() 描述:取消应用开机自启动 范例: mFireflyApi2.cleanAppStartup(); 3.3 硬件接口 3.3.1 GPIO 1. gpio 控制 函数:public boolean gpioCtrl(int gpio, String direction, int value) 描述:控制 gpio 参数:gpio gpio 编号    direction in, out    value 1/0 返回:true (成功)/ false(失败) 范例: boolean success = mFireflyApi2.gpioCtrl(150,"out",1);//GPIO4_C6的 gpio 节点为150 2. gpio 读值 函数:public int gpioRead(int gpio) 描述:读取 gpio 的值 参数:gpio gpio 编号 返回:读取失败时返回-1 范例: int gpioValue = mFireflyApi2.gpioRead(150);//GPIO4_C6的 gpio 节点为150 3. 检查gpio口是否被系统占用 函数:public boolean isGpioOccupied(int gpio) 描述:检查 gpio 口是否被系统占用 参数:gpio gpio 编号 返回:true(被占用)/false(空闲) 范例: boolean occupied = mFireflyApi2.isGpioOccupied(150);//GPIO4_C6的 gpio 节点为150 4. 解析gpio的节点值 函数:public int gpioParse(String gpioStr) 描述:解析 gpio 的节点值,例 GPIO4_C6 转换为节点150 参数:gpioStr 返回:解析失败返回-1 范例: int gpioValue= mFireflyApi2.gpioParse("GPIO4_C6");//GPIO4_C6的 gpio 节点为150 3.3.2 串口使用 导入头文件 import com.firefly.api2.serialport.SerialHelper2; 根据路径和波特率打开串口,并设置回调函数 private SerialHelper2 serialHelper; private boolean openSerialPort(String path,int baudrate) { ...... serialHelper = new SerialHelper2(path, baudrate) { @Override protected void onDataReceived(final byte[] data) { //16进制 Log.v(TAG,serialHelper.getPort()+" onDataReceived:"+ ByteUtil.ByteArrToHex(data).trim()); // 字符串 Log.v(TAG,serialHelper.getPort()+" onDataReceived- String:"+ new String(data, 0,data.length).trim()); } }; try { serialHelper.open(); return serialHelper.isOpen(); } catch (IOException e) { e.printStackTrace(); } return false; } 向串口发送字符串 serialHelper.sendTxt("112233445566"); 向串口发送16进制 //如 0x11,0x22,0x33,0x44,0x55,0x66 serialHelper.sendHex("112233445566"); 关闭串口 serialHelper.close(); 3.3.3 CAN使用 在使用之前需要了解 CanFilter,CanMessage,CanMessageListener, CanSocket 四个类的主要作用和用法。 CanFilter 构造函数:public CanFilter(final int mask, final int filter) 描述:用于存储过滤接收帧信息 参数:mask 掩码    filter 帧id 范例: //无接收过滤信息 CanFilter[] nofilters = new CanFilter[0]; //仅接收id为 0x400 和 0x410的帧 CanFilter[] filters = new CanFilter[]{new CanFilter(0xfff, 0x400), new CanFilter(0xfff, 0x410)}; CanMessage 构造函数:public CanMessage(final boolean isEFF, final boolean isRTR, final int id, final byte[] data) 描述:用于存储帧信息 参数:isEFF true 为扩展帧,false 为标准帧    isRTR true 为远程帧,false 为数据帧    id 帧ID    data 帧数据 范例: 存储一帧信息,id 为0x100, 标准帧,数据帧,数据为{0x01,0x02,0x03,0x04,0x05,0x6,0x7},长度为7的帧信息 boolean isEFF = false; boolean isRTR = false; int canid = 0x100; byte[] data = new byte[] {(byte)1, (byte)2, (byte)3, (byte)4, (byte)5, (byte)6,(byte)7}; CanMessage message = new CanMessage(isEFF, isRTR, canid, data); 获取帧信息 ID 函数:public final int getRawId() 描述:获取帧 ID 范例 : int can_id = message.getRawId(); 获取帧信息数据 函数:public final byte[] getData() 描述:获取帧信息 范例: byte[] data = message.getData(); 帧信息 函数:public final String toString() 描述:帧信息 范例: Log.i("debug", message.toString()); CanMessageListener 函数:public void rxedCanMessage() 描述:用于接收到 can 信息的处理接口函数 范例: public class TestCanHelper implements CanMessageListener { public final void rxedCanMessage(final CanMessage message) { Log.i(TAG, message.toString()); } } CanSocket 打开can设备 函数:public int canDeviceOpen(final String canDevice)throws IOException 描述:打开 can 设备,获取 socket 套接字 参数:canDevice can通道 返回:socket 套接字,失败返回-1 范例: int socket = mCanSocket.canDeviceOpen("can0"); 初始化接收任务 函数:public void initReceiveTask(final int socket, CanFilter[] filters) 描述:初始化接收任务 参数:socket 套接字    filters 过滤器 范例: mCanSocket.initReceiveTask(mRxSocket, filters); 开始接收任务 函数:public boolean startReceiveTask() 描述:开始接收任 务 返回:true(成功)/false(失败) 范例: boolean result = mCanSocket.startReceiveTask(); 停止接收任务 函数:public boolean stopReceiveTask() 描述:停止接收任 务 返回:true(成功)/false(失败) 范例: boolean result = mCanSocket.stopReceiveTask(); 发送帧信息 函数:public void transmit(CanMessage message, int socket)throws IOException 描述:发送帧信息 参数:message 帧信息    socket 套接字 范例: mCanSocket.transmit(message, mTxSocket); 获取接收任务状态 函数:public boolean RxTaskState() 描述:获取接收任 务状态 返回:true 接收任务处于运行状态    false 接收任务处于停止状 态 范例: boolean state = mCanSocket.RxTaskState(); 关闭can设备 函数:public void closeDevice(final int socket, final String canDevice) 描述:关闭can设备 参数:canDevice can通道 范例: mCanSocket.closeDevice(socket, "can0"); 添加接收监听器 函数:public void addMessageListener(final CanMessageListener canMessageListener) 描述:添加接收监听器 参数: canMessageListener 接收监听器 范例: mCanSocket.addMessageListener(this); 移除接收监听器 函数:public void removeMessageListener(final CanMessageListener canMessageListener) 描述:移除接收监听器 参数: canMessageListener 接收监听器 范例: mCanSocket.removeMessageListener(this); 清空接收监听器 函数:public void clearMessageListeners() 描述:清空接 收监听器 范例: mCanSocket.clearMessageListeners(); 设置波特率 函数:public static boolean setCanBaudRate(String canDevice, String baudrate) 描述:设置波特率 参数:canDevice can设备   baudrate 波特率 返回:true(成功)/false(失败) 范例: boolean result = CanSocket.setCanBaudRate("can0", "500000"); // can0波特率为500Kbps 获取can设备 函数:public static String[] getCanDeviceArr() 描述:获取 can设备 返回:可用的can设备 范例: String[] canDeviceArr = CanSocket.getCanDeviceArr(); 简单使用范例 import android.util.Log; import com.firefly.api2.can.CanFilter; import com.firefly.api2.can.CanMessage; import com.firefly.api2.can.CanMessageListener; import com.firefly.api2.can.CanSocket; import java.io.IOException; public class CanTest implements CanMessageListener { private static String TAG = "CanTest"; private CanSocket mCanSocket = new CanSocket(); private int txSocket, rxSocket; public CanTest(){} public void send()throws IOException { boolean isEFF = false; boolean isRTR = false; int id = 0x100; byte[] data = new byte[] {(byte)1, (byte)2, (byte)3, (byte)4, (byte)5, (byte)6,(byte)7, (byte)8}; CanMessage message = new CanMessage(isEFF, isRTR, id, data); CanSocket.setCanBaudRate("can0", "500000"); txSocket = mCanSocket.canDeviceOpen("can0"); mCanSocket.transmit(message,txSocket); mCanSocket.closeDevice(txSocket, "can0"); } public void receive()throws IOException{ CanFilter[] filter = new CanFilter[0]; CanSocket.setCanBaudRate("can1", "500000"); int rxSocket = mCanSocket.canDeviceOpen("can1"); mCanSocket.initReceiveTask(rxSocket, filter); mCanSocket.clearMessageListeners(); mCanSocket.addMessageListener(this); mCanSocket.startReceiveTask(); } public void stopTask(){ mCanSocket.stopReceiveTask(); mCanSocket.removeMessageListener(this); mCanSocket.closeDevice(rxSocket, "can1"); } @Override public void rxedCanMessage(final CanMessage message){ Log.d(TAG, "rxedCanMessage: " + message.toString()); } } 3.4 安装升级 1. 本地ota包升级 函数:public void installPackage(String path) 描述:将重启进行ota包升级,目前仅支持放置在内置存储根目录,即/sdcard/下 参数:path ota包的绝对路径 范例: mFireflyApi2.installPackage("/sdcard/update.zip"); 3.5 网络 网络功能需要添加以下权限: 3.5.1 以太网 1. 判断是否为双以太网口 函数:public boolean isDualEth(){ 描述:获取设备是否为双以太网口 返回:true 双以太网口    false 单以太网口 范例: boolean isDual = = mFireflyApi2.isDualEth(); 2. 获取设备主以太网口的MAC地址 函数:public String getEthMacAddress() 描述:获取设备主以太网口的MAC地址 返回:失败返回null 范例: String ethMac = mFireflyApi2.getEthMacAddress(); 3. 获取设备主以太网口的信息 函数:public EthernetInfo getEthConfiguration() 描述:获取设备主以太网口的信息(包含:ip,netmask,gateway,dns1,dns2) 范例: IpConfig info = mFireflyApi2.getEthConfiguration(); debug("IpAddress:"+info.getIpAddress()+"\n"); debug("Netmask:"+info.getNetmask()+"\n"); debug("Gateway:"+info.getGateway()+"\n"); debug("Dns1:"+info.getDns1()+"\n"); debug("Dns2:"+info.getDns2()+"\n"); 4. 设置设备主以太网口的IP地址 函数:public boolean setEthConfiguration(boolean isStatic,String ipaddressStr,String maskStr,String gatewayStr,String dns1Str,String dns2Str) 描述:设置设备以太网口的IP地址 参数:isStatic true 为静态 IP 时其他参数才有效,否则 false 时为动态 IP 自动获取 IP 返回:失败返回 false 范例: boolean set_static_ip = mFireflyApi2.setEthConfiguration(true,"192.168.1.3",.....); boolean set_dhcp_ip = mFireflyApi2.setEthConfiguration(false,null,null,null,null,null); 5. 设置主以太网口开启/关闭 函数:public boolean setEthEnable(boolean enabled) 描述:设置主以太网开启/关闭 参数:enabled true(开启)/false(关闭) 范例: boolean connect = mFireflyApi2.setEthEnable(); 6. 获取设备副以太网口的MAC地址 函数:public String getEthAuxMacAddress() 描述:获取设备副以太网口的 MAC 地址 返回:失败返回 null 范例: String auxEthMac = mFireflyApi2.getEthAuxMacAddress(); 7. 获取设备副以太网口的信息 函数:public EthernetInfo getEthAuxConfiguration() 描述:获取设备副以太网口的信息(包含:ip,netmask,gateway,dns1,dns2) 范例: IpConfig info = mFireflyApi2.getEthAuxConfiguration(); debug("IpAddress:"+info.getIpAddress()+"\n"); debug("Netmask:"+info.getNetmask()+"\n"); debug("Gateway:"+info.getGateway()+"\n"); debug("Dns1:"+info.getDns1()+"\n"); debug("Dns2:"+info.getDns2()+"\n"); 8. 设置设备副以太网口的IP地址 函数:public boolean setEthAuxConfiguration(boolean isStatic,String ipaddressStr,String maskStr,String gatewayStr,String dns1Str,String dns2Str) 描述:设置设备副以太网的IP地址 参数:isStatic true 为静态 IP 时其他参数才有效,否则false时为动态 IP 自动获取 IP 返回:失败返回false 范例: boolean set_static_ip = mFireflyApi2.setEthAuxConfiguration(true,"192.168.1.3",.....); boolean set_dhcp_ip = mFireflyApi2.setEthAuxConfiguration(false,null,null,null,null,null); 3.5.2 无线网络 1. 打开设备热点 函数:public void startTethering(ITetheringCallback callback) 描述:打开设备热点 参数:callback 事件回调 范例: mFireflyApi2.startTethering(new ITetheringCallback.Stub (){ @Override public void onTetheringStarted() throws RemoteException { Log.v(TAG,"onTetheringStarted"); } @Override public void onTetheringFailed() throws RemoteException { Log.v(TAG,"onTetheringFailed"); } }); 2. 关闭设备热点 函数:public void stopTethering() 描述:关闭设备热点 范例: mFireflyApi2.stopTethering(); 3. 判断设备热点是否已经打开 函数:public boolean isWifiHotspotEnabled() 描述:判断设备热点是否已经打开 返回:true(开启)/false(关闭) 范例: boolean isEnabled = mFireflyApi2.isWifiHotspotEnabled(); 4. 获取设备热点配置信息 函数:public SoftApConfiguration getWifiHotspotConfig() 描述:获取设备热点配置信息 返回:SoftApConfiguration 范例: SoftApConfiguration config = mFireflyApi2.getWifiHotspotConfig(); 5. 配置设备热点信息 函数:public void configWifiHotspot(String ssid, String password) 描述:配置设备热点信息(热点名称,密码) 参数:ssid 热点名称    password 密码 返回:SoftApConfiguration 范例: mFireflyApi2.configWifiHotspot("AndroidAP_Test","12345678"); 6. 自动关闭设备热点 函数:public void setWifiHotspotAutoShutdownEnabled(boolean enabled) 描述:自动关闭设备热点(无设备连接) 参数:enabled true(开启)/false(关闭) 范例: mFireflyApi2.setWifiHotspotAutoShutdownEnabled(true); 7. 判断设置热点是否开启自动关闭功能 函数:public boolean isWifiHotspotAutoShutdownEnabled() 描述:判断设置热点是否开启自动关闭功能 返回:true(开启)/false(关闭) 范例: boolean mAutoOff = mFireflyApi2.isWifiHotspotAutoShutdownEnabled(); 8. 设备热点使用固定IP地址 函数:public void setWifiHostspotUseFixedIfaceAddr(boolean use) 描述:设备热点使用固定IP地址 参数:use true(开启)/false(关闭) 范例: mFireflyApi2.setWifiHostspotUseFixedIfaceAddr("true"); 3.6 定时开关机 1. 设置一次定时开机 函数:public void setSchedulePowerOn(int id, boolean enabled, long alarm_time) 描述:指定UTC时间,设置定时开机,仅一次不会重复 参数:id 定时开机id    enabled true(开启)/false(关闭)    alarm_time 开机时间(UTC时间) 范例: //设置1分钟后开机,id为11002 mFireflyApi2.setSchedulePowerOn(11002,true,System.currentTimeMillis()+60); //取消id为11002的操作 mFireflyApi2.setSchedulePowerOn(11002,false,0); 2. 设置一次定时关机 函数:public void setSchedulePowerOff(int id, boolean enabled, long alarm_time) 描述:指定UTC时间,设置定时关机,仅一次不会重复 参数:id 定时关机id    enabled true(开启)/false(关闭)    alarm_time 关机时间(UTC时间) 范例: //设置1分钟后关机,id为11001 mFireflyApi2.setPowerOffAlarm(11001, true,System.currentTimeMillis()+60); //取消id为11001的操作 mFireflyApi2.setPowerOffAlarm(11001, false,0); 3. 设置一次定时重启 函数:public void setSchedulePowerReboot(int id, boolean enabled, long alarm_time) 描述:指定UTC时间,设置定时重启,仅一次不会重复 参数:id 定时重启id    enabled true(开启)/false(关闭)    alarm_time 重启时间(UTC时间) 范例: //设置1分钟后重启,id 为11003 mFireflyApi2.setSchedulePowerReboot(11003, true,System.currentTimeMillis()+60); //取消id 为11003的操作 mFireflyApi2.setSchedulePowerReboot(11003, false,0); 如果以上的功能无法满足您的需求,可以使用一下接口,自己做逻辑实现功能。 此接口只是最基本的定时开关机功能,由传入的id控制开启/关闭, 重启后失效需要手动再次设置 。