SM5100B GPRS et Notes générales (5 / 6 étapes)

Étape 5: GPRS

Si vous avez obtenu ce jour et vous pouvez envoyer un SMS ou passer un appel ou une autre manière valider que vous avez en effet un lien fonctionnel vers le réseau mobile, alors nous pouvons essayer d’obtenir un va de session GPRS.

Ce code est un piraté en place auprès d’un échantillon que j’ai trouvé par un gars nommé Toby : https://github.com/tobek/SM5100B-GPRS/blob/master/... c’était à peu près le seul fonctionnement peu de code sur internet ! Merci Toby Fox!!
Il appelle httpbin.org et rend un http requête get. httpbin.org est un ensemble pratique des pages pour le débogage des trucs de http.

Vous pouvez juste aller et de saisir des échantillon de Toby plutôt cause c’est l’original, probrably mieux et est bien documenté, bien que celui-ci ci-dessous est déjà modifié pour utiliser le matériel UART pour GSM et logiciel pour serial monitor comme mentionné plus tôt.

En utilisant le matériel UART initialement pour programmer l’esquisse,
Déconnectez la connexion série GSM, usb Branchez d’uno et téléverser des croquis.
Ensuite pour tester le croquis, puis retirer l’usb uno et branchez le module USB-série.
Rebranchez les câbles série du modem GSM dans les broches UART de matériel 0 & 1 nouveau

L’idée est d’utiliser le modem GSM avec le matériel UART comme la bibliothèque de logiciels de série
est de ralentir pour modem GSM, mais son évidemment très bien pour le débogage des trucs

#include
#define GSMSerial série
SoftwareSerial SMSerial(2,3) ; À l’aide de logiciels série comme deuxième UART-
const String apn = « internet » ; nom du point d’accès pour GPRS
const String ip = « 54.235.174.110 » ; Adresse IP du serveur à que nous sommes connecté
hôte de String const = « httpbin.org » ; requis dans HTTP 1.1 - Quel est le nom de l’hôte à cette adresse IP ?
requête de chaîne const = "GET /get? données = essai HTTP/1.1" ;
const String useragent = « Mozilla/5.0 » ; pour nos fins, l’agent utilisateur n’importe - si j’ai bien compris, qu'il est utile d’utiliser un élément générique le serveur reconnaîtra
void setup()
{
SMSerial.begin(9600) ;
SMSerial.println ("Starting SM5100B Communication...") ;
GSMSerial.begin(9600) ;
waitTil ("+ SIND: 4") ; garder d’impression GSMSerial de sortie jusqu'à ce que nous obtenons "+ SIND: 4"
SMSerial.println (Module ready") ;
}
void loop()
{

SMSerial.println ("fixation GPRS...") ;
GSMSerial.println("AT+CGATT=1") ;
waitFor("OK") ;
SMSerial.println ("création de contexte PDP...") ;
GSMSerial.println("AT+CGDCONT=1,\"IP\",\""+apn+"\"") ;
waitFor("OK") ;
SMSerial.println (« activation contexte PDP...") ;
GSMSerial.println("AT+CGACT=1,1") ;
waitFor("OK") ;
SMSerial.println ("configuration de connexion TCP au serveur TCP...") ;
GSMSerial.println("AT+SDATACONF=1,\"TCP\",\""+ip+"\",80") ;
waitFor("OK") ;
SMSerial.println ("Starting Connection TCP...") ;
GSMSerial.println("AT+SDATASTART=1,1") ;
waitFor("OK") ;
while (1) {/ / maintenant, nous allons en boucle pour toujours, vérification de l’état de socket et casser seulement lorsque nous nous connectons
SMSerial.println ("vérifier l’état de socket:") ;
GSMSerial.println("AT+SDATASTATUS=1") ; Nous allons revenir SOCKSTATUS et puis sur OK
String sockstat = getMessage() ;
waitFor("OK") ;
Si (sockstat == "+ SOCKSTATUS : 1,0,0104,0,0,0") {}
SMSerial.println ("ne pas lié encore. En attente de 1 seconde et essayer de nouveau. ") ;
Delay(750) ;
}
ElseIf (sockstat == "+ SOCKSTATUS : 1,1,0102,0,0,0") {}
SMSerial.print("!!! Le socket connecté!!! ");
rupture ;
}
else {}
SMSerial.println ("nous ne m’attendais pas que.") ;
cellOutputForever() ;
}
}
int packetLength = 26+host.length()+request.length()+useragent.length() ; 26 est la taille des pièces non variable du paquet, voir commentaires de taille ci-dessous
SMSerial.println ("envoi HTTP paquet...") ;
GSMSerial.print("AT+SDATATSEND=1,"+String(packetLength)+"\r") ;
waitFor('>') ; Attendez que le module GSM pour nous dire qu'il est prêt à recevoir le paquet
GSMSerial.print(request+"\r\n") ; TAILLE: 2
GSMSerial.print ("hôte:" + hôte + « \r\n ») ; TAILLE: 8
GSMSerial.print ("User-Agent:" + useragent + « \r\n\r\n ») ; TAILLE : 16
GSMSerial.write(26) ; Ctrl + z caractère : envoyer le paquet
waitFor("OK") ;
waitTil("+STCPD:1") ; Cela signifie que les données sont reçues
waitTil("+STCPC:1") ; Cela signifie la socket est fermée
SMSerial.println (« lecture de données du serveur...") ;
GSMSerial.println("AT+SDATAREAD=1") ; Comment on lit les données du serveur a envoyé
cellOutputForever() ; Il suffit de garder quelque module GSM nous dit d’impression
}
/ * NOTES
*
* ce qui est + STIN:1 ?
*
* pour déconnecter après transmission: AT + CGACT = 0, 1 prise de pauses. AT + CGATT = 0 semble fonctionner plus péremptoirement ?
* AT + SDATASTART = 1, 0 / / fermer la connexion TCP
* AT + SDATASTATUS = 1 / / clear octets envoyés/ack de SOCKSTATUS
*
*/
=== HELPER FONCTIONS === / /
Continuez à lire les série messages que nous recevons du module
boucle pour toujours, jusqu'à ce que nous obtenons une chaîne différente de zéro, se terminant par \r\n - impression et qui retournent.
TODO : appliquer un délai d’attente qui renvoie la valeur 0 ?
String getMessage() {}
String s = "" ;
{while(1)}
if(GSMSerial.available() > 0) {}
s = s+(char)GSMSerial.read() ;
Si (s.length() > 1 & & s[s.length () -2] == '\r' & & s[s.length()-1]=='\n') {/ / si les 2 derniers caractères sont \r\n
Si (s == "\r\n" || s == « \r\n ») {/ / ces sauter, se déplacer
s="";
}
else {/ / nous avons un message !
SMSerial.println(s.substring(0,s.length()-2)) ;
Return s.substring(0,s.length()-2) ;
}
}
}
}
}
pour manger un seul message que nous attendons depuis le module
imprime le message suivant dans le module. s’il n’est pas la valeur attendue, mourir
void waitFor(String s) {}
String message=getMessage() ;
Si (message! = s) {}
SMSerial.println ("attendez, ce n'est pas ce que nous attendions. Nous voulions \""+s+"\" ") ;
cellOutputForever() ;
}
Delay(100) ; attendre pour un tout petit peu avant d’envoyer la prochaine commande
}
garder crachant des messages provenant du module jusqu'à ce que nous obtenons celui que nous attendons
void waitTil(String s) {}
Message de chaîne ;
tandis que (1) {}
message = getMessage() ;
Si (message == s) {}
Delay(100) ; cause, que nous sommes probablement environ pour envoyer une autre commande
retour ;
}
}
}
continuer à lire les caractères jusqu'à ce que nous obtenons char c
void waitFor(char c) {}
{while(1)}
if(GSMSerial.available() > 0) {}
Si ((char)GSMSerial.read() == c) {}
Delay(100) ;
retour ;
}
}
}
}
Si quelque chose se passe mal, interrompre et juste afficher la sortie de module de cellule afin que nous puissions voir messages d’erreur
Cela fera une boucle pour toujours
void cellOutputForever() {}
SMSerial.println ("afficher ensuite sortie de module de cellule pour toujours") ;
GSMSerial.println("AT+SDATAREAD=1\r\n") ;
char incoming_char = 0 ;
while(1)
{
if(GSMSerial.available() > 0)
{
SMSerial.write(GSMSerial.read()) ;
}
if(SMSerial.available() > 0)
{
incoming_char=SMSerial.Read() ; Obtenir le caractère provenant de la borne
GSMSerial.print(incoming_char) ; Envoyez le personnage au module cellulaire.
}
}
}
comme ci-dessus, mais en hexadécimal, utile pour le débogage
void cellHexForever() {}
{while(1)}
if(GSMSerial.available() > 0) {}
char c = (char)GSMSerial.read() ;
Serial.Print ("char:") ;
SMSerial.print (c, HEX) ;
SMSerial.print("") ;
SMSerial.println(c) ;
}
}
}
recevoir la chaîne tels que "SOCKSTATUS : 1,1,0102,10,10,0"
0 est id de connexion. 1 soit connecté ou non. 2 est statut (0104 se connecte, 0102 est connecté, autres)
3 est envoyé octets. 4 Printed octets. 5 est « compteur de données reçues »
Cette vérification sera fonction qu’octets envoyés == ack octets et que la valeur de retour
retourne 0 s’ils ne correspondent pas ou si la quantité de données est 0
int checkSocketString (String s) {}
Si (socketStringSlice(3,s) == 0)
return 0 ;
ElseIf (socketStringSlice(3,s) == socketStringSlice(4,s))
Return socketStringSlice(3,s) ;
d’autre
return 0 ;
}
retourne l’index de la nième instance de char c String s
int nthIndexOf (char c, String s, int n) {}
int index = 0 ;
pour (int i = 0; i < = n; i ++) {}
indice = s.indexOf(c,index+1) ;
}
retour index ;
}
attend la chaîne tels que "SOCKSTATUS : 1,1,0102,10,10,0"
retourne le n-ième bloc de données, séparées par des virgules
int socketStringSlice (int n, String s) {}
Tranche de chaîne = s.substring(nthIndexOf(n-1,',',s)+1,nthIndexOf(n,',',s)) ;
char cArray[slice.length () + 1] ;
slice.toCharArray (cArray, sizeof(cArray)) ;
Return atoi(cArray) ;
}

Voici la sortie de la série monitor vous devriez vous attendre
SM5100B Communication de départ...
ÐèÐÐÐ
+ SIND: 1
+ SIND : 10, "SM", 1, "FD", 1, "LD", 1, "MC", 1, « RC », 1, « ME », 1
+ STIN:0
+ SIND : 11
+ SIND: 3
+ SIND: 4
Module prêt
Attacher le GPRS...
Bien
Mise en place le contexte PDP...
Bien
Activation de contexte PDP...
Bien
Configuration de la connexion TCP au serveur TCP...
Bien
À partir de connexion TCP...
Bien
Vérification d’état de la prise :
+ SOCKSTATUS : 1,0,0104,0,0,0
Bien
Vérification d’état de la prise :
+ SOCKSTATUS : 1,1,0102,0,0,0
Bien
!!! Le socket connecté!!! Envoi de paquets HTTP...
Bien
+ STCPD:1
Lecture des données du serveur...
Afficher ensuite sortie de module de cellule pour toujours
+ SURLABASEDESDONNÉESDUFABRICANTDUBALLAST :1,486,485454502F312E3120323030204F4B0D0A4163636573732D436F6E74726F6C2D416C6C6F772D4F726967696E3A202A0D0A436F6E74656E742D547970653A206170706C69636174696F6E2F6A736F6E0D0A446174653A205468752C203134204E6F7620323031332030353A32373A323320474D540D0A5365727665723A2067756E69636F726E2F302E31372E340D0A436F6E74656E742D4C656E6774683A203236330D0A582D43616368653A204D4953532066726F6D207478323272727065703233620D0A436F6E6E656374696F6E3A206B6565702D616C6976650D0A0D0A7B0A20202275726C223A2022687474703A2F2F6874747062696E2E6F72672F6765743F646174613D74657374696E67222C0A20202268656164657273223A207B0A2020202022436F6E6E656374696F6E223A2022636C6F7365222C0A2020202022486F7374223A20226874747062696E2E6F7267222C0A202020202243616368652D436F6E74726F6C223A20226D61782D6167653D323539323030222C0A2020202022557365722D4167656E74223A20224D6F7A696C6C612F352E30220A20207D2C0A2020226F726967696E223A202234392E3138302E3132322E3337222C0A20202261726773223A207B0A202020202264617461223A202274657374696E67220A20207D0A7D
Bien
+ SDATA:1, 0,
Bien

Notez que le + SURLABASEDESDONNÉESDUFABRICANTDUBALLAST de sortie au format hexadécimal, afin que la grosse corde usagée de mutilés, vous recevrez arrière doit être converti.
Vous pouvez la coller dans ce site pour obtenir un look facile à ce qui était la sortie : http://www.dolcevie.com/js/converter.html
et après le décodage de l’hexagone, notre rendement est

HTTP/1.1 200 OK?? Access-Control-Allow-Origin: *?? Content-Type : application/json?? Date: Thu, 14 novembre 2013 05:27:23 GMT?? Serveur : gunicorn/0.17.4?? Content-Length : 263?? X-Cache : Mlle de tx22rrpep23b?? Connection : keep-alive??? {? « url »: « http://httpbin.org/get?data=testing », ? « en-têtes »: {? « Connexion »: « fermer », ? « Host »: « httpbin.org », ? « Cache-Control »: "max-age = 259200", ? « User-Agent »: « Mozilla/5.0 » ? },? « origine »: « 49.180.122.37 », ? « args »: {? « données »: « testing » ? }?}?

Donc un succès http get demande, j’ai jamais pensé que cela arriverait.

EDIT!!!

Vous pouvez dire le 5100B pour vous relire les données recived en ASCII!! Avec une simple commande "AT + SDATARXMD = 1, 1, 0"

Avant cette line:"GSMSerial.println("AT+SDATAREAD=1") ; Comment nous lisons les données du serveur a envoyé"
Ajoutez le code :

GSMSerial.println("AT+SDATARXMD=1,1,0") ;
waitFor("OK") ;

Cela créera la sortie en ASCII juste avant d’appeler la SDATAREAD !
Et les données votre présentation sera désormais beaucoup plus beau regard plus comme ceci :

+ SSTR:1, HTTP/1.1 200 OK
Access-Control-Allow-Origin: *
Cont12:16 GMT
Serveur : gunicorn/0.17.4
Content-Length : 264
X-Cache : MISS de tx22rrpep38a
Connection : keep-alive
{
« args »: {}
« données »: « essais »
},
« en-têtes »: {}
« Host »: « httpbin.org »,
« User-Agent »: « Mozilla/5.0 »,
« Cache-Control »: "max-age = 259200",
« Connexion »: « fermer »
},
« url »: « http://httpbin.org/get?data=testing »,
« origine »: « 49.180.112.246 »
}

Sans besoin de vous écrire un hexagone à la fonction de conversion ASCII:)

Un gros problème vieux cela pose est « OK » c’est une partie d’une réponse HTTP.
OK est aussi la façon dont le SM5100B nous raconte son transformés une commande, chaque fois qu’on se « OK\r\n » sous forme de chaîne dans le tampon série, nous savons que le module GSM a répondu et il constitue la fin du message,,, alors c’est difficile de savoir si les « OK\r\n » au début de la réponse HTTP fait partie de la réponse ou le message à la fin du traitement avec succès la commande.
« Alors chercher la seconde "OK\r\n" J’ai pensée... mais alors ce que s’il y a aussi un « OK\r\n » dans le corps de la réponse!!!
Toutes les idées tout le monde, bueller, n’importe qui ?

Articles Liés

Ongles Note de musique

Ongles Note de musique

Étape 1: Commencez par une couche de BaseÉtape 2: Appliquez le vernis à ongles de votre choix j'ai utilisé la force de diamant de Sally Hansen.Étape 3: Dessiner le personnel de la musique Attendre que le vernis à ongles pour sécher complètement. Ensu
Conversion Decimal en nombres binaires

Conversion Decimal en nombres binaires

IntroductionDans le monde de l'informatique, les ordinateurs utilisent des nombres binaires pour afficher des informations à l'écran. Comprendre comment compter ces numéros dans les essentielles pour tout chercheur en informatique. C'est aussi un bon
Détecteur de rayonnement en réseau : Sentir les rayons cosmiques sur le bout des doigts

Détecteur de rayonnement en réseau : Sentir les rayons cosmiques sur le bout des doigts

* Mise à jour (12/23) *: vient d'entrer dans la compétition « protégés » - Protégez-vous contre rayonnement et votez pour moi:) MerciNote : Ceci est mon tout premier Instructable ! Je vais être très sensible à la rétroaction sur la façon d'améliorer
Plonger la Base de routeur pour un routeur fixe

Plonger la Base de routeur pour un routeur fixe

Pour de nombreux travailleurs du bois de début, le dilemme d'acheter un fixe ou plonger routeur (et quand/Pourquoi utiliser un sur l'autre) peut prêter à confusion. Pour la plupart des projets, un routeur fixe se chargera du travail haut la main, mai
Paracord Double Monkey Fist signet

Paracord Double Monkey Fist signet

ce signet snazzy auront tous vos amis en disant « cool » !  J'aime jouer avec les noeuds et tout ça, alors quand j'ai vu une photo de ce quelque part sur internet, j'ai décidé que ce serait un projet cool à faire, mais aussi pour rédiger et soumettre
Ampli guitare

Ampli guitare

voulez construire votre propre tube amplificateur pour guitare ? Il existe de nombreuses options : construire un kit, construire à partir d'un schéma existant, ou bifurquer comme je le faisais et essayer quelque chose de différent.Peut-être, comme mo
Recâblage Hello Kitty casque cassé deux

Recâblage Hello Kitty casque cassé deux

Nous avons probablement tous eu cela arriver à nous à un moment donné. Vous achetez une paire décente d'écouteurs, mais après quelques mois, ils cassent. Le mode de défaillance de ces dispositifs est généralement (du moins selon mon expérience) la co
Manipulateur Mobile polyvalent Mk 1

Manipulateur Mobile polyvalent Mk 1

Brève Description :Construire votre propre robot géant DIY qui joue du piano, dessine des images, prépare les repas, eaux des plantes, se livre à des duels de sabre laser et plus encore. Le manipulateur Mobile polyvalent est une plate-forme de roboti
Contrôle de Cubase avec Arduino basé à MIDI

Contrôle de Cubase avec Arduino basé à MIDI

Un de mes amis voulait contrôler Cubase, son logiciel d'enregistrement audio, avec un bouton poussoir afin qu'il puisse arrêter et démarrer des enregistrements à distance sans avoir à passer à l'ordinateur et tapez sur le clavier. Vous pouvez être ca
Ajouter des emplacements de POI à l’OSM à l’aide de votre iPhone

Ajouter des emplacements de POI à l’OSM à l’aide de votre iPhone

emplacements ajout de lieux d'intérêt (POI) à ce projet de Street Carte OSM (Open) est un excellent moyen d'améliorer la représentation numérique de votre communauté environnante ! C'est encore plus facile que vous le pensez, puisque vous pouvez faci
Station météo de Arduino GPRS - partie 1

Station météo de Arduino GPRS - partie 1

Avec la menace de plus en plus erratique météorologiques circulant le ciel de notre planète, jour après jour de pluie incessante, inondations, sécheresses, tempêtes de grêle et qui sait quoi d'autre, une station météorologique semble être un accessoi
Sciphone i68 GPRS + MMS Configuration tous pays Foolproof

Sciphone i68 GPRS + MMS Configuration tous pays Foolproof

le sciphone i68 + est un très bon clone de l'iphone très populaire à une coupe vers le bas prixCette instructable va vous montrer comment facilement mettre en place les paramètres GPRS et MMS sur votre sciphone i68 afin que vous pouvez envoyer et rec
À l’aide de la Telit GE863 (module GSM-GPRS)

À l’aide de la Telit GE863 (module GSM-GPRS)

The Telit GE863 est un module GSM-GPRS, c'est-à-dire essentiellement un téléphone sans écran ni clavier, en option avec GPS. Cette instructable est sur la façon de commencer à l'utiliser si vous l'achetez avec la carte d'interface. Vous pouvez achete
Bétail à cheval alimentation minérale

Bétail à cheval alimentation minérale

Cette instructable crée une mangeoire minérale pour chevaux de bétail ou un animal de ferme qui peut soulever le couvercle. Cette conception a été créé après l'achat d'un produit commercial rond qui fonctionne sur le même principe mais est sensibleme