布衣王子

          Email:roose2008@gmail.com QQ:79212131

          使用 Java ME 實現超低帶寬通信

          美國國防部和一些商業領域中,部分應用程序需要低速率(低功耗)的無線通信。舉例來說,如今大多數現代交通工具都隨帶胎壓監測系統。

          胎壓傳感器數據是如何從各個輪胎發送到車載嵌入式計算系統,并最終到達儀表板的呢?顯然,傳感器和儀表板的數據總線之間沒有線路連接。因此,正如您所想象的,一定有某種機制從胎壓傳感器檢索傳感器數據。并且,此機制一定是無線的,并且可以長時間連續運作,毫無中斷現象。

          在本技術文章中,我們將探討如何使用 Java ME 和 Sun SPOT 技術創建用于讀取傳感器數據的低帶寬無線系統。下圖顯示了一個與 US quarter 有關的 SPOT。


          下面列出了一些 Sun SPOT 規格。您將發現在這種新計算平臺上創建和部署應用程序為何會使我如此激動:

            Java ME CLDC 1.1 JVM (Squawk VM)
            180 MHz 32 位處理器
            512K RAM
            4M 閃存
            IEEE 802.15.4 無線傳感器
            3 軸加速度傳感器
            溫度傳感器
            光傳感器
            具有 6 個模擬輸入的模數轉換器 (ADC)
            2 個可程控開關
            充電電池

          注意:雖然 Sun SPOT 兼容 802.15.4 規范,但是它們并不完全兼容真正的 ZigBee 設備,因為它們沒有實現 ZigBee 協議 中的上層協議。因為許多人對 ZigBee 感到陌生,所以我們將它與某些常用的標準無線通信協議做一個比較。下表比較了 WiFi、Bluetooth 和 ZigBee 。

          WiFi Bluetooth ZigBee
          IEEE 規范 802.11b,g 802.15.1 802.15.4
          最大帶寬 54 Mb/s 3 Mb/s 250 kb/s
          最大通信范圍 300 ft. 300 ft. 914.40 cm.
          功耗率 小時 月/年

          如您所見,ZigBee(或者任何其他 IEEE 802.15.4 衍生協議)是無線傳感器應用程序的理想協議。這些應用程序以下列場景為代表,在這些場景中,建立到敏感傳感器或傳感器陣列(如胎壓傳感器)的連接是不切實際或不方便的。Sun SPOT SDK 包含 3 個 SPOT 設備。其中一個設備通過 USB 電纜連接到您的計算機上作為基站,而另外兩個設備可以自由移動。

          本技術文章將介紹兩個功能完整的應用程序,第一個是基站應用程序,從第二個應用程序(移動無線 Sun SPOT)接收數據。在這個場景中,我不計劃執行任何用于兩個設備互相找到對方的發現機制。因為我已經知道基站和移動 SPOT 的 ZigBee 地址,所以我計劃直接告訴雙方對方的地址。因為 SPOT 有一個 CLDC JVM,所以我將使用通用連接框架 ( Generic Connection Framework, GCF),以便建立基站與移動 SPOT 的連接:

          Connector.open("radiostream://0014.4F01.0000.1447:55");

          如您所見,移動 SPOT 的無線地址是 0014.4F01.0000.1447。雖然在此應用程序中,我選擇 55 作為端口號,但是您可以自由地選擇 31~127 之間的任意數值作為您的應用程序的端口號。

          下面是基站應用程序的完整代碼,文件名為 HostReceiver.java 。它打開了一個到移動 SPOT 設備的無線連接,并從遠程設備接收 10 個溫度值。
          package receiver;

          import com.sun.spot.peripheral.*;
          import com.sun.spot.peripheral.radio.*;
          import com.sun.spot.io.j2me.radio.*;
          import com.sun.spot.io.j2me.radiogram.*;
          import com.sun.spot.util.IEEEAddress;
          import java.io.DataInputStream;
          import javax.microedition.io.InputConnection;
          import com.sun.spot.util.*;

          import java.io.*;
          import javax.microedition.io.*;

          public class HostReceiver {
          /**
          * Print out our radio address.
          */
          public void run() throws IOException{
          IEEEAddress zigbeeAddress = new IEEEAddress(Spot.getInstance().getRadioPolicyManager().getIEEEAddress());
          System.out.println("The Host station Zigbee radio address = " + zigbeeAddress.asDottedHex());

          StreamConnection streamConnection = (StreamConnection) Connector.open("radiostream://0014.4F01.0000.1447:55");

          for(int i=0; i<10; i++){

          DataInputStream data_input_stream = streamConnection.openDataInputStream();

          double value = data_input_stream.readDouble();
          System.out.println("The temperature is: " + value + "F");

          data_input_stream.close();
          Utils.sleep(3000);
          }

          streamConnection.close();
          System.exit(0);

          }

          /**
          * Start up the host application.
          *
          * @param args any command line arguments
          */
          public static void main(String[] args) throws Exception {
          HostReceiver app = new HostReceiver();
          app.run();
          }
          }

          下面是移動 SPOT 應用程序的代碼,其使用它的溫度傳感器接收周圍的溫度。它將取樣 10 次溫度,并將數據發送到基站。此應用程序也做一些其他工作,打開外部的 LED,使其顯示不同顏色,讓操作員知道 SPOT 是否運作正常。所有代碼都包含在文件 SpotSender.java 中。

          package sender;

          import com.sun.spot.peripheral.Spot;
          import com.sun.spot.sensorboard.EDemoBoard;
          import com.sun.spot.sensorboard.peripheral.ITriColorLED;
          import com.sun.spot.peripheral.radio.IRadioPolicyManager;
          import com.sun.spot.io.j2me.radiostream.*;
          import com.sun.spot.io.j2me.radiogram.*;
          import com.sun.spot.util.*;
          import com.sun.spot.sensorboard.io.ITemperatureInput;

          import java.io.*;
          import javax.microedition.io.*;
          import javax.microedition.midlet.MIDlet;
          import javax.microedition.midlet.MIDletStateChangeException;

          import java.io.*;
          import javax.microedition.io.*;

          public class SpotSender extends MIDlet {
          public StreamConnection streamConnection = null;
          public ITemperatureInput temperatureSensor = null;
          public IEEEAddress zigbeeAddress = null;

          public SpotSender(){
          try {
          streamConnection = (StreamConnection) Connector.open("radiostream://0014.4F01.0000.1709:55");
          temperatureSensor = EDemoBoard.getInstance().getADCTemperature();
          zigbeeAddress = new IEEEAddress(Spot.getInstance().getRadioPolicyManager().getIEEEAddress());

          System.out.println("Our radio address = " + zigbeeAddress.asDottedHex());
          } catch (IOException e){
          System.out.println("exception in constructor");
          }
          }

          protected void startApp() throws MIDletStateChangeException {

          // get a reference to the LED array
          ITriColorLED [] leds = EDemoBoard.getInstance().getLEDs();

          // set LED2 to green
          leds[2].setRGB(0,100,0);

          for(int i=0; i<10; i++){

          // turn all LEDs off
          leds[2].setOff();
          leds[3].setOff();
          leds[4].setOff();

          // turn LED2 on
          leds[2].setOn();
          Utils.sleep(250);

          try{
          DataOutputStream data_output_stream = streamConnection.openDataOutputStream();
          data_output_stream.writeDouble(temperatureSensor.getFahrenheit());

          data_output_stream.close();

          // set the color to blue
          leds[3].setRGB(0,0,100);
          leds[3].setOn();
          } catch (Exception e){
          // set the color to red
          leds[4].setRGB(100,0,0);
          leds[4].setOn();
          }

          leds[2].setOff();
          Utils.sleep(3000);
          }

          try{
          streamConnection.close();
          } catch (IOException e){
          }
          }

          protected void pauseApp() {
          // This will never be called by the Squawk VM
          }

          protected void destroyApp(boolean arg0) throws MIDletStateChangeException {
          // Only called if startApp throws any exception other than MIDletStateChangeException
          }
          }

          您可以自己部署和運行代碼,這會發生什么呢?您將獲得基站應用程序的輸出結果,如下所示:

          The Host station radio address = 0014.4F01.0000.1709
          [radiostream] Adding: Input from 0014.4F01.0000.1447 on port 55
          The temperature is: 90.5F
          [radiostream]Removing: Input from 0014.4F01.0000.1447 on port 55
          [radiostream] Adding: Input from 0014.4F01.0000.1447 on port 55
          The temperature is: 90.95F
          [radiostream]Removing: Input from 0014.4F01.0000.1447 on port 55
          [radiostream] Adding: Input from 0014.4F01.0000.1447 on port 55
          The temperature is: 90.05000000000001F
          [radiostream]Removing: Input from 0014.4F01.0000.1447 on port 55
          [radiostream] Adding: Input from 0014.4F01.0000.1447 on port 55
          The temperature is: 90.5F
          [radiostream]Removing: Input from 0014.4F01.0000.1447 on port 55
          [radiostream] Adding: Input from 0014.4F01.0000.1447 on port 55
          The temperature is: 90.95F
          [radiostream]Removing: Input from 0014.4F01.0000.1447 on port 55
          [radiostream] Adding: Input from 0014.4F01.0000.1447 on port 55
          The temperature is: 90.05000000000001F
          [radiostream]Removing: Input from 0014.4F01.0000.1447 on port 55
          [radiostream] Adding: Input from 0014.4F01.0000.1447 on port 55
          The temperature is: 90.5F
          [radiostream]Removing: Input from 0014.4F01.0000.1447 on port 55
          [radiostream] Adding: Input from 0014.4F01.0000.1447 on port 55
          The temperature is: 90.05000000000001F
          [radiostream]Removing: Input from 0014.4F01.0000.1447 on port 55
          [radiostream] Adding: Input from 0014.4F01.0000.1447 on port 55
          The temperature is: 90.5F
          [radiostream]Removing: Input from 0014.4F01.0000.1447 on port 55
          [radiostream] Adding: Input from 0014.4F01.0000.1447 on port 55
          The temperature is: 90.5F
          [radiostream]Removing: Input from 0014.4F01.0000.1447 on port 55

          posted on 2008-07-17 23:01 草包書生 閱讀(314) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           

          導航

          常用鏈接

          相冊

          java的相關連接

          最新評論

          主站蜘蛛池模板: 永年县| 简阳市| 东丰县| 吉安市| 乌鲁木齐市| 茂名市| 吉木乃县| 吴堡县| 高雄市| 军事| 绥滨县| 中超| 富宁县| 新建县| 揭西县| 扬中市| 武胜县| 霍邱县| 华池县| 汝阳县| 富源县| 洛阳市| 镇远县| 霍邱县| 金沙县| 曲阳县| 南江县| 千阳县| 方山县| 长岛县| 翁源县| 泽普县| 右玉县| 砀山县| 成武县| 凌源市| 额尔古纳市| 四子王旗| 舟曲县| 千阳县| 石首市|