Помогите с enc28j60 (метод Post)

Tucan_Iura
Offline
Зарегистрирован: 17.11.2013

как можно реализовать post-запрос на удаленный сервер (сайт)

MaksMS
Offline
Зарегистрирован: 11.03.2013

В примерах  EtherCard есть реализации,например пример твиттер.

Tucan_Iura
Offline
Зарегистрирован: 17.11.2013

попробую

Tucan_Iura
Offline
Зарегистрирован: 17.11.2013

Не как не получается, помогите плиз

com
Offline
Зарегистрирован: 06.09.2013

ок, давайте разбираться. так как я не знаю, что именно у вас не работает, а вы сами не говорите, то я буду задавать вопросы с самого начала, а вы просто отвечайте. так мы рано или поздно найдем ,что именно увас не работает.

итак, начнем.

Вопрос 1. Компьютер включен?

bolotin.denis
bolotin.denis аватар
Offline
Зарегистрирован: 15.09.2013

Помогите пожалуйста нужен кусок кода для отправки get запроса с помощью данного ethernet shield-а. И какую библиотеку использовать. Сколько ищю ничего не получается.

Tucan_Iura
Offline
Зарегистрирован: 17.11.2013

есть сайт, на нем есть 

  header('Content-Type: text/html; charset=utf-8');
    $date = date("d-m-Y H:i:s");
	$db_host = 'localhost';
    $db_username = 'mysql';
    $db_password = 'mysql';
    $db_name = 'home';
    $db_charset = 'utf8';
    $is_connected = @mysql_connect($db_host, $db_username, $db_password);
    $is_db_selected = $is_connected ? @mysql_select_db($db_name) : FALSE; 
    $errors = array();
	$query='SELECT * FROM `device` WHERE name="'.mysql_real_escape_string(trim($_POST['name'])).'"';
	$result=mysql_query($query);
	if(mysql_num_rows($result)>0)
	{ 
	$sql = 'UPDATE `device` SET 
		`status`="'.mysql_real_escape_string(trim($_POST['status'])).'",
		`date`="'.$date.'" WHERE `name`="'.mysql_real_escape_string(trim($_POST['name'])).'"';
                $result = mysql_query($sql); 
	}else
	{
		$sql = 'INSERT INTO `device` SET 
		`name`="'.mysql_real_escape_string(trim($_POST['name'])).'",
		`status`="'.mysql_real_escape_string(trim($_POST['status'])).'",
		`date`="'.$date.'"';
				$result = mysql_query($sql); 

надо запрос POST или GET 

name=device&status=1:0

Использую libraries EncEthernet или ETHER_28J60 или ethercard (есть - etherShield с подержкой enc28j60 = но пока не использовал) 

Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

В части GET и POSTзапросов - c браузером потренируйтесь для начала, а потом перенесете на шилд... Ну и, по-хорошему, прежде чем что-то совать в селект - надо бы проверить, что оно существует, отличается от нуля, и имеет разумную длину.

Tucan_Iura
Offline
Зарегистрирован: 17.11.2013

в браузере у меня все замечательно выходит а вот перенести не получается, а того и прошу помощь

Tucan_Iura
Offline
Зарегистрирован: 17.11.2013

Кто долго мучается тот находит решение

#include <EtherCard.h> 
#define REQUEST_RATE 30000  
static byte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 }; 
static byte myip[] = { 192,168,0,12 };  
static byte gwip[] = { 192,168,0,1 };   
char website[] PROGMEM = "192.168.0.9"; 
byte Ethernet::buffer[300];                     
static long timer; 

static void my_result_cb (byte status, word off, word len) { 
} 

void setup () 
{ 
  if (ether.begin(sizeof Ethernet::buffer, mymac,53) == 0) 
  ether.staticSetup(myip, gwip); 
  ether.hisip[0] = 192; ether.hisip[1] = 168; ether.hisip[2] = 0; ether.hisip[3] = 9; 
  ether.printIp("Server: ", ether.hisip); 
  timer = - REQUEST_RATE; // start timing out right away 
  ether.persistTcpConnection(false); 
} 

void loop () { 
  ether.packetLoop(ether.packetReceive()); 
  if (millis() > timer + REQUEST_RATE) 
  { 
    timer = millis(); 
    ether.browseUrl(PSTR("/index.php?name=device000"), "", website, my_result_cb); 
  } 
} 

 

bolotin.denis
bolotin.denis аватар
Offline
Зарегистрирован: 15.09.2013

Tucan_Iura спасибо, помогло. Юзал не ту либу.

 

pshtettt
Offline
Зарегистрирован: 23.05.2014

Есть enc28j60 как на картинке выше и arduino mega2560. Мне нужно получать ip по dhcp и передавать данные на сервер подскажите рабочую библиотеку и примеры 

Araris
Offline
Зарегистрирован: 09.11.2012
pshtettt
Offline
Зарегистрирован: 23.05.2014

http://www.lucadentella.it/en/category/enc28j60-arduino/ из этих примеров ничего не получается.

Нашел библиотеку UIPEthernet https://github.com/ntruchsess/arduino_uip с ней получаю по примеру web client адрес по dhcp (УРА!!!!). Но  с отправкой данных ничего не выходит (хотя в ходе эксперементов один раз отправил (но я поздно заметил и повтарить не удалось :(  )). Помогите!!! :(

 

pshtettt
Offline
Зарегистрирован: 23.05.2014

Хоть какое то продвижение :) шлет на сервер

#include <UIPEthernet.h>
EthernetClient client;
signed long next;
void setup() 
{
  Serial.begin(9600);
  uint8_t mac[6] = {0x00,0x01,0x02,0x03,0x04,0x05};
  Ethernet.begin(mac);
  Serial.print("localIP: ");
  Serial.println(Ethernet.localIP());
  Serial.print("subnetMask: ");
  Serial.println(Ethernet.subnetMask());
  Serial.print("gatewayIP: ");
  Serial.println(Ethernet.gatewayIP());
  Serial.print("dnsServerIP: ");
  Serial.println(Ethernet.dnsServerIP());
}
void loop() 
{
  delay(3000);
      if (client.connect(IPAddress(XX,XX,XX,XX),80))
        {
          char buf[80];
          Serial.println("Client connected");
           sprintf(buf, "GET /t.php?s=_____ST HTTP/1.0");
           /////////////////////////////////
           Serial.println(buf);
           delay(500);
           client.println(buf); // Отправляем GET запрос
           delay(100);
           client.println();
           delay(500);
           Serial.println("disconnecting.");
           client.stop(); // Завершаем соединение
        } 
        else 
        {
           Serial.println("connection failed");
        }
}

но теперь возник вопрос_ если отвалится соединение или выдернуть шнурок и воткнуть обратно то соединение не востановится и ip уже не получим. Какие есть предложения?

sonmax
Offline
Зарегистрирован: 30.06.2013

Не стал плодить новую тему.

столкнулся с такой неприятностью:

пример из библиотеки ethercard

// Demo using DHCP and DNS to perform a web client request.
// 2011-06-08 <jc@wippler.nl> http://opensource.org/licenses/mit-license.php

#include <EtherCard.h>

// ethernet interface mac address, must be unique on the LAN
static byte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 };

byte Ethernet::buffer[700];
static uint32_t timer;

char website[] PROGMEM = "www.google.com";

// called when the client request is complete
static void my_callback (byte status, word off, word len) {
  Serial.println(">>>");
  Ethernet::buffer[off+300] = 0;
  Serial.print((const char*) Ethernet::buffer + off);
  Serial.println("...");
}

void setup () {
  Serial.begin(57600);
  Serial.println("\n[webClient]");

  if (ether.begin(sizeof Ethernet::buffer, mymac) == 0) 
    Serial.println( "Failed to access Ethernet controller");
  if (!ether.dhcpSetup())
    Serial.println("DHCP failed");

  ether.printIp("IP:  ", ether.myip);
  ether.printIp("GW:  ", ether.gwip);  
  ether.printIp("DNS: ", ether.dnsip);  

  if (!ether.dnsLookup(website))
    Serial.println("DNS failed");
    
  ether.printIp("SRV: ", ether.hisip);
}

void loop () {
  ether.packetLoop(ether.packetReceive());
  
  if (millis() > timer) {
    timer = millis() + 5000;
    Serial.println();
    Serial.print("<<< REQ ");
    ether.browseUrl(PSTR("/foo/"), "bar", website, my_callback);
  }
}

подключаю

#include "nRF24L01.h"
#include "RF24.h"

начинает ругаеться на

ether.browseUrl(PSTR("/foo/"), "bar", website, my_callback);

пишет:  Arduino: 1.5.6-r2 (Windows XP), Board: "Arduino Mega or Mega 2560, ATmega2560 (Mega 2560)"
webClient.ino: In function 'void loop()':
webClient:49: error: invalid conversion from 'const char*' to 'prog_char*'
webClient:49: error: initializing argument 1 of 'static void EtherCard::browseUrl(prog_char*, const char*, prog_char*, void (*)(uint8_t, uint16_t, uint16_t))'

В проекте еще использую Stash::prepare для отправки данных на сервер. но как с помощью Stash:: получить данные пока не разобрался

кто-то сталкивался с такой проблемой?

sonmax
Offline
Зарегистрирован: 30.06.2013

Походу, чтобы дождаться ответа нужно новую тему создавать.

Теперь по делу, проблема возникает при использовании старых библиотек <EtherCard.h> и <RF24.h>. При установке новых, проблема исчезает, но засада в том, что с новыми ничего не работает.

Остановился на таком варианте, мож кому пригодится.

ether.browseUrl((char*)PSTR("/w4394_1.php"),( char*) "", website, my_result_cb);

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

sonmax, зачем на таком? Там же в сообщении компилятора ясно было написано в чём дело, чего огород городить? Зачем тройное преобразование типов?

sonmax
Offline
Зарегистрирован: 30.06.2013

По другому не получилось. Как надо было?

И второй вопрос, с помощью ф.Stash: можно с сайта данные получить? 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Sonmax, компилятор Вам сказал, что он ожидает в первом аргументе типа prog_char*, а у Вас там const и это его смутило. Вы же зачем-то оставили const, и присобачили к нему преобразование к (char *). Зачем дважды преобразовывать? Ощущение, что делалось это методом тыка по принципу "ой, кажется заработало". :)

sonmax
Offline
Зарегистрирован: 30.06.2013

Да, получилось методем тыка, т.к. знаний в этой части у меня маловато. Если не трудно, правильное решение какое?

sonmax
Offline
Зарегистрирован: 30.06.2013

B если уж дальше разбираться, то каким образом библа RF24 влияет на стороннюю EtherCard? 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

sonmax пишет:

Да, получилось методем тыка, т.к. знаний в этой части у меня маловато. Если не трудно, правильное решение какое?

Ну, вот смотрите, компилятор Вам сказал:

webClient:49: error: initializing argument 1 of 'static void EtherCard::browseUrl(prog_char*, const char*, prog_char*, void (*)(uint8_t, uint16_t, uint16_t))'

так и передавайте ему те типы, которых он требует:

ether.browseUrl((prog_char*)"/w4394_1.php", "", (prog_char*)website, my_result_cb);

В принципе, (prog_char*) перед website можно и убрать, но можно и оставить - хуже не будет.

При такой записи Ваша строка "/w4394_1.php" сразу преобразуется к типу (prog_char*), что и требуется. А так как у Вас написано, она сначала преобразется к PSTR, затем Вы указали преобразование к (char *), а затем компилятор таки преобразует его к (prog_char*), как ему собственно и надо. Т.е. происходит ТРИ преобразования вместо одного.

У меня нет этой библиотеки, потому попробовать не могу, но по смыслу сообщения компилятора должно быть так.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

sonmax пишет:

B если уж дальше разбираться, то каким образом библа RF24 влияет на стороннюю EtherCard? 

Влиять может как угодно (по типам передралась или по константам, у меня её нет и посмотреть не могу).

Пожалуйста, не употребляйте выражений типа "библа", "прога", "либа", "сервак" и т.п. при обращении ко мне. Это жаргон малолеток из ФИДО - уши режет.

sonmax
Offline
Зарегистрирован: 30.06.2013

Спасибо, компилируется вроде без ошибок, но на железе только вечером попробую. т.к., так же пробовал убирать PSTR:  ether.browseUrl(("/w4394_1.php"), "", website, my_result_cb);

и ошибок не было, но ethernet не поднялся.

P.S.

не очень понял про малолеток, FidoNet вроде как с середины 80х существует. Хотя в 90-е это было бы про меня. И для меня это не жаргон, а просто сокращение- "библ-ой". И конечно же я это учту при общении с Вами, спасибо.

 

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

В любом случае (если не поднимется) тройное преобразование - не выход.

Надо смотреть что такое "prog_char" - этот тип определяется в файле arduino-1.6.5-r2\hardware\tools\avr\avr\include\avr\pgmspace.h и кстати, там много комментариев про него - почитайте. поймёте почему не работает с новыми версиями.

sonmax
Offline
Зарегистрирован: 30.06.2013

Спасибо, большое.

sonmax
Offline
Зарегистрирован: 30.06.2013

Почти сразу же наткнулся на такую строчку

#include <avr/pgmspace.h>

В примере, который я привел, ее не было.

и вот с ней исходный код

ether.browseUrl(PSTR("/foo/"), "bar", website, my_callback);

компилируется нормально.

Кстати, мне она уже попадалась ранее в каких-то примерах, но я не придал ей значение.

 

Serega_mexanik
Offline
Зарегистрирован: 21.12.2014

как ардуине работать с ftp сервером ?

Сразу наткнулся на грабли

есть старый ftp сервер. ftp.tratata.com.ua, при входе просит пароль и логинб как ему это выдать ???

плюс при подключениии мой адрес сервера скорее всего измениться на что-то типа ftp://admin@ftp.tratata.com.ua

как соедениться с ftp ?

VaDoSiQ
VaDoSiQ аватар
Offline
Зарегистрирован: 19.01.2017

Andrey_Y_Ostanovsky пишет:

Ну и, по-хорошему, прежде чем что-то совать в селект - надо бы проверить, что оно существует, отличается от нуля, и имеет разумную длину.

Вы о переменных говорите?

СовсемЗелёный
Offline
Зарегистрирован: 06.10.2021

Насколько я понял, надо руками ip расписать для ардуинки, так?
и не подскажите ли, как отправить запрос такого вида?
http://*пользователь*:*Пароль*@192.168.1.105/cgi-bin/ptz.cgi?action=start&channel=0&code=GotoPreset&arg1=0&arg2=7&arg3=0

СовсемЗелёный
Offline
Зарегистрирован: 06.10.2021

Есть такой вопрос, у меня поему-то по dhcp не хочет получать ip, есть предположение почему так может быть? уже долго голову ломаю, или может к enc28j60 не подходит этот код. Только не бейте, если что, совсем зелёный всё-таки :D

СовсемЗелёный
Offline
Зарегистрирован: 06.10.2021

Господа, есть такой вопрос каким образом можно отправить запрос такого вида? http://логин:пароль@192.168.54.102/cgi-bin/ptz.cgi?action=start&channel=0&code=GotoPreset&arg1=0&arg2=7&arg3=0

VaDoSiQ
VaDoSiQ аватар
Offline
Зарегистрирован: 19.01.2017
СовсемЗелёный
Offline
Зарегистрирован: 06.10.2021

Честно сказать, не помогло, не очень понимаю, какие библиотеки нужны для этого и как это использовать