UDP Client
- Войдите на сайт для отправки комментариев
Всем привет.
Помогите скетч отредактировать.
Задча подключаться к серверу и слать данные.
Но столкнулся с проблемой, работает только в сети где есть шлюз и днс.
А необходимо запустить работу в сети без днс и шлюза.
Помогите с кодом.
#include <EtherCard.h>
static byte mymac[] = { 0xAA,0x2B,0x3C,0x4D,0x5E,0x6F };
static byte myip[] = { 192,168,0,157 };
static byte gwip[] = { 192,168,0,7 };
static byte hisip[] = { 192,168,0,7 };
byte Ethernet::buffer[700];
static uint32_t timer;
const char website[] PROGMEM = "192.168.0.127"; //Адрес куда шлем
const int dstPort PROGMEM = 12345; //Порт куда шлем
const int srcPort PROGMEM = 4321; //Порт устройства
void setup () {
Serial.begin(9600);
if (ether.begin(sizeof Ethernet::buffer, mymac) == 0)
Serial.println( "Failed to access Ethernet controller");
ether.staticSetup(myip, gwip, hisip);
// 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);
}
char textToSend[] = "127480"; //Текст сообщения
void loop () {
if (millis() > timer) {
timer = millis() + 100;
//static void sendUdp (char *data,uint8_t len,uint16_t sport, uint8_t *dip, uint16_t dport);
ether.sendUdp(textToSend, sizeof(textToSend), srcPort, ether.hisip, dstPort );
}
}
Свой IP в качестве DNS и GW ставили?
Ставил. Все останавливается сразу.
Исходя из примеров библиотеки - вообще нет нужды указывать DNS/netmask и, возможно что GW тоже: ether.staticSetup(myip, gwip);
Пробовал и так. Тоже все колом встаёт.
Изначальная задача была создать tcp socet client, неделю гуглил и пришёл к выводу что это довольно хлопотно. С udp client все гораздо проще оказалось. Но он каким-то образом связан с dhcp судя по всему, надо как то от учить.
Попытайте UIPEthernet, в ней конструктор прямо под описанную задачу: void begin(const uint8_t* mac, IPAddress ip);
https://github.com/UIPEthernet/UIPEthernet/blob/master/examples/UdpClien...
Спасибо, завтра глянул обязательно, на работе все у меня лежит. Отпишу что да как.
Вроде сдвинулось с места.
Неделю не мог этот компонент приклеить, а седня сразу встал.
Ткните носом где тут статику прописать.
Сейчас работаетна автомате, и получает адрес формата IPv6.
Мне по сути надо только IP и шлюз чтобы был.
И в Serial ни че не шлет.
#if defined(__MBED__) #include <mbed.h> #include "mbed/millis.h" #define delay(x) wait_ms(x) #define PROGMEM #include "mbed/Print.h" #endif #include <UIPEthernet.h> #include "utility/logging.h" EthernetClient client; unsigned long next; #if defined(ARDUINO) void setup() { #endif #if defined(__MBED__) int main() { #endif #if ACTLOGLEVEL>LOG_NONE #if defined(ARDUINO) LogObject.begin(9600); #endif #if defined(__MBED__) Serial LogObject(SERIAL_TX,SERIAL_RX); #endif #endif uint8_t mac[6] = {0x00,0x01,0x02,0x03,0x04,0x05}; Ethernet.begin(mac); //Configure IP address via DHCP #if ACTLOGLEVEL>=LOG_INFO LogObject.uart_send_str(F("localIP: ")); #if defined(ARDUINO) LogObject.println(Ethernet.localIP()); #endif #if defined(__MBED__) LogObject.printf("%d.%d.%d.%d",Ethernet.localIP()[0],Ethernet.localIP()[1],Ethernet.localIP()[2],Ethernet.localIP()[3]); #endif LogObject.uart_send_str(F("subnetMask: ")); #if defined(ARDUINO) LogObject.println(Ethernet.subnetMask()); #endif #if defined(__MBED__) LogObject.printf("%d.%d.%d.%d",Ethernet.subnetMask()[0],Ethernet.subnetMask()[1],Ethernet.subnetMask()[2],Ethernet.subnetMask()[3]); #endif LogObject.uart_send_str(F("gatewayIP: ")); #if defined(ARDUINO) LogObject.println(Ethernet.gatewayIP()); #endif #if defined(__MBED__) LogObject.printf("%d.%d.%d.%d",Ethernet.gatewayIP()[0],Ethernet.gatewayIP()[1],Ethernet.gatewayIP()[2],Ethernet.gatewayIP()[3]); #endif LogObject.uart_send_str(F("dnsServerIP: ")); #if defined(ARDUINO) LogObject.println(Ethernet.dnsServerIP()); #endif #if defined(__MBED__) LogObject.printf("%d.%d.%d.%d",Ethernet.dnsServerIP()[0],Ethernet.dnsServerIP()[1],Ethernet.dnsServerIP()[2],Ethernet.dnsServerIP()[3]); #endif #endif next = 0; #if defined(ARDUINO) } void loop() { #endif #if defined(__MBED__) while(true) { #endif if (((signed long)(millis() - next)) > 0) { next = millis() + 500; #if ACTLOGLEVEL>=LOG_INFO LogObject.uart_send_strln(F("Client connect")); #endif // replace hostname with name of machine running tcpserver.pl // if (client.connect("server.local",5000)) if (client.connect(IPAddress(192,168,0,127),12345)) { #if ACTLOGLEVEL>=LOG_INFO LogObject.uart_send_strln(F("Client connected")); #endif client.println(F("DATA from Client")); int size; while ((client.available()==0) && (millis()<next)) { #if defined(ESP8266) wdt_reset(); #endif } while((size = client.available()) > 0) { uint8_t* msg = (uint8_t*)malloc(size+1); memset(msg, 0, size+1); size = client.read(msg,size); #if ACTLOGLEVEL>=LOG_INFO #if defined(ARDUINO) LogObject.write(msg,size); #endif #if defined(__MBED__) LogObject.uart_send_str(msg); #endif #endif free(msg); } //disconnect client #if ACTLOGLEVEL>=LOG_INFO LogObject.uart_send_strln(F("Client disconnect")); #endif client.stop(); } else { #if ACTLOGLEVEL>=LOG_INFO LogObject.uart_send_strln(F("Client connect failed")); #endif } } } #if defined(__MBED__) } #endifhttp://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukommentarii
Спасибо.
Вам придется перестать гнать лошадей.
Коммуникации на Arduino - не самая простая тема, а с ENC28J60 она, зачастую, приобретает мистический оттенок. Как правило - подход "накидать проводов и закомпилить любой скетч с интернета" не прокатывает. Писать за кого-то или исправлять куски кода, которые сюда вбрасывают, мне лично не интересно.
Я не зря потратил некоторое время и нашел пример для библиотеки (см. сообщение #5), в котором сеть инициализируется нужным вам способом в Ethernet.begin(...)
Насчет Serial подсказку вам даст этот фрагмент:
#if ACTLOGLEVEL>LOG_NONE <<<< смотреть сюда#if defined(ARDUINO)LogObject.begin(9600);#endifСпасибо. Я начинающий, модно сказать только осваиваю.