传祺19款GS5车机在线系统更新设计

前言

在前面的文章中,我们已经掌握了升级包的制作

在平常,如果需要进行刷机,通常需要进行以下步骤

  • 电脑上下载更新包
  • 复制到U盘
  • 拿到车上进行更新

如果遇到软件更新的情况,则需要再进行以上的操作,繁琐切麻烦

那么问题来了,如何在没有电脑和没有U盘的情况下进行更新系统呢?
如何快捷的进行更新呢?
如何更接近官方的更新方式呢?

分析

系统中自带的app做为研究对象,通过反编译+抓包的方式进行桥接破解

抓包

车机连接上wifi后设置服务器代理进行抓包,数据源样例

1
2
3
4
5
6
7
POST http://fota.timasync.com/api/check?componentVersion=A10T.AVNT.S.190427.V6.59.R&mac=123&model=AVNTG2A10&vendor=GAEI_ECU_DEV&locale=zh&imei=456 HTTP/1.1
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) chrome/33.0.1750.146 Safari/537.36
Host: fota.timasync.com
Connection: Keep-Alive
Accept-Encoding: gzip
Content-Length: 0

请求参数说明:

  • componentVersion=A10T.AVNT.S.190427.V6.59.R 当前系统版本
  • mac=123 车机MAC地址
  • model=AVNTG2A10 车辆型号
  • vendor=GAEI_ECU_DEV 供应商?
  • locale=zh 车机语言
  • imei=456 车机imei

无升级包时返回值样例

1
{"code":1006,"packageType":0,"root":0,"success":true}

有升级包时返回值样例

1
2
3
4
5
6
7
8
9
10
11
12
{
"code": 0,
"packageType": 1,
"root": 0,
"success": true,
"cdnDistribution": 1,
"newComponentVersion": "A10T.AVNT.S.200115.HOST.V1.0",
"packageMd5": "c10b9cb5cf49b6aab2b543ea870730fa",
"packageName": "A10T.AVNT.S.200115.HOST.V1.0",
"packageSize": 102400,
"packageDesc": "描述"
}
  • root 是否root
  • cdnDistribution 升级包cdn的id
  • newComponentVersion 新版本名称
  • packageMd5 新版本的MD5
  • packageName 升级包名称
  • packageSize 升级包大小
  • packageDesc 此次升级描述、内容

编码

得到以上数据包即可进行编码,做一个服务端,核心代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
[Route("check")]
[HttpPost]
public async Task<CheckResult> CheckFota(string componentVersion, string mac, string model, string vendor, string locale, string imei)
{
var package = await _fotaService.CheckPackageUpdate(componentVersion, mac,
model, vendor, locale, imei);

var result = new CheckResult();
if (package == null)
{
result.code = 1004;
result.packageType = 0;
result.root = 0;
result.success = true;
}
else
{
result.code = 0;
result.packageType = package.Type;
result.root = 0;
result.success = true;
result.cdnDistribution = package.Id;
result.newComponentVersion = package.ComponentVersion;
result.packageMd5 = package.Md5;
result.packageName = package.Name;
result.packageSize = package.Size;
result.packageDesc = package.Describe;
}

return result;
}

进阶

现在可以实现对系统更新的服务端接管,但是无法实现个性化,举个例子

现有系统更新包A10T.AVNT.S.190427.V6.59.R、A10T.AVNT.S.191125.V6.59.R

现在A想更新190427的版本,B想更新191125的版本,C表示我不想更新系统,不要推送系统给我

如何实现个性化是一个大的问题

纵观系统更新发出来的数据包中带有的参数,mac和imei都可以进行对唯一的车机进行识别

那么我们就做一个推送的规则功能

1
2
3
4
5
6
7
8
9
10
11
//检查升级包,看看是否有可用升级包
FotaPackage package = null;
var rule = await _ruleRepository.FindRule(imei);
if (rule != null)
{
package = await _packageRepository.FindPackage(model, vendor, componentVersion);
if (package != null)
{
return package;
}
}

根据imei识别规则,如果推送规则中有内容,则推送更新,完美解决系统更新中个性化的问题

现在只需要知道自己车机上的imei,然后到平台上选择推送的包,添加到推送规则中即可实现在线更新,大大方便了个性化的需求