# 解决星闪扫描的设备广播名称只有9个字符长度的问题

#### 问题现象

用户使用星闪扫描功能，实际预期的广播设备名应为：GAxxxxxR158xx11，但是系统获取的扫描结果中设备名称只有前9个字GAxxxxxR1，如何解决？

*   配置扫描过滤器的设备名GAxxxxxR158xx11：扫描不到。
*   配置GAxxxxxR1：可以扫到，但扫描结果显示设备名为GAxxxxxR1。
*   在设置界面打开星闪，显示的设备名称也是9个字节。
    
    ```
    / 以下为-data返回的广播数据：
    01010105060d0609060c06031d090607030410000609 4741xxxxxxxxxx52313538xxxx313100000000000 b1f4741xxxxxxxxxx52313538xxxx313100000000000000000000000000000000ff02f0ff
    // 以下为-解析广播数据中Tag：0x0B的数据：
    4741xxxxxxxxxx52313538xxxx313100000000000 000000000000000000000
    // 以下为-ASCII:
    30 -> 0;40 -> @;50 -> P
    31 -> 1;41 -> A;51 -> Q
    32 -> 2;42 -> B;52 -> R
    33 -> 3;43 -> C;53 -> S
    34 -> 4;44 -> D;54 -> T
    35 -> 5;45 -> E;55 -> U
    36 -> 6;46 -> F;56 -> V
    37 -> 7;47 -> G;57 -> W
    38 -> 8;48 -> H;58 -> X
    39 -> 9;49 -> I;59 -> Y
    // 以下为实际预期的广播设备名GAxxxxxR158xx11对应的ASCII:
    47 -> G
    41 -> A
    xx -> x表示部分隐藏不展示
    xx -> x表示部分隐藏不展示
    xx -> x表示部分隐藏不展示
    xx -> x表示部分隐藏不展示
    xx -> x表示部分隐藏不展示
    52 -> R
    31 -> 1
    35 -> 5
    38 -> 8
    xx -> x表示部分隐藏不展示
    xx -> x表示部分隐藏不展示
    31 -> 1
    31 -> 1
    // 以下为-问题定位日志：
    05-07 11:38:55.716  2076  2254 I C00152/nearlink_service/nearlink_service: [AdvertisingDataReport:248]AdvertisingReport advType=1 Data=01010105060D0609060C06031D090607030410000609 4741xxxxxxxxxx52313538xxxx313100000000000 B1F47414331533833523135383130313100000000000000000000000000000000FF02F0FF, addr=DE:**:**:**:75:00, rssi=-43
    ```
    

#### 背景知识

*   参考协议：星闪无线通信系统、基础服务层、设备发现与服务管理。
    
*   参考协议：星闪无线通信系统、基础应用层、设备信息管理。
    
    0x0609设备信息管理服务中类型解析参照下表：
    
    <<设备信息管理>>服务数据内容部分的TLV格式和含义：
    

| 类型Type | 长度Length | 数值类型和含义 |
| --- | --- | --- |
| 0x00 | 1字节无符号数，取值范围0～255 | <<厂商信息>>的可变长度字符串 |
| 0x01 | 1字节无符号数，取值范围0～255 | <<设备型号信息>>的可变长度字符串 |
| 0x02 | 1字节无符号数，取值范围0～255 | <<设备序列号信息>>的可变长度字符串 |
| 0x03 | 1字节无符号数，取值范围0～255 | <<硬件版本信息>>的可变长度字符串 |
| 0x04 | 1字节无符号数，取值范围0～255 | <<固件版本信息>>的可变长度字符串 |
| 0x05 | 1字节无符号数，取值范围0～255 | <<软件版本信息>>的可变长度字符串 |
| 0x06 | 1字节无符号数，取值范围0～255 | <<设备本地名称>>的可变长度字符串 |
| 0x07 | 1字节无符号数，固定取值3 | <<设备外观信息>>固定长度设备标识 |

#### 问题定位

以下为星闪广播字段：**01**0101**05**060d0609060c06**03**1d0906070304100006094741xxxxxxxxxx52313538xxxx31310000000000**0b**1f4741xxxxxxxxxx52313538xxxx313100000000000000000000000000000000ff02f0ff。

*   用户在0b中携带的设备名为GAxxxxxR158xx11。然而，除了0x0B设备完整本地名称中携带设备名称外，0x03标准服务数据信息也可以携带设备名称，并且从星闪代码逻辑看来，最终会以服务数据信息中的为准。
*   以下为截取出的广播数据中03的服务数据信息：
    
    031d09060703041000**0609**4741xxxxxxxxxx52313538xxxx31310000000000。
    
    ```
    // 通过对如下原始码流拆分：
    01010105060d0609060c06031d090607030410000609 4741xxxxxxxxxx52313538xxxx313100000000000 b1f4741xxxxxxxxxx52313538xxxx313100000000000000000000000000000000ff02f0ff
    广播数据类型： 0x03 标准服务数据信息；
    长度：0x0d  即29；
    服务uuid：0x0609 设备信息管理服务；
    类型：0x07 设备外观信息；
    长度：0x03；
    数据码流：041000；
    类型：0x06 设备本地名称；
    长度：0x09； // 由此看出：设备本地名称长度为9，导致解析后的设备名只有前9个字节。
    数据码流：4741xxxxxxxxxx5231；
    ```
    

#### 分析结论

广播数据中字段填写不对导致。设备信息管理服务中的设备本地名称长度填写为0x09，所以设备名被解析为只有前9个字节。

#### 修改建议

开发者检查广播发送方的广播内容，按照对应长度填写。

#### 常见FAQ

Q：如何在代码中判断当前设备是否支持星闪？

A：从API19版本开始，星闪底层做了enable验证，如果设备不支持星闪功能，调用星闪API接口都会返回801错误码。

Q：SLE配对后，开关星闪，每次重新连接后显示的已配对设备名称会变化。

A：广播扫到的名称与DIS配置的名称配置一致，可使设备名称不再变化。