【星闪开发连载】seek_result_cb回调函数

目录

引言

回调函数简析

sle_seek_result_info_t结构体

关于地址

关于名字

结语


引言

虽然星闪体验官的活动结束了,但还是有一些技术细节可以总结一下,今后会陆续发在博客中。今天先分享关于seek_result_cb回调函数。

回调函数简析

seek_result_cb函数是用于客户端搜索星闪服务器的,每次搜索到一个服务器的信息,该函数就会被调用一次,用户在该函数中检测是否找到所对应的服务器,如果找到就使用sle_stop_seek函数停止搜索。

下面就是一个回调函数的例子:

static void example_sle_seek_result_info_cbk(sle_seek_result_info_t *seek_result_data)
{
    if (seek_result_data == NULL) {
        PRINT("[SLE Client] seek result seek_result_data is NULL\r\n");
        return;
    }

    if (memcmp((void *)seek_result_data->addr.addr, (void *)g_sle_expected_addr, SLE_ADDR_LEN) == 0) {
        PRINT("[SLE Client] seek result find expected addr:%02x***%02x%02x\r\n", seek_result_data->addr.addr[0],
              seek_result_data->addr.addr[4], seek_result_data->addr.addr[5]);
        (void)memcpy_s(&g_remote_addr, sizeof(sle_addr_t), &seek_result_data->addr, sizeof(sle_addr_t));
        sle_stop_seek();
    }
}

sle_seek_result_info_t结构体

该结构体定义在src\include\middleware\services\bts\sle\sle_device_discovery.h中,结构体定义如下:

/**
 * @if Eng
 * @brief  Seek result.
 * @else
 * @brief  扫描结果报告设备信息。
 * @endif
 */
typedef struct sle_seek_result_info {
    uint8_t event_type;                /*!< @if Eng event type
                                            @else   上报事件类型 @endif */
    sle_addr_t addr;                   /*!< @if Eng address
                                            @else   地址 @endif */
    sle_addr_t direct_addr;            /*!< @if Eng direct address
                                            @else   定向发现地址 @endif */
    uint8_t rssi;                      /*!< @if Eng rssi
                                            @else   信号强度指示,取值范围[-127dBm, 20dBm],0x7F表示不提供信号强度指示
                                            @endif */
    uint8_t data_status;               /*!< @if Eng data status
                                            @else   数据状态 @endif */
    uint8_t data_length;               /*!< @if Eng data length
                                            @else   数据长度 @endif */
    uint8_t *data;                     /*!< @if Eng data
                                            @else   数据 @endif */
} sle_seek_result_info_t;

其中event_type的取值在文档中没有定义,从实际日志看有0x03和0x0b两种取值。

[adv_report] event_type: 0x03, addr_type: 0x0000, addr: 02:**:**:**:06:03
[adv_report] data length: 6, data: 0x02 0x01 0x01 0x02 0x02 0x00
[adv_report] event_type: 0x0b, addr_type: 0x0000, addr: 02:**:**:**:06:03
[adv_report] data length: 21, data: 0x02 0x0c 0x0a 0x11 0x0b 0x57
[sle client] sle_server_name: WiFi_SLE_Coexist, len = 21, addr:02:01:06:08:06:03, rssi = 190
02 0c 0a 11 0b 57 69 46 69 5f 53 4c 45 5f 43 6f 65 78 69 73 74

 

关于地址

sle_seek_result_info_t结构体的addr字段是6字节的地址。这个地址是服务器程序广播的。在海思SDK中,这个地址都是定义的服务器端的。

// 0x02 : Demo No. , from 1; 0x01, 0x06, 0x08 : Hoperun Address; 0x06, 0x03 : WS63
static uint8_t g_sle_local_addr[SLE_ADDR_LEN] = {0x02, 0x01, 0x06, 0x08, 0x06, 0x03};

从注释可以看到,这个地址是用于演示的。在前面的代码中,客户端是根据地址来找服务器的。在实际开发软件的话,这个地址一定要改成自己的,否则会出现一大堆服务器地址和满足都系统的广播信息。

关于名字

sle_seek_result_info_t结构体的data字段中保存有服务器的名字,但是不能用strcmp去比较它是不是预期的名字。从前面的日志可以看到,我们广播的名字是WiFi_SLE_Coexist,但是系统在我们的名字前加了5个字节的数据(含义目前未知)。所以只能用strstr去找名字。

结语

以上介绍都源于自己对相关代码的阅读,由于WS63模块的部分代码不开源,如果有错误之处,欢迎指出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

神一样的老师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值