LoginSignup
0
0

CoAPでバイナリデータを送信する(環境はGoogle Collaboratory)

Posted at

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.....'
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0