Page 1 of 1

蓝牙数据缓存

Posted: 2023年 Dec 13日 14:24
by Mr.lee

一、问题背景:
蓝牙设备在添加进入网关,立即进行数据上报的后,会存在dp数据丢失情况。

二、问题分析:
经分析,在网添加进入网关分为两个部分,子设备与网关配对成功,网关向云端添加成功,当第一步子设备与网关配对成功,网关收到数据,向云端上报,但是此时,网关与云端关于子设备配对交互可能仍然未结束,子设备模型在云端和本地未建立,这种情况,上报的dp会被丢弃。

三、解决方案:
增加子设备的数据缓存。

四、缓存组件接口介绍:

typedef struct {
//最大缓存字节数
UINT8_T max_dev_nums;
//每个设备最大缓存个数
UINT8_T max_dev_items;

//缓存有效时间
UINT16_T invalid_second;
}GW_SUBDEV_CACHE_PARAMS;

//当前设备状态,
typedef enum {
GW_SBUDEV_CACHE_START, //当网关完成与子设备配对,进行START,告诉组件可以缓存数据
GW_SUBDEV_CACHE_FINIT, // 网关完成与云端绑定交互,缓存数据交互,将缓存数据上报。
GW_SUBDEV_CACHE_CANCLE, //网关与云端交互失败,取消缓存数据
}GW_SUBDEV_CACHE_STATUS;

//缓存的设备类型
typedef enum {
GW_SUBDEV_CACHE_MESH = 0,
GW_SUBDEV_CACHE_BLE,
GW_SBUDEV_CACHE_BEACON,
GW_SUBDEV_CACH_ZIGBEE,
}GW_SUBDEV_CACHE_DEV_TYPE;

typedef void (*TUYA_CACHE_DATA_CBS)(IN CONST CHAR_T *dev_id, IN CONST void *prams, UINT16_T params_len, IN CONST UINT8_T *pdata, UINT16_T data_len,UINT_T timestamp);

//初始化
OPERATE_RET tuya_subdev_cache_init();

//设置对应的缓存数据上报方法回调
void tuya_subdev_cache_cbs_set(GW_SUBDEV_CACHE_DEV_TYPE type, GW_SUBDEV_CACHE_PARAMS *params, TUYA_CACHE_DATA_CBS cbs);

//设置当前缓存设备的状态,START,FINISH,CANCEL...
void tuya_subdev_cache_status_set(GW_SUBDEV_CACHE_DEV_TYPE type, IN CONST UINT8_T *dev_id, GW_SUBDEV_CACHE_STATUS stat);

//输入缓存数据,当当前已经START后,可缓存,否则返回错误。当超过缓存个数,也会返回错误
int tuya_subdev_cache_data_set(GW_SUBDEV_CACHE_DEV_TYPE type, IN CONST UINT8_T *dev_id, IN CONST void *param, UINT16_T param_len, IN CONST UINT8_T *pdata, UINT16_T len);

五、遗留问题:
mesh设备存在快速配网,当网关处于快速配网时,是无法接收到任何已配网mesh数据的,此时,即使有缓存功能,仍然无法解决dp丢失问题。