組み込みの装置を設計していると、装置の状態を集中管理しているサーバに転送する機能が、よく組み込まれます。この場合、通信プロトコルはTCP/IPやHTTPが使用され、データ形式はXMLが使用されます。C言語ではJavaやC#と違って、提供されるXML関連のライブラリがないため、XMLの取り扱い難しくはないが手間がかかります。
XML形式を次のようににした場合、C言語によるロジックを考えてみました。
<devicestatus> <server> <status>1</status> <port1>1,2,3</port1> <port2>4,5,6</port2> </server> <cliant1> <status>2</status> <port1>2,3,4</port1> <port2>5,6,7</port2> </cliant1> <cliant2> <status>3</status> <port1>8,7,6</port1> <port2>5,4,3</port2> </cliant2> </devicestatus>
XML形式でデータを構成する場合、文字列操作が主になりますが、なるべくできあがったソースを見やすくするために次のことを考えます。
- XML形式に合わせてストラクチャを作ること
- 同じデータ形式の情報は、個数をDefineで定義すること
- 入れ子になっているデータについてはfor文などのループにより処理ができるように、ストラクチャを構成すること
次のCコードは、構造体Device,DeviceStatusを入れ子にして、XML形式にあわせています。また、port[PortNum][DataNum]は、二次元配列とし、ポート番号とデータ番号をそれぞれ引数として、for文でループできる構造を採用しています。またソースを見やすくするため、引数はi,kでなく、cliant,portとして、引数の意味がわかるようにコーティングしています。
#include <stdio.h> #define Cliant 2 // クライアント数 #define PortNum 2 // ポート数 #define DataNum 3 // データ数 // 一台分の装置の情報ストラクチャ struct Device{ char status; char port[PortNum][DataNum]; }; // 装置/全体の情報ストラクチャ struct DeviceStatus{ struct Device server; struct Device cliant[Cliant]; }; int main(int argc, char *argv[]){ // 初期値設定 struct DeviceStatus devicestatus = { 1, 1, 2, 3, 4, 5, 6, { { 2, 2, 3, 4, 5, 6, 7 }, { 3, 8, 7, 6, 5, 4, 3 } } }; printf("<devicestatus>\n"); printf("<server>\n"); //サーバの装置情報をXML形式に変換する printf("<status>%d</status>\n", devicestatus.server.status); for (int port = 0; port < PortNum; port++){ printf("<port%d>%d,%d,%d</port%d>\n", port + 1, devicestatus.server.port[port][0], devicestatus.server.port[port][1], devicestatus.server.port[port][2], port + 1); } printf("</server>\n"); for (int cliant = 0; cliant < Cliant; cliant++){ printf("<cliant%d>\n", cliant + 1); //クライアントの装置情報をXML形式に変換する printf("<status>%d</status>\n", devicestatus.cliant[cliant].status); for (int port = 0; port < PortNum; port++){ printf("<port%d>%d,%d,%d</port%d>\n", port + 1, devicestatus.cliant[cliant].port[port][0], devicestatus.cliant[cliant].port[port][1], devicestatus.cliant[cliant].port[port][2], port + 1); } printf("</cliant%d>\n", cliant+1); } printf("</devicestatus>\n"); return 0; }
XML形式で情報を編集する場合、設計時にプログラムの作成しやすさも考慮して、XMLの構造を決めることも必要だと考えます。