This post follows what I intended to do which is to pump sensor data consisting of temperature and altitude readings from the Xtrinsic sensor board to my Azure Event Hub named getfityall. The sensor board comes with some Python scripts already as you have seen in my earlier posts. Coupled with Microsoft Azure Python packages from the SDK, I could easily reuse a very nifty Python script I found from Kloud’s blog, a very competent Microsoft cloud partner, to send sensor data to my Azure Event Hub. The repurposed Python script looks like the following:
import sys import azure import socket from azure.servicebus.servicebusservice import ( ServiceBusSASAuthentication ) from azure.http import ( HTTPRequest, HTTPError ) from azure.http.httpclient import _HTTPClient class EventHubClient(object): def sendMessage(self,body,partition): eventHubHost = "youreventhubname.servicebus.windows.net" httpclient = _HTTPClient(service_instance=self) sasKeyName = "yourprocessorname" sasKeyValue = "yourprocessoraccesskey" authentication = ServiceBusSASAuthentication(sasKeyName,sasKeyValue) request = HTTPRequest() request.method = "POST" request.host = eventHubHost request.protocol_override = "https" request.path = "/youreventhubname/publishers/" + partition \ + "/messages?api-version=2014-05" request.body = body request.headers.append(('Content-Type', \ 'application/atom+xml;type=entry;charset=utf-8')) authentication.sign_request(request, httpclient) request.headers.append(('Content-Length', str(len(request.body)))) status = 0 try: resp = httpclient.perform_request(request) status = resp.status except HTTPError as ex: status = ex.status return status class EventDataParser(object): def getMessage(self,payload,sensorId): host = socket.gethostname() body = "{ \"DeviceId\" : \"" + host + "\"" msgs = payload.split(",") for msg in msgs: sensorType = msg.split(":")[0] sensorValue = msg.split(":")[1] body += ", " body += "\"SensorId\" : \"" + sensorId \ + "\", \"SensorType\" : \""; body += sensorType + "\", \"SensorValue\" : " \ + sensorValue + " }" return body
I saved and named this Python script as sendtelemtry.py.
Then in the mpl3115a2.py script, add the following import statements:
import socket import sendtelemetry
At the end of the script, replace the Python code with the following:
mpl = mpl3115a2() mpl.initAlt() #mpl.initBar() mpl.active() time.sleep(1) while 1: #print "MPL3115:", "\tAlt.", mpl.getAlt(), "\tTemp:", mpl.getTemp() hubClient = sendtelemetry.EventHubClient() parser = sendtelemetry.EventDataParser() hostname = socket.gethostname() message = "temperature:"+repr(mpl.getTemp())+",altitude:"+repr(mpl.getAlt()) body = parser.getMessage(message,"mpl3115") hubStatus = hubClient.sendMessage(body,hostname) print "[RPi->AzureEventHub]\t[Data]"+message+"\t[Status]"+str(hubStatus) time.sleep(0.1)
Then execute this script by doing
sudo python mpl3115a2.py
The Azure Event Hub REST API returns HTTP status code to indicate the result of the send event REST call. A HTTP status code of 201 means success. Read more about the send event REST call here. You can monitor your Azure Event Hub dashboard to see the incoming messages.
In the next post I will share more about what I’m doing with the preview feature of Azure Stream Analytics to do a toll-gate analysis of event data in transit. Thus far I had only been doing descriptive analytics of data at rest. This ought to be interesting because it requires a different understanding of what I would like to analyze.