サンプルプログラム

サンプルプログラム(USBカメラによる画像送信)

 今回は、USBカメラと接続してみます。

RaspberryPiとUSBカメラの接続

 USBカメラはLogicoolのものを使用しました。
何かしら特別なことは必要なく、USBに挿し込むだけの接続です。

※写真ではSORACOMのUSBドングルが映っていますが、特にWi-Fiが使用できる場所では必要ありません。Wi-Fiがない環境であれば、SORACOM SIMを利用することによって接続が可能です。

クラウドと通信するための情報

 用意するのは次のとおりです。SensingApp のアカウントを用意したら、センサーを登録した後、次の情報をご確認下さい。

  1. USER ID
  2. 写真送信先URL

 以上の情報をご用意いただければ、USBカメラの画像をSensingAppに送信して閲覧することが可能です。

SensingApp画面のユーザー情報で、①と②のUSER IDと写真送信先URLを確認できます。

RaspberryPiの必要パッケージ

コードを書く前に、次のように必要なパッケージをインストールしておきます。
(事前にupdate&upgradeを終えておきます)

$ pip3 install opencv-python

$ pip3 install opencv-contrib-python

$ pip3 install Pillow

サンプルコード(Python)

RaspberryPiで動作させるサンプルコードを示します。

データ送信先のURLとUSER_IDは各自の情報に変更ください。

# -*- coding: utf-8 -*-
# USBカメラの画像送信のサンプルプログラム
#

import base64
import json
import urllib.request
from datetime import datetime
import time
import cv2
from io import BytesIO
from PIL import Image

# データ送信先
URL = "https://beta.sensingapp.io/api/image/"
USER_ID = "4bf7ee7c-be3f-43f6-a732-02b14de660be"  

file_name = "sample.png"
image_section = "事務所"

while True:
    try:
        ## 画像取得処理(USBカメラから)
        capture = cv2.VideoCapture(0)
        time.sleep(2)    # 画像が暗くならないように間を取る
        ret, frame = capture.read()
        cv2.imwrite(file_name, frame)

        img = Image.open(file_name)
        capture.release()

        ## 送信処理
        # PillowImageをbytesに変換してさらにbase64に変換
        buffered = BytesIO()
        img.save(buffered, format="JPEG")
        img_byte = buffered.getvalue() # bytes
        img_base64 = base64.b64encode(img_byte) 
        img_str = img_base64.decode('utf-8') 

        obj = {
                "user_id": USER_ID,
                "image_section": image_section,
                "uploaded_at": datetime.now().strftime('%Y-%m-%d %H:%M:%S'),
                "image_file": img_str,
            }
        json_data = json.dumps(obj).encode("utf-8")

        # httpリクエストを準備してPOST
        request = urllib.request.Request(
                URL, data=json_data, method="POST",
                headers={"Content-Type": "application/json", }
            )

        with urllib.request.urlopen(request) as response:
            response_body = response.read().decode("utf-8")

        if "Error" in response_body:
            print("response_body Error") # for debug
        else:
                # インターバルをクラウドから取得した数値を入れる
            interval_time = int(response_body)  

        print(interval_time) # for debug
        time.sleep(interval_time)

    # キーボード例外を検出
    except KeyboardInterrupt:
        print("Stopped by Ctrl+C")
        break

    except Exception as e:
        print(e)
        pass

自動起動設定

 RaspberryPiにプログラムを置いたら、それを自動起動にします。ファイル名、ディレクトリー名はご自身の環境に合わせて下さい。

画像送信のプログラム(post_image.py)を実行するために、sensingapp.shを用意します。

#!/bin/sh

sleep 30
cd /home/pi
/usr/bin/python3 /home/pi/post_image.py

 実行できるようにしておきます。

$ chmod 755 sensingapp.sh

 次に、自動起動するためのサービスを用意します。

[Unit]
Description=SensingApp
After=syslog.target

[Service]
Type=simple
WorkingDirectory=/home/pi
ExecStart=/home/pi/sensingapp.sh
User=pi
Group=pi

[Install]
WantedBy=multi-user.target

 自動起動の設定を行います。

$ sudo systemctl daemon-reload
$ sudo systemctl start sensingapp
$ sudo systemctl enable sensingapp

 起動しているか確認します。

$ systemctl status sensingapp

sensingapp.service – SensingApp
Loaded: loaded (/etc/systemd/system/sensingapp.service; enabled; vendor preset: enabled)
Active: active (running)

 一旦、RaspberryPiを再起動して、自動起動を行います。

画像一覧表示

 自動起動がうまくいけば、次のように画像一覧で写真が表示されます。

計測間隔の変更

 計測間隔はヘッダーメニュー(黒いところ)のデバイス設定で行えます。初期値は600秒(10分)ですが、サンプルプログラムでは次のように60秒で設定しています。60秒以上、自由に変更ができます。

画像が表示されなかったら

 ダッシュボードでデータが表示されない場合は次の理由が考えられます。

① IoTデバイスがインターネットに接続されていない。

② IoTデバイスで送信するプログラムのパラメーターが正しくない。

  • IoTデバイス設定の通信パラメーターをご覧ください。

③ システム全体が不具合を起こしている。

  • この場合には画面も見られなくなっている可能性がありますので、弊社にご相談ください。