CoAPサーバーを立てる機会があり、そのテスト用にCoAPクライアントを探していたのですが、なかなか見つからず、aiocoapというPython CoAPライブラリを使うことにしました。
CoAPとは
GMOの開発者ページにはこのように書かれています。
CoAPはRFC 7252で上がっている、UDPを使ったM2M向けのプロトコルです。マイコンのような低消費電力、ROM/RAMの容量をターゲットにしています。CoAPの特徴的なのはUDPを使ってHTTPを実装しているような仕組みになっている点です。
感じたのは、MQTTを実装するより簡単にサーバーは立てられるかなというところ。Pub/Subのしくみというより、RESTfulな感じです。
Google Collaboratoryで
ライブラリをインストール
!pip install aiocoap
!pip install nest-asyncio
aiocoapとnest-asyncioをインストールします。nest-asyncioは、Google Collaboratoryで非同期処理を実装する際のおまじないみたいなもので、非同期処理のasyncioをインポートする前に下記2行を入れるとよいそうです。
おまじない.py
import nest_asyncio
nest_asyncio.apply()
Googleドライブをマウント
今回は、CoAPプロトコルでバイナリデータを送信したく、そのバイナリデータをGoogleドライブ上に置いておきたかったので、マウントしました。
mount.py
from google.colab import drive
drive.mount('/content/drive')
CoAPで送信
coap_post_binary.py
from aiocoap import *
import nest_asyncio
nest_asyncio.apply()
import asyncio
async def main():
#foo.binファイルをGoogleドライブに入れておく
file_path = '/content/drive/My Drive/Colab Notebooks/coap/foo.bin'
# バイナリデータをファイルから読み込む
with open(file_path, 'rb') as f:
data = f.read()
print('Request: \n%s'%(data))
context = await Context.create_client_context()
await asyncio.sleep(2)
#メッセージを定義
request = Message(code=POST, payload=data, uri="coap://[HOST_NAME]/[PATH]")
response = await context.request(request).response
print('Result: %s\n%r'%(response.code, response.payload))
if __name__ == "__main__":
asyncio.run(main())
CoAP通信に成功すると、下記のように要求と応答ペイロードを確認することができます。
Request:
b'\xbdW\x0e\x00\x00r\x08\x0e\x00\x00'
Result: 2.03 Valid
b'\xa62\xac]d\xa9\'\x06\xe9O\r\xa1\xa.....'