我的物联网综合知识之创建app版前端

对于物联网应用来说,构建一个HTML5的移动app是尤其必要的。为了开发HTML5 app,除了使用React Native等之外,目前首选稳定的ionic+AngularJS来开发iOS 和Android。我们要开发的app版前端的功能和网页版前端的功能相同,即下发命令,控制Led的开与关,同时能实时展示温度曲线。

关于Ionic和Cordova

Ionic是一款可以使用Html5构建混合移动应用的用户界面框架,它自称是“本地与html5的结合”。该框架提供了很多基本的移动用户界面范例,例如像列表(lists)、标签页栏(tabbars)和触发开关(toggleswitches)这样的简单条目。它还提供了更加复杂的可视化布局示例,例如在下面显示内容的滑出式菜单。
Cordova是一款开放源代码的App开发框架,旨在让开发者使用HTML、JavaScript、CSS等WebAPIs开发跨平台的移动平台应用程序,其原名称之为PhoneGap,Adobe收购Nitobi公司后,PhoneGap商标保留,代码贡献给了Apache基金会,而Apache将其命名为ApacheCallback,其后发布新版本时,定名为ApacheCordova。
Cordova是一个行动设备的API接口集,利用JavaScript存取这些接口可以调用诸如摄影机、罗盘等硬件系统资源。配合上一些基于HTML5、CSS3技术的UI框架,如jQueryMobile、DojoMobile或SenchaTouch,开发者得以快速地开发跨平台App而不需要编写任何的原生代码,因为Cordova本身仍是一个原生程式,为App打包时依然需要用到这些系统平台的SDK。

Ionic 2的安装

为了避免国内网络安装错误,我们采用淘宝npm镜像,执行下面的命令:
sudo npm set registry https://registry.npm.taobao.org
下载后安装ionic和cordova包,终端输入:
sudo npm install -g cordova ionic
安装成功后,查看安装的包内容是否全部都已安装,终端输入:
ionic info
根据信息提示,可对未成功安装的包再次安装。

Ionic 2的目录结构

目录结构

App:系统初始化
Model:自定义的实体类
Pages:系统页面
Providers:自定义服务

实现步骤

1.创建项目。这里创建一个tab模板的项目,进入iot目录中,执行命令:

ionic start app tabs --v2 --skip-npm
然后,进入到项目目录app中安装依赖:
cnpm install

添加第三方的插件Echarts

首先,在终端中使用NPM安装Echarts
npm install echarts --save
然后,在declarations.d.ts文件中声明变量
declare module 'echarts';
接着,在需要调用的界面进行Import
import echarts from 'echarts';
最后,添加Ttypings解析(用于编译器的智能索引)
npm install @types/echarts --save
完成以上步骤就可以在界面中进行调用了

2.编写数据服务。

我们创建两个数据服务,分别用来操纵sensor集合和led集合。
sensor.ts的内容:

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的内容:

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.设计页面。修改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>电灯开关</ion-label> 
            <ion-toggle item-right color="danger" [(ngModel)]="ledState" (ionChange)="switch()"></ion-toggle>   
        </ion-item>
    </ion-list>
</ion-content>

4.修改类文件。

home.ts的内容为:

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[]=[];//定义温度数组 
     times:any[]=[]; //定义时间数组 
  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轴的设置
            //name:mydate,//x轴标题,显示日期,临时这样做,体现出这是哪天的数据
            //nameGap:'55',
            //nameRotate:'-45',
            data: this.times//x轴所使用的数据数组,前面用ajax方法得到
        },
        yAxis: [
        {
            type : 'value',
            axisLabel : {
                formatter: '{value} °C'//y轴数据的显示格式
            },
            splitLine : {show : true}//显示行分割线
        }
    ],
        series: [{//要展示的各个数据点
            type: 'line',
            data: this.temperatures
        }]
    });
  }
}

contact.ts的内容为:

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,194评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,058评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,780评论 0 346
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,388评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,430评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,764评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,907评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,679评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,122评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,459评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,605评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,270评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,867评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,734评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,961评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,297评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,472评论 2 348

推荐阅读更多精彩内容