引言
星闪测试已经搁置了很久了,主要是8-9月份太忙了。今天重新捡回来。想看看官方提供的星闪例子,在application\samples\bt\sle\sle_uuid_client\和sle_uuid_server目录。这两个例子是一对,一个用来广播服务,另一个去连接。对应的BLE的例子是ble_gatt_client和ble_gatt_server,所以估计这两个例子实现的功能和BLE的GATT服务是差不多。
Server程序分析
这段代码是一个用于星闪(SLE)设备的UUID服务器示例程序。它展示了如何初始化一个SLE服务,注册回调函数,处理连接状态变化,以及如何发送通知。以下是对代码的详细分析:
-
包含的头文件:
securec.h
:提供安全字符串操作的函数。errcode.h
:定义了错误代码。osal_addr.h
、soc_osal.h
:操作系统抽象层头文件,提供线程、内存分配等操作。app_init.h
:应用程序初始化相关的头文件。sle_common.h
、sle_errcode.h
:与安全轻量级加密(SLE)相关的头文件。sle_ssap_server.h
、sle_connection_manager.h
、sle_device_discovery.h
、sle_server_adv.h
、sle_uuid_server.h
:与SLE服务、连接管理、设备发现、服务器广告和UUID服务器相关的头文件。
-
宏定义:
OCTET_BIT_LEN
:定义了一个字节的位数,即8。UUID_LEN_2
:定义了UUID的长度为2。BT_INDEX_4
、BT_INDEX_5
、BT_INDEX_0
:定义了蓝牙地址数组的索引。
-
编码宏:
encode2byte_little
:用于将16位的数据以小端格式编码到一个字节数组中。
-
全局变量:
g_sle_uuid_app_uuid
:存储应用的UUID。g_sle_property_value
:存储属性值。g_sle_conn_hdl
:存储连接句柄。g_server_id
、g_service_handle
、g_property_handle
:分别存储服务器ID、服务句柄和属性句柄。
-
静态函数:
sle_uuid_set_base
:设置UUID的基础值。sle_uuid_setu2
:设置基于16位无符号整数的UUID。ssaps_read_request_cbk
、ssaps_write_request_cbk
、ssaps_mtu_changed_cbk
、ssaps_start_service_cbk
:处理不同的SSAP请求和状态变化的回调函数。sle_ssaps_register_cbks
:注册SSAP回调函数。sle_uuid_server_service_add
:添加服务。sle_uuid_server_property_add
:添加属性。sle_uuid_server_add
:初始化并注册服务器。sle_uuid_server_send_report_by_uuid
、sle_uuid_server_send_report_by_handle
:通过UUID或句柄发送报告数据。sle_connect_state_changed_cbk
、sle_pair_complete_cbk
:处理连接状态变化和配对完成的回调函数。sle_conn_register_cbks
:注册连接回调函数。
-
初始化和运行:
sle_uuid_server_init
:初始化UUID服务器。sle_uuid_server_entry
:创建一个任务来运行初始化函数。
-
日志打印:
- 使用
sample_at_log_print
宏来打印日志信息。
- 使用
-
内存管理:
- 使用
osal_vmalloc
和osal_vfree
进行动态内存分配和释放。
- 使用
-
错误处理:
- 使用
errcode_t
类型的错误代码来处理不同的错误情况。
- 使用
-
线程和任务管理:
- 使用
osal_kthread_create
和osal_kthread_set_priority
来创建和管理线程。
- 使用
整体来看,这段代码是一个SLE UUID服务器的实现,它展示了如何设置和注册服务、属性和描述符,以及如何处理连接和配对事件。代码中使用了多个回调函数来处理不同的SLE事件,并且通过日志打印来调试和跟踪程序的运行状态。
Server_adv程序分析
这段代码是SLE UUID服务器的广播配置部分。它定义了如何设置广播参数、广播数据和扫描响应数据,并注册了广播相关的回调函数。以下是对代码的详细分析:
-
包含的头文件:
securec.h
:提供安全字符串操作的函数。errcode.h
:定义了错误代码。osal_addr.h
:操作系统抽象层头文件,提供地址相关的操作。sle_common.h
、sle_device_discovery.h
、sle_connection_manager.h
:与SLE通用操作、设备发现和连接管理相关的头文件。test_suite_uart.h
:用于通过UART发送测试套件日志。sle_errcode.h
、sle_speed_server_adv.h
:与SLE错误代码和服务器广播相关的头文件。
-
宏定义:
NAME_MAX_LENGTH
:定义设备名称的最大长度。SLE_CONN_INTV_MIN_DEFAULT
、SLE_CONN_INTV_MAX_DEFAULT
:定义最小和最大连接间隔。SLE_ADV_INTERVAL_MIN_DEFAULT
、SLE_ADV_INTERVAL_MAX_DEFAULT
:定义最小和最大广播间隔。SLE_CONN_SUPERVISION_TIMEOUT_DEFAULT
、SLE_CONN_MAX_LATENCY
:定义连接超时时间和最大延迟。SLE_ADV_TX_POWER
:定义广播发送功率。SLE_ADV_HANDLE_DEFAULT
:定义广播ID。SLE_ADV_DATA_LEN_MAX
:定义最大广播数据长度。
-
全局变量:
sle_local_name
:存储设备的广播名称。
-
日志打印宏:
sample_at_log_print
:定义日志打印宏。
-
设置广播数据的函数:
sle_set_adv_local_name
:设置广播数据中的设备名称。sle_set_adv_data
:设置广播数据。sle_set_scan_response_data
:设置扫描响应数据。
-
设置默认广播参数的函数:
sle_set_default_announce_param
:设置默认的广播参数。
-
设置默认广播数据的函数:
sle_set_default_announce_data
:设置默认的广播数据。
-
广播相关的回调函数:
sle_announce_enable_cbk
、sle_announce_disable_cbk
、sle_announce_terminal_cbk
:分别处理广播使能、禁用和终止的回调函数。sle_enable_cbk
:SLE使能的回调函数。
-
注册广播回调函数的函数:
sle_announce_register_cbks
:注册广播相关的回调函数。
-
初始化广播的函数:
sle_uuid_server_adv_init
:初始化UUID服务器的广播。
-
广播参数和数据结构:
sle_announce_param_t
:定义广播参数的结构体。sle_announce_data_t
:定义广播数据的结构体。
-
广播操作:
sle_start_announce
:启动广播。
-
内存管理:
- 使用
memcpy_s
函数进行内存复制。
- 使用
-
错误处理:
- 使用
errcode_t
类型的错误代码来处理不同的错误情况。
- 使用
-
日志打印:
- 使用
test_suite_uart_sendf
函数通过UART发送日志信息。
- 使用
整体来看,这段代码负责初始化SLE UUID服务器的广播功能,包括设置广播参数、广播数据和扫描响应数据,并注册了相关的回调函数来处理广播过程中的事件。代码中使用了多个宏定义来配置广播参数,并通过日志打印来调试和跟踪程序的运行状态。
Client程序分析
这段代码是一个星闪(SLE)客户端的示例程序,用于演示如何注册私有服务。以下是对代码的详细分析:
-
包含的头文件:
securec.h
:提供安全字符串操作的函数。test_suite_uart.h
:用于通过UART发送测试套件日志。soc_osal.h
:操作系统抽象层头文件,提供线程、内存分配等操作。app_init.h
:应用程序初始化相关的头文件。sle_device_discovery.h
、sle_connection_manager.h
、sle_ssap_client.h
、sle_uuid_client.h
:与设备发现、连接管理、SSAP客户端和UUID客户端相关的头文件。
-
宏定义:
THIS_FILE_ID
:定义文件的唯一标识符。SLE_MTU_SIZE_DEFAULT
、SLE_SEEK_INTERVAL_DEFAULT
、SLE_SEEK_WINDOW_DEFAULT
:定义默认的MTU大小、扫描间隔和扫描窗口。UUID_16BIT_LEN
、UUID_128BIT_LEN
:定义16位和128位UUID的长度。
-
全局变量:
g_seek_cbk
、g_connect_cbk
、g_ssapc_cbk
:分别存储扫描、连接和SSAP客户端的回调函数。g_remote_addr
:存储远程设备的地址。g_conn_id
:存储连接ID。g_find_service_result
:存储查找服务的结果。
-
回调函数:
sle_sample_sle_enable_cbk
:SLE使能回调函数。sle_sample_seek_enable_cbk
、sle_sample_seek_disable_cbk
:扫描使能和禁用回调函数。sle_sample_seek_result_info_cbk
:扫描结果回调函数。sle_sample_seek_cbk_register
:注册扫描回调函数。sle_sample_connect_state_changed_cbk
、sle_sample_pair_complete_cbk
:连接状态变化和配对完成回调函数。sle_sample_connect_cbk_register
:注册连接回调函数。sle_sample_exchange_info_cbk
:交换信息回调函数。sle_sample_find_structure_cbk
、sle_sample_find_structure_cmp_cbk
:查找结构和比较结构回调函数。sle_sample_find_property_cbk
:查找属性回调函数。sle_sample_write_cfm_cbk
、sle_sample_read_cfm_cbk
:写确认和读确认回调函数。sle_sample_ssapc_cbk_register
:注册SSAP客户端回调函数。
-
初始化和扫描:
sle_client_init
:客户端初始化函数,注册回调并使能SLE。sle_start_scan
:开始扫描函数。
-
任务和优先级:
SLE_UUID_CLIENT_TASK_PRIO
、SLE_UUID_CLIENT_STACK_SIZE
:定义客户端任务的优先级和堆栈大小。
-
入口函数:
sle_uuid_client_entry
:创建一个任务来运行客户端初始化函数。app_run
:运行应用程序入口。
-
日志打印:
- 使用
test_suite_uart_sendf
函数通过UART发送日志信息。
- 使用
-
内存管理:
- 使用
memcpy_s
函数进行内存复制。
- 使用
-
错误处理:
- 使用
errcode_t
类型的错误代码来处理不同的错误情况。
- 使用
-
线程和任务管理:
- 使用
osal_kthread_create
和osal_kthread_set_priority
来创建和管理线程。
- 使用
整体来看,这段代码是一个SLE客户端的实现,它展示了如何注册回调函数,处理扫描、连接、配对、交换信息、查找服务和属性等操作。代码中使用了多个回调函数来处理不同的SLE事件,并且通过UART发送日志信息来调试和跟踪程序的运行状态。
后面再详细介绍如何编译和测试程序。