目录
引言
虽然星闪体验官的活动结束了,但还是有一些技术细节可以总结一下,今后会陆续发在博客中。今天先分享关于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模块的部分代码不开源,如果有错误之处,欢迎指出。