问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何用arduino构建一个基于zigbee的网络

发布网友 发布时间:2022-04-23 09:21

我来回答

1个回答

热心网友 时间:2023-05-19 00:24

这里我们使用Arino Ethernet建立一个简单网页服务器,当Arino服务器接收到浏览器访问请求时,即会发送响应消息,浏览器接收到响应消息,会将其中包含的HTML文本转换为网页显示出来。
这样就可以将传感器获取到的信息显示到网页上,每个在该网络范围内的计算机或其他移动设备,无论什么平台都可以通过网页浏览器了解到各传感器的数据。

[C++] 纯文本查看 复制代码

/*
OpenJumper WebServer Example
建立一个显示传感器信息的Arino服务器
[url=http://www.openjumper.com/]http://www.openjumper.com/[/url]
[url=http://x.openjumper.com/ethernet/]http://x.openjumper.com/ethernet/[/url]
*/

#include <SPI.h>
#include <Ethernet.h>

// 设定MAC地址、IP地址
// IP地址需要参考你的本地网络设置
byte mac[] = {
0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,1,177);

// 初始化Ethernet库
// HTTP默认端口为80
EthernetServer server(80);

void setup() {
// 初始化串口通信
Serial.begin(9600);

// 开始ethernet连接,并作为服务器初始化
Ethernet.begin(mac, ip);
server.begin();
Serial.print("server is at ");
Serial.println(Ethernet.localIP());
}

void loop() {
// 监听客户端传来的数据
EthernetClient client = server.available();
if (client) {
Serial.println("new client");
// 一个Http请求结尾必须带有回车换行
boolean currentLineIsBlank = true;
while (client.connected()) {
if (client.available()) {
char c = client.read();
Serial.write(c);
// 如果收到空白行,说明http请求结束,并发送响应消息
if (c == '\n' && currentLineIsBlank) {
// 发送标准的HTTP响应
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println("Connection: close");
client.println();
client.println("<!DOCTYPE HTML>");
client.println("<html>");
// 添加一个meta刷新标签, 浏览器会每5秒刷新一次
// 如果此处刷新频率设置过高,可能会出现网页的卡死的状况
client.println("<meta http-equiv=\"refresh\" content=\"5\">");
// 输出每个模拟口读到的值
for (int analogChannel = 0; analogChannel < 6; analogChannel++) {
int sensorReading = analogRead(analogChannel);
client.print("analog input ");
client.print(analogChannel);
client.print(" is ");
client.print(sensorReading);
client.println("<br />");
}
client.println("</html>");
break;
}
if (c == '\n') {
// 已经开始一个新行
currentLineIsBlank = true;
}
else if (c != '\r') {
// 在当前行已经得到一个字符
currentLineIsBlank = false;
}
}
}
// 等待浏览器接收数据
delay(1);
// 断开连接
client.stop();
Serial.println("client disonnected");
}
}

下载程序后,通过浏览器,访问Arino Ethernet所在的IP地址(如程序中设定的IP地址为192.168.1.177),即可看到如图10-11对应的网页了。

在网页中显示了A0至A5所读出的模拟值,你也可以通过修改以上程序,显示其他类型的数据。

以上程序修改自Arino IDE自带的Web Server例程,它是通过不断刷新网页来获取Arino反馈来完成的。实际上,在当今web开发上,我们几乎都是通过ajax不刷新网页,来与服务器通信的。这里我写了一个ajax+arino web server的示例。

程序二

要制作这个项目,首先我们需要准备一个

该网页HTML部分如下:

[HTML] 纯文本查看 复制代码

<!--例程网页控制Arino -->
<!--奈何col 2014.12.24 v3.0 -->
<!--学了半小时js,求别吐槽 -->
<html>
<head>
<meta charset="UTF-8">
<title>OpenJumper!Arino Web Server</title>
<script type="text/javascript">
function send2arino(){
var xmlhttp;
if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else
{// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}

element=document.getElementById("light");
if (element.innerHTML.match("Turn on"))
{
element.innerHTML="Turn off";
xmlhttp.open("GET","?on",true);
}
else
{
element.innerHTML="Turn on";
xmlhttp.open("GET","?off",true);
}
xmlhttp.send();
}
function getBrightness(){
var xmlhttp;
if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else
{// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
document.getElementById("brightness").innerHTML=xmlhttp.responseText;
}
}
xmlhttp.open("GET","?getBrightness",true);
xmlhttp.send();
}
window.setInterval(getBrightness,5000);
</script>
</head>
<body>
<div align="center">
<h1>Arino Web Server</h1>
<div>brightness:</div>
<div id="brightness">??</div>
<button id="light" type="button">Turn on</button>
<button type="button">About</button>
</div>
</body>
</html>

在该网页中,第一个id为light的button标签,用于控制开关灯。点击后,会调用send2arino()函数,浏览器会以AJAX的方式向Arino服务器发送含有"?on"或"?off"的GET请求。Arino服务器通过判断请求中的内容,做出开关灯动作。
而getBrightness()函数通过一个定时操作,每秒钟运行一次,每次都以AJAX的方式向Arino服务器发送含有"?getBrightness"的GET请求,Arino接收到该请求后,就会读取传感器数据并返回给浏览器。同时getBrightness()函数会将id为brightness的div标签中的内容更新为返回的数据。

此外我们将A0引脚连接光敏模块,用于采集室内光线;D2引脚连接LED模块。
示例程序代码如下:

[C++] 纯文本查看 复制代码

/*
OpenJumper WebServer Example
[url=http://www.openjumper.com/ethernet/]http://www.openjumper.com/ethernet/[/url]

显示室内照度+开关灯控制
通过手机、平板、计算机等设备访问
Arino Server,就看到当前室内光线照度
在A0引脚连接光敏模块,用于采集室内光线;在2号引脚连接LED模块。

奈何col 2014.12.25
*/

#include <SPI.h>
#include <Ethernet.h>

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,1,177);
EthernetServer server(80);
EthernetClient client;
String readString="";
int Light=2;
int Sensor=A0;

void setup() {
Serial.begin(9600);
//初始化Ethernet通信
Ethernet.begin(mac, ip);
server.begin();
pinMode(Light,OUTPUT);
Serial.print("Server is at ");
Serial.println(Ethernet.localIP());
}

void loop() {
// 监听连入的客户端
client = server.available();
if (client) {
Serial.println("new client");
boolean currentLineIsBlank = false;
while (client.connected()) {
if (client.available()) {
char c = client.read();
readString += c;
if (c == '\n') {
Serial.println(readString);
//检查收到的信息中是否有”on”,有则开灯
if(readString.indexOf("?on") >0) {
digitalWrite(Light, HIGH);
Serial.println("Led On");
break;
}
//检查收到的信息中是否有”off”,有则关灯
if(readString.indexOf("?off") >0) {
digitalWrite(Light, LOW);
Serial.println("Led Off");
break;
}
//检查收到的信息中是否有”getBrightness”,有则读取光敏模拟值,并返回给浏览器
if(readString.indexOf("?getBrightness") >0) {
client.println(analogRead(Sensor));
break;
}
//发送HTML文本
SendHTML();
break;
}
}
}
delay(1);
client.stop();
Serial.println("client disonnected");
readString="";
}
}

// 用于输出HTML文本的函数
void SendHTML()
{
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println("Connection: close");
client.println();
client.println("<!DOCTYPE HTML>");
client.println("<html><head><meta charset=\"UTF-8\"><title>OpenJumper!Arino Web Server</title><script type=\"text/javascript\">");
client.println("function send2arino(){var xmlhttp;if (window.XMLHttpRequest)xmlhttp=new XMLHttpRequest();else xmlhttp=new ActiveXObject(\"Microsoft.XMLHTTP\");element=document.getElementById(\"light\");if (element.innerHTML.match(\"Turn on\")){element.innerHTML=\"Turn off\"; xmlhttp.open(\"GET\",\"?on\",true);}else{ element.innerHTML=\"Turn on\";xmlhttp.open(\"GET\",\"?off\",true); }xmlhttp.send();}");
client.println("function getBrightness(){var xmlhttp;if (window.XMLHttpRequest)xmlhttp=new XMLHttpRequest();else xmlhttp=new ActiveXObject(\"Microsoft.XMLHTTP\");xmlhttp.onreadystatechange=function(){if (xmlhttp.readyState==4 && xmlhttp.status==200)document.getElementById(\"brightness\").innerHTML=xmlhttp.responseText;};xmlhttp.open(\"GET\",\"?getBrightness\",true); xmlhttp.send();}window.setInterval(getBrightness,1000);</script>");
client.println("</head><body><div align=\"center\"><h1>Arino Web Server</h1><div>brightness:</div><div id=\"brightness\">");
client.println(analogRead(Sensor));
client.println("</div><button id=\"light\" type=\"button\" onclick=\"send2arino()\">Turn on</button><button type=\"button\" onclick=\"alert('OpenJumper Web Server')\">About</button></div></body></html>");
}

下载程序,并将你的Arino接入到局域网中。现在你就可以通过浏览器访问你的Arino了。页面的中的亮度数据,每秒回更新一次,还可以通过“Turn on”、“Turn off”按钮控制LED的开关。

需要注意的是Arino本身的存储空间有限,存放和输出网页信息会消耗掉很多空间,因此在以上示例程序中,尽量将client.println()输出的文本行数减少,可以节省一定的存储空间。
在Arino Ethernet控制器及扩展板上通常都带有SD卡槽,也可以尝试将网页数据放置在SD卡上,然后分段读取,并通过Ethernet输出,从而达到节省存储空间的目的。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
不吃惊!冇我符!初生之犊不畏虎。有靠山?勿乱估:未曾痛过不知苦!能解... 不识惊!冇我符!初生之犊不畏虎。 有靠山,勿乱估。未曾通过不知苦... ...不识惊!冇我符!初生之犊不畏虎。有靠山?勿乱估。末曾痛过不知苦... 不识惊!冇我符! 初生之犊不畏虎。 有靠山?勿乱估。 未曾痛过不知苦... ...有靠山?勿乱估。未曾痛过不知苦?猜生肖!答案加理由。 跪求各位大仙,算命准的帮帮我 各位大神,网友大哥。我今天抽了支签,第十四签,请各位帮忙解一下。谢谢... 跪求各位有懂的帮忙解一下这个签!!! 紫金所为什么这么牛气? 战争机器5中文配音怎么设置 溶,融,熔怎么区别? 这个LINUX设置系统quota说明里的 domain_name “域名” 是什么东西??? 给头发上一喷,就能让头发变色的那个正规名称叫什么? 求好听的女生二字网络名字 最好读mò字 第一个字是姓氏 请教高手该如何学习zigbee啊!! Linux关于quota的问题 生姜可以直接给头发上抹吗 gs8怎样连接手机远程 ady映画怎么放弃快播了? 而且图片不显示? linux命令quota一些小问题。。。 ZigBee如何构建树状网络,具体是怎样的? 女生两字的网名 我用影音嗅探专家查找下载网址,可是找到的地址不行,请高手指点一下吧 Linux 中设置的quota磁盘配额为什么不生效 怎样使用gs8远程启动 怎样组建zigbee多跳网络? Linux中使用quota将mail用户的邮箱大小设置为20M,警告值为10M。 女生2字网名,要有诗意,高贵的风格 ady印画为什么老片不能老了 一进去就是无法显示该页面 新片还可以看 为什么 怎样用iar搭建zigbee的开发环境 广汽传祺gs8tb0x手机远程控制 给头发上发膜没有电热帽怎么办? 怎么查看linux内核是否支持磁盘配额 怎么正确使用面扑洗脸 好听的二字~三字~四字女生网名 要唯美的 不要非主流或超拽的 给头发打蜡,是要先染了,还是黑色就直接上蜡, 洗脸扑的好处与坏处 LINUX安装quota时出现如图状况,怎么办? ZigBee组建的物联网系统结构是怎样的? 跪求王羽电影全部,【免费高清】在线观看百度网盘资源 带有女人2字的网名 手机远程控制器功能使用方法? 有谁会zigbee吗? linux磁盘配额,无法生成quota.gruop和quotao.user 文件,请大家帮帮 洗脸扑的正确使用方法 夏天在头发上涂什么防晒? 洗脸扑怎么用,一个洗脸扑能用多久? linux disk space quota run out怎么解决 ZigBee在室内和室外两个区域组网,墙厚1米混凝土,2.4GHz 几乎无法穿透。请问如何组网,可否用两个天线? 给头发上高光有什么技巧吗,总是不知道涂哪