M5 StackとMatlabの間でMQTT通信する

MosquittoをブローカーサーバーとしてM5 StackとMatlab間で通信する
受け渡すデータはJSON形式にする(Matlabのjsondecode()関数を使うと便利)

Mac上でMosquittoを使ってMQTTのブローカーサーバをたてる

$ mosquitto 

M5stackからは3軸の加速度データをJSONでダンプし、MQTTで/accトピックにPublishする。
f:id:seinzumtode:20200511101311p:plain

このMATLABライブラリを使う
www.mathworks.com
matlabコード

サーバ側

clear; close all;

myMQTT=mqtt('tcp://127.0.0.1');
mySub = subscribe(myMQTT,'acc', 'Callback','computeAcc');

コールバック関数(メインの処理を行うルーチン)

function computeAcc(~,json)
  json = strrep(json,"'",'"')
  json = eraseBetween(json,1,1)
  json = eraseBetween(json,strlength(json),strlength(json))  
  data = jsondecode(json); 
  data
end

注意点として、JSONのデコードが厄介だった。
M5stackからやってくるJSONは、キー文字列('ax'とか)がシングルクォーテーションで囲われている。

"{'ay': 0.026, 'az': 1.052, 'ax': -0.004}"

一方で、Matlabのjsondecode()は文字列キーがダブルクォーテーションでないといけない。
したがって以下のような文字列操作が必要だった(キー文字列のシングルクォーテーションをstrrep()でダブルクォーテーションに変更し、波括弧の前後にある不要なダブルクォーテーションをeraseBetween()で削除する)

  json = strrep(json,"'",'"')
  json = eraseBetween(json,1,1)
  json = eraseBetween(json,strlength(json),strlength(json))