2

我有一个微控制器,当发生事件时,我希望它发送电子邮件。我知道如何在 Java 中使用电子邮件,但是如何将 Java 代码放在微控制器的 C 代码中呢?

#include <avr/io.h>
#include <util/delay.h>

int main(void)
{
DDRB |= 1 << PINB0; // = 0b00000001
DDRB &= ~(1 << PINB1);
PORTB |= 1 << PINB1;
DDRB |= 1 << PINB2;

while(1)
{
    PORTB ^= 1 << PINB0;
    if(bit_is_clear(PINB, 1)){
        PORTB &= ~(1 << PINB2);
        _delay_ms(100); //SLOW
    }           
    else{
        _delay_ms(10); //FAST
        /////I want the Java code in here/////

        PORTB ^= 1 << PINB2;
    }
}
}   

编辑

我正在使用 Atmel Atmega8A 微控制器。我正在制作一个简单的警报系统,如果引脚 B1 的电线断开,我想收到电子邮件或文本通知。

而且我只是一个高中生新手所以请不要太过分...

哦,如果有人可以为我淡化 C 中的多线程,那就太好了。我来自 Java 背景,因为这是他们在高中教的内容。

4

6 回答 6

6

好吧,您的“问题”是将 Java 嵌入到您的 AVR 中……但您真正想要的是发送电子邮件。有一些实现可以运行 Java 字节码(或者至少我认为是这样),但我相信这些都不能发送电子邮件。

您需要了解 AVR 的功能非常有限。要发送电子邮件,您的设置需要使用 TCP/IP 连接到 Internet。如此复杂的事情,ATmega8A 本身无法完成。可能会找到可以通过 UART 通信以发送电子邮件的硬件,或者您可以简单地将其连接到 PC 并运行应用程序以侦听 COM 端口并发送电子邮件,或者...无论如何您需要额外的硬件

您可能想研究其他微控制器。我相信有一些支持网络,但它们可能会非常昂贵。或者,您可以只使用 Raspberry Pi。

于 2013-07-02T05:17:05.633 回答
1

Alvin Wong 已经对这个问题给出了更直接的答案,但我觉得你的问题太不集中了,帮助你重新调整它可能会很好。

当您从 Java 程序发送邮件时,您应该开始了解实际发生的情况,然后了解您的微控制器实际上可以完成其中的哪些部分,以及如何完成。

那么,当您运行您的邮件发送 Java 程序时会发生什么?

  1. 你用 Java 语言编写程序,编译成 Java 字节码,由 Java 虚拟机解释,它会调用 Java 运行时提供的一些库,
  2. 这将(可能间接地)启动“网络通信”,这将利用操作系统网络设施,......
  3. 这将使用网络硬件,
  4. 使用某些邮件协议与邮件服务器通信,并向其发送一些特定的字节序列,使其了解正在向某人发送邮件消息。

( 1)部分由 Java 平台的所有层介导。(记住:Java 不仅仅是一种语言)。
( 2)是 Java 平台下的一层(或几层),包括您的所有操作系统(Windows、Linux、Mac OS X 等)。
( 3)是由您的硬件组成的层,其中包括其他子层,例如网卡中的固件,这仍然是更多可以管理诸如以太网/Wifi 协议细节之类的软件。
( 4)层是在某些通信通道(以太网、WiFi 等)中打开和关闭的位和字节。

现在,您的微控制器可以完成哪一部分?
微控制器位于(3)的下部。在你的情况下,Atmega 甚至没有任何网络硬件支持,所以......我不知道你打算如何连接到网络。无论如何,即使你拥有它,你也离(4)如此接近,以至于试图上升到(1)宁可发疯。(1)说大象,(4)可以由蚂蚁完成,微控制器大约有瓢虫大小,参考 Atmel 的吉祥物:P。

所以:停止像大象一样思考。事实上,你将不得不努力实现你的目标,但如果你采取大象的方式,你可能会做大量不需要的工作——如果可以完成的话,我对此表示怀疑。

(如果无论如何我不得不采取大象的方式,即在 AVR 中使用 Java,我会从查看 GCJ 或 LLVM 选项开始。我知道十多年前已经完成了一些工作以将极简 JVM 移植到 8 位微控制器,但不知道它是如何演变的)

于 2013-07-05T09:58:09.230 回答
1

Java 和 C 是非常非常不同的语言。

您需要为您的微控制器找到支持 Java 的编译器。

但是,如果您的控制器可以通过 GCC 编译 C,那么使用 GCJ 可能会在目标平台上的某些内存限制下工作。您需要生成正确架构的目标文件,并使用与微控制器兼容的 gcc 链接它。

不值得花时间。我建议改为在 C 中实现它。

此外,可能不会打开文件和套接字,因为微控制器通常不提供超出硬件访问某些方面的任何内核例程。libc也可能不存在或很少。

您也可能没有网络硬件。如果您能告诉我们哪个微控制器,我们可以提供帮助。

于 2013-07-02T01:31:26.843 回答
1

就像其他人说的那样,以这种方式发送电子邮件真的离你的微机很远(我假设你主要想发送邮件,而不是在那里运行 Java VM)。要让邮件继续发送,您需要使用 TCP/IP 连接到 Internet,然后使用例如 SMTP 协议,您可能能够完成此操作。

有问题的部分是连接到互联网。为此,您需要将设备连接到“合适的线路”上,通常是以太网,但也可能存在基于无线电的解决方案。然后,您必须实现在那条线上进行通信所需的一切(整个网络堆栈,直到 TCP/IP)。这不能合理地全部由您自己完成。一种方法是使用具有一些内置以太网连接功能的微型计算机,并根据您的喜好使用例如lwipContiki来发挥作用。另一种方法是使用额外的硬件来为你做这件事,比如这个 Moxa 产品,但你可能无法通过它实现 SMTP。

然后,您将“只”需要实现一个合适的SMTP(简单邮件传输协议)层来正确发送您的邮件(我上面介绍的一个或另一个解决方案可能已经为您提供了这个)。

于 2013-07-07T19:15:01.987 回答
0

您的微控制器需要支持 JDK 或 Java ME(可能是 Sun SPOT)。 http://www.inonit.com/cygwin/jni/invocationApi/c.html有一个使用 JNI 启动 JVM 并调用您的类的示例。

于 2013-07-02T01:34:52.440 回答
0

微控制器非常典型地是在 C 环境中开发的,因为在微控制器中,硬件能力方面的资源是有限的。使用 C 是因为它允许最大的灵活性并允许微调,因为在微控制器环境中实时计算机非常重要。但这并不是说,微控制器世界中使用了 java。非常令人费解的是,android 在一些 java 上运行,这些 java 在最低端可能使用 ARM 处理器(由您决定是否真的想称它为微控制器)。所以总而言之,是的,我建议你学习 C。如果你真的想走 java 的路,我个人还没有遇到很多资源可以让你在 AVR 微控制器上使用 java。这可能是可能的,但预计会影响性能。

如果您没有微控制器方面的经验,我建议您研究 Arduino (arduino.cc)。

祝你好运!

于 2013-07-02T03:15:45.290 回答