Raspberry PiはSocketを使用してデータをPCに送信し、データベースに保存します


1.はじめに

  プロジェクトでは、センサーで検出されたデータをRaspberry Piを介してPCに送信する必要があるため、Raspberry PiとPCの間の通信についてシミュレーション実験を行いました。実験では、Raspberry Piをクライアントとして使用しSocket、PCをサーバー。データを送信しpymysql、受信したデータをローカルデータベースに挿入します。

2.ハードウェアの準備

1.ラズベリーパイ4B * 1

2.ネットワークケーブル* 1

  ローカルエリアネットワークを介して通信するため、ネットワークケーブルでPCまたはルーターに接続する必要があります。ワイヤレスで通信する場合は、クラウドサーバーを構築できます。クラウドサーバーを構築するには、クラウドサーバーを呼び出すことで実装できます。Iここではあまり紹介しません。

  ケーブルを介してPCを接続する方法がわからない場合は、直接接続されたPCのネットワークケーブルであるRaspberry Pi4Bを参照してください。

3、ソフトウェアの準備

  プログラムを実行するときは、最初にPCを実行してから、RaspberryPiを実行します。

1. PC(サーバー)

import pymysql  # 导入 pymysql
import socket
import time

print("服务端开启")
# 套接字接口
mySocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 设置IP和端口
host = '192.168.137.1'
port = 2222
# bind绑定该端口
mySocket.bind((host, port))
mySocket.listen(10)

# 打开数据库连接
db = pymysql.connect(
    host='localhost',
    port=3306,
    user='root',
    passwd='123456',
    db='skdb',
    charset='utf8'
)
print("数据库开启")
# 使用 cursor() 方法创建一个游标对象 cursor
cursor = db.cursor()
sqltime = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))

while True:
    # 接收客户端连接
    print("等待连接....")
    client, address = mySocket.accept()
    print("新连接")
    print("IP is %s" % address[0])
    print("port is %d\n" % address[1])
    while True:
        # 读取消息
        msg = client.recv(1024)
        # 把接收到的数据进行解码
        print(msg.decode("utf-8"))
        print("读取完成")

        # SQL 插入语句
        # sql = "INSERT INTO MAGNETISM(MTIME , MFLAG) VALUES ('%s','%s')" % (sqltime, msg.decode("utf-8"))
        sql = "INSERT INTO MAGNETISM(MFLAG) VALUES ('%s')" % (msg.decode("utf-8"))

        try:
            # 执行sql语句
            cursor.execute(sql)
            # 提交到数据库执行
            db.commit()
        except:
            # 如果发生错误则回滚
            db.rollback()

        time.sleep(10)

        if msg == "over":
            client.close()
            mySocket.close()
            # 关闭数据库连接
            db.close()
            print("程序结束\n")
            exit()

2.ラズベリーパイ(クライアント)

import socket
import time
print("客户端开启")
#套接字接口
mySocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#设置ip和端口
host = '192.168.137.1'
port = 2222

try:
    mySocket.connect((host, port)) ##连接到服务器
    print("连接到服务器")
except :                           ##连接不成功,运行最初的ip
    print ('连接不成功')
    
while True:
    #发送消息
    msg = '9'
    #编码发送
    mySocket.send(msg.encode("utf-8"))
    print("发送完成")
    
    time.sleep(10)
    
    if msg == "over":
        mySocket.close()
        print("程序结束\n")
        exit()       
print("程序结束\n")


3.実験結果

  クライアントはシミュレートされたデータ9を10秒ごとにサーバーに送信し、サーバーはそれを受信して​​mysqlデータベースに保存します。
ここに画像の説明を挿入
データベーステーブル:
データベーステーブル

4、問題の要約

1. Socket of Pythonは、PCとRaspberryPi間のインタラクティブな通信を実現します

  Raspberry PiとPCのSocket通信部分は、Socket of Pythonのこの記事を参照して、PCとRaspberryPi間の対話型通信を実現します。PCがRaspberryPiにデータを送信することを認識します。次に、RaspberryPiに変更しました。 PCはデータを送信します。
ここに画像の説明を挿入

2.新人チュートリアルによって与えられたpymysqlデータベース接続の問題

ルーキーチュートリアルの例の接続エラーは、古くなっているか何かである可能性があります。わかりません。

#!/usr/bin/python3
 
import pymysql
 
# 打开数据库连接
db = pymysql.connect("localhost","testuser","test123","TESTDB" )
 
# 使用 cursor() 方法创建一个游标对象 cursor
cursor = db.cursor()
 
# 使用 execute()  方法执行 SQL 查询 
cursor.execute("SELECT VERSION()")
 
# 使用 fetchone() 方法获取单条数据.
data = cursor.fetchone()
 
print ("Database version : %s " % data)
 
# 关闭数据库连接
db.close()

次のように変更します。

# 打开数据库连接
db = pymysql.connect(
    host='localhost',
    port=3306,
    user='root',
    passwd='123456',
    db='skdb',
    charset='utf8'
)

データベース、ユーザーなどは独自のものに変更する必要があります。

3.pymysqlがパラメーター付きの変数を挿入する問題が表示されない

通常の挿入ステートメントを次のように変更するだけです:(同時に、プレースホルダーと二重引用符に注意してください)
ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/qq_41071754/article/details/114600531