[En-Nut-Discussion] NutTcpConnect error on GPRS Connection (MC35i)
paolo
pbisiac at inwind.it
Sat May 27 10:54:35 CEST 2006
Hi all,
I experimented a while with GPRS connection, using uart1 to connect my
Ethernut 1.3 to a Motorola G18 Modem. After many trials, choosing the
right Italian operator (Vodafone) leaded to a succesful PPP connection
and I could connect to a server (www.google.com on port 80) and open a
socket/ask for a page.
Now I changed my GPRS modem to Siemens MC35i: the modem seems to raise
up PPP link correctly, I can access my DNS server to resolve google, but
then I get error when I try to open a socket to server with instruction
NutTcpConnect.
This is my log:
Wake UP...OK.
Connecting...done.
Configure PPP...
[LCP-LOWERUP]
PPP<(20)[LCP-001(16)][CONFREQ][OPT(12)][ACCM=0x000A0000][MAGIC=0x7956341
2]
PPP>(29)[LCP-003(25)][CONFREQ][OPT(21)][ACCM=0x000A0000][PCOMP][ACOMP][M
AGIC=0x3
C8523FA][AUTH=0xC223]
PPP<(12)[LCP-003(8)][CONFNAK][OPT(4)][AUTH=0xC023]
PPP>(20)[LCP-001(16)][CONFACK][OPT(12)][ACCM=0x000A0000][MAGIC=0x7956341
2]
PPP>(28)[LCP-005(24)][CONFREQ][OPT(20)][ACCM=0x000A0000][PCOMP][ACOMP][M
AGIC=0x3
C8523FA][AUTH=0xC023]
PPP<(28)[LCP-005(24)][CONFACK][OPT(20)][ACCM=0x000A0000][PCOMP][ACOMP][M
AGIC=0x3
C8523FA][AUTH=0xC023]
PPP<(10)[PAP-003(6)][CONFREQ][OPT(2)]
PPP>(9)[PAP-003(5)][CONFACK]
[IPCP-LOWERUP]
PPP<(26)[IPCP-004(22)][CONFREQ][OPT(18)][ADDR=0.0.0.0][DNS1=0.0.0.0][DNS
2=0.0.0.
0]
PPP>(14)[IPCP-001(10)][CONFREQ][OPT(6)][ADDR=192.168.254.254]
PPP<(14)[IPCP-001(10)][CONFACK][OPT(6)][ADDR=192.168.254.254]
PPP<(26)[IPCP-004(22)][CONFREQ][OPT(18)][ADDR=0.0.0.0][DNS1=0.0.0.0][DNS
2=0.0.0.
0]
PPP>(14)[IPCP-004(10)][CONFREJ][OPT(6)][DNS2=0.0.0.0]
PPP<(20)[IPCP-005(16)][CONFREQ][OPT(12)][ADDR=0.0.0.0][DNS1=0.0.0.0]
PPP>(20)[IPCP-005(16)][CONFNAK][OPT(12)][ADDR=10.145.66.89][DNS1=83.224.
65.134]
PPP<(20)[IPCP-006(16)][CONFREQ][OPT(12)][ADDR=10.145.66.89][DNS1=83.224.
65.134]
PPP>(20)[IPCP-006(16)][CONFACK][OPT(12)][ADDR=10.145.66.89][DNS1=83.224.
65.134]
done
Local IP: 10.145.66.89
Remote IP: 192.168.254.254
Primary DNS: 83.224.65.134
Secondary DNS: 0.0.0.0
NutIpRouteAdd restituisce 0
call NutDnsGetHostByName to resolve www.google.com
PPP<(64)
PPP>(308)OK: il server www.google.com E' disponibile!
Connecting 66.249.93.99:80
PPP<(48)
PPP<(48)
PPP<(48)
PPP<(48)
PPP<(48)
PPP<(48)
PPP<(48)
PPP<(48)
PPP<(48)Bad news, www.google.com refuses the connection.(error 10060)
Disconnecting 66.249.93.99:80
I enclose my source code, wich is a mix between pppc.c and inetq.c
examples:
*!
* \example pppc/pppc.c
*
* PPP client. Similar to the TCP server sample, but uses PPP over
RS232.
*
* The default settings in this sample may be used to connect to a RAS
* server of a Windows PC. When adding a similar modem script, it will
* also work with a Linux PC nearly out of the box. At least you need
* to change the PPPUSER and PPPPASS.
*
* \bug This sample works with ICCAVR (6.28 tested) only with debugging
* enabled.
*
* \bug Not working with ATmega103. Debug output needs to be removed.
*/
#define INETSERVER "www.google.com"
#define INETSERVERPORT 80
/*
* The Nut/OS modem chat utility works similar to the the UNIX
* chat script. This one is used to connect to a Windows PC
* using a direct cable.
*/
#define PPPCHAT "TIMEOUT 15 '' AT OK AT&D2 OK
AT+CGDCONT=1,\"IP\",\"web.omnitel.it\" OK ATD*98# CONNECT"
/*
* PPP device settings.
*/
#define PPPDEV devAhdlc1 /* Use HDLC driver. */
//#define PPPDEV devUart1 /* Use standard UART driver. */
#define PPPCOM "uart1" /* Physical device name. */
#define PPPSPEED 57600 /* Baudrate. */
#define PPPRXTO 1000 /* Character receive timeout. */
/*
* Server input buffer size.
*/
#define RXBUFFSIZE 8192
#include <cfg/os.h>
#include <dev/debug.h>
//#include <dev/hd44780.h>
#include <dev/ahdlcavr.h>
#include <dev/uartavr.h>
#include <dev/ppp.h>
#include <dev/chat.h>
#include <sys/version.h>
#include <sys/heap.h>
#include <sys/thread.h>
#include <sys/timer.h>
#include <sys/event.h>
#include <sys/socket.h>
#include <dev/board.h>
#include "pppc.h"
#include <sys/timer.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <net/if_var.h>
#include <net/route.h>
#ifdef NUTDEBUG
#include <net/netdebug.h>
#endif
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <io.h>
#include <fcntl.h>
#if defined(__IMAGECRAFT__)
#define CC_STRING "ICCAVR"
#elif defined(__GNUC__)
#define CC_STRING "AVRGCC"
#else
#define CC_STRING "Compiler unknown"
#endif
/*
* Debug output device settings.
*/
#ifdef __AVR_ENHANCED__
//#define DBGDEV devAhdlc0
#define DBGDEV devDebug0 /* Use debug driver. */
//#define DBGDEV devUart0 /* Use standard UART driver. */
#define DBGCOM "uart0" /* Device name. */
#define DBGSPEED 57600 /* Baudrate. */
#endif
/*
* PPP client application entry.
*/
int main(void)
{
int pppcom;
PPPDCB *dcb;
u_long lctl;
int rc;
int i;
int PPP_loop;
// Variabili per il dialogo HTTP
TCPSOCKET *sock;
u_long rip;
FILE *stream;
/*
* Register our devices.
*/
#ifdef __AVR_ENHANCED__
NutRegisterDevice(&DBGDEV, 0, 0); // devUart0 ovvero devDebug0
#endif
NutRegisterDevice(&PPPDEV, 0, 0); // devUart1 ovvero devAhdlc1
NutRegisterDevice(&devPpp, 0, 0); // devPpp e' il nome del device
implementato da dev\ppp.h
/*
* Open debug device for standard output.
*/
if(freopen(DBGCOM, "w", stdout) == 0) {
for(;;);
}
/*
* Set debug output speed.
*/
#ifdef __AVR_ENHANCED__
lctl = DBGSPEED;
_ioctl(_fileno(stdout), UART_SETSPEED, &lctl);
#endif
/*
* Open PPP device. Specify physical device, user and password.
* pppcom = _open("ppp:uart0/user/passwd", _O_RDWR | _O_BINARY);
*/
printf("Open uart...");
/* GPRS: apro ppp senza usernane e password */
if ((pppcom = _open("ppp:" PPPCOM "/" "/", _O_RDWR | _O_BINARY)) ==
-1) {
printf("Failed to open " PPPCOM "\n");
for (;;);
}
puts("done");
/*
* Set PPP line speed.
*/
lctl = PPPSPEED;
_ioctl(pppcom, UART_SETSPEED, &lctl);
/*
* The PPP driver doesn't set any receive timeout, but
* may require it.
*/
lctl = PPPRXTO;
_ioctl(pppcom, UART_SETREADTIMEOUT, &lctl);
#ifdef NUTDEBUG
/*
* Optionally enable PPP trace.
*/
NutTracePPP(stdout, 1); // 1: tracing enabled
// NutTraceTcp(stdout, 1);
// NutTraceOs(stdout, 0);
// NutTraceHeap(stdout, 0);
// NutTracePPP(stdout, 0);
#endif
/*
* TODO This delay may be removed. It is quite helpful during
development.
*/
NutSleep(1000);
/*
* PPP connection loop.
*/
PPP_loop = 1;
while (PPP_loop == 1)
{
/*
* Connect using a chat script. We may also set any
* required hardware handshake line at this stage.
*/
printf("Connecting...");
if ((rc = NutChat(pppcom, PPPCHAT)) != 0) {
printf("no connect, reason = %d\n", rc);
continue;
}
puts("done.\r\n");
/*
* We are connected, configure our PPP network interface.
* This will initiate the PPP configuration negotiation
* and authentication with the server.
*/
printf("Configure PPP...");
rc = NutNetIfConfig("ppp", 0, 0, 0);
if (rc != 0) {
puts("failed");
continue;
/*
* Optionally toggle DTR to hang up the modem.
*/
continue;
}
puts("done");
/*
* Set name server and default route. Actually the PPP interface
* should do this, but the current release doesn't.
*/
dcb = devPpp.dev_dcb;
NutDnsConfig2(0, 0, dcb->dcb_ip_dns1, dcb->dcb_ip_dns2);
i = NutIpRouteAdd(0, 0, dcb->dcb_remote_ip, &devPpp);
/*
* Display our IP settings.
*/
printf(" Local IP: %s\n", inet_ntoa(dcb->dcb_local_ip));
printf(" Remote IP: %s\n", inet_ntoa(dcb->dcb_remote_ip));
printf(" Primary DNS: %s\n", inet_ntoa(dcb->dcb_ip_dns1));
printf("Secondary DNS: %s\n", inet_ntoa(dcb->dcb_ip_dns2));
printf("NutIpRouteAdd restituisce %d\n", i);
/*
* Resolve hostname using DNS. (vedi esempio inetq.c)
*/
printf("chiamo NutDnsGetHostByName per risolvere %s\n", INETSERVER);
i = -1;
if ((rip = NutDnsGetHostByName(INETSERVER)) != 0) {
printf("OK: il server %s E' disponibile!\n",
INETSERVER);
i = 0;
}
else
printf("ERROR: il server %s non e' disponibile!\n",
INETSERVER);
if (i == 0)
{
/*
* Now let's use native calls.
*/
if ((sock = NutTcpCreateSocket()) != 0) {
/*
* Connect a HTTP server in the Internet.
*/
printf("Connecting %s:%u\r\n", inet_ntoa(rip), INETSERVERPORT);
if (NutTcpConnect(sock, rip, INETSERVERPORT) ==
0)
{
printf("OK, %s connected.\r\nAssign stream...\r\n",
INETSERVER);
/*
* Assign a stream to our connected socket.
*/
if ((stream = _fdopen((int) sock, "r+b")) != 0)
{
for (;;)
{
NutSleep(100);
}
fclose(stream);
}
else
{
printf("Creating stream device
failed\n");
}
}
else
{
i = NutTcpError(sock);
printf("Bad news, %s refuses the connection.(error %d)\n", INETSERVER,
i);
}
printf("Disconnecting %s:%u\n", inet_ntoa(rip),
INETSERVERPORT);
NutTcpCloseSocket(sock);
} else printf ("Socket creation failed !\n");
} risolto
NutSleep(5000);
PPP_loop = 0;
} // while (PPP_loop == 1)
printf("END PROGRAM.\n");
for (;;)
NutSleep(1000);
}
Can anybody help me ?
Best regards,
Paolo
More information about the En-Nut-Discussion
mailing list