# 一步步搭建物联网系统(教你设计物联网系统)

# 1 简单物联网

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

硬件结构图

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

全连接

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

星形结构图

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

简单实物图

## 1.1 硬件通信

### 1.1.1 串口通信

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

#### 1.1.1.1 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的速率传输数据。

程序框架如下所示:

Raspberry Pi

代码如下:

    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"

python返回json数据

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

python处理完后的结果

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

改变状态后的结果

#### 1.1.1.2 Ruby

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

安装

    sudo gem install serialport

代码大致如下

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

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

## 1.2 硬件

### 1.2.1 Arduino

这样我们在我们的Arduino上所要做的便是，读取串口的结果并控制IO口。

    int ledPort=13;

    void setup() {
      Serial.begin(9600);
      pinMode(ledPort,OUTPUT);
    }

    int serialData;
    void loop() {
      String inString = "";
      while (Serial.available()> 0)
      {
        int inChar = Serial.read();
        if (isDigit(inChar)) {
          inString += (char)inChar;
        }
        serialData=inString.toInt();
        Serial.print(serialData);
      }
      if(serialData==1){
        digitalWrite(ledPort,HIGH);
      }else{
        digitalWrite(ledPort,LOW);
      }
    }

如果结果是1的话，就让13口为高电平，也就是让灯亮起来。

### 1.2.2 继电器

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

在这里我们可以默认为我们想要为单片机的5V电压控制220V的电器。

最后我们便可以通过些来控制灯的开和关。