代码参考:小程序Basic(aplt.leagor.basic)有一个iot驱动实例tleagor_iot。接收、并上报最多两个涂鸦WIFI门铃按下事件。
一、输出规范
1.1 settings.cfg
iot_driver = true
根下需存在键“iot_driver”,值是bool类型的“true”。
1.2 libroseaplt.so需输出函数:aplt_create_iot_slot
void* aplt_create_iot_slot(void* _subscriber);
参数是个指向tslot_subscriber对象的指针,其成员函数iot_did_events用于向launcher上报事件。返回值是个指向aplt::tiot_slot对象的指针。
二、tiot_slot api
Iot是“Internet of Things”缩写,指物联网。引入此驱动,是要实现机器人和智能设备互动,也就是通常说的智能家居。和智能设备互动可分两个方面,一是接收智能设备产生的事件,像门铃按下,一氧化碳传感器触发报警,这是机器人被动接收。二是机器人主动控制,像打开窗帘,上调空调温度。iot驱动负责的第一部分,目前核心就一个功能。
- 接收并上报智能设备产生的事件。接收,针对不同厂家设备用各自方法,然后事件统一以tiot_event结构存储。上报则是调用tslot_subscriber的iot_did_events方法。

2.1 流程一:运行iot线程函数start_iot,接收事件
- (主线程)加载iot驱动后,会以非nullptr的_slot为参数调用set_slot。
- (set_slot)调用驱动pre_start_iot方法。在这里,可做些运行节点线程前的准备工作。
- (set_slot)创建并运行新线程:iot_driver_node。这线程的线程函数叫start_iot。
- (start_iot)这是驱动必须重载的函数,运行在节点线程(iot_driver_node)。通常就做一件事,接收指定智能设备事件,存储到一个std::set<tiot_event>变量event_result_。
2.2 流程二:上报事件
- (主线程)launcher会不断调用时间片函数tiot_driver::slice()。后者调用iot驱动的slice()方法。
- (tiot_base::slice())通过subscriber.iot_did_events(result),上报事件。参数result来自event_result_,event_result_是在iot线程写,主线程读,为安全先把内容同步到临时变量result,随后清空。
三、tiot_event
class LIB3RDPARTY_DECL tiot_event { ... bool operator<(const tiot_event& that) const noexcept; int64_t t; int src; int evt; std::string device_id; std::string icon; };
- t。以当地时区表示的事件发生时刻。单位毫秒。
- src。事件来自的设备类型。launcher用enum定了可能出现的设备类型,以“iot_src_”开始。像iot_src_doorbell(门铃),iot_src_doorcontact(门磁)。
- evt。事件码。这个和特定src有关。像iot_src_doorbell(门铃),事件码只有iot_evt_pressdown(按下),iot_src_doorcontact则有iot_evt_open(开)、 iot_evt_close(关)。系统中有哪些src,以及特指src下有哪些事件,见全局变量“std::map<int, tiot_src2> iot_sources”。
- devcie_id。发生事件的设备ID。是一串由厂家指定的字符串。
- icon。由iot驱动指定,用于标识该设备的图像。只要iot驱动编写者愿意,同样src=iot_src_doorbell,也可指定不同图像。这图像将显示在kLink的“设备”页。图像文件放在iot驱动所在的<res_path>/images目录下,像值“misc/doorbell.png”,指向的全路径是“<res_path>/images/misc/doorbeel.png”。
通常会以着std::set<tiot_event>存储事件。tiot_event重载了“operator<”,其产生的std::set会按时间“t”降序排列,即最晚发生的按下事件放在第一条。
Basic小程序中的iot驱动代码实现流程可参考“读取涂鸦门铃按下事件(iot驱动)”的“三、aplt.leaogr.basic小程序中的iot驱动”。