Modeemi-nettiongelma

Moi, seuraavalla koodilla saan jotain onnistumaan, mutta sitten alkaa tökkiä.
Keksiikö joku heti vian koodista?

EDIT: Taitaa olla parempi kokeilla ftp-siirtoa, vinkkejä siihen?

AT+CREG?
AT+CREG?
AT+CGSOCKCONT=1,“193.229.9.132”,“www.kolumbus.fi”
AT+CSOCKAUTH=1,1,“w454921”,“salasanani”
AT+CHTTPACT="",21
Error waiting the request
AT+CHTTPACT="",21
Error waiting the request

/*
 *  Description: This example shows how to do a GET method. So the buffer of 
 *  is limited, we recommend to use the GET method with short answer for the
 *  requested webs. 
 *  This example shows the AT commands (and the answers of the module) used
 *  to work with HTTP. For more information about the AT commands, 
 *  refer to the AT command manual.
 *
 *  Copyright (C) 2013 Libelium Comunicaciones Distribuidas S.L.
 *  http://www.libelium.com
 *
 *  This program is free software: you can redistribute it and/or modify 
 *  it under the terms of the GNU General Public License as published by 
 *  the Free Software Foundation, either version 3 of the License, or 
 *  (at your option) any later version. 
 *  
 *  This program is distributed in the hope that it will be useful, 
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of 
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
 *  GNU General Public License for more details. 
 *  
 *  You should have received a copy of the GNU General Public License 
 *  along with this program.  If not, see <http://www.gnu.org/licenses/>. 
 *
 *  Version 0.2
 *  Author: Alejandro Gallego 
 */


int8_t answer;
int onModulePin = 10, aux;
int data_size = 0;
int end_file = 0;

char aux_str[100];

char data[250];
int x = 0;
long previous;

char url[ ]="";
int port= 21;
char request[ ]="";



void setup(){

    pinMode(onModulePin, OUTPUT);
    Serial.begin(115200);   

    Serial.println("Starting...");
    power_on();

    delay(3000);

    // sets the PIN code
    //sendATcommand("AT+CPIN=****", "OK", 2000);

    delay(3000);

    while( (sendATcommand("AT+CREG?", "+CREG: 0,1", 500) || 
        sendATcommand("AT+CREG?", "+CREG: 0,5", 500)) == 0 );

    // sets APN, user name and password
    sendATcommand("AT+CGSOCKCONT=1,\"193.229.9.132\",\"www.kolumbus.fi\"", "OK", 2000);
    sendATcommand("AT+CSOCKAUTH=1,1,\"w454921\",\"salasanani\"", "OK", 2000);
   



}
void loop(){

    // request the url
    sprintf(aux_str, "AT+CHTTPACT=\"%s\",%d", url, port);
    answer = sendATcommand(aux_str, "+CHTTPACT: REQUEST", 60000);

    if (answer == 1)
    {        
        Serial.println(request);
        // Sends 
        aux_str[0] = 0x1A;
        aux_str[1] = 0x00;
        answer = sendATcommand(aux_str, "+CHTTPACT: DATA,", 60000);

        x=0;
        do{
            if (answer == 1)
            {
                data_size = 0;
                while(Serial.available()==0);
                aux = Serial.read();
                do{
                    data_size *= 10;
                    data_size += (aux-0x30);
                    while(Serial.available()==0);
                    aux = Serial.read();        
                }
                while(aux != 0x0D);

                Serial.print("Data received: ");
                Serial.println(data_size);

                if (data_size > 0)
                {
                    while(Serial.available() < data_size);
                    Serial.read();

                    for (int y = 0; y < data_size; y++)
                    {
                        data[x] = Serial.read();
                        x++;
                    }
                    data[x] = '\0';
                }
                else
                {
                    Serial.println("Download finished");    
                }
            }
            else
            {
                Serial.println("Error getting the url");
                data_size = 0;
            }

            answer = sendATcommand2("", "+CHTTPACT: DATA,", "+CHTTPACT:0", 20000);
            
        }while (answer != 1);

        if (answer == 2)
        {
            Serial.print("Data received:");
            Serial.println(data);
        }
        else
        {
            Serial.println("Error getting data");
        }
    }
    else
    {
        Serial.println("Error waiting the request");    
    }

    delay(10000);

}

void power_on(){

    uint8_t answer=0;

    // checks if the module is started
    answer = sendATcommand("AT", "OK", 2000);
    if (answer == 0)
    {
        // power on pulse
        digitalWrite(onModulePin,HIGH);
        delay(3000);
        digitalWrite(onModulePin,LOW);

        // waits for an answer from the module
        while(answer == 0){    
            // Send AT every two seconds and wait for the answer
            answer = sendATcommand("AT", "OK", 2000);    
        }
    }

}


int8_t sendATcommand(char* ATcommand, char* expected_answer1,
            unsigned int timeout)
{

    uint8_t x=0,  answer=0;
    char response[100];
    unsigned long previous;

    memset(response, '\0', 100);    // Initialize the string

    delay(100);

    while( Serial.available() > 0) Serial.read();    // Clean the input buffer

    Serial.println(ATcommand);    // Send the AT command 


    x = 0;
    previous = millis();

    // this loop waits for the answer
    do{

        if(Serial.available() != 0){    
            response[x] = Serial.read();
            x++;
            // check if the desired answer is in the response of the module
            if (strstr(response, expected_answer1) != NULL)    
            {
                answer = 1;
            }
        }
        // Waits for the asnwer with time out
    }
    while((answer == 0) && ((millis() - previous) < timeout));    

    return answer;
}

int8_t sendATcommand2(char* ATcommand, char* expected_answer1,
         char* expected_answer2, unsigned int timeout)
{

    uint8_t x=0,  answer=0;
    char response[100];
    unsigned long previous;

    memset(response, '\0', 100);    // Initialize the string

    delay(100);

    while( Serial.available() > 0) Serial.read();    // Clean the input buffer

    Serial.println(ATcommand);    // Send the AT command 


    x = 0;
    previous = millis();

    // this loop waits for the answer
    do{

        if(Serial.available() != 0){    
            response[x] = Serial.read();
            x++;
            // check if the desired answer is in the response of the module
            if (strstr(response, expected_answer1) != NULL)    
            {
                answer = 1;
            }
            // check if the desired answer is in the response of the module
            if (strstr(response, expected_answer2) != NULL)    
            {
                answer = 2;
            }
        }
        // Waits for the asnwer with time out
    }
    while((answer == 0) && ((millis() - previous) < timeout));    

    return answer;
}

Sanoisin että vika kuvauksesi on aika epämääräinen. Mikä siis onnistuu ja missä vaiheessa tulee ongelmia?

Onko käytössäsi nimenomaan kyseisen valmistajan modeemi?

Moi

Käytössä on ML8011-kiinanihme. Menee gprs-verkkoon, mutta
edemmäs en ole päässyt. Alkaa vähitellen v-tuttaa, kun tiedän,
että nämä temput on tehty miljoonaan kertaan. Ei mitään
rakettitiedettä, mutta kun ei osaa!

Auttaisi vaikka scripti, jossa ladataan joku tiedosto ftp-palvelimelle.
Tunnarit mulla on testiä varten. Tietäisi vaan miten.

eikös AT+CHTTPACT ole pelkästään HTTP requestien tekoon?

AT+FTPxxx / AT+CFTPxxx on FTP siirtoihin tarkoitetut komennot.

tuolla on infoa jostain GSM mokkulan at komennoista
reyax.com/Module/GSM/SIM900D … _V1.00.pdf

Tuolta löyty jotain ftp komentoihin liittyvää. tarkista vastaako noi AT komennot mitään.
scribd.com/doc/63648056/329/ … -operation

Tässä vähän listaa siitä, mitä modeemi antaa takaisin.
Mua vähän epäilyttää, voiko modeemilla käyttää ollenkaan
ftp-komentoja!

ati

Quectel_Ltd
Quectel_M35
Revision: M35AR01A10

OK
AT+CGMI=?

OK
AT+CGSN

863070014873011

OK
AT+GCAP

+GCAP: +CGSM,+FCLASS

AT+CFTPMODE=?

+CME ERROR: 100

Moro,

Google tarjosi tuollaista manustaa valmistajan AT komentoihin
hobbielektronika.hu/forum/ge … ?id=203810

Dokumentissa puhutaan kyllä M10 mallista, mutta sama valmistaja.

Edit:
Tossa valmistajan FTP doku
antrax.de/downloads/gsm-easy … c_v1.1.pdf

Moi, kiitos vinkistä. Jälkimmäinen dokumentti on hyvä, ja sain
melkein toimimaan. Onkohan mulla jomman kumman pään
tiedostopolku väärin?

EDIT: Hetkinen, enhän mä ole kiinni tietokoneessa vaan
Arduinon lankussa :open_mouth: Eli nyt pitää keksiä keino lähettää
jotain Arduinon muistista eikä yrittää C:-levyltä… mitenköhän
onnistuu :question:

AT+QIFGCNT=0

OK
at+qicsgp=1,"internet"

OK
at+qftpuser="username"

OK
at+qftppass="password"

OK
at+qftpopen="193.229.9.132",21

OK

+QFTPOPEN:0
at+qftppath="/"

OK

+QFTPPATH:0
at+qftpput="c:\TEST.TXT"

ERROR
at+qftpput="c:\TEST.TXT" ,121,200

ERROR
AT+QFTPGET="komento.txt"

OK

+QFTPGET:-550

En tarkemmin vilkassut noita esimerrkejä, mutta eikö toi läheys komento ota binääridatastreamin vastaan.
Eli annat konennon että ftpput ja sille parametrina tiedoston nimi serverillä. tämän jälkeen annetaan modeemille streamina toi data.

Vai oliko tarkoitus että PC:llä kävästään arduinon ftp serveriltä hakemassa tiedosto?

Edit:
ftpput komentoon ei tule täydellistä hakemisto polkua vaan pelkkä tiedoston nimi.
at+qftppath="/" <-- Annetaan hakemisto polku serveriltä. Eli tuo on ftp palvelimen juurihakemisto.

AT+QFTPPUT=“sscom.ini”,1587,200 <-- sscom.ini luodaan ftp palvelimen juurihakemistoon jos on tarpeeksi oikeuksia. Tuon komennon jälkeen modeemi jää odottamaan, että 1587 merkkiä tulee tai 200s päästä tapahtuu timeout

Edit2:
Lisää tutkittuani niin
AT+QFTPCFG=4,"/COM/" pitäisi käyttää uarttia tiedoston siirtoon. Eli ei yritä tallentaa modeemille.

No sain vihdoin toimimaan, tosin ihan toisin kuin olin ajatellut.
Tein tilin (ilmainen toistaiseksi) Xivelyn (ex-pachub) sivuille, ja
IDE 1.04 mukana ollutta gsm-kirjaston examplea virittäen saan
dataa Xivelyn palvelimelle - tässä käytetään HTTP:ta, ei FTP:ta.

Data visualisoituu Xivelyn palvelimella ihan nätisti!

Mutta perusongelma on yhä ratkaisematta. Eli jos haluan siirtää
vaikkapa luvut stringin “12 33 42 22 32 423 31 23 232 221 31”
johonkin ja nimetän sen “mittausdata1.txt” niin miten onnistunee
ftp:lla vai onnistuuko lainkaan? Datasta pitäisi luoda ilmeisesti
streami, joka sitten aineellistuu tiedostoksi serverille. Ovat
hiukka outoja juttuja mulle.

Tarkoitukseeni sopisi ehkä paremminkin em. http-siirto vaikka
kerran tunnissa. Toistaiseksi jumppaan Xivelyn palvelimella, mutta
löytyyköhän jostain (halpaa tai ilmaista) palvelua, johon voisi itse
koodata vastaanottavan php-kikkulan? www.kolumbus.fi -palveluun
ei moisia saa asentaa, selvitin jo.

Kapsia voin itse ainakin suositella, saa pyöritellä about mitä huvittaa (FTP ei kuitenkaan onnistu, sen verta turvaton protokolla).