HarmonyOS鸿蒙Next中星闪作为服务端开始广播失败
HarmonyOS鸿蒙Next中星闪作为服务端开始广播失败 鸿蒙手机作为星闪服务端,开始广播,初次广播成功。外部设备连接上之后,广播自动停止。外部设备断开,程序主动再次调用开始星闪广播,提示code=1009700099, message=Operation failed.后续每过6s周期性调用
advertising.startAdvertising
都提示这个错误,可能这个操作连续几分钟之后可以开启广播成功一次。
如果在后台杀掉程序,再次打开程序一定能开启广播。
code=1009700099, Operation failed,这个报错说明是旧的广播通道资源未正确释放,导致底层协议栈无法分配新的广播通道。
我的建议是在设备断开连接后,先调用 stopAdvertising释放旧通道,等待足够时间让底层资源回收,再调用 startAdvertising开启新广播。同时应取消 6 秒周期性轮询,改为仅在断开连接事件中触发重启广播的逻辑。
开发中注意几点:
- startAdvertising和 stopAdvertising必须配对使用
每次 startAdvertising返回一个新的 advertisingId,代表一个独立的广播通道。必须调用 stopAdvertising(advertisingId)释放该通道,否则通道资源会累积占用,最终导致 Operation failed4。
- 连接建立后广播自动停止是协议正常行为
官方文档明确说明:建立 SSAP 连接后,SSAP 服务端广播会自动停止。后续如果服务端期望被客户端发现,需要重新发起广播1。这不需要调用 stopAdvertising,但广播通道资源仍需在重新开启前释放。
- 断开连接后需要等待底层资源回收
星闪协议栈在连接断开后需要时间完成内部状态重置。建议在断开连接回调中等待 500ms~1000ms后再调用 startAdvertising,避免因底层状态未就绪而报 Operation failed。
- 杀掉程序能成功的原因
杀掉程序后,系统会强制回收所有星闪相关资源(广播通道、SSAP 连接等),底层协议栈完全重置为初始状态,因此重新打开程序后一定能开启广播成功。这也从侧面印证了问题是资源未正确释放导致的。
- advertisingId取值范围
advertisingId的取值范围为 [0, 255]3,最多支持 256 个广播通道。如果不配对调用 stopAdvertising,通道很快会被耗尽。
ssap(星闪SSAP连接能力)-ArkTS API-NearLink Kit(星闪服务)-网络-系统 - 华为HarmonyOS开发者
更多关于HarmonyOS鸿蒙Next中星闪作为服务端开始广播失败的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
官方说明是:
1009700099
PhonePC/2in1TabletTVWearable
错误信息
Operation failed.
错误描述
当系统内部处理出错,将返回该错误码。
可能原因
其他未知错误。
在设备已配对的情况下再调用startPairing发起配对,会返回该错误码。
处理步骤
进行重试操作或请通过在线提单提交问题。
可以试试:
错误码 1009700099(Operation failed)表示系统内部处理出错,属于"其他未知错误"类型的通用错误码2。在您描述的场景中,该错误最可能的原因是:
设备断开连接后,底层SSAP连接资源未完全释放,导致短时间内再次调用 startAdvertising时系统内部状态尚未恢复,从而返回操作失败的错误。
核心思路:监听连接断开事件,等待底层资源释放后,再重新发起广播,并配合广播状态监听确认操作结果。类似的问题在社区中也有其他开发者反馈https://developer.huawei.com/consumer/cn/forum/topic/0201191070661830775?fid=0109140870620153026:星闪断开后重新连接不上、重新扫描也扫描不到,只有服务端关闭广播再重新开启才能再次被发现,说明断开后底层状态需要正确处理才能恢复。
从现象看,不太像广播参数有问题,更像是上一轮广播或连接资源没有完全释放干净。
关键线索有两个:
- 第一次广播一定成功
- 杀掉应用重启后一定恢复
这说明硬件和权限基本没问题,问题大概率出在 NearLink 状态机或者资源回收上。
建议重点检查:
1. 连接建立后广播是否被系统自动停止
你提到:
外部设备连接上之后,广播自动停止
这个要先确认是不是预期行为。
如果连接成功后系统已经停止了广播,那么再次启动前最好先执行一次:
await advertising.stopAdvertising(advertisingId)
即使你认为已经停了,也建议主动调用一次,确保状态同步。
2. advertisingId 是否已经失效
很多项目会保存第一次返回的:
const advertisingId = await advertising.startAdvertising(...)
连接断开后如果广播状态发生变化,这个 advertisingId 有可能已经失效。
建议每次启动广播都重新获取并维护最新的 advertisingId。
3. 是否监听了广播状态变化事件
建议注册:
advertising.on('advertisingStateChange', ...)
打印完整状态变化过程。
很多时候看起来是:
连接断开
↓
开始广播失败
实际上是:
连接断开
↓
广播资源仍处于Stopping状态
↓
立即startAdvertising
↓
返回Operation failed
4. 不要每6秒无脑重试
如果底层还没完成资源释放:
startAdvertising()
连续调用反而可能一直失败。
更推荐:
连接断开
↓
等待disconnect回调
↓
确认广播状态结束
↓
重新startAdvertising
而不是定时器轮询。
5. 检查星闪状态
连接断开后打印:
manager.getState()
确认当前仍然是:
NearlinkState.STATE_ON
避免出现连接过程中星闪模块进入异常状态。
如果能提供:
- startAdvertising 完整代码
- stopAdvertising 调用时机
- advertisingStateChange 日志
- 设备断开回调日志
基本就能判断到底是 广播资源未释放、advertisingId 管理问题,还是 NearLink SDK 本身的状态机问题。
从你描述的“杀进程后必恢复”来看,我个人首先怀疑的是连接断开后广播实例没有彻底释放,导致后续 startAdvertising 命中了 SDK 的状态保护机制。
不错,
广播失败通常因以下原因:1)未在module.json5中声明ohos.permission.USE_BLUETOOTH及ohos.permission.ACCESS_BLUETOOTH;2)未初始化星闪(NearLink)服务端实例或调用startBroadcast前未调用startService;3)广播参数(如频率、功率)超出设备支持范围。检查权限声明与API调用顺序。
错误码 1009700099 在星闪服务端广播中通常表示 操作过于频繁或广播资源被占用。您遇到的现象本质是:首次广播成功,外部设备连接导致广播自动停止,断开后立即或短间隔反复调用 startAdvertising 时,系统判定上一次广播的资源尚未完全释放或当前处于限制窗口,因此拒绝新请求。周期性每6秒调用仍失败,说明系统对重试间隔敏感;几分钟后偶然成功,可能是内部超时或资源回收周期恰好结束。杀掉进程后必然成功,因为彻底重置了蓝牙与星闪的底层状态。核心原因在于 StarLight Server 从停止广播到可再次启动广播之间存在冷却期,短时间内高频重试会触发防抖或防冲突保护。


