下载simplelink_cc2640r2_sdk_1_40_00_45.exe sdk,默认安装。
提示:初始环境搭建可以参考CC2640R2 BLE5.0 开发环境搭建。
Clone 工程默认,解压SDK 安装根目录的同级目录。
对于Beacon的广播数据分布放在广播数据AdvData和扫描回复的ScanRspData。关于广播和扫描可以详细阅读GAP ,对于Beacon的数据结构设计参考阅读Bluetooth® low energy Beacons
// Advertisement data (max size = 31 bytes, though this is
// best kept short to conserve power while advertising)
static uint8_t advertData[] = {
// Flags: this field sets the device to use general discoverable
// mode (advertises indefinitely) instead of general
// discoverable mode (advertise for 30 seconds at a time)
0x02, // length of this data
GAP_ADTYPE_FLAGS,
DEFAULT_DISCOVERABLE_MODE | GAP_ADTYPE_FLAGS_BREDR_NOT_SUPPORTED,
//!< Tx power level
(BEACON_POWER_SIZE+1), // length of this data
GAP_ADTYPE_POWER_LEVEL,
0, // 0dBm
//!< 128bit-UUID
(BEACON_UUID_SIZE+1),
GAP_ADTYPE_SERVICE_DATA_128BIT,
0x00, // UUID - Variable based on different use cases/applications
0x00, // UUID
0x00, // UUID
0x00, // UUID
0x00, // UUID
0x00, // UUID
0x00, // UUID
0x00, // UUID
0x00, // UUID
0x00, // UUID
0x00, // UUID
0x00, // UUID
0x00, // UUID
0x00, // UUID
0x00, // UUID
0x00, // UUID
//!< Major and Minor
(BEACON_MAJOR_SIZE+BEACON_MINOR_SIZE+1),
GAP_ADTYPE_MANUFACTURER_SPECIFIC,
0x00, // Major
0x01, // Major
0x00, // Minor
0x01, // Minor
};
// Scan response data (max size = 31 bytes)
static uint8_t scanRspData[BEACON_NAME_SIZE+BEACON_PASSWORD_SIZE+4] = {
// complete name
(BEACON_NAME_SIZE+1), // length of this data
GAP_ADTYPE_LOCAL_NAME_COMPLETE,
'L',
'e',
'c',
'o',
'n',
'i',
'o',
't',
'-',
'B',
'a',
'c',
'o',
'n',
'0', //!< 最后三位数做随机数
'0',
'1',
'\0',
'\0',
'\0',
//!< 这里做一个伪密码
(BEACON_PASSWORD_SIZE+1),
GAP_ADTYPE_SIMPLE_PAIRING_HASHC_256,
'0',
'1',
'2',
'3',
'4',
'5',
};
一共设计9个特诊值用以分别用以beacon信息和数据存储。详细实现参考beacon_gatt_profile.c/h
特诊值 | UID | 长度 | 说明 | 属性 |
---|---|---|---|---|
BEACON_PROFILE_NAME | 0xFFF1 | 20 | 广播名字 | 读、写 |
BEACON_PROFILE_MAJOR | 0xFFF2 | 2 | Major | 读、写 |
BEACON_PROFILE_MINOR | 0xFFF3 | 2 | Minor | 读、写 |
BEACON_PROFILE_INTERVAL | 0xFFF4 | 4 | 广播间隔 | 读、写 |
BEACON_PROFILE_POWER_LEVEL | 0xFFF5 | 1 | 输出功率 | 读、写 |
BEACON_PROFILE_LONG_UUID | 0xFFF6 | 16 | UUID | 读、写 |
BEACON_PROFILE_PASSWORD | 0xFFF7 | 6 | 6位数密码 | 读、写 |
BEACON_PROFILE_DATA_TX | 0xFFF8 | 20 | 数据传输(相对App) | 读、写 |
BEACON_PROFILE_DATA_RX | 0xFFF9 | 20 | 数据接收(相对App) | 读、通知 |
这里使用的Flash作为NVS存储,受Flash物理特性影响,不建议反复擦出和写入数据。这里设计到最大2000字节的数据读写,而最大特诊值长度限制在ATT_MTU
为20字节,所以需要数据拆包和组包发送接收。
以下数据Android App 对数据读写UML序列图。
对于数据读写,这里采用两个20字节长度的特诊值操作,其中BEACON_PROFILE_DATA_TX
用以Android App到 Beacon Device 的数据发送,BEACON_PROFILE_DATA_RX
用以 Android App 接收。
提示:TX和RX 方向都是相对于Android App。
因为涉及拆包和组包,所以对于20字节的特诊值这里需要组装,因为定长协议,所以这里直接采用TLV
格式。对于Type
,如下枚举变量。
typedef enum {
TYPE_READ=0, //!< 读取数据
TYPE_READ_CNT, //!< 读取数据长度
TYPE_READ_ERROR, //!< 读取数据错误
TYPE_WRITE, //!< 写入数据
TYPE_WRITE_CNT, //!< 写入数据长度
TYPE_WRITE_ERROR, //!< 写入数据错误
TYPE_WRITE_REPEAT, //!< 重复写入数据
TYPE_CLEAR, //!< 清除保存的数据
TYPE_ACK, //!< 应答数据
} BeaconDataType_t;
Length
为有效数据长度,不包括Type
,和Length
,最大长度为18字节。
而对于TYPE_READ
和TYPE_WRITE
类型 Value
第一字节表示数据长度相对17字节的索引。
提示: 这里的17字节为出去
Type
、Length
、Index
后数据长度。所以如果TYPE_READ
和TYPE_WRITE
单词最大操作17字节,例如发送50字节,需要分3次发送,所以Index
分别为0、1、2。
修改Beacon数据只需要直接修改广播数据AdvData和扫描回复的ScanRspData 数据变量;
读特诊值
// beacon_gatt_profile.c Line.622
/*********************************************************************
* @fn BeaconProfile_GetParameter
*
* @brief Get a Simple Profile parameter.
*
* @param param - Profile parameter ID
* @param value - pointer to data to put. This is dependent on
* the parameter ID and WILL be cast to the appropriate
* data type (example: data type of uint16 will be cast to
* uint16 pointer).
*
* @return bStatus_t
*/
bStatus_t BeaconProfile_GetParameter( uint8 param, void *value )
写特征值
// beacon_gatt_profile.c Line.520
/*********************************************************************
* @fn BeaconProfile_SetParameter
*
* @brief Set a Simple Profile parameter.
*
* @param param - Profile parameter ID
* @param len - length of data to write
* @param value - pointer to data to write. This is dependent on
* the parameter ID and WILL be cast to the appropriate
* data type (example: data type of uint16 will be cast to
* uint16 pointer).
*
* @return bStatus_t
*/
bStatus_t BeaconProfile_SetParameter( uint8 param, uint8 len, void *value ) ‘
特征值改变通知
//beacon_peripheral.c Line.1333
/*********************************************************************
* @fn BeaconPeripheral_processCharValueChangeEvt
*
* @brief Process a pending Simple Profile characteristic value change
* event.
*
* @param paramID - parameter ID of the value that was changed.
*
* @return None.
*/
static void BeaconPeripheral_processCharValueChangeEvt(uint8_t paramID);
NVS操作数据
详细参考TI NVS驱动。
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。