Het is gelukt!
Vanaf mijn sim7000e gaat het bericht nu naar een raspberry-pi bij mij thuis. (jaja, het kan beter)
Daar komt het in Python Flask terecht, die niets anders doet dan de json data uitkleden en ombouwen.
Flask zet de uitgeklede json data door naar een lokaal op die raspberry-pi geinstalleerde ThingsBoard.
Helaas niet zonder een “lokale server” maar op een oude raspberry-pi Model B uit mijn rommelkast kost deze demo omgeving met alsnog “niets”.
Het zal in Flask vast netter kunnen, maar dit is zoals het nu werkt:
Vanuit de sim7000e stuur ik een pakketje json-style data:
AT+CIPSTART=“UDP”,“172.27.131.100”,15683
AT+CIPSEND=48
{“latitude”: 52.136421, “longitude”: 5.262903}
(fake locatie!)
De Callback URL wijst naar het IP adres van mijn router, waarop een Port-Forward is ingesteld van buiten [80] naar binnen [8081]. Flask draait dan op [8081]. (Thingsboard draait op [8080] en is vooralsnog alleen voor mij binnen bereikbaar)
In Flask wordt het mega-pakket van T-Mobile gestript:
from flask import Flask, request, jsonify, json
import requests
app = Flask(__name__)
@app.route(‘/api/v1/Pca6uieWinGX6FjubpA6/telemetry’, methods=[‘POST’])
def hello():
data = request.data
data = data.replace(“u’”,“'”)
data = data.replace(“'”,“\”“)
data = data.replace(“L,”,”,")
msg = json.loads(data)
s = msg[‘reports’][0][‘value’].decode(‘hex’)
newmsg = json.loads(s)
json_str = ‘{“longitude”: ‘+ str(newmsg[‘longitude’]) + ’ ,“longitude”: ’ + str(newmsg[‘latitude’]) +’}’
url = ‘http://localhost:8080/api/v1/[key]/telemetry’
r = requests.post(url, json_str)
return ‘’,200
if __name__ == ‘__main__’:
app.run(host= ‘0.0.0.0’,port=8081,debug=True)
En in Thingsboard heb ik een Device die de longitude en longitude omzet naar een plattegrond.
Overigens liep ik hier ook even tegen het probleem aan dat de Callback URL alleen kan worden aangepast (naar mijn huis-router) wanneer een lege body toch een http code 200 teruggeeft. Maar met eenmalig een return ‘’,200 bovenin de hello-functie (die daarna weg kon) was dat nu snel opgelost.
Nu nog voor de show een https certificaat regelen bij Let’s-Encrypt en zien of/hoe dat met Flask geregeld kan worden…
En het viel me op dat ik soms een veel uitgebreidere json binnenkrijg dan de andere keren.
De grote versie begint met
{“responses”:
Terwijl de kleine versie begint met
{“reports”:
Ik twijfel nog of ik het Flask script conditioneel moet laten strippen, afhankelijk van welke variant er binnenkomt?