mco_iot_replicator_sync
启动节点的同步。
MCO_RET mco_iot_replicator_sync(
mco_iot_replicator_h repl,
mco_iot_agent_id_t agent_id,
int flags
);
- 如果未设置
MCO_IOT_SYNC_WAIT
标志,则在将数据写入套接字后函数会立即返回。后续事件,即推送的确认接收和拉取的数据,必须在回调函数中处理。 - 标志
MCO_IOT_SYNC_NONBLOCK
和MCO_IOT_SYNC_WAIT
不兼容。 - 当
agent_id
为MCO_IOT_ALL_AGENTS
时,不允许设置MCO_IOT_SYNC_WAIT
标志(无法同步等待所有代理的响应)。
有关概述,请参阅主动复制结构页面。
参数
repl
mco_iot_replicator_h
复制器对象。
agent_id
mco_iot_agent_id_t
要同步的device_id或以下常量之一:
- MCO_IOT_ALL_AGENTS:同步所有连接的设备。
- MCO_IOT_SERVER_AGENT_ID:表示服务器节点。
- MCO_IOT_ALL_UP_AGENTS:所有直接或间接连接的具有较低级别值的节点。
- MCO_IOT_ALL_DOWN_AGENTS:所有直接或间接连接的具有更高级别值的节点。
flags
以下同步标志组合的位掩码值:
- MCO_IOT_SYNC_PUSH:将修改发送(推出)到节点(或所有节点)。服务器从可下载类发送所有修改的数据,而设备从其可上传类发送所有修改的数据。
- MCO_IOT_SYNC_PULL:从远程节点请求修改。
- MCO_IOT_SYNC_NONBLOCK:确保套接字未处于阻塞状态(套接字阻塞时会使用一个内存缓冲区来临时缓存传输请求)。
- MCO_IOT_SYNC_WAIT:请等待所请求的操作完成。如果请求是推送(
MCO_IOT_SYNC_PUSH
),则需等待从远程节点收到确认(ACK
);如果请求是拉取(MCO_IOT_SYNC_PULL
),则需等待所有数据接收完毕。 - MCO_IOT_SYNC_BOTH:相当于
MCO_IOT_SYNC_PUSH | MCO_IOT_SYNC_PULL
。 - MCO_IOT_SYNC_DEEP_ACK:如果设置,则目标节点必须确认数据。这可确保目标已收到数据,但如果目标繁忙或不可用,则可能会延迟接收 ACK。如果未设置此标志,则由直连节点(路由器)确认的数据。稍后,路由器会将数据传送到目的地。
- MCO_IOT_SYNC_RESEND:通常
mco_iot_replicator_sync()
不会重新发送已发送但未确认的数据。此标志强制重新发送所有未确认的数据。如果节点在 ioT 网络中的位置发生了变化,这可能很有用。 - MCO_IOT_SYNC_CHILDS:如果设置,则数据将传送到目标节点及其所有直接和间接子节点。
返回
MCO_S_OK
同步已成功启动。
MCO_S_IOT_NO_NEW_DATA
自上次调用 mco_iot_replicator_sync()
以来,没有插入或更新任何新数据。
请注意,这不是错误代码,而是状态代码。
MCO_E_IOT_INVALID_HANDLE
无效的复制器句柄 repl
。
MCO_E_ILLEGAL_PARAM
参数值不兼容。
MCO_E_IOT_WRONG_AGENT_ID
agent_id
无效。
MCO_E_IOT_AGENT_NOT_FOUND
未找到具有指定 agent_id
的设备或服务器。
MCO_E_NOMEM
无法为内部结构分配内存。
MCO_E_WRITE_STREAM
无法将复制的数据写入套接字。
MCO_E_SESLIMIT
如果该函数无法创建数据库连接,则会出现其他 connect()
错误。
mco_trans_start()
错误
启动事务时出错。
mco_trans_commit()
错误
提交事务时出错。
其他错误
在访问数据库以序列化更改时可能会发生其他错误。
示例
下面的代码片段初始化了 ARF(物联网)运行时,打开并连接数据库,创建通信器和复制器对象,然后连接并同步复制器:
int main(int argc, char *argv[])
{
mco_db_params_t db_params;
mco_device_t dev;
mco_db_h db;
mco_iot_replicator_params_t repl_params;
mco_iot_comm_params_t comm_params;
mco_iot_replicator_h repl;
mco_iot_comm_h comm;
const char *conn_string = (argc > 1) ? argv[1] : "127.0.0.1:15000";
...
/* Initialize SmartEDB and IoT runtimes */
mco_error_set_handler(&sample_errhandler);
mco_runtime_start();
mco_iot_init();
/* Create database */
dev.type = MCO_MEMORY_CONV;
dev.assignment = MCO_MEMORY_ASSIGN_DATABASE;
dev.size = DEVICE_DATABASE_SIZE;
dev.dev.conv.ptr = (void*)malloc(dev.size);
mco_db_params_init (&db_params);
db_params.db_max_connections = 5;
if (argc > 2) {
db_params.iot_agent_id = atoi(argv[2]); /* Override the agent_id in the schema */
}
CHECK(mco_db_open_dev(db_name, iotdevice_get_dictionary(), &dev, 1, &db_params));
CHECK(mco_db_connect(db_name, &db));
mco_iot_comm_params_init(&comm_params);
CHECK(mco_iot_comm_create(&comm_params, &comm));
mco_iot_replicator_params_init(&repl_params);
CHECK(mco_iot_replicator_create(db, comm, &repl_params, &repl));
...
CHECK(mco_iot_replicator_connect(repl, conn_string, 2*1000, 0));
...
CHECK(mco_iot_replicator_sync(repl, MCO_IOT_SERVER_AGENT_ID, MCO_IOT_SYNC_PULL | MCO_IOT_SYNC_PUSH | MCO_IOT_SYNC_WAIT));
}
文件
- 头文件:
mcoiot.h
- 源文件:
mcoiotrepl.c
- 库:
libmcoiotrepl.a