title: 事件监听

事件监听是指通过事件触发的方式来获取云端变化的数据。通过监听云端事件,本地获取并处理数据,保持和数据实时同步。

事件

数据在云端发生变化后会触发事件。

事件包含以下几种:

事件类型 说明
WD_ET_VALUECHANGE 初始化监听或指定节点及子节点数据变化时触发。

注意:

每当指定节点下的数据(包括更深层节点数据)发生改变时,都会触发 WD_ET_VALUECHANGE 事件。所以,为了聚焦你关心的数据,你应该把监听的节点路径设置的更加精确。例如,尽量不要在根节点设置 WD_ET_VALUECHANGE 事件监听。

监听数据

通过 Wilddog Sync 提供的方法,监听云端的事件,保持和云端实时同步。

设置监听

例如,通过 wilddog_addObserver() 方法配合 WD_ET_VALUECHANGE 事件监听 Jobs 节点下的数据:

C / RTOS / OpenWRT SDK Arduino SDK
c STATIC void onObserverCallback(Wilddog_Node_T *p_snapshot, void* arg, Wilddog_Return_T err){ if(err < WILDDOG_HTTP_OK || err >= WILDDOG_HTTP_NOT_MODIFIED){ wilddog_debug("Observe value error! Error code is %d", err); return; } //打印监听到的新节点数据 wilddog_debug_printnode(p_snapshot); return; } int main(void){ Wilddog_T wilddog = 0; //<SyncAppID>即你应用的 SyncAppID,"/Jobs" 为节点的路径 wilddog = wilddog_initWithUrl("coaps://<SyncAppID>.wilddogio.com/Jobs"); //注意,这里省略了对wilddog_addObserver返回值的检查 wilddog_addObserver(wilddog, WD_ET_VALUECHANGE, onObserverCallback, NULL); while(1){ //和云端同步 wilddog_trySync(); } wilddog_destroy(&wilddog); return 0; }
Arduino void onObserverCallback(const char *pdata, int error, void* arg){ if(error >= 200 && error < 400){ Serial.print("\n get data success!\n"); } Serial.print("\n Observe data : "); Serial.print(pdata); return; } Wilddog *ref = NULL; void setup{ //<SyncAppID>即你应用的 SyncAppID,"/Jobs" 为节点的路径 ref = new Wilddog("coaps://<SyncAppID>.wilddogio.com/Jobs"); ref->addObserver(WD_ET_VALUECHANGE, onObserverCallback, NULL); return; } void loop(){ //和云端同步 if(ref) ref->trySync(); return; }

提示:

如果你只想获取数据,可使用wilddog_getValue()方法。

移除监听

wilddog_removeObserver() 方法用于移除指定事件。移除监听之后,事件回调方法将不会被触发。

C / RTOS / OpenWRT SDK Arduino SDK
c int main(void){ Wilddog_T wilddog = 0; //<SyncAppID>即你应用的 SyncAppID,"/Jobs" 为节点的路径 wilddog = wilddog_initWithUrl("coaps://<SyncAppID>.wilddogio.com/Jobs"); //注意,这里省略了对wilddog_removeObserver返回值的检查 wilddog_removeObserver(wilddog, WD_ET_VALUECHANGE); while(1){ //和云端同步 wilddog_trySync(); } wilddog_destroy(&wilddog); return 0; }
Arduino Wilddog *ref = NULL; void setup{ //<SyncAppID>即你应用的 SyncAppID,"/Jobs" 为节点的路径 ref = new Wilddog("coaps://<SyncAppID>.wilddogio.com/Jobs"); ref->removeObserver(WD_ET_VALUECHANGE); return; } void loop(){ //和云端同步 if(ref) ref->trySync(); return; }

注意:

在父节点上调用 wilddog_removeObserver() 方法时不会移除在其子节点上添加的监听。