質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

2840閲覧

RaspberryPiからさくらレンタルサーバーのMySQLにセンサー値を登録したい

kumabear

総合スコア4

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/04/17 10:25

実現したいこと

RaspberryPiに接続したセンサーで得た座標や温度などの値を、さくらレンタルサーバーのMySQLに数分おきに追加していきたいと考えています。
インデペンデンスシステムズ様のページを参考に、さくらのレンタルサーバー上にデータベースとPHPを置いてjson形式のデータをpostするという形で進めておりますが、Pythonがエラーをはいてしまいます。
何か方法や解決策をご存じの方いらっしゃいましたらご教授いただきたく、おねがい申し上げます。

該当のソースコード

Python

1import requests 2import json 3 4from datetime import datetime 5 6def uploadSensorValues(temp, hum, press): 7 8 url = '(サーバーアドレス)/sensvalues.php' 9 10 sensorsdata = {'datetime':datetime.now().strftime("%Y/%m/%d %H:%M:%S"),'temp':temp,'hum':hum,'press':press} 11 12 print(json.dumps(sensorsdata)) 13 14 headers = {'content-type': 'application/json'} 15 16 res = requests.post(url, data=json.dumps(sensorsdata), headers=headers, verify=False) 17 18 print(res.json()) 19 pass 20 21def main(): 22 23 uploadSensorValues(21.8, 39.1, 1020) 24 25if __name__ == '__main__': 26 main()

エラーメッセージ

{"datetime": "*", "temp": 21.8, "hum": 39.1, "press": 1020} Traceback (most recent call last): File "C:/Users/*/Desktop/*/test.py", line 31, in <module> uploadSensorValues(temp,hum,press); File "C:/Users/*/Desktop/*/test.py", line 17, in uploadSensorValues print(res.json()) File "C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python37_64\lib\site-packages\requests\models.py", line 898, in json return complexjson.loads(self.text, **kwargs) File "C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python37_64\lib\json\__init__.py", line 348, in loads return _default_decoder.decode(s) File "C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python37_64\lib\json\decoder.py", line 337, in decode obj, end = self.raw_decode(s, idx=_w(s, 0).end()) File "C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python37_64\lib\json\decoder.py", line 355, in raw_decode raise JSONDecodeError("Expecting value", s, err.value) from None json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

試したこと

Python

1res = requests.post(url, data=json.dumps(sensorsdata), headers=headers, verify=False) 23res = "requests.post(url, data=json.dumps(sensorsdata), headers=headers, verify=False)"

その後のエラーメッセージ

{"datetime": "*", "temp": 21.8, "hum": 39.1, "press": 1020} Traceback (most recent call last): File "C:/Users/*/Desktop/*/test.py", line 26, in <module> main() File "C:/Users/*/Desktop/*/test.py", line 23, in main uploadSensorValues(21.8, 39.1, 1020) File "C:/Users/*/Desktop/*/test.py", line 18, in uploadSensorValues print(res.json()) AttributeError: 'str' object has no attribute 'json'

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

レンタルサーバ側で意図したレスポンス返してないのでは?

投稿2020/04/17 10:44

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

自己解決

ご回答いただきありがとうございました!
結局jsonはあきらめ、データを格納した変数をbyte配列に変換して、urllibでそのまま送った結果うまくいってしまいました...
当面の間はこれで良しとしたいと思います。

##RaspberryPi側

Python

1import urllib.request 2import urllib.parse 3 4posturl = 'サーバーアドレス/receive.php' 5#送信先設定 6postrawdata = { 7 'a':a, 8 'b':b, 9 'c':c, 10  } 11#送信データセット 12postdata = urllib.parse.urlencode(postrawdata) 13postbyte = postdata.encode('utf-8') 14#byte変換 15response = urllib.request.urlopen(posturl, postbyte) 16#post実行 17body = response.read().decode('utf-8') 18print(body) 19#返り値表示

##さくらのレンタルサーバー側

php

1//login.php 2<?php 3//*を変更 4$server = "*.sakura.ne.jp"; //DBサーバアドレス 5$user = "*"; //ユーザ名 6$pass = "*"; //パスワード 7$dbname = "*"; //データベース名 8?>

php

1//receive.php 2<?php 3ini_set('display_errors',1); 4error_reporting(E_ALL); 5session_start(); 6//エラー内容表示させる 7 8$a1 = $_POST['a']; 9$b1 = $_POST['b']; 10$c1 = $_POST['c']; 11//変数a1,b1,c1に送られてきたデータa,b,cを入れる 12 13require_once('login.php'); 14$conn = new mysqli($server, $user, $pass, $dbname); 15//login.phpの情報をもとにSQLにログイン 16 17$sql = "INSERT INTO receivedata (a2,b2,c2) VALUES ('$a1','$b1','$c1')"; 18//テーブルreceivedataのカラムa2,b2,c2にa1,b1,c1の値を入れる 19 20if ($conn->query($sql) === TRUE) { 21 echo "OK"; 22} else { 23 echo "Error: " . $sql . "<br>" . $conn->error; 24} 25//結果返答

投稿2020/04/18 02:05

kumabear

総合スコア4

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問