Inviare dei Byte ad Patchube(Cosm) tramite sim908

hai ragione, vedendo che ai byte c'era affianco una lettera pensavo seguissero la tabella ascii.

Allora la soluzione "stupida" è raggrupare 2 a 2 i byte ed inviarli usando la SimpleWriteln(int) ma funziona solo se il numero di byte è pari (mi pare di sì nel caso dei tuoi messaggi)

per esempio

int i, mess;
for (i=0;i<lunghezzaArray;i+=2){
    mess = ((int)connectMessage[i])<<8+connectMessage[i+1];
    gsm.SimpleWriteln(mess);
}

la soluzione "difficile" è modificare la libreria per "magiarsi" anche gli array di byte (oppure sempre di char ma specificando la lunghezza, bypassando così il tappo delle stringhe)

non ho quella libreria sottomano,ma direi che c'è un metodo simpleWrite che accetta due parametri,il vettore dy bytes,e la sua lunghezza...

non mi pare ci fosse, ma quella libreria a sua volta si poggiava su un'altra libreria(quindi alla fine erano 3 librerie una sopra l'altra), che essendo più "basso livello" dovrebbe avere il metodo, ora controllo

edit: come non detto, anche la libreria più a basso livello lavora con le stringhe, per via del fatto che sono comandi AT. però giaà nella libreria SIM900 si può notare un oggetto _cell, che poi sarebbe la seriale che è collegata con il modulo GSM (SoftwareSerial)...

quindi in SIM900.h aggiungi:

void SimpleWrite(byte *comm, int len);

e in SIM900.cpp

void SIMCOM900::SimpleWrite(byte *comm, int len)
{
        _cell.write(comm, len);
}

dopo di che potrei usare tranquillamente gli array byte così
gsm.SimpleWriteln(connectMessage, 18); //18 è il numero di byte da scrivere

Ciao, allora ho provato a fare il tutto, risolto problema in compilazione, ma invio il messaggio di connect al server ma questo non mi risponde, allora ho fatto delle prove su un server di un mio amico e ho verificato che dopo aver avviato la connessione TCP, regolarmente accettata dal server, qualunque cosa invio al server questi non riceve nulla; Viceversa se il server manda qualcosa a me io la ricevo.
Ho provato anche a mandare una semplice stringa di caratteri tramite il comando SimpleWrietln ma nulla.
Ho fatto una prova con il metodo get della libreria inetGsm e in quel caso il server riceve le stringhe che si trovano nel metodo.
Non mi capacito quale sia la differenza e del perchè questo avvenga.
Potete illuminarmi!!!??? =(

l'unica divverenza che noto è il carattere di "a capo" che viene aggiunto attraverso la println. Quindi dovresti modificare

void SIMCOM900::SimpleWrite(byte *comm, int len)
{
        _cell.write(comm, len);
}

in

void SIMCOM900::SimpleWrite(byte *comm, int len)
{
        _cell.write(comm, len);
        _cell.write('\n', 1); //aggiunge il carattere "a capo"
}

però a questo punto ho paura a cosa possa succedere se in mezzo al comando ci sia un valore che corrisponda all'a-capo.. tutto dipende da come interpreta i dati il chip GSM, bisognerebbe vedere che succede a basso livello (libreria gsm.h) però ora sono a lavoro.

@lesto: sicuro di poter usare _cell.write('\n', 1) ?non so com'è fatta la libreria,ma ho paura che facendo così usi 13 o 10(valore asci dell'acapo) come indirizzo per cercarsi il vettore di array..

uff hai ragione ancora una volta, dovrebbe essere
char acapo = '\n';
_cell.write(&acapo, 1)

con le doppie virgolette, in questo modo lo forzi a a passare l'indirizzo

edit: chissà se si può fare
_cell.write(&'\n', 1)

o meglio
_cell.write("\n", 1)

si,con il & dovrebbe andare..

Allora ho provato ha cambiare il metodo come mi avete consigliato, ma purtroppo non funziona mi dà errore in compilazione, quindi ho pensato di inserire nel codice del programma /n direttamente con il SimpleWrite, ho provato a inviare questo connectMessage a cosm, ma questi dopo aver accettato la connessione TCP non risponde nulla, invece secondo il protocollo MQTT dovrebbe rispondere con dei connectACK sia nel caso in cui accetti la richiesta sia nel caso in cui il connectMessage sia sbagliato, quindi mi sorge il dubbio che al server ancora non arriva nulla.
Come posso verificare se il server riceve i byte che gli mando?

Ragazzi veramente grazie per la pazienza e il supporto che mi state dando :P!!!

uhmm un analizzatore di rete lato server tipo wireshark o snuff

Ho scaricato il programma che mi hai detto hai idea di come posso fare l'analisi della connessione con il gsm di arduino?
Scusa se ti rompo, ma ho visto che sembra abbastanza complicato, quindi magari se tu avevi già esperienza potevi velocizzarmi un pò la cosa.

Cmq ottimo programma, stò analizzando il traffico del mio cpu ed è veramente perfetto per quello che serve a me, il problema è far analizzare il traffico sul gsm...

il traffico del tuo cpu?

non puoi analizzare il traffico sulla rete GSM, ma puoi analizzarlo una volta che sul cavo/wifi una volta che arriva al server

Scusami, ma non ho ben capito come usare questo programma con arduino... :blush:

Ok, risolto!!!

cosa e come hai risolto?

Ciao, scusa hai ragione, sono stato un pò vago, in pratica sono riuscito finalmente ad inviare al mio server di prova una stringa, adesso stavo cercando di scrivere un metodo per farlo, è ho un errore in compilazione:

error: extra qualification 'InetGSM::' on member 'mqttConnect'

il metodo è il seguente:

int InetGSM::mqttConnect(const char* server, int port, char* msg,char* result, int resultlength)
{
boolean connected=false;
int n_of_at=0;
int length_write;
char end_c[2];
end_c[0]=0x1a;
end_c[1]='\0';

while(n_of_at<3){
if(!connectTCP(server, port)){
#ifdef DEBUG_ON
Serial.println("DB:NOT CONN");
#endif
n_of_at++;
}
else{
connected=true;
n_of_at=3;
}
}

if(!connected) return 0;

gsm.SimpleWrite(msg);

gsm.SimpleWrite("\n\n");
gsm.SimpleWrite(end_c);

switch(gsm.WaitResp(10000, 100, "SEND")){
case RX_TMOUT_ERR:
return 0;
break;
case RX_FINISHED_STR_NOT_RECV:
return 0;
break;
}

#ifdef DEBUG_ON
Serial.println("DB:SENT");
#endif
int res= gsm.read(result, resultlength);

return res;
}

L'errore che avevo era dovuto a una scrittura sbagliata del prototipo del metodo, adesso funziona e riesco ad inviare dati al server sotto forma di stringa, adesso provo con i byte e vedo che succede...

ah, ma quindi per inviare la stringa andava bene il '\n'?

No, bisogna inserire un array di char ovvero:

char end_c[2];
end_c[0]=0x1a;
end_c[1]='\0';

e poi inviarlo a fine stringa, grazie a questo il server ha ricevuto la stringa.