RaspberryPi3からAWS IoTへセンサデータの送信
AWS IoT SDK for JavaScriptのインストール
githubのREADMEを参考に、AWS IoT SDKをインストール
nodejsのバージョンは
node -v v4.4.4
npm install aws-iot-device-sdk cd /home/pi (任意のディレクトリでOK) git clone https://github.com/aws/aws-iot-device-sdk-js.git cd aws-iot-device-sdk-js npm install
センサー情報の取得
センサー情報はGrove+を使って取得する
AWS IoT SDKはnode.jsを使っているけれど、センサーデータはpythonで取得する
まずはpythonのコードを作成する
#!/usr/bin/env python import sys sys.path.append('/home/pi/Desktop/GrovePi/Software/Python/') import time import datetime from grovepi import * import serial # for GPS ser = serial.Serial('/dev/ttyAMA0', 9600, timeout = 0) #Open the serial port at 9600 baud ser.flush() class GPS: inp=[] GGA=[] def read(self): while True: GPS.inp=ser.readline() if GPS.inp[:6] =='$GPGGA': # GGA data , packet 1, has all the data we need break time.sleep(0.1) try: ind=GPS.inp.index('$GPGGA',5,len(GPS.inp)) GPS.inp=GPS.inp[ind:] except ValueError: hoge="fuga" GPS.GGA=GPS.inp.split(",") return [GPS.GGA] def vals(self): time=GPS.GGA[1] lat=GPS.GGA[2] lat_ns=GPS.GGA[3] long=GPS.GGA[4] long_ew=GPS.GGA[5] fix=GPS.GGA[6] sats=GPS.GGA[7] alt=GPS.GGA[9] return [time,fix,sats,alt,lat,lat_ns,long,long_ew] # for Japan Timestamp class JapanTZ(datetime.tzinfo): def tzname(self, dt): return "JST" def utcoffset(self, dt): return datetime.timedelta(hours=9) def dst(self, dt): return datetime.timedelta(0) ptemperature = 3 pmoisture = 0 plight = 1 gps = GPS() pinMode(ptemperature,"INPUT") pinMode(pmoisture,"INPUT") pinMode(plight,"INPUT") time.sleep(1) [temperature, humidity] = dht(ptemperature, 1) moisture = analogRead(pmoisture) light = analogRead(plight) gps.read() [t,fix,sats,alt,lat,lat_ns,long,long_ew] = gps.vals() try: latitude = str(float(lat)/100) longitude = str(float(long)/100) except ValueError: latitude = 0 longitude = 0 time.sleep(.5) print("{0},{1},{2},{3},{4},{5},{6}".format(datetime.datetime.now(JapanTZ()).strftime('%Y-%m-%dT%H:%M:%S+09:00'), temperature, humidity, moisture, light, latitude, longitude)) ser.close()
次にnode.jsのコード
5分間隔でセンサーデータを取得し、AWS IoTクラウドへ送信する
private.pem.key、certificate.pem.crt、root-CA.crtは、AWS IoTのクラウドコンソールからダウンロードしておき、任意のディレクトリに配置しておく
pythonコードの実行は、child_processのexecファンクションを使用する(pythonの標準出力を、execファンクションに設定したコールバック関数の引数として受け取れる)
var awsIot = require('aws-iot-device-sdk'); var sys = require('sys') var exec = require('child_process').exec; var device = awsIot.device({ privateKey: './certs/private.pem.key', clientCert: './certs/certificate.pem.crt', caCert: './certs/root-CA.crt', clientId: 'test_client', region: 'ap-northeast-1' }); device.on('connect', function() { console.log('Connect!!'); setInterval(function() { exec("python /path to python code", function(error, stdout, stderr) { if (error !== null) { console.log('exec error: ' + error); return } var data = stdout.replace(/\r?\n/g,""); var datas = data.split(",") var record = { deviceid: "pi_01", timestamp: datas[0], temperature: Number(datas[1]), humidity: Number(datas[2]), moisture: Number(datas[3]), light: Number(datas[4]), location: datas[5] + "," + datas[6] }; var message = JSON.stringify(record); console.log("Publish: " + message); device.publish('pi_test', message); }); return; }, 300000); });