文字列入門 json/正規表現
はじめに
従来のシングルチップマイコンのアプリケーションでは、2つのマイコンがシリアルポートで通信する際、フレームヘッダ、データフレーム、チェックフレーム、フレームテールなどのフレーム形式を自分たちで定義することが一般的でした。下図はフライトコントローラのMavLinkプロトコルの例です。

この方法は安定していて効率的ですが、明らかな欠点もあります。開発の手間が大きく、独自にプロトコルを設計する必要があり、エンコード・デコードのコードも手動で書かなければなりません。2つのシングルチップ間で通信を試したいだけなら、シリアルポートでJSON文字列を送受信する方法をお勧めします。
優れた点:下位レベルの問題を意識する必要がありません。例えば
- エンディアン(バイトオーダー)を考慮する必要がない
- データのバイト変換を考慮する必要がない
- 任意の長さのint、floatに対応できる
- 理解しやすく、実装も簡単
欠点:効率がやや低く、エンコード・デコードにCPUを消費します。
実際、JSONによるデータ伝送はネットワークプログラミングにおいて標準的な手法になっています。例えばRESTful APIでは、フロントエンドとバックエンドがJSONを使って情報をやり取りします。ただ、従来のシングルチップマイコンの分野ではあまり一般的ではありません。一つには効率がやや低いこと、また組み込みシステムでは通常コスト面での要求が高いことが理由です。しかし、チップのコストが下がるにつれ、材料コストにそれほどシビアな要求がないアプリケーションも増えており、開発効率がますます重視されるようになっています。
文字列
string = "hello string!"
OpenMVはシリアル経由で文字列を送信できます。
from machine import UART
uart = UART(1, 9600)
string = "hello string!"
uart.write(string)
文字列操作
http://www.runoob.com/python3/python3-string.html
例えば:
blobs=[12,23,11,22,33,44]
print("%d", blobs[3])
JSONは簡潔で効率的なデータ交換形式です。次のようにシンプルに書くこともできます。
"[[12,0],[10,12],[22,10],[99,11]]"
補足:このようなシンプルな文字列を使って、OpenMVで検出したカラーブロブのx, y座標を送信しています。
また、次のように複雑な形にすることもできます('''はPythonの複数行文字列を表します)。
'''
{
"number":10,
"color" :[255,0,0],
"rate" :0.65
}
'''
この構造を使って、OpenMVで収集した色情報をWi-Fi経由でサーバーに送信しています。
さらに、次のような形にもできます。
'''
{
"firstName": "John",
"lastName": "Smith",
"sex": "male",
"age": 25,
"address":
{
"streetAddress": "21 2nd Street",
"city": "New York",
"state": "NY",
"postalCode": "10021"
},
"phoneNumber":
[
{
"type": "home",
"number": "212 555-1234"
},
{
"type": "fax",
"number": "646 555-4567"
}
]
}
'''
注意:JSONの形式はPythonに似ていますが、JSONはあくまでオブジェクトを表現するための形式であり、Pythonの表現方法とは若干異なります。
PythonでJSONを出力する
OpenMVにはjsonモジュールがあり、json.dumps(obj)とujson.loads(str)を使うことで、文字列としてのJSONを簡単に出力・解析できます。
import json
obj = [[12,0],[10,12],[22,10],[99,11]]
print(json.dumps(obj))
obj = {
"number":10,
"color" :[255,0,0],
"rate" :0.65
}
print(json.dumps(obj))
以下のように出力されます:
'[[12, 0], [10, 12], [22, 10], [99, 11]]'
'{"color": [255, 0, 0], "number": 10, "rate": 0.65}'
こうして文字列をシリアル経由で送信し、受信側ではJSON文字列をオブジェクト/配列にデコードして、後続の論理処理を行います。
他のシングルチップ向けJSONモジュール
JSONはシンプルで汎用性が高い形式です。
- Arduino: https://github.com/bblanchon/ArduinoJson
- STM32: http://blog.csdn.net/yannanxiu/article/details/52712723
MicroPython(pyboard,esp8266,samd21): http://docs.micropython.org/en/latest/pyboard/library/ujson.html
NodeMCU(esp8266): https://nodemcu.readthedocs.io/en/master/en/modules/sjson/
- 51: 使うのはやめておきましょう
これらのライブラリを使えば、JSON文字列をオブジェクトに変換できます。
PC上の他言語向けJSONモジュール
基本的にほとんどの言語(Lispでさえも)がJSONをサポートしているため、通信は容易です。
正規表現
単純な文字列処理であれば、いくつかの組み込み関数を使うだけで十分です。しかし、比較的複雑な要件になると、正規表現が必要になります。
例えば、URLの処理があります(OpenMVではあまり使われないため、ここでは省略します。MicroPythonのESP系ネットワークアプリケーションの章で詳しく紹介する予定です)。