Events 为什么要从particle.publish获取两个事件?
我在粒子电子上使用这样的代码来报告从kegerator上的流量计到粒子云的脉冲计数:Events 为什么要从particle.publish获取两个事件?,events,cloud,publish,particle.io,Events,Cloud,Publish,Particle.io,我在粒子电子上使用这样的代码来报告从kegerator上的流量计到粒子云的脉冲计数: 当我将事件日志卷曲到终端中时,我看到第一次发布的两个事件,如下所示: 我不明白这怎么会发生。为什么它不报告“滴答声:47”?我错过了什么 更新: 我做了一些进一步的测试,发现Particle.publish在第一次成功完成时返回false。这是超时问题吗?这些发布之间的时间差只有大约200ms。好的,这至少是部分答案 似乎Particle.publish是异步的。它返回的承诺是,一个开始为false的答
当我将事件日志卷曲到终端中时,我看到第一次发布的两个事件,如下所示:
我不明白这怎么会发生。为什么它不报告“滴答声:47”?我错过了什么 更新:
我做了一些进一步的测试,发现Particle.publish在第一次成功完成时返回false。这是超时问题吗?这些发布之间的时间差只有大约200ms。好的,这至少是部分答案 似乎Particle.publish是异步的。它返回的承诺是,一个开始为false的答案只有在实际完成操作时才会变为true。如果在Particle.publish之后和检查返回代码之前等待不确定的时间量(比如延迟(10)),则返回值将指示发布的实际成功或失败。我的代码无法工作,因为在我等待时计数的刻度将在我重置仪表时被删除。我也有同样的行为 我必须修改代码,以便在长时间运行Particle.publish时不会丢失任何记号。我认为在服务器确认之前,每个statusMessage都应该放在一个列表中 最终答案:
我修改了代码以关闭窗口,在此期间,我可以接收刻度,当我重置计数器时,这些刻度将被清除。为此,我将滴答声捕获到一个数组中,然后重置滴答声计数器(仪表)。我正在使用一个名为PublishQueueAsyncRK的库(cudos to rickkas7这个库很棒!),所以我可以直接启动它,然后忘记它。在github上查看它
void publishStatus(){
无符号整数计数器[NUM_-METERS];
未签名整数待定;
对于(int i=0;i滴答声;
挂起+=计数器[i];
重置仪表(一);
}
如果(待定){
字符串状态报告;
对于(int i=0;i=发布间隔){
publishStatus();
}
}
void meterInterrupt(void) {
detachInterrupt(pin);
ticks++;
cloudPending = 1;
attachInterrupt(pin, meterInterrupt, FALLING);
}
void publishStatus() {
if (!cloudPending) {
return;
}
cloudPending = 0;
getStatus(&statusMessage);
// status message contains number of ticks since last publish
bool published = Particle.publish("Ticks", statusMessage, PRIVATE);
if (published) {
resetMeters();
lastPublish = millis();
}
}
void loop() {
if ((millis() - lastPublish) >= 1000) {
publishStatus();
}
}
event: Ticks
data: {"data":"ticks:1","ttl":60,"published_at":"2018-07-03T22:35:01.008Z","coreid":"420052000351353337353037"}
event: hook-sent/Ticks
data: {"data":"","ttl":60,"published_at":"2018-07-03T22:35:01.130Z","coreid":"particle-internal"}
event: Ticks
data: {"data":"ticks:46","ttl":60,"published_at":"2018-07-03T22:35:01.193Z","coreid":"420052000351353337353037"}
event: hook-sent/Ticks
data: {"data":"","ttl":60,"published_at":"2018-07-03T22:35:01.303Z","coreid":"particle-internal"}
void publishStatus() {
unsigned int counters[NUM_METERS];
unsigned int pending;
for (int i = 0; i < NUM_METERS; i++) {
meter_t *meter = &meters[i];
counters[i] = meter->ticks;
pending += counters[i];
resetMeter(i);
}
if (pending) {
String statusReport;
for (int i = 0; i < NUM_METERS; i++) {
statusReport.concat(String::format("%i:%u|", i+1, counters[i]));
}
publishReport(statusReport);
lastPublished = millis();
}
}
void publishReport(String report) {
if (report != "") {
publishQueue.publish("PourLittleTicks", report, PRIVATE);
}
}
void loop() {
if ((millis() - lastPublished) >= PUBLISH_INTERVAL) {
publishStatus();
}
}