上架

  • 帐号:对于上架测试的账号有授权和白名单的要求,如果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开发:

文档中心 (harmonyos.com)

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++程序样例

最后修改:2023 年 07 月 05 日
如果觉得我的文章对你有用,请随意赞赏