LoginSignup
2

More than 3 years have passed since last update.

ラズベリーパイとESP32で温度管理システムの制作(3) 受信側 Pythonファイル

Last updated at Posted at 2020-01-13

仕様

ラズベリーパイに送信してきたESP32のデータをSQLiteに登録する

・起動時にUDP受信pythonファイルを実行
・ラズベリーパイにApacheをインストール・SQLiteを有効にする
・phpファイル作成。ブラウザで表示できるようにする

当方phpは習いたてなので、恐ろしくシンプルなものを作る予定です。

ファイル構成

home/pi/
  └SQLiteHTMLShow/
     ├UDP_SQLite.py
     └ db/
       └data.db

UDP受信→SQLite登録

UDP受信しSQLiteにデータを登録するpythonファイルを作ります。

python UDP_SQLite.py

# -*- coding: utf-8 -*-
import socket #UDP送信
import struct #数値→バイト列変換用
from contextlib import closing #with用

import sqlite3
import time
import datetime

import sys

UDP_IP = "" #このままでいい
UDP_PORT = 1234 #受信するポート番号
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) #ソケットの生成

sock.bind((UDP_IP, UDP_PORT)) #ソケットを登録する
#データベースを指定
dbname = '/home/pi/SQLiteHTMLShow/db/data.db'

with closing(sock): #プログラム終了時にソケットを自動的に閉じる

  while True: #無限ループ
    try:
      data, addr = sock.recvfrom(1024) #受信する

      #print ( data ) #バイト列をそのまま表示
      #print(addr[0]) #ipアドレスの表示
      #print(addr[1]) #送信元portの表示

      # データベース内のテーブルの名前
      ESP32 =addr[0].split('.')
      print('dbtable = ' + 'ip' + str(ESP32[2] + ESP32[3]))#IPアドレスの192.168以下をテーブル名にする
      dbtable = 'ip' + str(ESP32[2] + ESP32[3])

      # SQLiteへの接続    
      conn = sqlite3.connect(dbname)
      c = conn.cursor()

      # SQLiteにテーブルがあるかどうか確認する
      checkdb = conn.execute("SELECT * FROM sqlite_master WHERE type='table' and name='%s'" % dbtable)

      # もしテーブルがなかったら新規でテーブルを作成する
      if checkdb.fetchone() == None:
          create_table = '''create table ''' + dbtable + '''(id integer primary key autoincrement, time text,
                    ip text, port integer, temp text, humi text)'''
          print(create_table)

          c.execute(create_table)#実行
          conn.commit()

      # 温度、湿度、タイムスタンプを保存。
      sql = 'insert into ' + dbtable + '(time,ip,port,temp,humi) values (?,?,?,?,?)'

      todaydetail = datetime.datetime.today()
      time = todaydetail.strftime("%Y/%m/%d %H:%M:%S")
      ip = addr[0]
      port=addr[1]

      print(str(data))
      #まとめて送信しているデバイスNo、温度、湿度の文字列を分解
      val=str(data).replace('b','').replace("'",'').split(',')

      print(float(val[0]),float(val[1]))

      data= (time,ip,port,float(val[0]),float(val[1]))
      c.execute(sql, data)
      conn.commit()
      #接続を切る
      conn.close()
    except:
      print(sys.exc_info())

これでESP32で指定しているIPアドレスがそのままテーブル名になりSQLiteに登録されます。

もしESP32のIPアドレスを1個1個別にした場合、別にしただけのテーブルが作られることになります。

私は何れ仕事で使用した時に会社のIPアドレスを広く占有するのもなんだと思いIPアドレスは1個で使用します。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2