以前にPythonでサーバを立ち上げ、ブラウザからArduinoを操作するという仕組みについて書きました。
このときはBottleというフレームワークを使っていたのですが、getUserMediaなどJavaScriptで画像を扱うインタフェースがHTTPSでしか使えなくなり、BottleをHTTPSに対応させるのが難しいので、CherryPyというフレームワークに変えてみました。
まず、前作業として、下記を参考にオレオレ証明書を作っておきます。
http://docs.cherrypy.org/en/latest/deploy.html#ssl
$ openssl genrsa -out privkey.pem 2048
$ openssl req -new -x509 -days 365 -key privkey.pem -out cert.pem
このpemを指定してHello worldを表示するサンプルがこちら。Arduinoへ接続する前に、こちらで動作確認してみてください。
import cherrypy
cherrypy.server.ssl_module = 'builtin'
cherrypy.server.ssl_certificate = "cert.pem"
cherrypy.server.ssl_private_key = "privkey.pem"
class HelloWorld(object):
@cherrypy.expose
def index(self):
return "Hello world!"
if __name__ == '__main__':
cherrypy.quickstart(HelloWorld())
ブラウザが怒りますが安心してください。履いてます。正常動作です。
これに、pyserialによるシリアル送信とCORS対応(HTTPヘッダにドメインを跨いでのアクセスを許容するための設定)を書き足したのがこちら。
import cherrypy
cherrypy.server.ssl_module = 'builtin'
cherrypy.server.ssl_certificate = "cert.pem"
cherrypy.server.ssl_private_key = "privkey.pem"
import serial
ser = serial.Serial('/dev/tty.usbmodem1411',9600)
def multi_headers():
cherrypy.response.header_list.extend(
cherrypy.response.headers.encode_header_items(
cherrypy.response.multiheaders))
cherrypy.tools.multiheaders = cherrypy.Tool('on_end_resource', multi_headers)
class CherryArduino(object):
@cherrypy.expose
@cherrypy.tools.multiheaders()
def index(self,value='Hello'):
cherrypy.response.multiheaders = [('Access-Control-Allow-Origin', '*')]
ser.write(str(value))
return value
if __name__ == '__main__':
cherrypy.quickstart(CherryArduino())
これを実行してhttps://127.0.0.1:8080/?value=1
にアクセスすると、Arduinoに「1」という値が送信されます。
Arduino側のスクリプトは、こちらを参考にしてください。
Githubにも置きましたので、こちらからもどうぞ。