ASP.NET Web APIでデータ蓄積の7回目です。前回までで少なくとも温度データが登録出来るASP.NET Web APIが出来ました。今回はRaspbery Piに実際に温度センサを接続して温度データを蓄積してみます。今回使用する温度センサについては以下で書きました。
温度センサADT7410(その1)i2C通信とは
温度センサADT7410(その3)Raspbery Piでの利用
今回はRaspbery Pi上で動作するプログラムを書きます。pythonで取得した温度センサのデータをPostする部分を書きます。Raspbery Pi側は以下のような構成です。もちろん、ASP.NET Web APIのPCと同一ネットワークで通信出来ることが前提です。
pipとrequetsのインストール
まずは、Raspbery Pi側での作業です。requestsをインストールするために先にパッケージマネージャのpipをインストールしました。以下がマニュアルです。
Installation pip 7.1.0 documentation
私の場合は結局は以下のページの方法を使いました。ありがとうございます。
いつの間にかpipのインストールが楽になってた件
以下です。
$ sudo curl -kL https://raw.github.com/pypa/pip/master/contrib/get-pip.py | sudo python
このpipを使ってrequetsパッケージのインストールをします。requetsパッケージを利用してHTTPのPost通信を行います。他にもpythonでHTTP通信を実行する方法はありますが、このrequetsが簡単かと思いましたので使ってみます。
$ sudo pip install requests
requestsでの動作確認
簡単なHTTPのGETでrequestsの動作確認します。以下のようなスクリプトを書きました。
import requests def main(): res = requests.get('http://www.example.com/') print res.text if __name__ == '__main__': main()
要するにブラウザで表示すると以下のように表示されるページをGETしてレスポンスを表示するという処理です。
http://www.example.com/
以上は簡単な例ですが、同様に前回のAPIのURLにJSON形式の温度データのパラメータと共にPOSTすればいいだろうということです。
IIS Expressでの外部からのアクセス
実際に温度データを取得してPOSTするスクリプトを書く前にASP.NET Web APIが動作するWindows側での作業です。
ASP.NET Web API開発時に利用出来るIIS Express(テスト用のWEBサーバ)はデフォルトでは他のコンピュータからはアクセス出来ないです。これをアクセス出来るように設定します。
以下のページを見ながら作業をしました。ありがとうございます。
IIS Express で localhost 以外からアクセスする方法
以下のファイルを編集します。
C:\Users\ユーザ名\Documents\IISExpress\config\applicationhost.config
Visual Studioで作成して実行したプロジェクトのサイト名になるURLが定義されています。これを探して外部からアクセス出来るホスト名を追加します。
<site name="ASPNETWebApiTemperature" id="16"> <application path="/" applicationPool="Clr4IntegratedAppPool"> <virtualDirectory path="/" physicalPath="c:\users\nishi_000\documents\visual studio 2013\Projects\ASPNETWebApiTemperature\ASPNETWebApiTemperature" /> </application> <bindings> <binding protocol="http" bindingInformation="*:62205:localhost" /> <binding protocol="http" bindingInformation="*:62205:isydell.local" /> </bindings> </site>
追加したのは以下の行の部分です。
<binding protocol="http" bindingInformation="*:62205:isydell.local" />
次にVisual Studioでこのサイト名になるように設定します。Visual Studioのメニューから、[プロジェクト] の[(プロジェクト名)のプロパティ]で以下のように設定しました。
以下のように権限を追加します。コマンド プロンプトを「管理者として実行」して実行します。(ここでのホスト名はAvahiでのホスト名です。)そのコマンドプロンプトで以下のようにを入力します。ホスト名とポート番号は私の場合です。必要な場合は読み替えて下さい。
netsh http add urlacl url=http://isydell.local:62205/ user=everyone
以上で私の環境では外部からアクセス出来るようになりました。
Raspberry PiからのPOST
温度センサを以下のページのように接続して温度が表示出来るか確認しておきます。
温度センサADT7410(その3)Raspbery Piでの利用
これを利用してrequestsとjsonを組み合わせて以下のようなスクリプトにしました。(※エラー処理等細かい部分は書いていません。動作は一切無保証です。)
#!/usr/bin/python # -*- coding: utf-8 -*- import smbus import time import requests import json def tempDataPost(tval): url = 'http://isydell.local:62205/api/TemperatureDatas' dtInit = '2015-01-01 00:00:00' tmpdata = {'DeviceId':100, 'TemperatureValue':tval, 'CreatedDateTime':dtInitt } headers = {'content-type': 'application/json'} res = requests.post(url, data=json.dumps(tmpdata), headers=headers) #print res.json() def adt7410(): i2c = smbus.SMBus(1) address = 0x48 block = i2c.read_i2c_block_data(address, 0x00, 2) val = block[0] << 8 #上位ビットをシフトしてセット val = val | block[1] #下位ビットをORでセット val = val >> 3 #右へシフトで13ビット化 # 以下プラス、マイナス判定をして温度を計算する if(val >= 4096): val = val - 8192 print("Temperature:%6.2f" % (val / 16.0)) return val def main(): while True: try: val = adt7410() tempDataPost(val/16.0) except: pass time.sleep(30) if __name__ == '__main__': main()
30秒ごとに温度センサのデータを取得してASP.NET Web APIにPOSTしています。これで何とか動作しました。試しに2時間ほどですが蓄積してみました。開発用のデータベースから単純にExcelにコピーアンドペーストでデータをコピーしてチャート表示しました。
2015年7月22日の23:30ごろから翌日の1:30ごろまでです。少しですが下降していくのが確認出来ました。これで何とか今回の大きなテーマであるASP.NET Web APIでデータ蓄積が確認出来ました。
応用的な内容はここからになると思いますが今回のシリーズはここまでです。また応用的な内容や関連する内容等書けたら書きます。
※2015/08/07 以下を書きました。
ASP.NET Web APIでデータ蓄積の続き(その1)データ表示ページ
ASP.NET Web APIでデータ蓄積の続き(その2)グラフ表示
今回のシリーズの一覧です。
ASP.NET Web APIでデータ蓄積(その1)ASP.NET Web APIとは
ASP.NET Web APIでデータ蓄積(その2)ASP.NET コードファーストでのモデル構築
ASP.NET Web APIでデータ蓄積(その3)ASP.NET ApiControllerクラス
ASP.NET Web APIでデータ蓄積(その4)ASP.NET ApiControllerクラスとView
ASP.NET Web APIでデータ蓄積(その5)ASP.NET Web APIテンプレートからの構築
ASP.NET Web APIでデータ蓄積(その6)ASP.NET Web APIでの動作確認
ASP.NET Web APIでデータ蓄積(その7)Raspbery Piからの温度データ蓄積
その他関連サイト
Getting Started with ASP.NET Web API 2 (C#)
Using Web API 2 with Entity Framework 6
Entity Framework Code First の規約
Entity Framework Code First のデータ注釈
Entity Framework での新しいデータベース向けの Code First
Amazon関連商品