注:该项目参考自Arduino中文社区kevinzhang19701楼主的帖子
:小题大做之远程LED控制
http://www.arduino.cn/forum.php?mod=viewthread&tid=8463&fromuid=84650
(出处: Arduino中文社区)
在这里十分感谢这位老师。
我觉得这个很有潜力,控制LED小灯只是开始,有了这个基本的项目,就可以拓展为外网远程控制其他一些家庭电器,俨然可以成为智能家居的一个切入点。
1预备工作:
1.由于需要可以通过外网来控制小灯,所以内网穿透是必不可少的。
我们选择了花生壳来实现。
首先要找到花生壳官网(Oray)进行注册,然后你会获得一个免费的域名,这个免费的域名的长相十分奇怪不容记忆,但是免费送的并且仅仅只是实验测试用的所以就不要抱怨了。(当然你可以升级为付费版商业版的,域名端口都可以定制)
得到域名之后需要开启内网穿透服务,建议不想花费太多的话可以开启免费版(但是开通还是需要缴纳少量的费用)。我用的就是免费版的服务,足够这个项目用的。有一点需要注意,免费版的服务解析速度偏慢,而且有流量限制(每月1G),所以呢,网页如果需要加载很多图片视频的话,那么就得考虑升级个人商业版了。建议一切从简,学到原理最重要。
2.准备一台电脑来作为服务器。
当然实验阶段的话,可以用自己的笔记本或者一台二手旧电脑,不用担心性能,对这个实验项目古董电脑都绰绰有余了。(当然土豪就当我什么都没说,直接去某宝买专业的服务器或者工作站好了,至于工作站或者服务器的使用和配置方法去问度娘吧)
2硬件部分:
1.控制器部分:Arduino UNO R3 开发板
2.Ethernet W5100
3.导线,面包板,200欧(或者1K欧姆)的电阻两个,两个LED,路由器,网线
4.两件叠加效果图:
5.接线效果图:
3软件部分:
(默认JAVA开发环境已经配置好了,没有配好JAVA环境先配置环境)
1.Arduino IDE:
下载链接:https://yunpan.cn/cMjJIsprnQbad 访问密码 f834
Arduino IDE的安装十分简单不再多说了。
2.Tomcat:
下载链接:https://yunpan.cn/cMjJTDtkc8UDb 访问密码 fe5c
Tomcat也需要配置环境变量哦
3.MySQL:
下载链接:https://yunpan.cn/cMjJC35LDecxx 访问密码 071f
4.MySQL Workbench:
下载链接:https://yunpan.cn/cMjJ7bb4rPzJI 访问密码 b6d7
Workbench这个软件是搭配MySQL来使用的,它是MySQL的图形界面
5.eclipse jee:
下载链接:https://yunpan.cn/cMjZyfFRnfgCi 访问密码 0ac4
6.JDBC:
下载链接:https://yunpan.cn/cMjVsNUAMetP3 访问密码 4ad5
6.花生壳客户端:
下载链接:https://yunpan.cn/cMjZVw8hqcd33 访问密码 052e
4逻辑部分:
逻辑应该很清楚了:客户端可以通过外网访问到服务器,
服务器上有两个servlet:ControlServlet和 ResponseServlet:
ControlServlet:主要接受来自于外网访客对LED开/关状态的变化,并要将这些变化状态写入MySQL数据库(对应0和1)
ResponseServlet:主要是回答W5100每隔1秒向服务器提交的LED状态查询。
然后
Arduino板子上的sketch只完成一个工作:
每隔1秒向服务器查询数据库里最新的LED状态,然后刷新LED高低电平。
5代码部分:
Arduino代码:
#include <SPI.h>
#include <Ethernet.h>
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress dnserver(192, 168, 0,105);
IPAddress ip(192, 168,0,111);
EthernetClient client;
char c;
String result;
void setup() {
Serial.begin(9600);
Ethernet.begin(mac, ip);
delay(3000);
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
Serial.println("Ethernet connecting...");
}
void loop() {
if (client.connect(dnserver, 80))
{
Serial.println("Connected");
client.println("POST http://192.168.0.105:80/remoteControlByYuancong/ResponseServlet HTTP/1.1");
client.println("Host:192.168.0.105");
client.println();
delay(1000);
// Serial.println(client.available());//为什么返回值比实际的字符串长度多2?
while(client.available())
{
c = client.read();
result += c;
}
//Serial.println("==");
Serial.println(result.substring(0,156));
Serial.println(result.substring(147,156));
Serial.println(result.substring(147,151));
if (result.substring(147,151).equals("A2=1"))
{
digitalWrite(2, HIGH);
}
else
{
digitalWrite(2, LOW);
}
if (result.substring(152,156).equals("A3=1"))
{
digitalWrite(3, HIGH);
}
else
{
digitalWrite(3, LOW);
}
client.stop();
result = "";
}
else
{
Serial.println("connection failed");
}
}
web代码:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>遥控</title>
<style type="text/css">
body{
margin:0px;
text-align:center; /*居中*/
}
div{
box-sizing:border-box; /*盒子宽高设置以border为标准*/
}
#top{
height:50px;
margin:0 auto ;
}
.container{
width:270px;
height:480px;
margin:0 auto;
background-color:#FFFFFF;
background-image:url("images/76.jpg");
<!--border-radius:10px;-->
border-style:solid;
border-width:2px;
border-color:gray;
box-shadow:5px 5px 5px gray;
}
.className{
line-height:50px;
height:50px;
width: