简介:这份Word版《百度IOT平台——平台使用手册》面向物联网开发初学者、嵌入式工程师及智能硬件产品团队,系统讲解设备接入百度IoT云平台并完成云端托管的完整流程。内容涵盖创建产品与配置联网方式、下载并烧录CA及Profile文件、检测心跳、设置与测试数据点、批量生成Profile、OTA固件升级,以及新增设备、设备存活、设备活跃、在网时长与固件版本分布等数据统计指标,还涉及服务列表管理和APP应用的创建与API Key、Secret Key配置,相当于一份从设备接入到应用联调的实操指引。资源包仅含1个doc文件,约1.35MB,结构按研发管理、数据分析、服务与应用管理分章组织,可按步骤查阅。已有384人学习,适合作为接入调试与排错时的案头参考。
1. 手册翻三遍不如照着点一遍:物联网 IOT 基础平台把哪些活替你干了
去年帮一个做智能门锁的团队看接入问题,他们设备端代码早写完了,卡住的地方却特别朴素:产品建了三个,Profile 不知道哪个对应哪批货,心跳检测点了五次全失败。这类事不是算法难,是接入链路没人按顺序捋清楚。物联网 IOT 基础平台的价值就在这——它把产品创建、证书烧录、心跳验证、数据点建模、批量生产到 OTA 升级串成一条有序的流水线,照着走就不会乱。这份平台使用手册就是那条流水线的说明书,适合刚接手设备接入的嵌入式、后端工程师,也适合要给产线和 App 端做对接的项目负责人。下面按手册的真实结构往下拆。
2. 平台骨架拆解:手册的章节顺序,其实就是一条从产品到应用的对象链
2.1 先看目录:八个功能页对应一条接入流水线
很多人拿到这类手册第一反应是从头读到尾,读完还是不知道先点哪。手册的章节排序本身是有信息量的:研发与管理在前、服务居中、应用在后,这不是排版习惯,而是数据依赖顺序——没有产品就没有 Profile,没有数据点就导不出设备描述文件,没有应用就拿不到 App 侧的凭据。把每个功能页当成流水线上的一道工序,产出物流给下一道,链路立刻清晰。
| 功能页 | 干的事 | 产出物 | 下游依赖 |
|---|---|---|---|
| 设备接入-产品管理 | 定义产品类别、型号、联网方式 | 产品记录(含自定义配置) | 数据点、批次 |
| 设备接入-CA/Profile | 下发设备身份与连接配置 | CA 证书 + Profile 文件 | 烧录工序 |
| 心跳检测 | 验证设备是否真的连上云 | 检测结果(成功/失败) | 量产前验收 |
| 数据点 | 定义上下行数据契约 | 数据点 + 设备描述文件 | 设备端解析、App 渲染 |
| 数据点测试 | Demo APP 扫码联调 | 联调结论 | 量产放行 |
| 批量生产 | 按批次生成 Profile | 单批最多 10000 份 Profile | 产线烧录 |
| OTA 升级 | 固件分发与灰度 | 固件包 + 升级规则 | 版本运维 |
| 数据统计 | 设备生命周期指标 | 看板数据 | 运营决策 |
| 服务 / 应用 | 云服务接入与 App 凭据 | AK/SK | App 端接入 |
这张表是我照着手册目录画的,唯一自己加的一列是“产出物”。加完之后有个直接好处:产线和 App 端要东西时,你能一句话说清该找哪个页面拿、拿到的是什么形态的文件,而不是含糊地说“在平台上下一下”。血泪经验是,很多团队的接入延期不是技术问题,而是产线拿到一堆 Profile 文件不知道哪份属于哪台机器,根因就是没人维护“产出物 → 使用方”这条对应关系。
2.2 四层对象模型:产品、设备、数据点、应用各自管什么
把手册里的名词收敛一下,平台其实只有四层对象,层级关系是产品 → 设备(Profile)→ 数据点 → 应用,四层之上再挂服务和统计。
产品是最上层的模板,决定“这是一类什么设备”:产品类别(智能家居、智能硬件这类)、产品型号(自定义标识)、联网方式(Wi-Fi、蓝牙、4G 之类),另外还有自定义配置信息。产品不承载任何一机一密的东西,它只是模具。
设备是产品的实例化,每台设备对应一份 Profile。注意手册里下载 Profile 的入口是在产品里点的,容易让人误以为 Profile 是产品级的——实际上产品页点下载只是“生成一份符合该产品配置的设备身份包”,批量生产环节一次性生成上万份,正好反证了它是设备级产物。这个理解偏差是后面很多烧录事故的源头。
数据点是设备与云端的数据契约,定义了“设备能上报什么、云端能下发什么”。它不是数据库表,但作用接近:一旦下发到设备端,字段名就成了固件里的硬编码,改名等于要发版。
应用是 App 侧的凭据容器,创建完拿到 API Key 和 Secret Key,再按平台填 Android 包名加应用签名、iOS 的 Bundle ID。应用层只管“哪个 App 有资格控设备”,跟设备身份是两条独立的认证线。
2.3 服务与应用为什么单独拆一层:两套凭据别混着用
手册把“服务”和“应用”放在最后两章,容易被当成可选项跳过。实际项目里这两层承担的是完全不同的事:CA 和 Profile 属于设备级凭据,证明“这台硬件是我们的”;应用 AK/SK 属于应用级凭据,证明“这个 App 有权限下发指令”。前者烧进 Flash,后者放在服务端或 App 的安全存储里,泄露后的处置方式也完全不同——设备凭据泄露要作废单台设备并重新烧录,应用密钥泄露要轮换密钥并重发版。
我一般会在项目启动会上就把这两套凭据的责任人分开:设备凭据归硬件/产线负责人,应用凭据归服务端负责人,谁都不许把 CA 私钥或 Secret Key 贴进群聊和代码仓库。手册里服务详情页有个“查看文档”入口,指向具体服务的使用说明,接入前先点开确认这个服务是否需要独立开通,比事后发现权限没开要省事得多。
3. 设备接入链路:从新建产品到心跳落地的四步
3.1 创建产品时的三个必填项怎么定
进入开发者中心,在设备接入页面点【新建产品】,填产品类别、产品型号、联网方式,需要的话再加自定义配置信息,点【新建】完成。字段不多,但命名习惯会跟着项目走很久,这里几条实操建议。
产品型号建议带上硬件版本和通信模组型号,例如统一用“小写字母 + 下划线 + 版本号”的形式,别用中文、空格和斜杠。型号会出现在 Profile 的元信息里,也可能被产线扫码工具当文件名用,一旦带特殊字符,某些烧录工具会直接报错。产品类别不是装饰字段,部分平台的统计口径和可用服务是按类别开放的,选错可能要重建产品。
自定义配置信息是给业务侧留的扩展位,常见做法是把“设备上报周期”“是否需要 OTA 白名单”这类产品级默认值塞进去,让设备端首次连接后拉一次配置,避免每台机器写死。填完点新建,右侧区域就能看到刚建好的产品,接着才是下载 CA 和 Profile。
3.2 CA 与 Profile 的分工:一个验身份,一个装配置
产品创建完成后,点进产品,分别点【下载 Profile】和【下载 CA】。这两个文件经常被混为一谈,实际分工完全不同。
CA 是信任链的根证书,用来校验“云端是不是真的云端”。设备侧 TLS 握手时拿它验证服务端证书,它本身不含任何设备身份信息,同一产品的所有设备可以共用同一份。Profile 才是设备身份包,内含设备标识、密钥材料和连接参数(接入地址、端口、主题规则之类),一机一份,绝对不能复用。
烧录顺序建议先写 CA 再写 Profile,因为很多烧录工具在写 Profile 时会顺带校验 CA 是否存在。手册里明确要求参考设备端开发者手册完成烧录,这一步别跳——不同模组的烧录分区和文件格式不一样,平台侧给的是通用材料,落到具体硬件上要按模组文档转一次格式。烧完联网,CA 会向云端定时发送心跳,这条心跳就是后面所有统计口径的基础。
3.3 心跳检测:验证烧录是否真的生效
设备联网后回到设备接入页面点【心跳检测】,平台会自动检测设备是否已向云端上报心跳,检测中会显示状态,成功弹窗提示,失败则提示检查烧录过程,可以重复检测。
这里有个容易被忽略的边界:心跳检测只证明“设备能连上云”,不证明数据点对得上、更不证明 App 能控。我见过团队把心跳检测通过当成量产放行条件,结果首批货到了用户手里才发现数据上报字段全空。合理的放行条件是三件事都过:心跳检测通过、数据点测试通过、OTA 通道验证过一次。
另外心跳检测是即时动作,只反映当下状态。设备离线一段时间再上线,页面上的历史检测结果不会自动刷新,排查“设备是不是掉线了”要看数据统计里的设备存活和在网时间,别只盯这个按钮。
3.4 设备端连接示例:把 Profile 里的参数喂给 MQTT 客户端
手册到心跳检测就结束了,但真实接入必须落到代码。设备端最常见的做法是 MQTT over TLS,参数全部来自 Profile 文件。下面这段是参数落位的示意,字段名以你实际下载的 Profile 为准,主题和端口也以手册和设备端文档为准。
# 目的:验证 Profile 里的参数能否正确喂给 MQTT 客户端并完成一次心跳上报 import ssl, json, time import paho.mqtt.client as mqtt profile = json.load(open("device_profile.json")) # 平台下载的 Profile 文件 endpoint = profile["endpoint"] # 接入域名,Profile 内提供 port = profile.get("port", 8883) # MQTT over TLS 常用 8883 client_id = profile["device_key"] # 设备唯一标识,一机一值 ca_file = "ca.pem" # 平台下载的 CA,全产品共用 cert_file = "device.crt" # 由 Profile 派生的设备证书 key_file = "device.key" # 设备私钥,禁止入库、禁止上传 def on_connect(client, userdata, flags, rc): # rc == 0 表示 TLS 与鉴权都通过,非 0 先查证书再查时间同步 print("connected, rc =", rc) if rc == 0: client.publish(profile["heartbeat_topic"], payload="{}", qos=1) client = mqtt.Client(client_id=client_id) client.tls_set(ca_certs=ca_file, certfile=cert_file, keyfile=key_file, tls_version=ssl.PROTOCOL_TLSv1_2) client.on_connect = on_connect client.connect(endpoint, port, keepalive=60) client.loop_start() time.sleep(5) # 给握手和首包留时间,产线回检可以适当放大 client.loop_stop()几个参数值得单独说。keepalive 设 60 秒意味着客户端每 60 秒发一次 PING,平台侧据此判断在线;手册里“一次心跳代表设备在网 30 分钟”是统计口径的折算,不是要求你 30 分钟发一次,两者别搞混。qos=1 保证心跳至少到达一次,代价是可能重复,服务端要能幂等处理。tls_version 显式指定比依赖默认值稳,不同 Python 版本默认协议不一样,产线机器上很容易翻车。
还有一个细节:client_id 用 device_key 而不是随机串,是为了让平台侧能把连接和具体设备对应起来;如果模组重连时换了 client_id,同一条连接可能被判定成两台设备,新增设备统计就会虚高。
4. 数据点建模与量产下发:数据契约、批量 Profile 和 OTA 灰度
4.1 数据点怎么设计才不用返工
数据点在产品数据点页面配置:先选产品,点新建数据点,选数据点类型,再选数据类型,填完点【确认】创建,已建好的可以编辑和删除。手册把类型和数据类型拆成两步选,说明这两个维度是正交的——类型描述“这是什么语义”,数据类型描述“传输时用什么结构”。
常见做法是按平台叫法分属性、事件、服务三类:属性是设备状态(电量、开关状态),事件是设备主动上报的一次性消息,服务是云端可调用的动作。数据类型通常有布尔、整型、浮点、字符串、枚举、结构体几档。设计时三个原则:能枚举就别用字符串,省流量也省得 App 端做字符串匹配;所有带物理量的数据点必须标单位,温度写摄氏度还是华氏度必须在描述里说死;标识符(identifier)一旦下发就当成固件常量,命名先在文档里定稿再点确认。
下面是一个数据点定义的示意结构,字段名按你平台上实际表单来,结构是通用的。
{ "identifier": "lock_battery", "name": "电池电量", "type": "property", "dataType": { "type": "int", "min": 0, "max": 100, "unit": "%" }, "accessMode": "r", "description": "门锁电池剩余电量,上报周期 6 小时,低于 20% 触发低电事件" }identifier 是设备端代码里唯一要硬编码的东西,其余字段都只是给人看的元信息。所以改名成本极高:改了 identifier,已经出货的设备全部对不上,只能靠云端做兼容映射,那是另一种债。我一般要求 identifier 命名走“模块_含义”的格式,全小写下划线,长度控制在 20 字符以内,模组端的缓冲区大小往往卡在这。
4.2 数据点测试与设备描述文件:不导出就等于没定义
数据点建完还有一步:导出为设备描述文件,把它和 CA 集成后烧进设备,设备与云端的数据才能互通。这一步是整条链路上最容易漏的,因为它在页面上不显眼,但少了它设备端根本不知道字段长什么样。
测试流程是:在数据点设置页面点【数据点测试】,用 Demo APP 扫描弹出的二维码,进入联调。扫码本质上是把产品/设备上下文传给 Demo APP,让它知道连哪台设备、按哪套描述文件渲染界面。测试时重点看三件事:上行字段是否按定义的类型到达、下行控制指令是否有回执、异常值(比如电量传 120)平台侧怎么处理。第三点很多团队不测,等线上出现脏数据才发现没有校验。
一个实操建议:把设备描述文件当成构建产物纳入版本管理,和数据点配置的变更记录对齐。描述文件一改,固件和 App 两端都要跟着改,如果它只存在某个人的下载目录里,下次谁也不知道线上跑的到底是哪一版。设备描述文件与 CA 集成后再烧录,顺序别反,部分工具会覆盖分区。
4.3 批量生产:批次、Profile 配额与产线对接
数据点创建并检测没问题后,可以申请批量生产:选择要生产的产品型号,点【新建批次】,设置批次信息,注意单个批次的 Profile 数量上限是 10000 个,创建完成后点进批次就能下载 Profile。
10000 这个上限对大批量出货是硬约束。一万台以上的订单必须拆成多个批次,而批次号如果只按日期命名,很快就会撞车。我一般建议批次命名带上工单号后缀,产线扫码时按“工单 → 批次 → Profile”三级对应,出现坏机可以精确定位到哪一批次需要作废。
产线对接上还有两条纪律。Profile 一机一密,不能复制粘贴给第二台机器,重复烧录会导致两台设备互相顶掉连接;批次文件下载到本地后尽快导入烧录工装,别长期散落在共享盘里,里面含设备密钥材料,权限要按密钥级别管。手册里没有明说文件保存期限,稳妥做法是产线用完即归档到受控目录,离职交接时单独列清单。
4.4 OTA 升级:固件包规则与四种通知策略
OTA 在 OTA 升级页面操作:选择产品,点上传固件,固件最大 10MB 且必须是 zip 格式,然后填固件版本号和通知方式,完成规则配置。
10MB 的限制决定了固件要精简,带资源文件的固件很容易超。常见的处理是把大资源放到设备首次联网后按需下载,OTA 包里只放可执行部分。zip 是打包格式,不是加密格式,别指望它能保护固件内容。
通知方式是这块最需要和产品经理对齐的地方。静默是直接升级、无提醒、无需用户干预,适合安全补丁和不可能打扰用户的场景;强提醒、弱提醒、被动提醒都是推给 App 端的信息,具体表现形式要在 App 里实现,平台只负责把消息发出去。选了提醒模式但 App 端没做对应 UI,用户感知就是“固件传上去了但设备没升”——这是最常见的 OTA 报障之一。
灰度节奏建议按固件版本分布来定:先放 1% 观察数据统计里的设备存活和固件版本分布两个指标,稳定后再放量。下面这段是灰度批次创建的示意脚本,接口路径和鉴权方式以你平台实际文档为准,结构可参考。
#!/usr/bin/env bash # 用途:按比例创建 OTA 灰度任务,先 1% 再逐步放量 set -euo pipefail TOKEN="${IOT_TOKEN:?请先导出应用令牌}" # 应用 AK/SK 换取的访问令牌 BASE="https://iot.example.com" # 换成你的接入域名 PRODUCT="lock_v2" # 产品型号 FIRMWARE="fw_1_2_0.zip" # 已上传的固件包名 # 版本号必须单调递增,重复版本号平台会拒绝或静默忽略 for ratio in 1 10 50 100; do curl -s -X POST "${BASE}/v1/ota/tasks" \ -H "Authorization: Bearer ${TOKEN}" \ -H "Content-Type: application/json" \ -d "{\"product\":\"${PRODUCT}\",\"firmware\":\"${FIRMWARE}\", \"version\":\"1.2.0\",\"notify\":\"silent\",\"percent\":${ratio}}" echo "已提交 ${ratio}% 灰度" sleep 1800 # 每档观察半小时,看存活与版本分布再决定是否继续 done脚本里最值得保留的是 sleep 那行。灰度不是提交完就完事,每一档都要留观察窗口,否则等同于全量发布。version 字段建议在 CI 里从固件构建产物自动读取,手工填版本号是升级事故的高发点。
5. 常见问题排查:心跳通不过、数据点对不上、OTA 不生效的现场记录
5.1 设备与固件侧:四类问题占了报障的大头
现象一:点【心跳检测】一直失败,日志里 TLS 握手报错。原因多半是证书链没对齐:只烧了 Profile 没烧 CA,或者 CA 版本和 Profile 不是同一次下载的。还有一种隐蔽情况是设备系统时间没同步,证书校验会直接判过期。 解决:先确认设备侧 CA、设备证书、私钥三件套齐全且来自同一批次,再检查设备时间是否通过 NTP 同步到正确时间。产线批量出问题时优先抽三台对比烧录日志,别一台台试。
现象二:心跳检测成功,但数据点测试扫不出数据。原因通常是设备描述文件没导出或没烧进设备,也可能是导出的是旧版本描述文件,字段和数据点配置对不上。 解决:重新导出描述文件,与 CA 一起集成后重烧,再扫码测试。养成“改完数据点必重导描述文件”的习惯,这一步没有自动提醒。
现象三:OTA 上传固件成功,设备端毫无反应。原因分三类:固件包超过 10MB 或不是 zip 格式被拒;版本号没有递增,平台判定无需升级;通知方式选了提醒模式但 App 端未实现对应处理逻辑。 解决:先看固件大小和格式,再核对版本号是否严格大于设备当前版本,最后确认 App 侧有没有处理升级消息。三项都过还是不动,就看设备端 OTA 通道有没有在心跳里上报能力位。
现象四:批量生产建批次失败,提示数量超限。原因是单批次 Profile 上限就是 10000,按整单数量填必然失败。 解决:按 10000 拆批,批次命名带工单号后缀,产线按批次分批烧录。拆批后记得每批都跑一次小批量心跳回检,别等全部烧完才发现第一批就有问题。
5.2 平台配置与数据口径侧:数字对不上先怀疑定义
现象五:数据统计里的新增设备和产线出货量差一大截。原因是“新增设备”的口径是设备首次向云端上报心跳才计为激活,出厂但没通电、通电但没联网的设备都不在内。产线出货量统计的是物理出货,两者本来就不是一回事。 解决:对账时用“产线出货量 → 已烧录量 → 已激活量”三级漏斗,而不是直接拿出货量比新增设备。差值落在哪一级,问题就在哪一级。
现象六:设备存活和活跃两个数差很多,被质疑数据造假。原因是两者定义不同:存活是有数据上报(含心跳和应用控制上报),活跃是只有非心跳数据上报。一台设备只发心跳不发业务数据,会算存活但不算活跃。 解决:给业务方解释口径时把“心跳数据上报”和“非心跳数据上报”分开讲;同时排查设备是不是真的不发业务数据,那可能是固件上报逻辑的问题,不是统计问题。
现象七:在网时间和实际在线时长对不上。原因是口径为“一次心跳代表设备在网 30 分钟”,是折算值不是精确值,短于 30 分钟的掉线会被吞掉。 解决:对在线时长敏感的业务(比如计费类)不要直接用这个指标,改成自己按心跳时间戳在业务侧算。在网时长分布和固件版本分布可以用来做版本健康度判断,前者看稳定性,后者看升级覆盖率,未激活设备不计入固件版本分布这一点要记住,否则覆盖率永远是错的。
6. 二次开发改造:把手册里的手工点击,变成一条能回放的接入流水线
手册描述的是控制台操作,一个项目接完,如果这些东西还留在某个人脑子里,第二款产品出来就得重来一遍。我通常做三件事把它固化下来。
第一件是把产品配置模板化。产品类别、型号规则、联网方式、数据点清单整理成一份受版本管理的配置文件,新产品立项时改几个字段就生成全套定义。数据点的 identifier 尤其要在这份文件里定稿,评审通过再上平台点,避免建完再删。这一步省下的时间在第二个产品上就能回本。
第二件是把产线环节脚本化。批次创建、Profile 下载、烧录后心跳回检,这三步都能用接口或工装脚本串起来。回检脚本是最值得写的:产线烧完一批,自动读设备清单逐个查在线状态,输出未激活名单,工位当场返修,而不是等入库几天后运营发现激活率偏低再回头查。
#!/usr/bin/env bash # 产线回检:读取本批设备清单,逐个确认心跳是否已落地 set -euo pipefail TOKEN="${IOT_TOKEN:?缺少访问令牌}" BASE="https://iot.example.com" # 换成本项目的接入域名 INPUT="${1:?用法: ./check.sh batch.txt}" # 每行一个 device_key while read -r key; do resp=$(curl -s -H "Authorization: Bearer ${TOKEN}" \ "${BASE}/v1/devices/${key}/heartbeat?window=30m") # 接口返回结构以实际文档为准,这里只判断是否出现过心跳 case "$resp" in *'"online":true'*) echo "OK ${key}" ;; *) echo "FAIL ${key}" ;; esac done < "$INPUT"第三件是把 OTA 灰度做成有观察窗口的流水,而不是一把梭。每档放量前读一次固件版本分布,确认上一档的升级成功率,再决定是否推进。这套检查我一般直接塞进发布流水线,卡在人工确认节点上,谁点发布谁签字。
| 改造点 | 手工做法 | 脚本化后 | 实际收益 |
|---|---|---|---|
| 产品与数据点 | 控制台逐条点 | 配置文件生成 | 新品接入少走一遍评审 |
| 批次与 Profile | 页面建批次下载 | 脚本建批次并绑定工单 | 批次可追溯,坏机可定位 |
| 烧录回检 | 人工抽检 | 全量心跳回检 | 激活率问题在工位暴露 |
| OTA 灰度 | 页面调比例 | 分档提交带观察窗口 | 升级事故可控可回退 |
改造完回头看,最大的变化不是效率,而是可回放。出了问题能对着脚本和配置文件复盘“当时到底下发了什么”,而不是靠回忆点过哪些按钮。从那以后我每次接新平台,都先把手册里的每个按钮对应成一条可脚本化的命令,跑不通的先记进排查清单——手册是给人看的,流水线是给下一次用的。希望帮到你。
本文还有配套的精品资源,点击获取