智能硬件项目最容易出现的一种误判,是产品原型已经确认,硬件也能通电,就认为APP或小程序可以全面开工了。

页面当然可以先做。注册、首页、设备列表这些常规功能也不难推进。真正到了“发现设备、完成配网、下发控制、读取状态”这几步,问题才会冒出来:开发人员不知道该搜哪个蓝牙广播,硬件返回了一串十六进制数据却没有字段说明,云端接口能调通,但测试账号名下没有设备。页面看起来完成了一大半,设备仍然连不上。

所以红数科技在项目启动阶段先确认的,不是一句“硬件已经做好”,而是有没有一套可以复现的联调条件。最低限度包括:能正常工作的样机、可识别的固件版本、可执行的通信协议、可访问的测试环境,以及能够处理固件问题的对接人。少掉任何一项,排期都只能算预估,不能算可靠的开发计划。

智能硬件联调工作台

先把设备怎么连说清楚

智能硬件并不只有一种连接方式。有的产品由手机通过BLE直接控制,有的用蓝牙完成Wi-Fi配网,后续指令全部经过云端;还有一些设备使用4G、NB-IoT、局域网、NFC或网关。连接路径不同,APP和小程序需要的资料完全不同。

项目开始前,最好先画一张最朴素的连接图:手机、设备、路由器、网关、云平台和第三方服务之间,谁先连谁,数据从哪里发出,最后由谁确认成功。图不用漂亮,但要能回答这些问题:

  • 首次使用是否必须靠近设备,设备怎样进入待配网或待绑定状态;
  • 手机是在本地直接控制设备,还是把指令发给云端;
  • 设备离线时哪些功能仍能用,哪些操作只能提示稍后重试;
  • 同一台设备能否被多人共享,换手机、换路由器或恢复出厂后怎样处理;
  • 一条控制指令由设备确认、云端确认,还是两边都确认;
  • 设备状态由主动查询获得,还是通过蓝牙通知、MQTT消息或WebSocket推送更新。

这张图一旦说不清,后面的接口文档通常也会互相打架。比如页面显示“开机成功”,到底是接口受理成功,还是设备真的执行成功,两者不是一回事。

样机不能只交一台能亮的机器

供开发和测试使用的样机,应当与计划量产的通信方案一致。外壳可以还是手板,设备名称、主控芯片或射频模块却不能在联调中途随意更换。确实要换,也应同步说明硬件版本、影响范围和协议差异。

比较稳妥的准备方式是提供2至3台可独立使用的样机。一台给客户端开发,一台留给固件联调或测试;涉及多人并发、设备分享、批量绑定时,还需要更多样机。只有一台样机在几方之间来回寄送,任何一个偶发问题都很难复现,进度也会被物流和人员时间反复打断。

样机一起交付的资料,不复杂,但要具体:

  • 产品型号、硬件版本、固件版本,三者在机身或包装上能对应起来;
  • SN、MAC、IMEI、设备密钥、二维码等标识分别是什么,哪些可以公开展示;
  • 电源、数据线、专用底座、网关、测试卡等配件是否齐全;
  • 开机、关机、唤醒、配网、解绑、恢复出厂的真实操作步骤;
  • 指示灯、蜂鸣器、屏幕、按键在各状态下的表现;
  • 低电量、传感器异常、升级失败、网络断开等故障怎样触发和恢复;
  • 串口日志、调试口或专用调试工具怎样使用,由谁负责查看固件日志。

APP团队通常不需要拿到全部硬件原理图和固件源码,但必须知道硬件当前运行的是哪个版本,出了问题能从哪里取得日志。如果设备每次刷机后的行为都不一样,却没有版本记录,联调结果就没有可追溯性。

蓝牙协议要写到“照着文档就能收发数据”

“设备支持BLE”不算接口资料。BLE开发真正需要的是广播、连接、服务发现和数据收发的完整约定。微信小程序当前要求蓝牙能力取得 scope.bluetooth 授权;iOS、Android和微信运行环境对扫描、连接、后台运行、权限提示也各有边界,开发前需要按目标平台分别验证。微信开放文档对蓝牙初始化的说明中也明确列出了初始化、系统蓝牙状态和错误码等要求。

一份能用的BLE协议,至少应写明:

项目需要提供的内容
广播设备名称规则、广播间隔、Service UUID、Manufacturer Data格式、设备是否处于可连接状态
识别APP依据什么区分产品型号和具体设备,SN、MAC或设备ID从哪里取得
连接是否需要配对或绑定、连接超时、重连策略、同时允许几台手机连接
服务与特征Service UUID、Characteristic UUID,以及每个特征支持Read、Write、Write Without Response还是Notify
数据限制MTU约定、单包有效长度、大包怎样分片与重组、发送间隔是否有限制
安全是否加密、密钥怎样生成和分发、随机数与时间戳怎样使用、重放怎样处理
BLE协议与数据帧

最关键的部分还是指令表。每一条指令都应有命令字、发送方向、请求字段、响应字段、字段长度、字节序、取值范围、单位和一组真实报文示例。校验位怎么算,文本用UTF-8还是其他编码,时间是秒级时间戳还是设备本地时间,也要写在文档里。

举个不涉及具体产品的格式例子:如果“设置目标温度”需要发送目标值,文档不能只写“温度:20”。它应说明数值占几个字节,20℃在报文中是 0x140x00C8 还是字符串 "20",设备成功后回什么,超出范围又回什么。开发人员拿到示例后,应该能在没有口头补充的情况下组出同一帧数据。

还要约定那些不顺利的情况:设备多久不回包算超时,是否允许重发,重复指令会不会执行两次;Notify丢失后如何重新读取状态;手机刚连上时,是设备主动推送全量状态,还是APP逐项查询。只写正常路径,联调时一定会把这些问题重新问一遍。

蓝牙SIG的核心规范对GAP、ATT、GATT等基础机制有完整定义,但产品自己的服务、特征和业务数据格式仍需项目方明确。规范可以解释蓝牙怎样工作,不能替代产品协议。Bluetooth Core Specification适合用来核对底层术语和能力边界。

配网资料要覆盖家庭路由器里的真实情况

需要联网的设备,还要把配网方式定下来。常见做法有BLE辅助配网、SoftAP、SmartConfig或设备配网码,几种方式对用户操作、手机权限、兼容性和失败恢复的要求不同,不能等页面做完再由固件临时决定。

配网文档应说明设备支持2.4GHz还是同时支持5GHz,支持哪些Wi-Fi安全方式,SSID和密码的长度及字符限制,设备进入配网状态后能保持多久。隐藏SSID、双频合一、无密码网络、路由器更换、密码错误、信号过弱、DHCP失败、云端激活失败,分别由谁识别、返回什么错误,用户是否需要重新操作。

有一个细节很容易漏:连接上路由器不等于配网完成。设备还可能需要校时、注册云端、取得证书、绑定用户,最后才算真正可用。APP页面上的进度和错误提示,应当对应这些实际阶段,否则用户只会看到“配网失败”,项目团队也不知道失败发生在哪里。

设备配网与云端链路

云端接口不能只有地址和参数名

只要设备状态、账号或控制指令经过服务器,就要准备一套可以直接访问的测试环境。比较省事的交付方式是OpenAPI文档配合在线调试地址,同时提供测试账号、测试设备和初始化数据。

接口资料至少应覆盖:

  • 测试、预发布和正式环境的基础地址,环境之间的数据是否隔离;
  • 登录、Token刷新、签名、时间戳和权限校验方式;
  • 用户、家庭、房间、设备、成员之间的数据关系;
  • 设备绑定、解绑、分享、转移、删除和恢复出厂后的服务端处理;
  • 设备列表、详情、实时状态、历史数据和告警记录的字段定义;
  • 控制接口是同步返回执行结果,还是只返回任务已受理;
  • MQTT主题、QoS、消息体、上下行方向,或者WebSocket事件名称与重连规则;
  • 分页、幂等、限流、超时、错误码和接口版本变更办法;
  • 一组能成功调用的请求与响应,以及几组常见失败响应。

文档中的字段名和线上返回值必须一致。status=1 到底表示在线、开启还是正常,不能靠开发人员猜。时间字段要说明时区和精度,空值要说明是 null、空字符串还是字段不返回。对设备控制来说,还要区分“服务器收到指令”“设备收到指令”和“设备执行完成”三种状态。

做微信小程序时,服务器域名也不是上线前再填的一项杂事。微信要求事先配置通讯域名,常规网络请求使用HTTPS,域名不能直接用IP地址或 localhost,并涉及ICP备案和TLS版本要求,具体限制以微信小程序网络能力说明为准。开发工具里跳过域名校验,只能方便本地调试,不能证明真机和正式版本可以访问。

OTA升级要作为完整功能准备

如果产品上线后还会修复固件或增加设备能力,OTA不能只留一句“后续支持”。升级流程同时牵涉固件、云端和客户端,开发前就要把边界定好。

需要提供的内容包括固件包格式、版本号比较规则、适用的硬件版本、文件大小、校验值或数字签名、下载地址与鉴权方式;设备最低电量、升级时长、分包大小、断点续传、失败重试和回滚策略也应明确。用户能否跳过升级,是否存在强制升级,升级中断电会进入什么状态,都直接影响页面和异常处理。

如果升级数据通过BLE传输,还要给出开始升级、发送分片、确认进度、校验、重启和查询新版本的完整指令。如果设备自行从云端下载,则要说明APP怎样获取进度、怎样判断设备已经重新上线。没有这一段资料,OTA页面做得再完整,也只是一个进度条外壳。

平台账号和第三方能力应由权属方提前开好

APP或小程序最终要发布到谁的主体名下,最好在立项时就确定。微信小程序的AppID、成员权限、服务器域名,iOS的开发者账号、Bundle ID和证书,Android的应用包名、签名文件和应用市场账号,都不适合由临时个人账号代替。账号晚开并不只影响最后上线,还会影响登录、支付、推送、授权回调和真机测试。

短信、地图、语音、消息推送、支付、对象存储、客服或统计服务也是同样的道理。需要哪项就提供对应平台账号、测试密钥、回调地址和权限范围;密钥不要写在聊天记录或正文文档里,应通过受控方式交付,并区分测试与正式环境。

隐私合规必须从数据清单开始

智能硬件经常会接触位置、蓝牙、Wi-Fi信息、设备标识、家庭成员、音视频或健康数据。开发前先列清楚“采集什么、为什么采集、在什么时候申请权限、传到哪里、保存多久、怎样删除”,比页面完成后再补一份隐私政策可靠得多。

权限申请要与实际功能对应。扫描附近蓝牙设备、读取相册、获取位置或打开麦克风,不应在用户刚进入首页时一次性索取。账号注销、设备解绑、个人信息查询与删除、日志脱敏、传输加密、第三方SDK清单,也应在需求和接口阶段落到具体动作。涉及敏感个人信息、未成年人或跨境传输时,还需要由项目法务和合规负责人按实际业务单独判断。

相关边界应以现行的《中华人民共和国个人信息保护法》、应用备案要求、应用商店和小程序平台审核规则为准。它们会更新,不能把上一款产品的隐私政策原样换个产品名继续使用。

真正影响体验的,是异常路径资料

正常路径往往最好写:打开蓝牙,发现设备,连接成功,开始使用。真实产品里更费时间的是另一边:设备正在被别人绑定,手机蓝牙开着但系统权限关闭,路由器能连却访问不了云端,控制指令已发送但设备突然断电,升级到一半用户退出页面。

这些情况不需要产品经理凭空设计。硬件、固件和云端各自把能够识别的状态与错误码交出来,产品再决定页面怎么说、哪些动作可以重试、哪些情况必须恢复出厂。技术错误码可以很细,用户提示不能只显示“错误10008”;但如果底层只返回一个笼统的失败,页面也不可能准确告诉用户该检查什么。

多设备异常测试

开发前最好把下面这些场景实际走一遍:

  • 第一次绑定、重复绑定、被其他账号绑定、管理员分享设备;
  • 蓝牙关闭、权限拒绝、扫描不到、连接超时、连接后立即断开;
  • Wi-Fi密码错误、弱信号、路由器断网、设备掉线后重新上线;
  • APP退到后台、手机锁屏、切换网络、系统回收进程;
  • 设备断电重启、恢复出厂、换路由器、换账号和换手机;
  • 固件升级中断、包校验失败、版本不匹配和升级后状态恢复;
  • 多台同型号设备同时出现,多人同时操作同一台设备。

Android 12及以上版本对附近设备相关蓝牙权限有单独要求,旧版本又可能与位置权限相关,具体实现应按Android Bluetooth permissions核对。iOS侧则要结合Core Bluetooth的能力、授权和后台行为做真机验证。模拟器和开发工具无法代替不同品牌手机、系统版本、路由器和真实弱网环境。

一套可以直接交付的开发资料目录

如果不知道怎样整理,按下面这个目录准备就够用。文件名里带上版本号和日期,变更后保留记录,不要用群聊里一句“协议改了”代替正式更新。

01_产品与流程
  产品需求、交互原型、设备状态图、异常处理表
02_硬件与样机
  型号和版本说明、操作手册、样机清单、标识规则
03_固件
  固件包、刷机或升级方法、版本记录、日志说明
04_设备通信协议
  连接拓扑、BLE或局域网协议、指令表、报文示例、错误码
05_云端接口
  OpenAPI、消息协议、测试环境、测试账号、测试设备
06_OTA
  升级流程、包规则、接口、失败恢复和验收条件
07_平台与第三方
  应用主体、AppID或包名、成员权限、测试配置
08_测试与验收
  机型和系统范围、路由器环境、用例、问题记录、发布标准

交付是否合格,可以用一句很实在的话判断:换一名没有参加过前期会议的开发人员,他拿到样机和这套资料后,能否独立完成设备发现、连接、控制、状态读取、异常恢复和升级测试。还要不停追问“这个字段什么意思”“失败了回什么”,资料就没有准备完。

几个经常被问到的问题

硬件还没完成,APP能不能先开发?

可以先做账号、业务页面、视觉和一部分云端功能,设备交互也可以用模拟器或Mock数据搭框架。但协议没有冻结、真实样机没有出来之前,连接稳定性、数据解析、异常恢复和OTA不能算完成。排期里应把“页面完成”和“整机联调完成”分开。

一定要提供固件源码和电路图吗?

通常不是APP开发的必需交付物。更实际的要求是提供可识别版本的固件包、稳定的协议、刷机或升级办法、日志入口,以及能修改固件的负责人。涉及APP内实现特定算法、定制加密或联合排查硬件时,再按需要开放相应资料。

只有蓝牙直连,没有云端,还需要接口文档吗?

需要。此时BLE协议就是核心接口,设备绑定、数据存储、换手机迁移、固件升级和隐私边界更要提前说清。没有服务器不等于没有数据规则。

智能硬件更适合做APP还是小程序?

要看连接时长、后台运行、系统能力、用户使用频率和发布方式。小程序适合低门槛进入和轻量操作,也提供BLE、UDP、TCP等相关能力,但受微信运行环境和平台规则约束;需要长时间后台连接、深度系统集成或更稳定的设备常驻能力时,原生APP通常有更大空间。这个选择应在连接方案和核心使用场景明确后决定,而不是只比较开发价格。

开发前最先交哪几样东西?

先交一台可用样机、当前固件版本、连接拓扑、通信协议、测试环境地址、可调用的测试账号、产品原型和明确的技术对接人。这几项到位,团队就能先跑通最短链路,再逐步补齐OTA、第三方平台和完整验收资料。

智能硬件APP或小程序并不是一个单独的软件界面,它是手机系统、设备固件、无线通信、云平台和真实使用环境共同完成的一次交付。开发前把资料准备细一点,省下来的不只是几轮沟通,而是那些最难定位、最容易在量产后暴露的问题。