oneM2Mアプリケーション開発
チュートリアル
oneM2M編
-株式会社KDDI総合研究所
奥井 宣広
アジェンダ
1. oneM2Mの概要と仕様の紹介
2. デモとoneM2M仕様のマッピング
3. アプリケーションの構成
4. 開発に必要なoneM2Mの仕様
5. oneM2Mのオープンソース
6. AE用オープンソースの紹介
7. AndroidとoneM2Mとの連携
8. Android wearアプリ開発
9. 可視化サービス
Appendix. デモ環境構築手順
oneM2M編
プログラム編
IoTアプリケーション開発における課題
E.g. Cellular, Fixed, Wi-Fi, …
IoT Device Underlying Networks
E.g. DTLS, TLS, PSK, PKI, …
IoT Device Security Models
E.g. HTTP(s), CoAP(s), MQTT(s), WebSockets, …
IoT Device Transport Protocols
E.g. XML, JSON, CBOR, Plain-Text, …
IoT Device Content Serializations
E.g. OCF, LWM2M, Thread, OMA DM, TR-069, …
IoT Services and Management Technologies
E.g. SAREF, W3C TD, …
IoT Device Semantic Ontologies
IoTで使用できる技術の組み合わせが多くて煩雑
LWM2M
XML JSON CBOR …
HTTP(s)
Cellular Fixed Wi-Fi … TLS/PSK TLS/PKI DTLS/PSK … CoAP(s) MQTT(s) … OCF OMA DM BBF … oneM2M W3C TD SAREF …
oneM2Mを利用するメリット
仕様検討のコスト削減
• oneM2Mの学習コストと天秤
→本セミナーを通じて学習コスト削減を期待
• 全面採用せずとも参考にはなるはず
拡張性のある仕様
• 継ぎ接ぎだらけの仕様を避けたい
運用保守コストの削減
• いろんな部署でIoTを検討していませんか?
様々なユースケースを想定して検討された
グローバルでオープンな仕様
oneM2Mのオープンソース
CSE用オープンソース
AE用オープンソース
oneM2Mアーキテクチャ
IN CSE AE MN CSE AE ASN CSE AE ADN AE ADN AE ASN CSE AE IN Infrastructure Node MN Middle NodeASN Application Service Node ADN Application Dedicated Node CSE Common Service Entity
AE Application Entity
oneM2Mのプリミティブ
Originator Receiver
Request
Response
Request Primitive Parameter Short name Data Type 説明
op op m2m:operation CRUD+N
to to xs:anyURI ターゲットリソースアドレス
from fr m2m:ID 送信者アドレス
request identifier rqi m2m:requestID リクエスト識別子
resource type rt m2m:resourceType リソースタイプ
content pc m2m:primitiveContent リソースの内容
Response Primitive Parameter Short name Data Type 説明
response status code rsc m2m:responseStatusCode ステータスコード
request identifier ri m2m:requestID リクエストと同じ値
シリアライゼーション
Release2では、以下の3つをサポート
• XML
• JSON
• CBOR
JSON形式で心拍数データを登録する場合の例
←今回のデモではJSONを使用する
{ "m2m:cin" : { "cnf" : "application/text", "con" : ”62" } }プロトコルバインディング
Release2では以下のプロトコルをサポート
• HTTP
、MQTT、CoAP、WebSocket
Request Primitive Parameter HTTP Mapping op Method to Request target from X-M2M-Originrequest identifier X-M2M-RI resource type Content-Type content Message Body
Response Primitive Parameter
HTTP Mapping
response status code X-M2M-RSC request identifier X-M2M-RI
content Message Body
oneM2M op HTTP Method Create POST Retrieve GET Update PUT Delete DELETE Notify POST
プロトコルバインディングの例
心拍数データをHTTP+JSONで登録する場合
POST /~/in-cse/in-name/receiver-demo-ae/led_status HTTP/1.1 X-M2M-Origin: X-M2M-RI: Content-Type: application/json;ty=4 { "m2m:cin" : { "cnf" : "application/text", "con" : ”62" } }リソース
全てのリソースはRESTful APIで操作
• 全てのリソースは一意なURIで識別
• リソースに対してCRUDによる操作
Value Interpretation 1 accessControlPolicy 2 AE 3 container 4 contentInstance 5 CSEBase 6 delivery 7 eventConfig 8 execInstance 9 group 10 locationPolicy 11 m2mServiceSubscriptionProfile 12 mgmtCmd 13 mgmtObj 14 node 15 pollingChannel 16 remoteCSE 17 request 18 schedule 19 serviceSubscribedAppRule 20 serviceSubscribedNode 21 statsCollect 22 statsConfig 23 subscription 24 semanticDescriptor 25 notificationTargetMgmtPolicyRef 26 notificationTargetPolicy 27 policyDeletionRules 28 flexContainer 29 timeSeries 30 timeSeriesInstance 31 role 32 token 33 trafficPattern 34 dynamicAuthorizationConsultation 35 authorizationDecision 36 authorizationPolicy 37 authorizationInformation 38 ontologyRepository 39 ontology 40 semanticMashupJobProfile 41 semanticMashupInstance 42 semanticMashupResult 10001 accessControlPolicyAnnc 10002 AEAnnc 10003 containerAnnc 10004 contentInstanceAnnc 10009 groupAnnc 10010 locationPolicyAnnc 10013 mgmtObjAnnc 10014 nodeAnnc 10016 remoteCSEAnnc 10018 scheduleAnnc 10024 semanticDescriptorAnnc 10028 flexContainerAnnc 10029 timeSeriesAnnc 10030 timeSeriesInstanceAnnc 10033 trafficPatternAnnc 10034 dynamicAuthorizationConsultationAnnc 10038 ontologyRepositoryAnnc 10039 ontologyAnnc 10040 semanticMashupJobProfileAnnc 10041 semanticMashupInstanceAnncValue
Interpretation
2
AE
3
container
4
contentInstance
5
CSEBase
23
subscription
本デモで使用するリソース
時系列データは<timeSeries>と<timeSeriesInstance>を使用することが推奨され ますが、本デモは汎用的な<container>と<contentInstance>を使用します。リソース構造
<CSEBase>
<AE>
<container>
<contentInstance>
<contentInstance>
<subscription>
CSE内のリソース構造
CSEのルートディレクトリ AEのデータを格納するディレクトリ データ種別を分けるディレクトリ 登録したリソースの変更通知、通知先などを記述 AEが生成するデータが格納 1データ単位=1<contentInstance><container>
<container>
<contentInstance>
<contentInstance>
<AE>配下に複数作成可能 <container>配下に作成することもできるリソースのアドレス規則
resourceNameとresourceID
• resourceName: Originatorが指定して登録することが可能
• resourceID: CSEがユニークに払い出す
階層アドレスと非階層アドレス
• 階層アドレス:resourceNameを使用する
• 非階層アドレス: resourceIDを使用する
絶対アドレスと相対アドレス
• CSE-Relative: CSE内でユニーク
• SP-Relative: Service Provider内でユニーク
• Absolute: 全世界でユニーク
リソースアドレス
in-name /in-cse sensor_app_ae CAE20180831 heart_rate cnt-1234567 上段: resourceName 下段: resourceID <CSEBase> <AE> <container> CSE-Relative http://192.168.10.10:7579/cnt-1234567 SP-Relative http://192.168.10.10:7579/~/in-cse/cnt-1234567Absolute http://192.168.10.10:7579/_/onem2m.org/in-cse/cnt-1234567 IP Address: 192.168.10.10
Port: 7579
Domain: onem2m.org
CSE-Relative http://192.168.10.10:7579/in-name/sensor_app_ae/heart_rate
SP-Relative http://192.168.10.10:7579/~/in-cse/in-name/sensor_app_ae/heart_rate
Absolute http://192.168.10.10:7579/_/onem2m.org/in-cse/in-name/sensor_app_ae/heart_rate
非階層アドレス
デモ内容
Android Wearで取得したセンサデータをサーバに保存
• Androidスマートホン経由でサーバに送信
• AndroidスマートホンでoneM2Mプロトコルに変換
センサデータの可視化
• センサデータを保管しているサーバは、新規データ登録時に自動
的に可視化サーバにデータを転送
• 可視化サーバはデータを受領後、DBに保管し、可視化ツールを
使用してセンサデータを可視化
デモ構成
プラットフォーム 可視化サービス Infrastructure Domain Field Domain oneM2M Non-oneM2M MetabaseHeart rate / Light
Heart rate / Light
Heart rate / Light
oneM2Mのプロトコルに 変換して送信
Polar M600
デモ構成(oneM2M)
プラットフォーム 可視化サービス Infrastructure Domain Field Domain oneM2M Non-oneM2M MetabaseHeart rate / Light
Heart rate / Light
Heart rate / Light
oneM2Mのプロトコルに 変換して送信
IN-CSE
ADN-AE
デモシーケンス
Android Wear Android Smartphone プラットフォーム (1-2) AEの生成 (2-1) Container(heart rate)の生成 (3-1) Subscription(heart rate)の生成 (5-1) contentInstance(heart rate)の生成 (6-1) Notification(heart rate) 可視化サービス (4-1)heart rateの送信 (1-1) AEの生成 (2-2) Container(light)の生成 (3-2) Subscription(light)の生成 (4-2)lightの送信 (5-2) contentInstance(light)の生成 (6-2) Notification(light) AE CSE AEデモにおけるリソース構造
Mobius /in-cse M600_001 S20180821053115321TvXk heartrate SyXx1cmY8Q <CSEBase> <AE> <container> light HymFcoQYUm heartrate_subscription SJXEu67FI7 <subscription> light_subscription Sy7Lue4Y87 <subscription>(1) Create <AE>: Request
URL http://52.246.165.212:7579/Mobius
METHOD POST
HEADERS Content-Type application/json;ty=2 X-M2M-Origin S X-M2M-RI 1 BODY { "m2m:ae" :{ "api" : "sensor-app", "rn" : "M600_001", "rr" : false } } Android Smartphone プラットフォーム Request Create <AE>
X-M2M-Originには、OriginatorのresourceIDを 入力するが、AEの登録に限っては、 S、C、未記入のいずれかにする resourceType=2は<AE>を示している Application-ID Applicationごとに同一にする <AE>のresourceName <AE>生成時にアプリケーション側で指定している。 CSEのresourceName
AE-ID
IN-CSE
MN-CSE
ADN
ADN
• AE-IDは、SまたはCで始まる • SとCでIDのユニーク性を担保する範囲が異なる • AE-IDはCSEが払い出す • AE登録時のOriginatorヘッダで、S形式かC形式 かを指定できる • S形式:S(例:SAE001) • C形式:C(例:CAE001) • AE-IDの形式を指定しない場合は、Originatorに 関するヘッダを付けない S形式でユニークな範囲 C形式でユニークな範囲TS-0001: 7.1.2 Application Entity Identifier (AE-ID)
(1) Create <AE>: Response
201 Created
HEADERS X-Powered-By: Express Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET, PUT, POST, DELETE, OPTIONS
Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, X-M2M-RI, X-M2M-RSC, Accept, X-M2M-Origin, Locale Access-Control-Expose-Headers: Origin, X-Requested-With, Content-Type,
X-M2M-RI, X-M2M-RSC, Accept, X-M2M-Origin, Locale Content-Location: S20180821053115321TvXk
X-M2M-RI: 1
X-M2M-RSC: 2001
Content-Type: application/json
Date: Tue, 21 Aug 2018 05:31:15 GMT Connection: keep-alive Content-Length: 212 bytes BODY { "m2m:ae": { "rn": "M600_001", "ty": 2, "pi": "HkbCDpg9M", "ri": "S20180821053115321TvXk", "ct": "20180821T053115", "et": "20210821T053115", "lt": "20180821T053115", "api": "sensor-app", "rr": false, "aei": "S20180821053115321TvXk" } } Android Smartphone プラットフォーム Request Create <AE>
CSEによりAE-ID (=resourceID)が 払い出された
Requestと同じ値
(2) Create Container
Android
Smartphone プラットフォーム Request Create <container>
URL http://52.246.165.212:7579/Mobius/M600_001
METHOD POST
HEADERS Content-Type application/json;ty=3 X-M2M-Origin S20180821053115321TvXk X-M2M-RI 2 BODY { "m2m:cnt" : { "rn" : "heartrate" } } BODY { "m2m:cnt": { "rn": "heartrate", "ty": 3, "pi": "S20180821053115321TvXk", "ri": "SyXx1cmY8Q", "ct": "20180821T055743", "et": "20210821T055743", "lt": "20180821T055743", "st": 0, "mni": 3153600000, "mbs": 3153600000, "mia": 31536000, "cr": "S20180821053115321TvXk", "cni": 0, "cbs": 0 } } Request Response • AE(M600_001)配下にcontainerを生成する • ResourceType=3はcontainerを示す • AEからのRequestであるため、X-M2M-Originには、 AE-IDを付ける • containerのresourceNameとしてheartrateを指定 している • pi=parentID、AE配下であるため、 AEのresourceID(=AE-ID)が記述さ れている • ri=resourceID、containerの resourceIDがCSEから払い出され ている • mni=maxNrOfInstatances、 container配下に保持できる contentInstanceの個数 • mbs=maxByteSize、container配下 に保持できるデータの総容量 • mia=maxInstanceAge、保持する contentInstanceに期間。秒単位。 • cni=currentNrOfInstances、現在 のcontentInstanceの数 • cbs=currentByteSize、現在のデー タの総容量
(3) Create Subscription: Request
Android
Smartphone プラットフォーム
Request Create <subscription>
URL http://52.246.165.212:7579/Mobius/M600_001/heartrate
METHOD POST
HEADERS Content-Type application/json;ty=23 X-M2M-Origin S20180821053115321TvXk X-M2M-RI 3 Request BODY { "m2m:sub": { "enc": { "net": [ 3 ] }, "ln": true, "nu": [ "http://13.78.11.160:8080/heartrate_subscription" ], "nct": 1, "rn": "heartrate_subscription" } } • container配下にsubscriptionを作成 • resourceType=23はsubscriptionを示す • enc=eventNotificationCriteria、Notificationを生成する条件を 記述 • net=notificationEventType、Notification生成のトリガー。 3は、配下にリソースが生成された時をトリガーとする。 • nu=notificationURI、Notification転送先を記述 • nct=notificationContentType、Notificationで転送する内容。 1は、全てのアトリビュート。
(3) Create Subscription: Response
Android
Smartphone プラットフォーム
Response Create <subscription>
BODY { "m2m:sub": { "rn": "heartrate_subscription", "enc": { "ty": 23, "net": [ "pi": "SyXx1cmY8Q", 3 "ri": "SJXEu67FI7", ] "ct": "20180821T061259", }, "et": "20210821T061259", "ln": "true", "lt": "20180821T061259", "nct": 1, "nu": [ "cr": "S20180821053115321TvXk" "http://13.78.11.160:8080/heartrate _subscription" } ], }
(5) Create contentInstance: Request
Android
Smartphone プラットフォーム
Request Create <contentInstance>
URL http://52.246.165.212:7579/Mobius/M600_001/heartrate
METHOD POST
HEADERS Content-Type application/json;ty=4
X-M2M-Origin S20180821053115321TvXk
X-M2M-RI 4
BODY {
"m2m:cin": {
"cnf": "application/json",
"con": "{ ¥"value¥":¥"60¥", ¥"time¥":¥"2018/08/21 16:20:37.044¥" }"
}
• cnf=contentInfo、contentのメディアタイプ などを記載(IETF RFC 6838)
(5) Create contentInstance: Response
BODY { "m2m:cin": { "rn": "4-20180821072101876o0he", "ty": 4, "pi": "SyXx1cmY8Q", "ri": "BkmLw64tLX", "ct": "20180821T072101", "et": "20210821T072101", "lt": "20180821T072101", "st": 2, "cs": 47, "cnf": "application/json", "con": { "value": "60", "time": "2018/08/21 16:20:37.044" }, "cr": "S20180821053115321TvXk" } } Android Smartphone プラットフォームResponse Create <contentInstance>
(6) Notification
Android
Smartphone プラットフォーム
Response Create <contentInstance>
URL http://13.78.11.160:8080/heartrate_subscription METHOD POST HEADERS BODY { "m2m:sgn": { "net": "3", "lt": "20180821T072101", "st": 2, "cs": 47, "sur": "/Mobius/M600_001/heartrate/heartrate_subscri ption", "cnf": "application/json", "nec": "", "con": { "nev": { "value": "60", "rep": { "time": "2018/08/21 16:20:37.044" "m2m:cin": { }, "rn": "4-20180821072101876o0he", "cr": "S20180821053115321TvXk" "ty": 4, } "pi": "SyXx1cmY8Q", } "ri": "BkmLw64tLX", }