Vous êtes sur la page 1sur 11

Demande de publication HTTP

SIM900/800 au format JSON avec


Arduino

AdministrateurDernière mise à jour : 21 août 2022

423 4384 minutes de lecture

Partager

Dans cet article, nous apprendrons à utiliser SIM800 ou SIM900 avec Arduino

et à effectuer une requête de publication HTTP au format JSON sur n'importe

quel serveur API.


Table des matières [ masquer ]

 1 Aperçu

 2 Nomenclature

 3 Qu'est-ce que l'API ?

 4 Qu'est-ce que le format JSON ?

 5 Configuration matérielle

 6 Bibliothèque Arduino JSON

 7 Code source : Demande de publication HTTP SIM900/800 au format JSON avec

Arduino

 8 Résultat & Réponses

Aperçu
Outre le module Wifi ou le module Ethernet, les projets IoT peuvent également

être réalisés via le module SIM800/900 GSM GPRS. Le principal avantage de

Cellular IoT par rapport à Wifi IoT est la disponibilité du réseau et du signal

partout. Dans l'un de mes articles précédents, j'ai expliqué comment vous

pouvez envoyer les données du capteur sans fil à l'aide du module GSM au

serveur Thingspeak. Vous pouvez consulter le message ici : Envoyer des

données GPRS SIM800/900 à Thingspeak avec Arduino

Mais aujourd'hui, nous allons interfacer le module SIM800/900 GSM GPRS avec

Arduino et développer un code pour envoyer les données à n'importe quelle


adresse Web ou serveur Web à l'aide de l'API. Nous devons envoyer les

données au format JSON car l'envoi direct d'une chaîne de données semble

difficile. L'ensemble du processus et le code final sont expliqués dans ce post.

Nomenclature
Voici les composants nécessaires pour apprendre et acquérir une expérience

pratique de ce didacticiel. Tous les composants peuvent être facilement

achetés sur Amazon. Le lien d'achat des composants est également indiqué.

SN COMPOSANTS LA DESCRIPTION QUANTITÉ

1 Arduino UNO Carte de développement Arduino UNO R3 1 https://amzn.to/38

2 Module GSM Module GPRS GSM SIM800/SIM900 1 https://amzn.to/2V

3 Capteur DHT11 Capteur de température d'humidité DHT11 1 https://amzn.to/2T

4 Module RTC Module d'horloge en temps réel DS3231 1 https://amzn.to/2Q

5 Alimentation 12/9V - 1 https://amzn.to/2P

6 Fils de connexion Fils de cavalier dix https://amzn.to/2L

sept Planche à pain - 1 https://amzn.to/2Y

Qu'est-ce que l'API ?


API est l'acronyme d'Application Programming Interface, qui est un

intermédiaire logiciel qui permet à deux applications de se parler. Chaque fois


que vous utilisez une application comme Facebook, envoyez un message

instantané ou consultez la météo sur votre téléphone, vous utilisez une API.

Exemple d'API : Lorsque vous utilisez une application sur votre téléphone

mobile, l'application se connecte à Internet et envoie des données à un

serveur. Le serveur récupère ensuite ces données, les interprète, effectue les

actions nécessaires et les renvoie à votre téléphone. L'application interprète

ensuite ces données et vous présente les informations souhaitées de manière

lisible. C'est ce qu'est une API - tout cela se passe via l'API.

Qu'est-ce que le format JSON ?


JSON signifie JavaScript Object Notation. C'est un format léger pour stocker et

transporter des données. Il est souvent utilisé lorsque des données sont

envoyées d'un serveur à une page Web.

Par exemple, voici un exemple d'objet utilisateur simple sérialisé en XML :

1 <xml>
2 <user>
3 <firstName>Jason</firstName>
4 <middleName>Alexander</middleName>
5 <lastName>Smith</lastName>
6 <address>
7 <street1>1234 Someplace Avenue</street1>
8 <street2>Apt. 302</street2>
9 <city>Anytown</city>
10 <state>NY</state>
11 <postalCode>12345</postalCode>
12 <country>US</country>
13 </address>
14 </user>
15 </xml>

Comme vous pouvez le constater, les mêmes données représentées dans JSON

sont bien plus efficaces, tout en conservant toute leur lisibilité humaine :
1 {
2 "firstName" : "Jason",
3 "middleName" : "Alexander",
4 "lastName" : "Smith",
5 "address" : {
6 "street1" : "1234 Someplace Avenue",
7 "street2" : "Apt. 302",
8 "city" : "Anytown",
9 "state" : "NY",
10 "postalCode" : "12345",
11 "country" : "US"
12 }
13 }

JSON est généralement utilisé avec des protocoles IoT qui ne fournissent pas

de support natif pour la sérialisation de structure de données tels que

HTTP/Rest, WebSockets, MQTT et SMQ.

Dans JSON, les données sont structurées de manière spécifique. JSON utilise

des symboles comme { } , : ” ” [ ] et il a la syntaxe suivante :

Les données sont représentées dans des paires clé/valeur

1. Les deux-points (:) attribuent une valeur à la clé

2. Les paires clé/valeur sont séparées par des virgules (,)

3. Les accolades contiennent des objets ({ })

4. Les crochets contiennent des tableaux ( [ ])

configuration materielle
Faisons maintenant une configuration matérielle. J'utilise 2 modules dont les

données sont à envoyer au serveur via API au format JSON. J'utilise le capteur

d'humidité et de température DHT11 car je souhaite envoyer des données

d'humidité et de température. De même, j'utilise également le module DS3231

Real Time Clock (RTC) pour vérifier l'heure et l'envoyer au serveur.


Voici le schéma de connexion ci-dessous, assemblez le circuit comme indiqué

sur la figure.

J'ai donc fait la même connexion ici comme indiqué ci-dessous. J'ai donc

alimenté le module GSM avec 12V et Arduino avec 5V à partir du port USB de

l'ordinateur.
Bibliothèque Arduino JSON
Le moyen le plus simple de décoder et d'encoder des chaînes JSON avec l'IDE

Arduino consiste à utiliser la bibliothèque ArduinoJson qui a été conçue pour

être la bibliothèque JSON la plus intuitive, avec la plus petite empreinte et la

gestion de la mémoire la plus efficace pour Arduino. ArduinoJson est une

bibliothèque C++ JSON pour Arduino et IoT (Internet Of Things).

Fonctionnalités

1. Décodage JSON (les commentaires sont pris en charge)

2. Encodage JSON (avec indentation facultative)

3. API élégante, très facile à utiliser

4. Allocation de mémoire fixe (zéro mallocs)


5. Pas de duplication de données (zéro copie)

6. Portable ( écrit en C++98)

7. Autonome (pas de dépendance externe)

8. Faible encombrement

9. Bibliothèque d'en-tête uniquement

Code source : Demande de publication HTTP SIM900/800


au format JSON avec Arduino
Le code source pour créer HTTP POST au format JSON avec API et module

GSM SIM900/800 est donné ci-dessous.

Avant cela, vous avez besoin de quelques bibliothèques. Téléchargez les

bibliothèques à partir du lien suivant et ajoutez-les à l'IDE Arduino.

1. RTC Lib pour DS3231 : Télécharger

2. Bibliothèque DHT pour capteur DHT11 : Télécharger

3. Bibliothèque Arduino JSON : Télécharger

Dans le code suivant, apportez des modifications à l'APN. J'ai utilisé Airtel

APN. Vérifiez l'APN de votre opérateur et apportez des modifications. Modifiez

également le serveur Web ou ajoutez l'adresse de votre serveur Web API où

vous souhaitez envoyer les données.


1 #include <RTClib.h> // Download the library from https://github.com/adafruit/RTClib
2 #include <Wire.h> // Library for I2C Communication with DS3231 Module
3 #include <DHT.h>
4 #include <SoftwareSerial.h>
5 SoftwareSerial myserial(10, 11); // RX: 10, TX:11
6 #include <ArduinoJson.h>
7 StaticJsonBuffer<200> jsonBuffer;
8
9
10 #define DHTPIN A1
11 #define DHTTYPE DHT11
12
13 RTC_DS3231 rtc;
14 DHT dht(DHTPIN, DHTTYPE);
15
16 char t[32];
17 char deviceID[12] = "MYTEST56";
18
19
20 void setup()
21 {
22 myserial.begin(9600); // the GPRS baud rate
23 Serial.begin(9600);
24 Serial.println("Initializing..........");
25 dht.begin();
26 Wire.begin();
27 DynamicJsonBuffer jsonBuffer;
28
29
30 if (! rtc.begin()) {
31 Serial.println("Couldn't find RTC");
32 while (1);
33 }
34 rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
35 //rtc.adjust(DateTime(2020, 02, 29, 17, 50, 40));
36 delay(5000);
37 }
38
39 void loop()
40 {
41 Serial.println("");
42 Serial.println("************************************************************");
43 float humidity = dht.readHumidity();
44 float temperature = dht.readTemperature();
45
46 DateTime now = rtc.now();
47
48 sprintf(t, "%02d:%02d:%02d %02d/%02d/%02d", now.hour(), now.minute(), now.second(), now.day(), now.month(),
49 now.year());
50
51 Serial.print("Device ID: ");
52 Serial.println(deviceID);
53 Serial.print("Temperature: ");
54 Serial.print(temperature);
55 Serial.println(" °C");
56 Serial.print("Humidity: ");
57 Serial.print(humidity);
58 Serial.println(" %");
59 Serial.print(F("Time/Date: "));
60 Serial.println(t);
61 delay(1000);
62
63
64 /********************GSM Communication Starts********************/
65
66 if (myserial.available())
67 Serial.write(myserial.read());
68
69 myserial.println("AT");
70 delay(3000);
71
72 myserial.println("AT+SAPBR=3,1,\"Contype\",\"GPRS\"");
73 delay(6000);
74 ShowSerialData();
75
76 myserial.println("AT+SAPBR=3,1,\"APN\",\"airtelgprs.com\"");//APN
77 delay(6000);
78 ShowSerialData();
79
80 myserial.println("AT+SAPBR=1,1");
81 delay(6000);
82 ShowSerialData();
83
84 myserial.println("AT+SAPBR=2,1");
85 delay(6000);
86 ShowSerialData();
87
88
89 myserial.println("AT+HTTPINIT");
90 delay(6000);
91 ShowSerialData();
92
93 myserial.println("AT+HTTPPARA=\"CID\",1");
94 delay(6000);
95 ShowSerialData();
96
97 StaticJsonBuffer<200> jsonBuffer;
98 JsonObject& object = jsonBuffer.createObject();
99
100 object.set("deviceID",deviceID);
101 object.set("humidity",humidity);
102 object.set("temperature",temperature);
103 object.set("timedate",t);
104
105 object.printTo(Serial);
106 Serial.println(" ");
107 String sendtoserver;
108 object.prettyPrintTo(sendtoserver);
109 delay(4000);
110
111 myserial.println("AT+HTTPPARA=\"URL\",\"http://192.xxxxxxxxxxxxxxxxxxxxxxxx.php\""); //Server address
112 delay(4000);
113 ShowSerialData();
114
115 myserial.println("AT+HTTPPARA=\"CONTENT\",\"application/json\"");
116 delay(4000);
117 ShowSerialData();
118
119
120 myserial.println("AT+HTTPDATA=" + String(sendtoserver.length()) + ",100000");
121 Serial.println(sendtoserver);
122 delay(6000);
123 ShowSerialData();
124
125 myserial.println(sendtoserver);
126 delay(6000);
127 ShowSerialData;
128
129 myserial.println("AT+HTTPACTION=1");
130 delay(6000);
131 ShowSerialData();
132
133 myserial.println("AT+HTTPREAD");
134 delay(6000);
135 ShowSerialData();
136
137 myserial.println("AT+HTTPTERM");
138 delay(10000);
139 ShowSerialData;
140
141 /********************GSM Communication Stops********************/
142
143 }
144
145
146 void ShowSerialData()
147 {
148 while (myserial.available() != 0)
149 Serial.write(myserial.read());
150 delay(1000);
151
}

Vous aimerez peut-être aussi