python - 从 Raspberry Pi 发送 base64 图像到 Rest Web 服务

标签 python raspberry-pi base64 python-requests

我在将图像发送到休息服务时遇到问题。我知道该服务正在运行,因为我已经向该服务发送了一个测试字符串(“测试字符串”),您可以在下面的 shell 信息中看到结果。我将图像转换为 Base64,然后尝试将其发送到服务并收到类型错误。我正在使用 Python 请求和 base64 库。下面显示了成功的调用和失败的调用。为了便于阅读,我缩短了 base64 字符串。

感谢您的帮助...

Python 3.4.2 (default, Oct 19 2014, 13:31:11)
[GCC 4.9.1] on linux
Type "copyright", "credits" or "license()" for more information.
>>> ================================ RESTART ================================
>>>
Gpio pin 25 is HIGH
file name = /home/pi/photo/2016-01-06_17.59.31.jpg
{'Content-Type': 'application/json', 'Content-Length': '141',
'User-Agent': 'python-requests/2.4.3 CPython/3.4.2 Linux/4.1.13+',
'Accept': 'text/plain', 'Accept-Encoding': 'gzip, deflate',
'Connection': 'keep-alive'}
"Success"
https://alerts4yousvc.azurewebsites.net/api/SendReading
200
Gpio pin 25 is LOW

>>> ================================ RESTART ================================
>>>
Gpio pin 25 is HIGH
file name = /home/pi/photo/2016-01-06_18.00.32.jpg
Traceback (most recent call last):
  File "/home/pi/Source/motionpi_http5.py", line 45, in <module>
    r = requests.post("https://alerts4yousvc.azurewebsites.net/api/SendReading",
json=payload, headers=headers)
  File "/usr/lib/python3/dist-packages/requests/api.py", line 94, in post
    return request('post', url, data=data, json=json, **kwargs)
  File "/usr/lib/python3/dist-packages/requests/api.py", line 49, in request
    return session.request(method=method, url=url, **kwargs)
  File "/usr/lib/python3/dist-packages/requests/sessions.py", line
443, in request
    prep = self.prepare_request(req)
  File "/usr/lib/python3/dist-packages/requests/sessions.py", line
374, in prepare_request
    hooks=merge_hooks(request.hooks, self.hooks),
  File "/usr/lib/python3/dist-packages/requests/models.py", line 307, in prepare
    self.prepare_body(data, files, json)
  File "/usr/lib/python3/dist-packages/requests/models.py", line 424,
in prepare_body
    body = json_dumps(json)
  File "/usr/lib/python3.4/json/__init__.py", line 230, in dumps
    return _default_encoder.encode(obj)
  File "/usr/lib/python3.4/json/encoder.py", line 192, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "/usr/lib/python3.4/json/encoder.py", line 250, in iterencode
    return _iterencode(o, 0)
  File "/usr/lib/python3.4/json/encoder.py", line 173, in default
    raise TypeError(repr(o) + " is not JSON serializable")
TypeError: b'/9j/4WQGRXhpZgAATU0AKgAAAAgACgEAAAQAAAABAAABQAEBAAQAAAABAAAA8AEPAAIAAAAMAAAAhgEQAAIAAAAKAAAAkgEaAAUAAAABAAAAnAEbAAUAAAABAAAApAEoAAMAAAABAAIAAAEyAAIAAAAUAAAArAITAAMAAAABAAEAAIdpAAQAAAABAAAAwAAAA4hSYXNwYmVycnlQaQBSUF9PVjU2NDcAAAAASAAAAAEAAABIAAAAATIwMTY6MDE6MDYgMTg6MDA6MzIAABeCmgAFAAAAAQAAAdqCnQAFAAAAAQAAAeKIIgADAAAAAQADAACIJwADAAAAAQD6AACQAAAHAAAABDAyMjCQAwACAAAAFAAAAeqQBAACAAAAFAAAAf6RAQAHAAAABAECAwCSAQAKAAAAAQAAAhKSAgAFAAAAAQAAAhqSAwAKAAAAAQAAAiKSBQAFAAAAAQAAAiqSBwADAAAAAQACAACSCQADAAAAAQAAAACSCgAFAAAAAQAAAjKSfAAHAAABPAAAAjqgAAAHAAAABDAxMDCgAQADAAAAAQABAACgAgAEAAAAAQAAAUCgAwAEAAAAAQAAAPCgBQAEAAAAAQAAA3akAgADAAAAAQAAAACkAwADAAAAAQAAAAAAAAAAAAHoPgAPQkAAAHE4AAAnEDIwMTY6MDE6MDYgMTg6MDA6MzIAMjAxNjowMTowNiAxODowMDozMgAALcczAA9CQAAAd/EAACcQAAAAAwAAAGQAAHfxAAAnEAAAjIgAACcQZXY9LTEgbWx1IyxD/AP/Z'
is not JSON serializable

这是我正在使用的代码...

import RPi.GPIO as GPIO
import time
import picamera
import datetime
import base64
import requests
import urllib
import json

def get_file_name():
    return datetime.datetime.now().strftime("%Y-%m-%d_%H.%M.%S.jpg")

sensor = 25

GPIO.setmode(GPIO.BCM)
GPIO.setup(sensor,GPIO.IN,GPIO.PUD_DOWN)

previous_state = True
current_state = False
client_key="79c538c0f239"
task_key="ece0e81a26f1"


cam = picamera.PiCamera()
cam.resolution =(320,240)

while True:
    time.sleep(1)   
    previous_state = current_state   
    current_state = GPIO.input(sensor)
   # print("previous_state %s" %(previous_state))
   # print("current_state %s" %(current_state))
    if current_state != previous_state:
      #  print("4")
        new_state = "HIGH" if current_state else "LOW"
        print("Gpio pin %s is %s" % (sensor, new_state))
        if current_state:
            fileName = get_file_name()
            imgpath = "/home/pi/photo/" + fileName
            print("file name = %s" % (imgpath))
            cam.capture(imgpath)
            image_64 = base64.b64encode(open(imgpath,"rb").read())
            payload = {"ClientKey": client_key,"TaskId": task_key, "MsgBody":image_64, "Reading":1}
            headers = {'Content-Type': 'application/json', 'Accept':'text/plain'}
            r = requests.post("https://alerts4yousvc.azurewebsites.net/api/SendReading", json=payload, headers=headers)
            print(r.request.headers)
            print(r.text)
            print(r.url)
            print(r.status_code)

最佳答案

我想你可能会做

 image_64 = str(base64.b64encode(open(imgpath,"rb").read()).decode("ascii"))

关于python - 从 Raspberry Pi 发送 base64 图像到 Rest Web 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34645791/

相关文章:

python - Apache Airflow 中调度程序间隔和启动时间的工作不正确

java - OpenCV 在 System.loadLibrary() 上因 SIGSEGV 崩溃;

c++ - 以编程方式从节能或屏幕保护程序中唤醒操作系统

iphone - NSString 的 Base64 编码

python - 如何在 npyscreen 中制作退出按钮?

python Pandas 如果列表中的列中的单词在新列中添加 Y 标志

python - 如何避免 Numpy 类型转换?

java - 如何通过互联网将 Python 脚本中的数据发送到 Android 应用程序,反之亦然。

java - 如何解码 base 64 数据

javascript - 通过 JavaScript 进行 Base64URL 解码?