2012年11月14日

JNX-2000D測電器(PowerMeter)-Linux讀取程式(程式碼下載、使用說明篇)

上一篇解說了JNX-2000D的USB無線接收器和PC間的溝通方式以及測電器的資料表示方式,
這一篇我將我寫好的程式、程式碼和使用方式附上。

程式介紹:
整份程式包含3支程式,2支C程式,1支php的程式,分別是:

  • jnx2000_meter.c
  • jnx2000_monitor.c
  • meter.php
jnx2000_meter.c:
USB無線接收器的讀取程式,它根據前一篇的流程將測電器數據讀出後,
將數據寫到Linux的SHM(ShareMemory)當中,並持續更新。
為了能同時支援多台JNX2000D的USB無線接收器,
每個Channel Number會使用獨立的SHM Key,例如:
Channel 0時,SHM Key為70248070
Channel 1時,SHM Key為70248071
.....
依Channel Number增加使用不同的SHM Key


jnx2000_monitor.c:
Linux Console的測電器資訊顯示程式。
程式執行時,要帶入測電器的Channel Number,
如果SHM Key存在(jnx2000_meter讀取程式正常執行),
就會在終端機中顯示目前的測電器資訊。
畫面如下:


















meter.php:
Linux PHP Web版的測電器資訊顯示程式。
直接透過網頁可以讀取到Web Server的測電器資訊,
Web URL同樣要帶入測電器的Channel Number。
畫面如下:















編譯方式:
jnx2000_meter.c:
jnx2000_meter.c的編譯非常簡單,直接如下即可產生jnx2000_meter:
gcc -o jnx2000_meter jnx2000_meter.c

jnx2000_monitor.c:
jnx2000_monitor.c編譯時要稍微注意一下,
jnx2000_monitor的Console繪圖,是使用ncurses這個library,
因此編譯前要先確定有安裝libncurses5-dev這個套件。
在Debian/Ubuntu下,如下安裝:
apt-get install libncurses5-dev

確定有ncurses的library後,如下執行即可產生jnx2000_monitor:
gcc -o jnx2000_monitor jnx2000_monitor.c -lncurses


使用說明:
jnx2000_meter:
jnx2000_meter使用前要注意幾點:

  1. USB無線接收器的USB要確定插在Linux電腦上,且要確定ttyUSB有抓到
  2. 要確定USB無線接收器是開機狀態(有數值顯示),因為它有省電保護,一段時間沒有和PC通訊,就會自動關機。
  3. 操作順序必須是,先開USB無線接收器,確定有開機,再執行jnx2000_meter。如果先執行jnx2000_meter,是抓不到USB無線接收器的

按照上述幾點,操作順序如下圖:

執行方式如圖片所示,輸入
jnx2000_meter
例如:jnx2000_meter /dev/ttyUSB1&
例如:jnx2000_meter ttyUSB1&


成功取的測電器資訊,會如圖片一樣顯示:
JNX-2000D Channel=9
Share Memory Key=70248079


這就表示jnx2000_meter成功執行中。
最後面記得加上&,讓它在背景執行。

jnx2000_monitor:
jnx2000_monitor使用相對簡單些,要注意的是:

  1. 要確定ncurses library有安裝,在Debian/Ubuntu下可以安裝libncurses5
    apt-get install libncurses5
  2. 必須要先執行jnx2000_meter,才可以執行jnx2000_monitor
要執行jnx2000_monitor,要先知道Channel Number,知道後,如下執行:
jnx2000_monitor <Channel Number>
例如:jnx2000_monitor 9


meter.php:
php版的meter.php功能和jnx2000_monitor相同。
要使用它,首先將meter.php放在php可以執行的Web路徑中,
以我這邊為例,我的Web路徑在
/var/www/

將meter.php放入/var/www/中,之後Web URL輸入如下:
http://192.168.1.6/meter.php

成功了會看到下面的畫面:














此時同樣的,根據Channel Number,在網址列加入Channel Number,
在這裡,我使用的Channel是9,加上:
http://192.168.1.6/meter.php?channel=9

即可出現下面畫面:















SHM資訊:
jnx2000_meter會將測電器資訊寫入SHM當中,
如果要在其他程式中使用SHM資訊,直接讀取即可使用,
SHM的資訊如下:

  1. 每個Channel Number會使用獨立的SHM Key,例如:
    Channel 0時,SHM Key為70248070
    Channel 1時,SHM Key為70248071
    .....
    依Channel Number增加使用不同的SHM Key

  2. SHM結構如下:
  3. typedef struct power_meter_string_data PowerMeterStringData;
    struct power_meter_string_data
    {
            char voltage[10];
            char current[10];
            char quantity[10];
            char duration_days[10];
            char duration_hours[10];
            char duration_mins[10];
            char factor[10];
            char wattage[10];
            char reserve[60];
    };
    所有資訊都使用char表示,並且均為10個字元(含字串結尾),
    最後面包含保留空間60個字元。


程式碼下載:
程式碼與程式

沒有留言: