机器对机器通信的协议选择 - 级别:n00b

机器对机器通信的协议选择 - 级别:n00b

我正在为灌溉泵及其连接的管道构建一个监控系统。到目前为止,我已经完成了传感器网络。所有东西都连接到一个微控制器板(实际上是 4 Teensy 3.0我们在一个实验室中组装了一个电子电路板(boards),并且该电路板被编程为按照预定的时间间隔输出一串格式化的数据(读数)。

我想做的是通过 USB 串行将电路板连接到树莓派(或其他 SBC)并让计算机将从传感器板接收到的读数发送到远程服务器进行记录。

我考虑过的选项有:

1 - Syslog... 我很早就意识到了这一点,因为它似乎提供了我需要的一切。不过它的复杂性让我害怕。

2——休息...让 RaspberryPI 通过网络将数据逐行发布到服务器上的 CouchDB。

3 - HTTP... 与 node.js 保持开放的 HTTP 连接并“写入”数据行。当然,它需要由第二个 node.js 脚本接收以存储在数据库中。

现在来看看要求:

~ 它需要轻量级且相对较快。会有大量数据(1 秒间隔),而 RaspberryPI 并不是强大的。

~ 我非常希望有压缩字符串选项。上行链路通过 3G,我希望采用“小”月费套餐。

~ 加密会很好,但不是强制性的。乡巴佬的偏执狂很严重……

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

长话短说,我认为这是某种网络串行连接,其中一台计算机一行一行地向另一台计算机传送数据。

那么,我这里给出的哪个选项更可取?或者更好的是,有人有更好的主意吗?

如果有人提出好的观点,我很乐意编辑甚至重新发布该问题。

编辑:

迄今为止的所有评论和答复都已受到重视和考虑。

Syslog 确实很棒,但我真的需要避免复杂性和开销。此外,经过一些测试后,RaspberryPI 似乎在启动 rsyslog 后不久就停止了。

现在已经决定 DBMS 将采用 CouchDB。

显而易见的选择是使用 curl 或残留的 node.js 服务器,在数据到达后立即对数据库服务器进行 REST 调用。虽然这种方法简单有效,但由于多种原因,并不可取。安全性也是一个问题;我不喜欢在现场使用微型 PC 直接调用数据库管理系统的想法。

我发起悬赏的原因是希望有人能提出类似以下的想法:“远程微型 PC 和 DBMS 之间的某种持久连接。数据将通过某种协议格式化并通过此连接转发以便在另一端接收。此连接需要尽可能轻量,并尽可能减少开销”。

答案1

您是否考虑过使用 SMTP(电子邮件)?Raspberry 上有两个进程:一个进程读取数据并将其附加到文件中,另一个进程(可能在 crontab 中)移动文件(可能聚合一些文件)并通过电子邮件发送到目标计算机。这样,如果您同意的话,采样频率和记录频率之间就没有耦合(例如每 20 秒或每分钟发送一封电子邮件)。

邮件可以压缩、加密(使用 SMTP TLS)。此外,它还具有弹性:如果您丢失了上行链路,我们将在链路恢复时发送数据。从您的日志记录过程的角度来看,该链路始终处于“开启”状态。

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

如果您想要进行身份验证,您可以使用多种方案,从共享密钥到 PGP 签名!

我们这样做是为了向我们的数据仓库提供信息,因为我们不希望有任何类型的传入连接(https 或 ssh),诚然不是以 1s 的采样率(但数据更大)。

最后但同样重要的一点是,您可以单独测试每个组件(记录器、发送器、接收器和数据库馈送器),而无需运行所有基础设施。

答案2

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

Rsyslog 可能是传输的一个不错的选择,因为它已经可以解决您在开发自定义解决方案时可能遇到的许多问题(即使用 REST、通用 HTTP 时):

  1. RELP 非常可靠
  2. 具有磁盘排队选项,因此您可以在重新建立连接后传递消息
  3. 支持gzip消息压缩
  4. 支持 TLS
  5. 支持多种输入模块
  6. 及输出模块
  7. 过滤修改两边

TLS 会产生巨大的开销 - 尽量不要使用它。

您需要在另一端设置相同的系统,然后您可以根据需要对消息进行一些技巧,即将其插入到mysql或/和PostgreSQL数据库,或/和任何其他具有 DBI 的或/和转发至文件或/和命名管道或/和snmp 陷阱或/和电子邮件,和/或定制应用程序ETC。

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

答案3

您还可以查看RabbitMQ 因为它是一个消息代理,它是为解决这个问题而设计的。

RabbitMQ 是一个消息代理。其主要思想非常简单:它接收和转发消息。您可以将其想象成一个邮局:当您将邮件发送到邮箱时,您非常确定邮递员先生最终会将邮件递送给您的收件人。用这个比喻来说,RabbitMQ 是一个邮箱、一个邮局和一个邮递员。

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

这里'一篇描述如何在 Rpi 上使用它的帖子。

相关内容