1 pièce(s) jointe(s)
Comment utiliser PycURL pour envoyer des paramètre avec la méthode POST
Bonjour à tous,
Depuis mon Raspberry, je dois envoyer des données via ma connexion WiFi, à un server distant.
C'est un fichier PHP qui va traiter les données.
J'ai déjà mon scropt PHP prêt, qui recois les données envoyées par The Things Network en POST.
Laissez-moi vous expliquer en quelques lignes le but de l'exrcices pour mieux comprendre où je veux en venir.
Sur mon Raspberry, je prends des mesures et je les envoie avec le protocole LoRaWAN à TTN (The Thinks Network). Les serveurs TTN ont un intégrateur HTTP qui va me les retourner sur mon serveur avec la méthode POST.
Donc mon script PHP est prêt et fonctionne dans ce cas de figure.
Actuellement, mon deuxième raspbbery ne peut pas envoyer les données avec le protocole LoRaWAN, mais il est connecté au réseau WiFi.
Donc je dois encoyer ces même donnée directement à mon serveur, ... le même script PHP var les recevoirs et traiter les données, comme il le fait quand il les reçoit vie TTN.
Mon fichier PHP commence comme cel
Code:
1 2 3 4 5 6 7 8
|
ini_set("display_errors",1);
$gmdate= gmdate("Y-m-d H:i:s");
# Get measures from TTN
$postdata = file_get_contents('php://input');
# Convert json to array
$payload = json_decode($postdata,true); |
Puis il va récupérer les données ainsi
Code:
1 2 3
|
$app_id = $payload['app_id'];
$dev_id = $payload['dev_id']; |
et ainsi de suite pour les autres paramètres POST.
Donc en ce qui concerne Python et PycURL
J'ai trouvé un tuto qui indique comment, le faire. Mais j'ai en doute si la methode POST est bien utilisée car mon code PHP ne l'interprete pas ainsi.
Voci ce que j'ai pour python
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
|
payload_curl = {}
payload_curl["app_id"] = "aqi-sds011"
payload_curl["dev_id"] = "sds011-12"
payload_curl["a"] = int(pmt_2_5 * 100) # p1 (pm2.5)
payload_curl["b"] = int(pmt_10 * 100) # p2 (pm10)
payload_curl["c"] = int(aqi_2_5 * 100) # a1 (aqi2.5)
payload_curl["d"] = int(aqi_10 * 100) # a2 (aqi10)
payload_curl["e"] = int(lat * 10000) # la (lat)
payload_curl["f"] = int(lon * 10000) # lo (lon)
payload_curl["g"] = str(timestamp_now) # ti (timestamp)
payload_curl["h"] = int(bat1*100) # b1 (input 1)
payload_curl["i"] = int(bat2*100) # b2 (input 2)
payload_curl["j"] = int(bat3*100) # b3 (inout 2)
payload_curl["k"] = co2 # co (CO2)
print('[INFO] Sending data with PycURL')
crl = pycurl.Curl()
crl.setopt(crl.URL, 'http://www.website.ch/folder/file.php')
# data exemple: {"app_id":"aqi-sds012","dev_id":"sds011-12","p1":"","p2":""}
pf = urlencode(payload_curl)
crl.setopt(crl.POSTFIELDS, pf)
crl.perform()
crl.close() |
Voilà ce qu'il se passe du côté PHP
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| # Je recupère les données envoyées en POST
$postdata = file_get_contents('php://input');
# Convert json to array
$payload = json_decode($postdata,true);
# Je récupère les valeurs de app_id
$app_id = $payload['app_id'];
# Je récupère la valeur de dev_id
$dev_id = $payload['dev_id'];
#Pour voir ce que je recois, je le sauve les données envoyées dans un fichier de mon serveur
file_put_contents('../log/tmp/'.$dev_id.'-'.gmdate("ymdHis").'.json', $postdata . PHP_EOL, FILE_APPEND);
# Je quitte pour que le reste du code ne fasse rien de plus
exit(); |
Je précise que ce code fonctionne très bien quand les données sont envoyées depuis TTN.
dans la variable $postdata, je retrouve tous mes paramètres envoyés. Et je les vois aussi dans le fichier json créé dans le dossier /log/tmp/
Donc les valeurs sont bien envoyées et reçues.
Mais par contre, il semble que la variable $payload ne contient rien
Code:
$payload = json_decode($postdata,true);
car le nom du fichier json ne contien pas la valeur de dev_id
Code:
$dev_id = $payload['dev_id'];
Je ne comprends pas trop pourquoi, si ca marche dans un sens, pourquoi ca ne marche pas dans l'autre?
Théoriquement l'explication que je vois
Code:
$postdata = file_get_contents('php://input');
$postdata n'est pas un format JSON
donc ceci
Code:
$payload = json_decode($postdata,true);
Ne vas pas decoder la chaine json en array.
Pourtant j'ai vérifié sur ma console TTN que les données sont bien envoyée en POST
Pièce jointe 567190
Serait-il peut être un string au format JSON qui en envoyé en POST?
(en écrivant ce post, peut être que je trouve la réponse :D)
Mais le but de ce post est de vérifier mon script Python, si je le fais bien avec la methode POST?
M'avez-vous suivi?