上架
- 帐号:对于上架测试的账号有授权和白名单的要求,如果FA发布到全网且产品未通过发布
商用环境
,那么普通用户拉起FA后无法显示设备的图片,如果账号在DP平台开启了测试选项,那么可以正常拉起和使用。如果账号没有设置测试选项,那么需要进行以下设置:
打开DP平台,用主帐号给该帐号授权,并点击右上角的用户头像->基本资料
进行设置,开启智慧生活测试。
- 自测表:FA上架前需要做自测,该自测从华为方获取自测表进行自测。
- 程序包:在DevEco Studio中进行Build App进行导出
- 版本号
{
"app": {
"bundleName": "com.skyworth.xxx",
"vendor": "skyworth",
"version": {
"code": 1000001,
"name": "1.0.1"
}
}
}
该闭包展示的是模块的版本号,位于config.json的首个闭包,其中上架后的版本号需要在每个模块中进行单独设置。
- icon
该选项位于config.json上的icon的值,需要进行简单的Logo替换,该logo在正式版可以显示在配网前页面的标识。
- 显示服务名
该服务名为展示给用户的服务名,便于辨识原子化服务(针对每个模块均需要进行单独设置):
{
"skills": [
{
"entities": [
"entity.system.home"
],
"actions": [
"action.system.home"
]
}
],
"name": "com.skyworth.xxx.MainAbility",
"icon": "$media:icon",
"description": "该Ability描述",
"label": "显示的原子化服务名",
"type": "page",
"mission": "com.skyworth.xxx",
"launchType": "standard"
}
如下图中的entry_MainAbility则为显示的原子化服务名:
软件更新:更新软件包需要重新提测,上传软件包。
智慧生活服务
以下页面为应用基本信息,需要结合智慧生活服务和上架使用。
SHA256证书指纹:该选项需要增加Release证书的SHA256指纹信息,否则无法进行FA授权。
包名:对应于Bundle Name。
OAuth 2.0客户端ID:该选项对应的是entry模块的config.json的appid选项:
{
"metaData": {
"customizeData": [
{
"name": "com.huawei.hms.client.appid",
"value": "OAuth 2.0 Client ID"
},
{
"name": "hwc-theme",
"value": "androidhwext:style/Theme.Emui.Translucent.NoTitleBar"
}
]
}
}
Links Ref
连接配网内容参考:
设备配网-Fi/Combo)-功能开发(Wi-原子化服务-应用开发-HarmonyOS设备开发
NFC标签使用参考:
生成NFC标签-NFC标签认证-量产管理-HarmonyOS设备开发
智慧生活H5开发:
Codes
C++生成码流参考:
void convert_hexa(const char *input, char *output)
{
// 该功能是将字符转换为ASCII码,然后将该码转为16进制
// 如:0 --> 48(十进制) -->30(十六进制)
int loop = 0;
int i = 0;
while (input[loop] != '\0')
{
sprintf((char *)(output + i), "%02X", input[loop]);
loop += 1;
i += 2;
}
// marking the end of the string
output[i++] = '\0';
}
int Func::GenerateNFC(const char *streamCode, const char *mac, const char *sn, const char *paramEx1, char *result)
{
// 该功能用于将指定码流模板的MAC生成对应的NFC码流
int len = strlen(mac);
char ascii_str[4096] = {0};
// hex string to ascii string
convert_hexa(mac, ascii_str);
std::string macAscii = std::string(ascii_str);
// hex string to int
unsigned long long macInt = std::stoull(mac, 0, 16);
// operation of mac + 1
unsigned long long macIntPlusOne = macInt + 1;
// int to hex string
std::stringstream stream;
stream << std::hex << macIntPlusOne;
std::string resultHex(stream.str());
// padding result to 6 bytes (12 hex number).
while (resultHex.size() < 12)
{
std::string temp = "0";
temp.append(resultHex);
resultHex = temp;
}
// lower case string to upper case
std::string resultHexUpperCase = "";
for (auto &token : resultHex)
resultHexUpperCase += toupper(token);
// 04578BE5219F
std::string macPlusOne = resultHexUpperCase; // hex -> hex + 1
std::string split1 = "140C";
// std::string _result = streamCode + macPlusOne + split1 + macAscii + paramEx1;
std::string _result = "0347D202426877200100480032374d310081090057200685041417910406" + macPlusOne + "140C" + macAscii + "1701009112" + std::string(mac) + macAscii;
strcpy(result, _result.c_str());
return 0;
}
Java代码参考:
// 该类用于存储解析的模板内容,主要分为三部分:
// stream: 该串为华为Device Partner申请的码流前段
// paramEx: 该串为170100,目前由华为指定
public class Config {
public Config(String stream, String paramEx) {
this.stream = stream;
this.paramEx = paramEx;
}
public String stream;
public String paramEx;
}
/*
* NEW
* 码流模板:
* 0332D2022D687720010048003246535200810800552006850414170406A1B2C3D4E5F6140C413142324333443445354636170100
* MAC地址:849DC222FBB2
* 合成目标码流算法:
* 0332D2022D68772001004800324653520081080055200685041417
* 0406
* A1B2C3D4E5F6(将0406后面的12位字符替换成MAC地址)
* 140C
* 413142324333443445354636(将140c后面的24位字符,替换成MAC地址字符串对应的16进制)
* 170100
* 输入要求:输入码流模板,输入目标MAC地址
* 输出要求:输出目标码流
*/
public Config parseTemplate(String steamCodeTemplate) {
int found = steamCodeTemplate.indexOf("0406");
int MAC_LENGTH = 12;
String subStreamStr = steamCodeTemplate.substring(0, found + 4); // stream+0406
String subLastStr = steamCodeTemplate.substring(found + 4 + MAC_LENGTH + 4 + 2 * MAC_LENGTH);
return new Config(steamCodeTemplate.substring(0, found), subLastStr);
}
public static String genNFCCodeForOHOS(String stream, String paramEX, String mac)
{
StringBuilder macPlusOne = new StringBuilder(Long.toHexString(Long.parseLong(mac, 16) + 1));
while (macPlusOne.length() < 12)
{
macPlusOne.insert(0, "0");
}
String newResult = stream + "0406" + macPlusOne + "140C" + HEXUtil.asciiChar2HexValue(mac) + paramEX;
return newResult.toUpperCase();
}
// genNFCCode
C++程序样例
- ht_toolkit_nfc.exeht_toolkit_nfc.exe)