Skip to main content

智慧屏OTA升级方案

:::info 文档信息

文档标识:RK-SM-YF-535 · 发布版本:V1.0.0 · 发布日期:2020-07-23 · 页数:6 · 语言:中文

原始文档:Rockchip_Introduction_Smart_Screen_OTA_CN.pdf

:::

章节大纲​

  • 智慧屏OTA升级方案(P1)
    • 流程框架(P4)
      • HOST-DEVICE(P4)
    • HOST端实现(P4)
      • APK实现传输功能(P4)
    • DEVICE端实现(P5)
      • AB固件的编译(P6)
      • 升级功能的实现(P6)

在线预览​

若预览无法显示,请直接下载 PDF 后用本地阅读器打开。


1. 流程框架​

1.1 HOST-DEVICE​

如上图所示,OTA升级由TV端的app发起升级请求,基于RNDIS,通过网络传输,将OTA包传输DEVICE端的/data/update.img目录,DEVICE端收到OTA包后进行MD5校验,校验成功,则执行升级应用程序进行OTA升级。

2. HOST端实现​

2.1 APK实现传输功能​

APK需要实现对/data/update.img进行分包传输,sendCmd接口是对DEVICE端发送升级命令,sendData接口是对DEVICE端发送OTA包数据,具体接口说明请查看Rockchip AI Camera 安卓端API接口说明文档,代码实现可参考以下代码:

byte[] inUpdate = new byte[0]; //byte数组接受文件的数据
int leaveNum = 0; //文件剩下的字符数
long streamTotal = 0; //接受流的容量
int streamNum = 0; //流需要分开的数量
File inFile = new File("/data/update.img");
FileInputStream inStream = null;
try {
inStream = new FileInputStream(inFile);
} catch (FileNotFoundException e) {
Log.d(TAG, "inStream fail");
e.printStackTrace();
return;
}
mAIDeviceHandler.sendCmd(mDevHandle, AIDevice.RNDIS_CMD_UPGRADE,
"DOWNLOAD");
try {
streamTotal = inStream.available();
} catch (IOException e) {
e.printStackTrace();
}
Log.d(TAG, "streamTotal is:" + streamTotal);

//取得流文件需要分开的数量

streamNum = (int) Math.floor(streamTotal / MAX_BYTE);

//分开文件之后,剩余的数量

leaveNum = (int) streamTotal % MAX_BYTE;
Log.d(TAG, "streamNum is:" + streamNum + "leaveNum is:" + leaveNum);

//文件的容量大于60Mb时进入循环

if (streamNum > 0) {
for (int i = 0; i < streamNum; ++i) {
inUpdate = new byte[MAX_BYTE];

//读入流,保存在byte数组

try {
inStream.read(inUpdate, 0, MAX_BYTE);
} catch (IOException e) {
e.printStackTrace();
}
try {
sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
mAIDeviceHandler.sendData(mDevHandle, inUpdate, MAX_BYTE, 1);
}
}

//写出剩下的流数据

inUpdate = new byte[leaveNum];
try {
inStream.read(inUpdate, 0, leaveNum);
} catch (IOException e) {
e.printStackTrace();
}
mAIDeviceHandler.sendData(mDevHandle, inUpdate, leaveNum, 0);

3. DEVICE端实现​

3.1 AB固件的编译​

DEVICE端需要编译生成AB固件,参考Rockchip_Developer_Guide_Linux_Upgrade_CN文档,Linux A/B模式章节,进行相应配置生成AB固件。

3.2 升级功能的实现​

DEVICE端完整接收TV端发送的OTA包后,进行MD5值校验,校验成功,则调用updateEngine升级程序进行OTA升级。