記事のディレクトリ
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がパラメーター付きの変数を挿入する問題が表示されない
通常の挿入ステートメントを次のように変更するだけです:(同時に、プレースホルダーと二重引用符に注意してください)