Archive: 2014/05/23

fplug_for_linux

先日調達した富士通ビー・エス・シーF-PLUG(エフプラグ)

F-PLUG
F-PLUG

データの取得は一般公開されているF-PLUG メッセージ一覧に従って一般的なRFCOMMの接続手順をベースに実装すれば良いのだが、まずは動作確認を含めてOBDNマガジンgoto2048/fplug_for_linuxを利用してみた。

電力は期待通り採れたので動作確認はOKとしたのだが、fptest温度(Temperature)が採れない事がある事に気付いて調べてみたところ、応答メッセージがF-PLUG メッセージ一覧の仕様と違って1バイト短い事がわかった。湿度、照度は大丈夫そうなのだが、ひとまずデータの最後から2バイトに注目するように改修した。

yano@ML110G7:~/software/fplug_for_linux$ sudo fptest
1.Get Temperature
2.Get Humidity
3.Illumination
4.Watt(Realtime)
5.Exit
Input command no ->1
Temp Command:10,81,00,00,0E,F0,00,00,11,00,62,01,E0,00,
ret size=15
Temp Status:10,81,00,00,00,00,0E,F0,00,72,01,E0,02,0E,01,
Temperature=27.0

1.Get Temperature
2.Get Humidity
3.Illumination
4.Watt(Realtime)
5.Exit
Input command no ->4
ret size=16
Realtime Wattmeter:10,81,00,00,00,22,00,0E,F0,00,72,01,E2,02,73,02,
Watt(Realtime)=62.7W

fpstatusもsensors.cronからデータを取得できるよう同様に改修してみたのだが、応答メッセージの受信以前に要求メッセージの送信がうまくいかない事が多い事がわかった。調べてみると"Transport endpoint is not connected"が発生しているので、ENOTCONNの場合はwriteをリトライするように対処。

ついでに一度の接続で電力、温度、湿度、照度を立て続けに取得できるように改造。

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include

#include "fplug.h"

#define DEOJ_TOKEN "\x0E\xF0\x00\x72"
#define DEOJ_TOKEN_LEN 4
static unsigned char *
memmem(unsigned char *a, size_t a_len, unsigned char *b, size_t b_len)
{
int i;

for (i = 0; i < (a_len - b_len); i++ ){
if ( a[i] != *b )
continue;
if ( !memcmp(&a[i], b, b_len) )
return &a[i];
}
return NULL;
}

static void dump_message( char *mes, unsigned char *buf, int size )
{
/*
int cnt;
printf( "%s", mes );
for ( cnt=0; cnt printf( "%02X,", buf[cnt] );
}
printf( "\n" );
*/
return;
}

int fp_main( int, int );

int main(int argc, char *argv[])
{
int fd;
struct termios oldtio, newtio;
char *cmd;

if ( argc == 1 ) {
printf("Usage: fpstatus