【问题标题】:How to send emails with an Arduino without using a computer?如何在不使用计算机的情况下使用 Arduino 发送电子邮件?
【发布时间】:2012-08-25 03:54:31
【问题描述】:

我正在试验我的Arduino Mega。我还有一个Arduino Ethernet Shield

我需要使用它们发送电子邮件,没有计算机的帮助(或任何其他设备;如智能手机等)。虽然我可以找到几篇文章,但我找不到任何可接受的解决方案......

我该怎么做?由于我不要求将其用于任何特殊应用,因此您可以 对缺失的细节做出任何假设。

【问题讨论】:

  • 你需要一个 tcp/ip 栈,然后邮件协议就相当简单了,协议见 rfc for SMTP。 tcp/ip 堆栈是困难的部分,除非已经有一个/一些罐头解决方案
  • 一个 Arduino 可能是发送或接收电子邮件的糟糕选择。如果您有 DIY 的想法,请从 Raspberry PI 中取出一个字节:)。
  • +1 @paulsm4 为您的建议,但目前我已经通过 Arduino 做到了。希望有人能告诉我一个方法..
  • 感谢@dwelch,但我没有足够的时间来试验它(当然我会在空闲时间尝试)。猜猜会有人有经验..更喜欢完整的(大致)示例..
  • @paulsm4 正如我所提到的,我正在试验我的 Arduino mega。没有任何特殊目的,事件等......所以,你可以假设最简单的事情。当我按下连接到 Arduino 的按钮时,例如向我的电子邮件地址发送包含一些文本 ("Wow..It Works!!") 的电子邮件。或者任何更简单的......然后我将能够在以后进一步挖掘更高级的应用程序......

标签: arduino communication microcontroller ethernet


【解决方案1】:

从上面在 cmets 中的讨论看来,您要么需要刚刚为您完成代码的人提供代码,要么需要花时间了解组件并找到或制作组件。

如果这个平台只对非标准数据包有用,他们就不会为这个平台制作以太网屏蔽。所以有人在某个地方创建了某种级别的 IP 堆栈。

不过,为了发送邮件,您需要了解Simple Mail Transfer Protocol (SMTP)。几乎所有 Internet 协议定义都是使用称为 RFCs(征求意见)的东西定义的。因此,如果您 google SMTP RFC,您会发现 RFC 2821

IETF 是 Internet 工程任务组。许多网站上都会有这些文件的许多副本。并且由于 Internet 的时代和这些协议,在许多情况下,您会发现创建了一个 RFC 来替换之前的一个。不使用版本号,但它有点像 HTML 1.0 然后 HTML 2.0 等等。即使 RFC 说它完全取代了 RFC xyz,我还是建议您去查找 RFC xyz 并阅读它。我尽可能回溯到那个地方,然后继续前进。

许多/大多数基于 TCP 的协议(TCP 是 RFC 中定义的另一个协议,稍后会详细介绍)是基于 ASCII 的,例如 Telnet 很容易学习/实验协议,你大概可以用 Telnet 来学习 SMTP。

大多数协议是某种半双工的东西,建立连接时,服务器通常会向您发送一个字符串,您会看到该字符串,然后您发送某种 hello 字符串,服务器会以某种 OKAY 或失败响应地位。对于 SMTP,然后您执行某种操作或失败。最终,您告诉服务器您已准备好发送消息正文,您这样做,以定义的终止结束消息。然后要么服务器说没问题,要么失败,或者可能有更多的握手。

一般的协议虽然有这个来回。通常您发送带有命令的字符串,并且服务器端通常会发回一个简短的 OK 或错误。有时,如果他们愿意,他们会发回有关错误的更多详细信息,但总是以表示正常或错误的几个字节开头。协议通常有一个流程,你必须先做这个然后这个然后那个。

您应该学习套接字编程,有时称为Berkeley sockets。如果您选择的平台是 Windows 套接字,您可以编写大多数可跨 Unix 移植的程序,但也可以使用 Windows 套接字跨 Windows 移植。您需要先学习该协议,最好在您的台式机/笔记本电脑上而不是嵌入式上,您可以在那里更快地完成它。您不必学习 fork 或 thread 来使用套接字。这些示例可能表明,这样很容易显示,但是您可以仅使用轮询来编写完整的应用程序,它是半双工的,发送一些东西,等待,发送一些东西,等待。对于这些简单的学习程序,提前一点时间来学习套接字,然后就是学习协议了。

现在这是非常容易的部分,困难的部分是 TCP/IP 堆栈。我不建议在没有获得更多经验的情况下尝试这样做。例如,首先学习响应ARP(又一个RFC 协议,地址解析协议),然后是pingICMP echo,ICMP 协议的一个子集),然后是IP basics(嗅探数据包),然后接收并生成UDP 数据包。 TCP 在此之上是另一个层次,更多的握手。它不是固定的数据包大小,它是流式传输的,不需要您的代码对数据包进行操作,它是字节流,就像使用串行端口一样。 p>

做你自己的 TCP 栈是一件非常重要的事情,我不推荐它,你需要找一个为这个平台为以太网屏蔽做过 TCP/IP 栈的人,然后使用它,无论如何RTOS 或他们使用的环境,使用它。然后使用该协议获取基于台式机/笔记本电脑的体验并应用它。

从上面的讨论中,如果你不想学习协议等,我认为你需要在谷歌周围查看 Arduino 以太网屏蔽示例,看看是否有人做过发送电子邮件的事情。

【讨论】:

  • 感谢您的出色回答!好吧,我放弃了。我会试着自己面对这个。实际上,我在使用您提到的一些(简单)协议方面经验丰富。但是,是的,我没有太多关于 TCP/IP 堆栈的知识(不是说我什么都不知道)。当然,我正在寻找一个简单的解决方案。但我想我不会得到比这更好的答案了..非常感谢!
  • 我不知道你的经验水平。数据包结构非常简单,来回跟踪事物等等是它变得更加复杂的地方,尤其是如果尝试在这样一个有限的平台上进行。谷歌搜索自己虽然看起来盾牌使用 wiznet 芯片。所以堆栈是在硬件中为你完成的,而 arduino 沙箱似乎让事情变得不那么痛苦。 arduino.cc/en/Guide/ArduinoEthernetShield
  • TCP/IP 已经内置在 W5100 芯片中的 Arduino 以太网扩展板中。例如。来自Arduino Ethernet Shield:“以太网控制器:具有内部 16K 缓冲区的 W5100 ... Wiznet W5100 提供了一个支持 TCP 和 UDP 的网络 (IP) 堆栈”。 W5100 datasheet.
  • 对,就是我说的,栈是在硬件上帮你搞定的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-10-13
  • 2014-01-01
  • 1970-01-01
  • 2021-05-19
  • 2012-12-25
  • 1970-01-01
  • 2021-12-22
相关资源
最近更新 更多