仕様
ラズベリーパイに送信してきた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個で使用します。