#c #arduino
#c #arduino
Вопрос:
В коде есть библиотека, которая помогает получить динамический IP-адрес без необходимости его установки.. Но проблема в том, что они не указывают, как правильно его использовать, и я не знаю, как это исправить, потому что я новичок в arduino и C..
Вероятно, это будет глупый вопрос.
Источник кода находится в книге под названием: «Кулинарная книга Arduino»
Вот та часть, где я пытался и следовал:
15.2 Obtaining Your IP Address Automatically
Problem
The IP adress you use for the Ethernet shield must be unique on your network and you would like this to be allocated automatically. You want the Ethernet shield to obtain an IP adress from a DHCP server.
Solution
This is the sketch from Recipe 15.1 with the bolded lines added to use the DHCP library:
#if ARDUINO > 18
#include <SPI.h> // needed for Arduino versions later than 0018
#endif
#include <Ethernet.h>
#include "Dhcp.h" // add this for the DHCP library
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
// IP addressing lines removed
byte server[] = { 209,85,229,104 }; // Google
Client client(server, 80);
void setup()
{
Serial.begin(9600);
if(Dhcp.beginWithDHCP(mac) == 1) // begin method returns 1 if successful
{
Serial.println("got IP address, connecting...");
delay(5000);
}
else
{
Serial.println("unable to acquire ip address!");
while(true)
; // do nothing
}
if (client.connect()) {
Serial.println("connected");
client.println("GET /search?q=arduino HTTP/1.0");
client.println();
} else {
Serial.println("connection failed");
}
}
void loop()
{
if (client.available()) {
char c = client.read();
Serial.print(c);
}
if (!client.connected()) {
Serial.println();
Serial.println("disconnecting.");
client.stop();
for(;;)
;
}
}
«Если вы хотите увидеть значения, возвращаемые с DHCP-сервера, на последовательном мониторе, используйте следующую функцию настройки:»
void setup()
{
Serial.begin(9600);
if(Dhcp.beginWithDHCP(mac) == 1) // begin method returns 1 if successful
{
byte buffer[6];
Serial.println("ip acquired...");
// show the values returned from the DHCP server
Dhcp.getLocalIp(buffer);
Serial.print("ip address: ");
printArray(amp;Serial, ".", buffer, 4, 10);
Dhcp.getSubnetMask(buffer);
Serial.print("subnet mask: ");
printArray(amp;Serial, ".", buffer, 4, 10);
Dhcp.getGatewayIp(buffer);
Serial.print("gateway ip: ");
printArray(amp;Serial, ".", buffer, 4, 10);
Dhcp.getDhcpServerIp(buffer);
Serial.print("dhcp server ip: ");
printArray(amp;Serial, ".", buffer, 4, 10);
Dhcp.getDnsServerIp(buffer);
Serial.print("dns server ip: ");
printArray(amp;Serial, ".", buffer, 4, 10);
delay(5000);
}
else
{
Serial.println("unable to acquire ip address!");
while(true)
; // do nothing
}
if (client.connect()) {
Serial.println("connected");
client.println("GET /search?q=arduino HTTP/1.0");
client.println();
} else {
Serial.println("connection failed");
}
}
Это инструкция, которую я получаю на веб-сайте, содержащем библиотеку:
- Добавьте «#include»Dhcp.h» в начало вашего эскиза Arduino.
- Объявите переменную типа Dhcp (например, «Dhcp dhcp;»).
- Вызовите метод beginWithDHCP(), указав ему MAC-адрес.
Для получения полного содержимого вы можете использовать эту ссылку: LINK
PS: The download file is the latest version (v0.4)
This is the code:
#include <SPI.h>
#include <Ethernet.h>
#include "Dhcp.h"
#include <string.h>
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte server[] = { 209,85,229,104 };
EthernetClient client(80);
const int ledPin = 9;
String readString = String(30);
int status = 0;
void setup(){
Serial.begin(9600);
if(Dhcp.beginWithDHCP(mac) == 1){
Serial.println("got IP address, connecting...");
byte buffer[6];
Serial.println("ip acquired...");
// show the values returned from the DHCP server
Dhcp.getLocalIp(buffer);
Serial.print("ip address: ");
printArray(amp;Serial, ".", buffer, 4, 10);
Dhcp.getSubnetMask(buffer);
Serial.print("subnet mask: ");
printArray(amp;Serial, ".", buffer, 4, 10);
Dhcp.getGatewayIp(buffer);
Serial.print("gateway ip: ");
printArray(amp;Serial, ".", buffer, 4, 10);
Dhcp.getDhcpServerIp(buffer);
Serial.print("dhcp server ip: ");
printArray(amp;Serial, ".", buffer, 4, 10);
Dhcp.getDnsServerIp(buffer);
Serial.print("dns server ip: ");
printArray(amp;Serial, ".", buffer, 4, 10);
delay(5000);
} else {
Serial.println("unable to acquire ip address!");
while(true)
}
if (client.connect()) {
Serial.println("connected");
client.println("GET /search?q=arduino HTTP/1.0");
client.println();
} else {
Serial.println("connection failed");
}
Ethernet.begin(mac, ip, gateway, subnet);
server.begin();
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, LOW);
}
void loop(){
if (client.available()) {
char c = client.read();
Serial.print(c);
}
if (!client.connected()) {
Serial.println();
Serial.println("disconnecting.");
client.stop();
for(;;)
;
}
EthernetClient client = server.available();
if (client) {
while (client.connected()) {
if (client.available()) {
char c = client.read();
if (readString.length() < 100)
{
readString = c; // "readstring" VAI RECEBER OS CARACTERES LIDO
}
if (c == 'n') { //SE ENCONTRAR "n" É O FINAL DO CABEÇALHO DA REQUISIÇÃO HTTP
if (readString.indexOf("?") <0){ //SE ENCONTRAR O CARACTER "?", FAZ
}
else //SENÃO,FAZ
if(readString.indexOf("ledParam=1") >0)
{
digitalWrite(ledPin, HIGH);
status = 1;
}else{ //SENÃO, FAZ
digitalWrite(ledPin, LOW);
status = 0;
}
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println("");
client.println("<!DOCTYPE HTML>");
client.println("<html>");
client.println("<head>");
client.println("<link rel='icon' type='image/png' href='http://blogmasterwalkershop.com.br/arquivos/artigos/sub_wifi/logo_mws.png'/>");
client.println("<title>Led por Net</title>");
client.println("</head>");
client.println("<body style=background-color:#ADD8E6>");
client.println("<center><font color='blue'><h1>Test</font></center></h1>");
client.println("<h1><center>CONTROLE DE LED</center></h1>");
if (status == 1){
client.println("<center><form method=get name=LED><input type=hidden name=ledParam value=0 /><input type=submit value=APAGAR></form></center>");
}else{
client.println("<center><form method=get name=LED><input type=hidden name=ledParam value=1 /><input type=submit value=ACENDER></form></center>");
}
client.println("<center><font size='5'>Status atual do LED: </center>");
if (status == 1){
client.println("<center><font color='green' size='5'>LIGADO</center>");
}else{ //SENÃO, FAZ
client.println("<center><font color='red' size='5'>DESLIGADO</center>");
}
client.println("<hr/>");
client.println("<hr/>");
client.println("</body>");
client.println("</html>");
readString=""; //A VARIÁVEL É REINICIALIZADA
client.stop();
}
}
}
}
}
void printArray(Print *output, char* delimeter, byte* data, int len, int base){
char buf[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
for(int i = 0; i < len; i ){
if(i != 0)
output->print(delimeter);
output->print(itoa(data[i], buf, base));
}
output->println();
}
Проблема с ошибкой:
/*
In function 'void loop()':
Rede_VPN:70:34: error: request for member 'available' in 'server', which is of non-class type 'byte [4] {aka unsigned char [4]}'
EthernetClient client = server.available();
^
exit status 1
request for member 'beginWithDHCP' in 'Dhcp', which is of non-class type 'word {aka unsigned int}'
*/
Извините за мой плохой английский.. Im BR
ОТРЕДАКТИРОВАНО:
Я нахожу некоторый код от разработчика DHCP и все же сталкиваюсь с той же проблемой.. Dhcp не был объявлен в его коде.
#include <Ethernet.h>
#include "Dhcp.h"
#include <string.h>
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte server[] = { 64, 233, 187, 99 }; // Google
boolean ipAcquired = false;
Client client(server, 80);
void setup()
{
Serial.begin(9600);
Serial.println("getting ip...");
int result = Dhcp.beginWithDHCP(mac);
if(result == 1)
{
ipAcquired = true;
byte buffer[6];
Serial.println("ip acquired...");
Dhcp.getMacAddress(buffer);
Serial.print("mac address: ");
printArray(amp;Serial, ":", buffer, 6, 16);
Dhcp.getLocalIp(buffer);
Serial.print("ip address: ");
printArray(amp;Serial, ".", buffer, 4, 10);
Dhcp.getSubnetMask(buffer);
Serial.print("subnet mask: ");
printArray(amp;Serial, ".", buffer, 4, 10);
Dhcp.getGatewayIp(buffer);
Serial.print("gateway ip: ");
printArray(amp;Serial, ".", buffer, 4, 10);
Dhcp.getDhcpServerIp(buffer);
Serial.print("dhcp server ip: ");
printArray(amp;Serial, ".", buffer, 4, 10);
Dhcp.getDnsServerIp(buffer);
Serial.print("dns server ip: ");
printArray(amp;Serial, ".", buffer, 4, 10);
delay(3000);
Serial.println("connecting...");
if (client.connect()) {
Serial.println("connected");
client.println("GET /search?q=arduino HTTP/1.0");
client.println();
} else {
Serial.println("connection failed");
}
}
else
Serial.println("unable to acquire ip address...");
}
void printArray(Print *output, char* delimeter, byte* data, int len, int base)
{
char buf[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
for(int i = 0; i < len; i )
{
if(i != 0)
output->print(delimeter);
output->print(itoa(data[i], buf, base));
}
output->println();
}
void loop()
{
if(ipAcquired)
{
if (client.available()) {
char c = client.read();
Serial.print(c);
}
if (!client.connected()) {
Serial.println();
Serial.println("disconnecting.");
client.stop();
spinForever();
}
}
else
spinForever();
}
void spinForever()
{
for(;;)
;
}
Я думаю, что код Arduino получил некоторые изменения, которые делают недействительной эту библиотеку, и я не думаю, что смогу это исправить..
Это было создано в 2009 году.
Комментарии:
1. Вам следует связаться с автором библиотеки и спросить его . Не мы. Прямо на этой странице есть ссылка для контакта.
2. «Объявите переменную типа Dhcp (например, «Dhcp Dhcp;»)». Но вы этого не сделали. Почему бы и нет?
3.
server.available();
Что это должно делать?server
является массивомbyte
. Хотя эта ошибка возникает из кода, который вы нам даже не показали.4. @LightnessRacesinOrbit Хорошо .. я следую инструкциям в книге под названием «Кулинарная книга Arduino». Код — это просто копия, и я знаю, что он не объявляет переменную с именем Dhcp, и по этой причине возникает проблема. Я просто попробовал несколько способов исправить это, но не могу найти, как это сделать.
5. Но вы не следовали инструкции. В инструкции указано объявить переменную. Вы этого не делали. Вы можете прочитать о том, как объявить переменную в своей книге по C .