我的物聯(lián)網(wǎng)綜合知識之創(chuàng)建app版前端

對于物聯(lián)網(wǎng)應(yīng)用來說,構(gòu)建一個HTML5的移動app是尤其必要的就珠。為了開發(fā)HTML5 app,除了使用React Native等之外,目前首選穩(wěn)定的ionic+AngularJS來開發(fā)iOS 和Android臊泌。我們要開發(fā)的app版前端的功能和網(wǎng)頁版前端的功能相同,即下發(fā)命令揍拆,控制Led的開與關(guān)渠概,同時能實時展示溫度曲線。

關(guān)于Ionic和Cordova

Ionic是一款可以使用Html5構(gòu)建混合移動應(yīng)用的用戶界面框架嫂拴,它自稱是“本地與html5的結(jié)合”播揪。該框架提供了很多基本的移動用戶界面范例,例如像列表(lists)筒狠、標簽頁欄(tabbars)和觸發(fā)開關(guān)(toggleswitches)這樣的簡單條目猪狈。它還提供了更加復(fù)雜的可視化布局示例,例如在下面顯示內(nèi)容的滑出式菜單辩恼。
Cordova是一款開放源代碼的App開發(fā)框架雇庙,旨在讓開發(fā)者使用HTML、JavaScript灶伊、CSS等WebAPIs開發(fā)跨平臺的移動平臺應(yīng)用程序疆前,其原名稱之為PhoneGap,Adobe收購Nitobi公司后聘萨,PhoneGap商標保留竹椒,代碼貢獻給了Apache基金會,而Apache將其命名為ApacheCallback米辐,其后發(fā)布新版本時胸完,定名為ApacheCordova。
Cordova是一個行動設(shè)備的API接口集儡循,利用JavaScript存取這些接口可以調(diào)用諸如攝影機舶吗、羅盤等硬件系統(tǒng)資源。配合上一些基于HTML5择膝、CSS3技術(shù)的UI框架誓琼,如jQueryMobile、DojoMobile或SenchaTouch,開發(fā)者得以快速地開發(fā)跨平臺App而不需要編寫任何的原生代碼腹侣,因為Cordova本身仍是一個原生程式叔收,為App打包時依然需要用到這些系統(tǒng)平臺的SDK。

Ionic 2的安裝

為了避免國內(nèi)網(wǎng)絡(luò)安裝錯誤傲隶,我們采用淘寶npm鏡像饺律,執(zhí)行下面的命令:
sudo npm set registry https://registry.npm.taobao.org
下載后安裝ionic和cordova包,終端輸入:
sudo npm install -g cordova ionic
安裝成功后跺株,查看安裝的包內(nèi)容是否全部都已安裝复濒,終端輸入:
ionic info
根據(jù)信息提示,可對未成功安裝的包再次安裝乒省。

Ionic 2的目錄結(jié)構(gòu)

目錄結(jié)構(gòu)

App:系統(tǒng)初始化
Model:自定義的實體類
Pages:系統(tǒng)頁面
Providers:自定義服務(wù)

實現(xiàn)步驟

1.創(chuàng)建項目巧颈。這里創(chuàng)建一個tab模板的項目,進入iot目錄中袖扛,執(zhí)行命令:

ionic start app tabs --v2 --skip-npm
然后砸泛,進入到項目目錄app中安裝依賴:
cnpm install

添加第三方的插件Echarts

首先,在終端中使用NPM安裝Echarts
npm install echarts --save
然后蛆封,在declarations.d.ts文件中聲明變量
declare module 'echarts';
接著唇礁,在需要調(diào)用的界面進行Import
import echarts from 'echarts';
最后,添加Ttypings解析(用于編譯器的智能索引)
npm install @types/echarts --save
完成以上步驟就可以在界面中進行調(diào)用了

2.編寫數(shù)據(jù)服務(wù)惨篱。

我們創(chuàng)建兩個數(shù)據(jù)服務(wù)盏筐,分別用來操縱sensor集合和led集合。
sensor.ts的內(nèi)容:

import { Injectable } from '@angular/core';
import { Http } from '@angular/http';
import 'rxjs/add/operator/map';
@Injectable()
export class Sensor {
  data:any;
  constructor(public http: Http) {
    this.data=null;
  }
  getSensor(){
    if (this.data) {
      return Promise.resolve(this.data);
    }
    return new Promise(resolve => {
      this.http.get('http://localhost:3000/sensor')
        .map(res => res.json())
        .subscribe(data => {
          this.data = data;
          resolve(this.data);
        });
    });
  }
}

led.ts的內(nèi)容:

import { Injectable } from '@angular/core';
import { Http,Headers } from '@angular/http';
import 'rxjs/add/operator/map';
@Injectable()
export class Led {
    data: any;
  constructor(public http: Http) {this.data=null;}
    getStates(){
        if (this.data){
            return Promise.resolve(this.data);
        }
        return new Promise(resolve=>{
            this.http.get('http://1506eaee.nat123.cc:38044/led/state')
                    .map(res=>res.json())
                    .subscribe(data=>{
                        this.data=data;
                        resolve(this.data);
                    });
        });
    }
    updateStates(leds) {
        let headers=new Headers();
        headers.append('Content-Type','application/json');
        this.http.put('http://localhost:3000/led',JSON.stringify(leds),{headers:headers}).subscribe((res)=>{console.log(res.json())});
    }
}

3.設(shè)計頁面妒蛇。修改src/pages/home/home.html:

<ion-header>
  <ion-navbar>
    <ion-title>溫度曲線</ion-title>
  </ion-navbar>
</ion-header>
<ion-content padding>
    <div id="myChart"></div>
</ion-content>

修改src/pages/contact/contact.html:

<ion-header>
  <ion-navbar>
    <ion-title>
      控制Led
    </ion-title>
  </ion-navbar>
</ion-header>
<ion-content>
    <ion-list>
        <ion-item>
            <ion-icon item-left name="bulb"></ion-icon>
            <ion-label>電燈開關(guān)</ion-label> 
            <ion-toggle item-right color="danger" [(ngModel)]="ledState" (ionChange)="switch()"></ion-toggle>   
        </ion-item>
    </ion-list>
</ion-content>

4.修改類文件机断。

home.ts的內(nèi)容為:

import { Component,ViewChild,ElementRef } from '@angular/core';
import { NavController } from 'ionic-angular';
import { Sensor } from '../../providers/sensor';
import echarts from 'echarts';
@Component({
  selector: 'page-home',
  templateUrl: 'home.html'
})
export class HomePage {
  public sensors:any;
public a:any=1;
    temperatures:any[]=[];//定義溫度數(shù)組 
     times:any[]=[]; //定義時間數(shù)組 
  constructor(public navCtrl: NavController,public sensorService: Sensor) {}
  ionViewDidEnter(){
    this.loadCharts();
  }
  loadCharts(){
    var myChart = echarts.init(<HTMLCanvasElement> document.getElementById('myChart'));
    this.sensorService.getSensor().then((data) => {  
        for (var i in data){
         this.temperatures.push(data[i].temperature);
         this.times.push(data[i].time);
        } 
    });
    myChart.setOption({
     tooltip:{},
        dataZoom:[ //縮放
          {
            type: 'slider',//加入滑塊
            start: 1,
            end: 100
          },
          {
            type: 'inside',//支持鼠標縮放
            start: 1,
            end: 100
          }
        ],
        xAxis: { //x軸的設(shè)置
            //name:mydate,//x軸標題绣夺,顯示日期吏奸,臨時這樣做,體現(xiàn)出這是哪天的數(shù)據(jù)
            //nameGap:'55',
            //nameRotate:'-45',
            data: this.times//x軸所使用的數(shù)據(jù)數(shù)組陶耍,前面用ajax方法得到
        },
        yAxis: [
        {
            type : 'value',
            axisLabel : {
                formatter: '{value} °C'//y軸數(shù)據(jù)的顯示格式
            },
            splitLine : {show : true}//顯示行分割線
        }
    ],
        series: [{//要展示的各個數(shù)據(jù)點
            type: 'line'奋蔚,
            data: this.temperatures
        }]
    });
  }
}

contact.ts的內(nèi)容為:

import { Component } from '@angular/core';
import { Led } from '../../providers/led';
@Component({
  selector: 'page-contact',
  templateUrl: 'contact.html'
})
export class ContactPage {
    public ledState: boolean;
    public state;
    public x:boolean;
  constructor(public ledService: Led) {
     
  }
    public switch(){
            let leds={status:this.ledState};        
          this.ledService.updateStates(leds);
 
    }
    ionViewDidLoad(){
         this.ledService.getStates().then(function(data){
            
        });
        this.switch();
    }
}

最終完成的頁面為:

溫度曲線

控制led

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市烈钞,隨后出現(xiàn)的幾起案子泊碑,更是在濱河造成了極大的恐慌,老刑警劉巖毯欣,帶你破解...
    沈念sama閱讀 222,729評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件馒过,死亡現(xiàn)場離奇詭異,居然都是意外死亡酗钞,警方通過查閱死者的電腦和手機腹忽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評論 3 399
  • 文/潘曉璐 我一進店門来累,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人窘奏,你說我怎么就攤上這事嘹锁。” “怎么了着裹?”我有些...
    開封第一講書人閱讀 169,461評論 0 362
  • 文/不壞的土叔 我叫張陵领猾,是天一觀的道長。 經(jīng)常有香客問我骇扇,道長摔竿,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,135評論 1 300
  • 正文 為了忘掉前任匠题,我火速辦了婚禮拯坟,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘韭山。我一直安慰自己,他們只是感情好冷溃,可當(dāng)我...
    茶點故事閱讀 69,130評論 6 398
  • 文/花漫 我一把揭開白布钱磅。 她就那樣靜靜地躺著,像睡著了一般似枕。 火紅的嫁衣襯著肌膚如雪盖淡。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,736評論 1 312
  • 那天凿歼,我揣著相機與錄音褪迟,去河邊找鬼。 笑死答憔,一個胖子當(dāng)著我的面吹牛味赃,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播虐拓,決...
    沈念sama閱讀 41,179評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼心俗,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了蓉驹?” 一聲冷哼從身側(cè)響起城榛,我...
    開封第一講書人閱讀 40,124評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎态兴,沒想到半個月后狠持,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,657評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡瞻润,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,723評論 3 342
  • 正文 我和宋清朗相戀三年喘垂,在試婚紗的時候發(fā)現(xiàn)自己被綠了甜刻。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,872評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡王污,死狀恐怖罢吃,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情昭齐,我是刑警寧澤尿招,帶...
    沈念sama閱讀 36,533評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站阱驾,受9級特大地震影響就谜,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜里覆,卻給世界環(huán)境...
    茶點故事閱讀 42,213評論 3 336
  • 文/蒙蒙 一丧荐、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧喧枷,春花似錦虹统、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,700評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至戚扳,卻和暖如春忧便,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背帽借。 一陣腳步聲響...
    開封第一講書人閱讀 33,819評論 1 274
  • 我被黑心中介騙來泰國打工珠增, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人砍艾。 一個月前我還...
    沈念sama閱讀 49,304評論 3 379
  • 正文 我出身青樓蒂教,卻偏偏與公主長得像,于是被迫代替她去往敵國和親辐董。 傳聞我的和親對象是個殘疾皇子悴品,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,876評論 2 361

推薦閱讀更多精彩內(nèi)容