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

Issue sending base64 image to Rest web service from Raspberry Pi

我在将图像发送到休息服务时遇到问题。我知道该服务正在运行,因为我已经向该服务发送了一个测试字符串 ("test string"),您可以在下面的 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"))