Events 为什么要从particle.publish获取两个事件?

Events 为什么要从particle.publish获取两个事件?,events,cloud,publish,particle.io,Events,Cloud,Publish,Particle.io,我在粒子电子上使用这样的代码来报告从kegerator上的流量计到粒子云的脉冲计数: 当我将事件日志卷曲到终端中时,我看到第一次发布的两个事件,如下所示: 我不明白这怎么会发生。为什么它不报告“滴答声:47”?我错过了什么 更新: 我做了一些进一步的测试,发现Particle.publish在第一次成功完成时返回false。这是超时问题吗?这些发布之间的时间差只有大约200ms。好的,这至少是部分答案 似乎Particle.publish是异步的。它返回的承诺是,一个开始为false的答

我在粒子电子上使用这样的代码来报告从kegerator上的流量计到粒子云的脉冲计数:



当我将事件日志卷曲到终端中时,我看到第一次发布的两个事件,如下所示:



我不明白这怎么会发生。为什么它不报告“滴答声: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();
  }
}