色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

聚豐項目 > 家庭網關模擬

家庭網關模擬

所謂的網關,其實也可以叫中央控制器(IOT HUB),主要是收集各離散節點的信息,在終端上顯示;另外就是通過手持終端來發出各種指令控制,控制各離散節點設備的運行。

netlhx netlhx

分享
3 喜歡這個項目
團隊介紹

netlhx netlhx

團隊成員

劉紅新 老師

分享
項目簡介
所謂的網關,其實也可以叫中央控制器(IOT HUB),主要是收集各離散節點的信息,在終端上顯示;另外就是通過手持終端來發出各種指令控制,控制各離散節點設備的運行。
硬件說明
  • 溫度傳感器連接到擴展板的A1

  • 光照傳感器連接到擴展板的A2

  • PWM輸出連接到擴展板的D5

  • 舵機連接到擴展板的D3

  • LCD連接到I2C接口

整體連接效果如圖



在原來的計劃中,舵機控制是準備實現的。只是可惜在實驗中,舵機被燒壞了。



燒壞的舵機,估計是在試驗的時候,正反轉設置的時候參數有問題,可惜!

軟件說明

實現關鍵代碼

程序代碼使用NODE.JS來實現,調用底層的MRAA及UPM庫來實現相關操作。
完整控制代碼如下

  1. var http = require('http');

  2. var query = require('querystring');

  3. var mraa = require('mraa');

  4. var grove = require('jsupm_grove');

  5. var LCD = require('jsupm_i2clcd');

  6. var SERVO = require('jsupm_servo');

  7. var os = require('os');


  8. var lcd = new LCD.Jhd1313m1(6, 0x3E, 0x62);

  9. var hostname = os.hostname().toString();

  10. var ipaddr = os.networkInterfaces()['wlan0'][0]['address'].toString();


  11. var light = new grove.GroveLight(2);

  12. var temp = new grove.GroveTemp(1);


  13. var lightValue = light.value();

  14. var tempValue = temp.value();


  15. //var servo = new SERVO.ES08A(3);

  16. var led_pwm = new mraa.Pwm(6);

  17. led_pwm.enable(true); //must enable


  18. var ds2 = new mraa.Gpio(13);

  19. ds2.dir(mraa.DIR_OUT);

  20. ds2.write(1);


  21. led_pwm.write(0);

  22. //servo.setAngle(90);


  23. lcd.clear();

  24. lcd.setCursor(0, 0);

  25. lcd.write('Intel Edison IoT');


  26. var status = {};


  27. status['host'] = hostname;

  28. status['ipaddr'] = ipaddr;

  29. status['title'] = 'Intel Edison IoT';


  30. setInterval(function() {

  31.         status['temp'] = temp.value().toString();

  32.         status['light'] = light.value().toString();

  33. }, 2000);


  34. var server = http.createServer(function(req, res) {

  35.         switch(req.method) {

  36.                 case 'GET':

  37.                         //res.writeHead(200, {'Content-Type': 'application/json'});

  38.                         //res.end(JSON.stringify(status));

  39.                         break;


  40.                 case 'POST':

  41.                         var content = "";

  42.                         req.setEncoding('utf8');

  43.                         req.on('data', function(chunk) {

  44.                                 content += chunk;

  45.                         });


  46.                         req.on('end', function() {

  47.                                 console.log(content);

  48.                                 status['title'] = JSON.parse(content)['title'];

  49.                                 status['pwm'] = JSON.parse(content)['pwm'];

  50.                                 status['ds2'] = JSON.parse(content)['ds2'];

  51.                                 console.log(status);

  52.                                 lcd.clear();

  53.                                 lcd.setCursor(0, 0);

  54.                                 lcd.write(status['title'].toString());


  55.                                 led_pwm.write(Number(status['pwm']) / 100);

  56.                                 ds2.write(Number(status['ds2']));




  57.                         });

  58.                         break;


  59.                 default:

  60.                         break;

  61.         }

  62.         res.writeHead(200, {'Content-Type': 'application/json'});

  63.         res.end(JSON.stringify(status));

  64. });


  65. server.listen(8000);


復制代碼

目前代碼測試正常,不過不排除潛在的BUG,希望各位有時間的話測試。

客戶端使用ANDROID,編寫一個簡單APP來顯示及控制節點。部分關鍵代碼如下

  1. host = (TextView)findViewById(R.id.host);

  2.         ipAddr = (TextView)findViewById(R.id.ipAddr);

  3.         light = (TextView)findViewById(R.id.light);

  4.         temp = (TextView)findViewById(R.id.temp);


  5.         pwm = (SeekBar)findViewById(R.id.pwmSeekBar);

  6.         lcd = (EditText)findViewById(R.id.lcd);

  7.         ds2 = (Button)findViewById(R.id.switchButton);


  8.         postButton = (Button)findViewById(R.id.postButton);


  9.         info = new JSONObject();




  10.         postButton.setOnClickListener(new View.OnClickListener() {

  11.             @Override

  12.             public void onClick(View v) {

  13.                 try {

  14.                     info.put("pwm", "" + pwm.getProgress());

  15.                     info.put("title", lcd.getText().toString());

  16.                     //info.put("ds2", String.valueOf(0));

  17.                 } catch (JSONException e) {

  18.                     e.printStackTrace();

  19.                 }

  20.                 new SendJsonTask().execute(info);


  21.             }

  22.         });


  23.         ds2.setOnClickListener(new View.OnClickListener() {

  24.             @Override

  25.             public void onClick(View v) {


  26.                 try {

  27.                     if(ds2.getText() == "關") {

  28.                         info.put("ds2", "0");

  29.                         ds2.setText("開");


  30.                     }

  31.                     else {

  32.                         info.put("ds2", "1");

  33.                         ds2.setText("關");

  34.                     }

  35.                 } catch (JSONException e) {

  36.                     e.printStackTrace();

  37.                 }


  38.                 ds2.setEnabled(false);


  39.             }

  40.         });


  41.     }


  42.    class SendJsonTask extends AsyncTask<JSONObject, Void, String>

  43.    {


  44.        @Override

  45.        protected String doInBackground(JSONObject... params) {


  46.            StringBuilder sb = new StringBuilder();


  47.            String http = "http://192.168.99.221:8000/";



  48.            HttpURLConnection urlConnection=null;

  49.            try {

  50.                URL url = new URL(http);

  51.                urlConnection = (HttpURLConnection) url.openConnection();

  52.                urlConnection.setDoInput(true);

  53.                urlConnection.setDoOutput(true);

  54.                urlConnection.setRequestMethod("POST");

  55.                urlConnection.setUseCaches(false);

  56.                urlConnection.setConnectTimeout(10000);

  57.                urlConnection.setReadTimeout(10000);

  58.                urlConnection.setRequestProperty("Content-Type","application/json");


  59.                urlConnection.connect();



  60.                OutputStreamWriter out = new   OutputStreamWriter(urlConnection.getOutputStream());

  61.                Log.d("JSON", params[0].toString());


  62.                out.write(params[0].toString());

  63.                out.close();


  64.                int HttpResult =urlConnection.getResponseCode();

  65.                if(HttpResult == HttpURLConnection.HTTP_OK){

  66.                    BufferedReader br = new BufferedReader(new InputStreamReader(

  67.                            urlConnection.getInputStream(),"utf-8"));

  68.                    String line = null;

  69.                    while ((line = br.readLine()) != null) {

  70.                        sb.append(line );

  71.                    }

  72.                    br.close();


  73.                    Log.d("JSON", sb.toString());


  74.                    return sb.toString();


  75.                }else{

  76.                    System.out.println(urlConnection.getResponseMessage());

  77.                }

  78.            } catch (MalformedURLException e) {


  79.                e.printStackTrace();

  80.            }

  81.            catch (IOException e) {


  82.                e.printStackTrace();

  83.            }


  84.            finally{

  85.                if(urlConnection!=null)

  86.                    urlConnection.disconnect();

  87.            }


  88.            return null;

  89.        }


  90.        @Override

  91.        protected void onPostExecute(String data)

  92.        {

  93.            super.onPostExecute(data);

  94.            try {

  95.                JSONObject receivedInfo = new JSONObject(data.toString());

  96.                host.setText(receivedInfo.get("host").toString());

  97.                ipAddr.setText(receivedInfo.get("ipaddr").toString());

  98.                light.setText(receivedInfo.get("light").toString());

  99.                temp.setText(receivedInfo.get("temp").toString());

  100.                lcd.setText(receivedInfo.get("title").toString());

  101.                //if(Integer.parseInt(receivedInfo.get("ds2").toString()) == 1)

  102.                    //ds2.setText("關");

  103.                //else

  104.                    //ds2.setText("開");


  105.                ds2.setEnabled(true);


  106.            } catch (JSONException e) {

  107.                e.printStackTrace();

  108.            }

  109.        }

  110.    }


復制代碼



網絡訪問部分使用了異步任務,在接收到JSON數據之后,刷新APP界面元素。


演示效果

功能概括

  • INTEL EDISON作為中央控制節點,收集及接收來自終端節點的信息,并執行相應的控制指令

  • 溫度傳感器收集溫度信息

  • 光照傳感器收集光照強度,光照強度值可以用來控制燈光的強弱

  • 無級調光,通過PWM來控制燈的亮度(通過LED燈來模擬)

  • 舵機控制,比如調整自動澆花器的位置

  • 開關控制,打開或關閉指定位置的照明燈(通過LED燈來模擬)

  • LCD顯示,模擬家中的LED顯示屏

設計思路

程序設計語言使用NODE.JS做為服務端控制語言,這也是INTEL主推的一個物聯網應用中的開發語言。NODE.JS調用底層的MRAA及UPM庫來控制硬件。硬件控制GROVE的實驗請參考http://bbs.elecfans.com/forum.ph ... d&tid=919288&extra=

INTEL官方提供的諸多IDE中,XDK實在太臃腫,加上使用NODE.JS只需要一個VIM即可實現編程、調試。另外C/C++類編程語言在調試過程中需要反復修改、編譯、調試,步驟略顯繁瑣。所以這里使用輕便的NODE.JS來實現服務端功能。

服務器端使用比較原生的HTTP模塊搭建了一個簡單的WEB服務器,客戶端可以使用HTTP請求來獲取或者上傳相應控制指令。

數據通信格式

服務器與客戶端之前使用JSON來進行通信,一次典型的通信數據如下

  1. {"ds2":"1","title":"Hello, world","pwm":"51"}

復制代碼

上述JSON數據中,第一部分是客戶端通過HTTP POST方法上傳的要求服務器執行的信息

  • "ds2":"1" 請求EDISON打開板載的DS2指示燈,起到模擬開燈/關燈的效果

  • "title":"Hello, world" 請求將LCD的顯示內容設置為HELLO, WORLD

  • "pwm":"51" 請求將連接在D5上的LED燈亮度值設置為51%



下面一部分JSON數據是將EDISON上的一些信息反饋給客戶端,用戶可以使用HTTP來顯示這些內容,如下圖



簡易的客戶端APP實現

除了可以使用瀏覽器之外,專門設計了一個簡單的ANDROID客戶端程序,界面很簡單,如下圖



APP上面是顯示區域,顯示從服務器端獲取的數據信息;中間為控制區域,只設計了控制EDISON的部分接口;最下面是刷新按鈕,用來刷新數據。


效果及簡單總結

本貼實現了一個典型的C/S通信控制。

  • 服務端SERVER使用了大名鼎鼎的NODE.JS,主要提供兩方面的內容:基于RESTFULL的服務;結合MRAA及UPM提供硬件訪問控制

  • 客戶端實現了WEB/APP雙訪問機制,不過出于安全考慮,WEB訪問只提供了只讀式的訪問方式。要想控制設備,需要通過APP來實現

  • 本項目雖然功能還比較簡單,但是通信/控制的基本框架已基本具備,添加新的功能已非常簡單

  • 基于C/S通信架構的調試,比單機設備調試需要考慮的因素更多,過程也更復雜


附:

部分運行效果圖


LCD顯示效果,可以通過APP來實時改變顯示內容


舵機調試


外接的WIFI天線,以增強遠距離通信效果


評論區(1 )
  • 動心忍性1234: 您好我是無線電雜志的編輯,我們對您的項目十分感興趣,請問您有興趣投稿嗎?成為我們的作者除稿費外還有其他優厚條件。敬請參與。投稿請聯系QQ260534978.

    回復

主站蜘蛛池模板: 亚洲在线2018最新无码| 卫生间被教官做好爽HH视频| 国产精品97久久久久久AV色戒 | 日本内射精品一区二区视频| 久久不卡免费视频| 国产精品自产拍在线观看中文| CHINA末成年VIDEO学生| 樱桃BT在线观看| 亚洲人成网站在线播放| 午夜神器老司机高清无码| 色婷婷综合激情中文在线| 欧美乱码卡一卡二卡四卡免费 | 99热精品在线av播放| 综合精品欧美日韩国产在线| 亚洲精品视频在线观看视频| 色狼亚洲色图| 乌克兰黄色录像| 香蕉久久夜色精品国产小优| 羲义嫁密着中出交尾gvg794| 亚洲精品国产品国语在线试看| 亚洲国产精品久久又爽黄A片| 亚洲男人97色综合久久久 | 国产人妻精品久久久久久很牛| 国产AV午夜精品一区二区入口| 国产成人免费在线观看| 国产麻豆精品传媒AV国产在线| 好色的妹妹| 牛牛在线精品视频| 全黄H全肉细节文NP| 香蕉在线播放| 最近高清日本免费| 把腿张开再深点好爽宝贝动态图 | 99久久99久久精品| 大胸美女被cao哭| 含羞草在线| 飘雪在线观看免费高清完整版韩国| 天天影视网网色色欲| 在线亚洲中文字幕36页| 成人精品视频在线| 寂寞夜晚免费观看视频| 年轻的朋友4在线看中文字幕|