我是兰瓶Coding,一枚刚踏入鸿蒙领域的转型小白,原是移动开发中级,如下是我学习笔记《零基础学鸿蒙》,若对你所有帮助,还请不吝啬的给个大大的赞~

前言:不想再“各玩各的”,就把端—边—云连成闭环吧

老实讲,很多项目卡在最后一公里:App 很丝滑、设备很能打、云上也有一堆强服务,可真到联动时就东一榔头西一棒槌。要想把HarmonyOS(或 OpenHarmony)端的多模态能力、分布式能力,和华为云的 IoT、存储、函数、API 网关等服务拧成一股绳,关键是:标准化接入 + 统一鉴权 + 事件驱动 + 最小可行闭环
  下面给你一张架构图、五步落地法、可跑样例代码、运维&安全清单,照着做,今天就能把“端—云”打通;后续再加边缘、AI 也不费劲。🙂

一、端—云联动的“1 张图”

[HarmonyOS App / 设备]
  ├─ ArkTS:UI/采集/本地缓存/分布式软总线
  ├─ MQTT(TLS) → IoTDA(设备上报/下发)
  └─ HTTPSAPI Gateway(业务API、安全透传)

                │
                ▼
[Huawei Cloud 华为云]
  ├─ IoTDA(设备接入:MQTT/X.509/PSK,影子/规则)
  ├─ API Gateway(统一入口,签名/限流/鉴权)
  ├─ FunctionGraph(函数计算:无服务编排/触发)
  ├─ OBS(对象存储:图片/日志/分片直传)
  └─ (可选)消息/流:DMS Kafka、ROMA、数据湖等
  • 设备接入:IoTDA 原生 MQTT,支持 X.509 证书接入与 Topic 规范,上报/下发都标准化。
  • 统一入口:API Gateway 封装业务 API、签名校验、流量治理与后端路由,便于前后端/多端共享。
  • 事件编排:FunctionGraph 作为“云端胶水”,轻松衔接 IoTDA 事件、OBS、数据库等。
  • 文件侧写:端或边缘把大对象直传到 OBS;Web/小程序可用 BrowserJS SDK。
  • HarmonyOS Connect 云服务:做设备数据存储、消息推送、静态资源的“管家”,和上面能力不冲突,可按场景组合。

二、五步落地(从 0→1 的最小闭环)

Step 1:在 IoTDA 注册产品&设备(选 X.509 更稳)

  1. 建产品创建设备(建议用 X.509 证书认证,防拷贝、防泄密)。
  2. 生成设备证书/私钥;控制台登记证书 SHA-256 指纹
  3. 设备在线:用 MQTT over TLS/8883 连接,ClientId/Username 构造遵循平台规范。

典型上报 Topic:
$oc/devices/{device_id}/sys/properties/report(属性上报)
Payload 示例: 服务/属性字典 + UTC 时间戳(未带则用平台时间)。

Step 2:HarmonyOS 端接入(ArkTS 骨架)

端侧职责:采集→本地缓冲→安全上送。弱网下批量、合并唤醒,尽量用 Wi-Fi/充电再发。

// mqttClient.ets —— 伪代码骨架(选择你常用的 MQTT 客户端库)
import { connect } from 'mqtt'  // 选择支持 TLS 的实现
const endpoint = 'ssl://<iotda-endpoint>:8883'   // 控制台查看
const clientId  = '<deviceId>_0_0_20251018'      // 样例:不校验时间戳
const username  = '<deviceId>'
const caCertPem = '---BEGIN CERTIFICATE---...'
const devCertPem= '---BEGIN CERTIFICATE---...'
const devKeyPem = '---BEGIN PRIVATE KEY---...'

export function startMqtt() {
  const client = connect(endpoint, {
    clientId, username,
    protocol: 'mqtts',
    cert: devCertPem, key: devKeyPem, ca: caCertPem, rejectUnauthorized: true
  })
  client.on('connect', () => {
    // 上报属性
    const topic = `$oc/devices/${username}/sys/properties/report`
    client.publish(topic, JSON.stringify({
      services: [{ service_id: 'Battery', properties: { batteryLevel: 87 } }]
    }))
  })
}

说明:ClientId/Username 的构成、Topic 路径、证书鉴权流程,以 IoTDA 文档为准。

Step 3:API 网关做“统一北向接口”

  • 把 App/后台业务 API 都放到 APIG,启用 AK/SK 签名、IP 白名单、限流、CORS;
  • 后端目标可以是 FunctionGraph、容器、微服务网关等,便于灰度与伸缩。

场景示例:App 端走 APIG 请求一个临时上传凭证,随后把大文件直传 OBS(省带宽、可断点)。Browser 侧可用 OBS BrowserJS SDK

Step 4:函数计算承接事件&胶水编排

  • 触发源:IoTDA 规则转发、APIG、定时器、对象存储通知等;
  • 用途:清洗上报、检验 Schema、落库/落 OBS、推送通知、调用第三方。
  • 优势按量计费 + 环境变量配置敏感项(不进代码)。[3])

FunctionGraph(Python)处理 IoTDA 上报的简例:

# handler.py
import json, os, time
def handler(event, context):
    body = json.loads(event['body'])
    for svc in body.get('services', []):
        sid = svc.get('service_id')
        props = svc.get('properties', {})
        # TODO: 校验/落库/触发告警
    return {'statusCode': 200, 'body': json.dumps({'ok': True})}

Step 5:OBS 做大对象落地 & 回看

  • 前端(ArkTS/JS)拿到 临时凭证/预签名 URL 后,分片直传 OBS;
  • 后台用 FunctionGraph 监听对象创建事件,做转码/缩略图/索引。
  • Web 场景直接引入 OBS BrowserJS SDK(支持 axios、Promise)。

三、端—云“可跑”闭环 Demo(最少组件版)

  1. IoTDA:创建产品 & X.509 设备,获取接入域名;
  2. 端侧:按上面 ArkTS/MQTT 骨架上报 Battery.batteryLevel
  3. APIG:建一个 POST /upload-token,后端指到 FunctionGraph;
  4. FunctionGraph:返回 OBS 预签名上传 URL;
  5. 端侧:用 URL 直传图片/日志到 OBS;
  6. (可选)IoTDA 规则:把设备上报转发到 FunctionGraph,落库或推送。

先跑“一个上报 + 一个文件上传”,做成最小闭环,再扩展告警/看板/AI。

四、生产化清单(安全/观测/成本)

安全

  • 设备层用 X.509一机一密,禁明文;Topic 最小授权。[1])
  • APIG 开 AK/SK 签名、WAF/限流、IP 白名单;
  • 函数/容器里把密钥放 环境变量/密钥管控(非代码)。
  • OBS 使用 短时预签名 + 最小权限桶策略

可观测

  • IoTDA 在线率/上下行量、Topic 失败码监控;
  • APIG QPS、P95、429/5xx 告警;
  • FunctionGraph 执行次数/错误率/冷启动时延;
  • OBS 访问/带宽/对象数;

成本

  • IoT 上行合并、属性打包(10–60s 批);
  • 函数超时/内存按需设置,重 I/O 任务拆分为事件链;
  • OBS 低频/归档分层,按生命周期规则转储。

五、ArkTS × 云:常用代码“抄作业角落”

(1)批量上送 + WorkScheduler:弱网也不怕

import workScheduler from '@ohos.resourceschedule.workScheduler'
export function scheduleBatchUpload() {
  workScheduler.startWork({
    workId: 4001, isPersisted: true,
    networkType: workScheduler.NetWorkType.NETWORK_TYPE_UNMETERED,
    isChargingRequired: true, repeatCycleTime: 30*60*1000
  })
}

(2)HTTPS 调 APIG:统一签名入口(示意)

// 用你现成的 AK/SK 签名工具封装 header,避免把密钥写死在端
async function callApig(path: string, body: any) {
  const { url, headers } = signAkSk('POST', path, body) // 自封装
  const res = await fetch(url, { method: 'POST', headers, body: JSON.stringify(body) })
  return await res.json()
}

(3)OBS 预签名直传(端侧示意)

// 1) 向 APIG 请求临时URL
const { uploadUrl } = await callApig('/upload-token', { filename: 'img.png', contentType: 'image/png' })
// 2) 直传
await fetch(uploadUrl, { method: 'PUT', headers: { 'Content-Type': 'image/png' }, body: pngBytes })

六、扩展路线(按需加料)

  • 消息&集成:IoTDA → ROMA/DMS Kafka → 你的数据平台/湖仓;
  • 云端推理:FunctionGraph 串 ModelArts/推理服务;
  • 鸿蒙 Connect:用其设备数据存储/推送/静态资源做“业务侧中台”。([鸿蒙智联][5])
  • 最新行业案例:HarmonyOS 已加速面向商用端设备(如零售场景),为“端—云—业务”一体化验证了路径。([TechRadar][6])

七、常见坑 & 规避

  • Topic 写错/证书链不对 → 先用客户端工具验证 MQTT/TLS,严格按文档构造 ClientId/Username
  • API 入口散落 → 所有外部流量统一走 APIG,内部再路由。
  • 函数“胶水”塞过多 → 计算重的放后端/容器;函数只做编排/轻清洗。
  • OBS 直传跨域 → 预签名 + CORS 规则;前端用官方 BrowserJS SDK

结语:把“联动”做成默认能力,开发效率就会肉眼可见地涨

HarmonyOS 端负责体验与近场感知,华为云负责统一接入、数据与弹性。当你用 IoTDA + APIG + FunctionGraph + OBS 把最小闭环跑顺,剩下就是“把场景搬上去”的体力活。一次接好,处处省心。🚀

(未完待续)

Logo

电商企业物流数字化转型必备!快递鸟 API 接口,72 小时快速完成物流系统集成。全流程实战1V1指导,营造开放的API技术生态圈。

更多推荐