物联网系统的搭建(十)

 简单物联网

到这时,我们算搭建了一个简单的REST服务了。接着我们可以简单的做一个最小的物联网系统,将我们的单片机、MCU等等连上网。

图像说明文字

考虑到如果我们只是单一连接各个节点,那么系统的结构图,同下所示

图像说明文字

下面的星形结构图类似于我们在接下来所要构建的系统

图像说明文字

一个用于控制真实电器的硬件实物图

图像说明文字

硬件通信

串口通信

Arduino与Raspberry Pi通过串口通信的方式实现通信,相互传输所需要的数据,Raspberry Pi将资源传于互联网上对应的接口,接口可以在互联网上被访问。Laravel框架构架于服务器之上,将Raspbery Pi获取过来的数据存储于MySQL数据,再以REST服务的方式共享数据,互联网上的其他设备便可以通过网络来访问这些设备。Ajax用于将后台的数据以不需要刷新的方式传递到网站前台,通过HighCharts框架显示给终端用户。

Python

1.在Windows中的串口通常是COM1,COM0等等

ser=serial.Serial("COM0",9600)

2.Mac OS系统中位于/dev目录下,名字类似于tty.usbmodem1451

    serial.Serial("/dev/tty.usbmodem1451",9600)

3.在Linux内核的系统中虚拟串口用的节点是ttyACM,位于/dev目录下。

    serial.Serial("/dev/ttyACM0",9600)

串行接口是一种可以将接受来自CPU的并行数据字符转换为连续的串行数据流发送出去,同时可将接受的串行数据流转换为并行的数据字符供给CPU的器件。一般完成这种功能 的电路,我们称为串行接口电路。

便是打开这个设备,以9600的速率传输数据。

import json
import urllib2
import serial
import time

url="http://www.xianuniversity.com/athome/1"

while 1:
    try:
        date=urllib2.urlopen(url)
        result=json.load(date)
        status=result[0]["led1"]
        ser=serial.Serial("/dev/ttyACM0",9600)
        if status==1 :
            ser.write("1")
        elif status==0:
            ser.write("0")
        time.sleep(1)
    except urllib2.URLError:
        print "Bad URL or timeout"

图像说明文字

系统还需要对上面的数据进行处理,只拿其中的结果

图像说明文字

当改变led的状态后,便可以得到下面的结果

图像说明文字

Ruby

如果你用的是Ruby的话,可以尝试使用serialport

安装

sudo gem install serialport

代码大致如下

require 'serialport'
sp = SerialPort.new "/dev/ACM0", 9600
sp.write "1"

注意: 根据相关的系统修改相关的代码。

1.2 I2C通信

2 硬件

2.1 51单片机

51单片机是对所有兼容Intel 8031指令系统的单片机的统称。该系列单片机的始祖是Intel的8031单片机,后来随着Flash rom技术的发展,8031单片机取得了长足的进展,成为应用最广泛的8位单片机之一,其代表型号是ATMEL公司的AT89系列,它广泛应用于工业测控系统之中。

这里以51单片机为例的原因是,多数大学课程都是以51单片机为主。

2.2 Arduino

2.3 Raspberry Pi

对于搭载GNU/Linux系统的RPi来说,这活就比较轻松了。

2.4 ARM

LwIP是Light Weight (轻型)IP协议,有无操作系统的支持都可以运行。LwIP实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用,它只需十几KB的RAM和40K左右的ROM就可以运行,这使LwIP协议栈适合在低端的嵌入式系统中使用。

git clone git@gitorious.org:coap-lwip/coap-lwip.git

TinyOS CoAP

2.5 继电器

继电器(英文名称:relay)是一种电控制器件,是当输入量(激励量)的变化达到规定要求时,在电气输出电路中使被控量发生预定的阶跃变化的一种电器。它具有控制系统(又称输入回路)和被控制系统(又称输出回路)之间的互动关系。通常应用于自动化的控制电路中,它实际上是用小电流去控制大电流运作的一种“自动开关”。故在电路中起着自动调节、安全保护、转换电路等作用。

3 协议间通讯

当我们有使用CoAP协议的A设备,以及HTTP协议的B设备。这时,就变成一个有意思的话题了。

Android简单示例

由于在某些嵌入式系统中使用的是Android系统,这里给出一个简单的Android App的示例,具体代码可以从clone自https://github.com/phodal/iot-android

代码说明,经过测试的版本有

  • Android 2.3
  • Android 4.0.4

机型有

  • HTC G1 (android 2.3)
  • Motor xt300 (android 2.3)
  • Sony ST25I (android 4.0.4)
  • MI2

应该可以在大部分的手机上工作。

调用Web Services GET

这里我们参考一篇文章来调用Web Services——Calling Web Services in Android using HttpClient

创建RESTClient

在这里我们首先会定义四个REST方法GET、POST、PUT、DELETE

public void Execute(RequestMethod method) throws Exception {
    switch (method) {
    case GET: {
        // add parameters
        String combinedParams = "";
        if (!params.isEmpty()) {
            combinedParams += "?";
            for (NameValuePair p : params) {
                String paramString = p.getName() + "="
                        + URLEncoder.encode(p.getValue(), HTTP.UTF_8);
                if (combinedParams.length() > 1) {
                    combinedParams += "&" + paramString;
                } else {
                    combinedParams += paramString;
                }
            }
        }

        HttpGet request = new HttpGet(url + combinedParams);
        request.addHeader("Accept-Encoding", "gzip");

        // add headers
        for (NameValuePair h : headers) {
            request.addHeader(h.getName(), h.getValue());
        }

        executeRequest(request, url);
        break;
    }
    case POST: {
        HttpPost request = new HttpPost(url);
        request.addHeader("Accept-Encoding", "gzip");

        // add headers
        for (NameValuePair h : headers) {
            request.addHeader(h.getName(), h.getValue());
        }
        if (!data.equals("")) {
            request.setEntity(new StringEntity(data, HTTP.UTF_8));
        }

        if (!params.isEmpty()) {
            request.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));
        }

        executeRequest(request, url);
        break;
    }
    case PUT: {
        HttpPut request = new HttpPut(url);
        request.addHeader("Accept-Encoding", "gzip");

        // add headers
        for (NameValuePair h : headers) {
            request.addHeader(h.getName(), h.getValue());
        }
        if (!data.equals("")) {
            request.setEntity(new StringEntity(data, HTTP.UTF_8));
        }

        if (!params.isEmpty()) {
            request.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));
        }

        executeRequest(request, url);
        break;
    }
    case DELETE: {
        HttpDelete request = new HttpDelete(url);
        request.addHeader("Accept-Encoding", "gzip");

        // add headers
        for (NameValuePair h : headers) {
            request.addHeader(h.getName(), h.getValue());
        }

        executeRequest(request, url);
        break;
    }
    }
}

这四个方法最后都执行executeRequest来获取响应结果。

protected void executeRequest(HttpUriRequest request, String url) {

        HttpParams httpParameters = new BasicHttpParams();
        HttpConnectionParams.setConnectionTimeout(httpParameters,
                timeoutConnection);
        HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket);

        HttpProtocolParams.setUseExpectContinue(httpParameters, false);
        request.setParams(httpParameters);

        setOauth(request);

        DefaultHttpClient client = new DefaultHttpClient();

        HttpResponse httpResponse;

        try {
            httpResponse = client.execute(request);
            responseCode = httpResponse.getStatusLine().getStatusCode();
            message = httpResponse.getStatusLine().getReasonPhrase();

            HttpEntity entity = httpResponse.getEntity();

            if (entity != null) {
                InputStream instream = httpResponse.getEntity().getContent();
                Header contentEncoding = httpResponse
                        .getFirstHeader("Content-Encoding");

                if (contentEncoding != null
                        && contentEncoding.getValue().equalsIgnoreCase("gzip")) {
                    instream = new GZIPInputStream(instream);
                }

                // instream = entity.getContent();
                response = convertStreamToString(instream);

                // Closing the input stream will trigger connection release
                instream.close();
            }

        } catch (ClientProtocolException e) {
            client.getConnectionManager().shutdown();
            e.printStackTrace();
        } catch (IOException e) {
            client.getConnectionManager().shutdown();
            e.printStackTrace();
        }
    }

接着,我们便可以执行getResponse()函数来获取结果。

使用REST Client获取结果

使用RESTClient时,便可以用下面的示例

RestClient client = new RestClient(tUrl);
try {
    client.Execute(RequestMethod.GET);
    if (client.getResponseCode() != 200) {
        //do something
    }
    //JSONArray jArray = new JSONArray(client.getResponse());
} catch (Exception e) {
    //do something
}

而这时,我们只需要对相应的数据进行处理就可以了,如

JSONArray jArray = new JSONArray(client.getResponse());
JSONObject jObj=jArray.getJSONObject(0);
vshow.setText(jObj.toString());

outputJSON(jObj);

将他转换为String,接着在Android端上显示最后的结果。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值