机器对机器通信的协议select – 级别:n00b

我正在build立一个灌溉泵和连接pipe道的监测系统。 到目前为止,我已经完成了传感器networking。 一切都连接到一个微控制器板(实际上是4 Teensy 3.0板),并且板被编程为以预定的时间间隔输出一串格式化的数据(读数)。

我想要做的就是通过USB串口将电路板连接到一个RaspberryPI (或其他一些SBC),然后让计算机将来自传感器板的读数发送到远程服务器进行logging。

我考虑的选项是:

1 – 系统日志…它让我很早就意识到这一点,因为它似乎提供了我所需要的几乎所有东西。 复杂性让我感到害怕。

2 – REST …将RaspberryPI POST数据,线上,通过networking上传到服务器上的CouchDB。

3 – HTTP …使用node.js保持一个开放的HTTP连接,并“写入”数据行。 它当然需要被第二个node.js脚本接收,以存储在DB中。

现在要求:

〜它需要轻量级和相对较快。 将会有很多数据(间隔1秒),而RaspberryPI也不是强大的。

〜我非常喜欢压缩string的选项。 上行链路是通过3G,我希望去一个“小”的月度计划。

〜encryption将是很好的,但不是强制性的。 偏执狂与乡下人一样强大

〜我真的需要这个尽可能KISS。

长话短说,我已经把这个作为一种网上串行连接,一台计算机在线连接到另一台计算机。

那么,我在这里select的选项是可取的? 或者更好,有谁有更好的主意?

我诚恳地打开编辑,甚至重新发布这个问题,如果有人有一个好点。

编辑:

迄今为止所有的评论和回答都被赞赏和考虑。

系统日志真的很棒,但我真的需要避免复杂性和开销。 另外,经过一些testing,RaspberryPI似乎在启动rsyslog后不久就停下来了。

到目前为止,已经决定DBMS将成为CouchDB。

显而易见的select是使用curl或退化的node.js服务器在数据到达时立即对数据库服务器进行REST调用。 这虽然简单而有效,但出于许多原因并不可取。 安全也是一个问题。 我不喜欢在直接调用DBMS的领域中使用微型PC的想法。

我开始赏金的原因是我希望有人能够提出一个如下的想法:“远程微型PC和DBMS之间的某种持续连接,数据将通过某种协议进行格式化并通过这种连接进行转发以便在另一端接收,这种连接需要尽可能轻量,尽可能less的开销“。

你有没有想过使用SMTP(电子邮件)? Raspberry有两个进程:一个读取数据并将它们附加到一个文件中,另一个(可能在crontab中)移动文件(可能聚合一些文件)并通过电子邮件发送到目标机器。 这样,如果采样频率和采集频率相符(例如每隔20秒或每分钟发送一次电子邮件),就没有耦合。

邮件可以被压缩,encryption(使用SMTP TLS)。 此外,它是有弹性的:如果你失去了上行链路,我们将在链路恢复时发送的数据。 从您的logging过程的angular度来看,链接始终是“上”的。

在你的couchdb服务器(或连接到couchdb的另一台机器上)中,创build一个专用用户,并在.forward中放置一个脚本,解压消息并将其提供给couchdb。

如果你想authentication,你可以用许多scheme从共享秘密到PGP签名!

我们这样做是为了给我们的数据仓库提供数据,因为我们不需要任何forms的传入连接(https或ssh),当然不是以1s的采样率(但是数据量更大)。

最后但并非最不重要的是,您可以单独testing每个组件(logging器,发送器,接收器和db-feeder),而无需运行所有基础架构。

一般来说,一切都取决于你在另一边做什么。 例如:如果您需要将这些数据转发到Zabbix – 您使用Zabbix代理,对于SNMP – 您使用snmpd,进行Web应用程序处理 – HTTP等。

Rsyslog可能是一个很好的传输选项,因为它可以解决在开发自定义解决scheme时(即使用REST,通用HTTP)时可能遇到的许多问题:

  1. RELP是可靠的
  2. 有磁盘上的排队选项,所以你可以在连接重新build立后传递消息
  3. 支持gzip消息压缩
  4. 支持TLS
  5. 支持多个input模块
  6. 和输出模块
  7. 过滤和修改双方

TLS将有巨大的开销 – 尽量不要使用它。

你需要在另一端设置相同的系统,然后你可以按照你的意愿去做技巧,也就是把它插入到mysql或者/和postgresql数据库,或者用DBI或/和其他的方式插入到/或者转发到文件 ,或者/和命名pipe道 ,或/和作为SNMP陷阱 ,或/和作为电子邮件 ,和/或定制应用程序等

我使用的是类似的系统(Arduino + Raspberry),但是我运行的是专用的应用程序,具有特定的队列和SOAP传输。 对于简单的消息传递,我想我会使用rsyslog。

你也可以看看RabbitMQ,因为它是一个消息代理,这是为这个问题devise的。

RabbitMQ是一个消息中介。 主要想法非常简单:接受和转发消息。 你可以把它想象成一个邮局:当你发邮件到邮箱时,你很确定邮差先生最终会把邮件发送给你的收件人。 使用这个比喻RabbitMQ是邮政信箱,邮局和邮递员。

RabbitMQ与邮局的主要区别在于它不处理纸张,而是接受,存储和转发二进制数据块。

这里有一篇文章描述如何在Rpi上使用它。