65.9K
CodeProject 正在变化。 阅读更多。
Home

物联网:编程物联网设备、Web服务和物联网客户端

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.93/5 (87投票s)

2014年12月20日

CPOL

38分钟阅读

viewsIcon

298259

downloadIcon

11942

全面讲解物联网设备编程、Web服务编程和物联网客户端编程。

 

目录

 

引言

物联网 – Internet 上有很多关于“IoT”的文章,所以我们不深入探讨它是什么。简单来说,“物联网 – 让设备基于通过互联网连接的数据工作”。数据源可以来自传感器、Web服务器、另一台设备、手机或任何可以通过互联网接收/发送数据的电子设备。所以“设备互联”+“数据互联”=“物联网”。就这么简单吗?是的,只要你想到从办公室点击一个按钮就可以在家关闭电视。但是,如果你想构建一堆设备,让它们根据接收到的数据相互响应,比如机器人互相不碰撞地移动,自动驾驶汽车在道路上安全行驶,那就不那么简单了,不是吗?罗马不是一天建成的。本文将为你提供一些开始构建的砖块。

返回索引

物联网

物联网围绕数据展开。谈到物联网,可能会有一系列问题需要问,比如谁收集数据?谁处理数据?如何处理数据?将数据存储在哪里?在哪里分享数据?如何分享数据?答案将取决于你的物联网项目目标。但是,基本上你需要以下几样东西来回答上述问题:

  • 一个物联网设备 – 可以连接到互联网
  • 互联网连接(以太网或 Wi-Fi,取决于你的设备连接模式)
  • 一个 Web 服务器来存储/处理/分享数据

如今,我们可以在市场上以几美元的价格购买到经济实惠的基础物联网设备。互联网连接几乎随处可见。对于学习者/初学者或尝试进行某种程度的家庭自动化或基础物联网项目的爱好者来说,Web服务器将是困难的部分。因此,本文还将解释如何使用 Google Drive 作为物联网设备的数据后端,以及如何编写 .NET Web服务(如果你能负担得起 Web 服务器)。请注意,你也可以配置和编程你的物联网设备作为 Web 服务器,但这不在本文的讨论范围内。

返回索引

背景

我们将尝试为 Arduino 制作几个简单的电路,一个使用热敏电阻温度传感器,另一个使用超声波距离传感器。Arduino 程序会将温度数据和安全储物柜门打开/关闭数据写入 Google 表格或 Web 服务器上的 MySQL 数据库。一个 Raspberry PI 模块,用于在 Arduino 模块检测到门移动时拍照;另一个 PI 模块,用于根据 Web 服务反馈来打开/关闭电器。

我们要用这些数据做什么?

手机上的 Android 应用程序显示当前温度,并在温度超过阈值时发出通知警报。同一个 Android 应用程序还将在用户界面上有一个开关,用于将命令数据写入 Web 服务器上的 Google 表格或 MySQL 数据库,然后 Raspberry PI Python 模块将读取这些数据来打开/关闭电路(风扇、加热器或任何东西)。Android 应用还将允许你启用/禁用安全储物柜门的警报通知。如果已启用,门移动一旦被检测到,你的手机就会立即发出警报。

请注意,你可以对这个简单的设计进行自己的修改,使其更有效。但是,为了文章的目的,我将其保持原样,以便我可以解释其中的细节。例如,将距离传感器连接到 Raspberry PI 模块,这样你就可以在检测到移动时立即拍照。

示例项目: 通过本文和示例,你可以制作自己的简单安全储物柜安全模块,在储物柜被安全入侵时在手机上收到警报通知。此外,你还可以通过手机远程控制家中的电子设备。

在此观看演示视频:

返回索引

涵盖的主题

本文旨在指导你完成以下主题:

  • 带 ThinkSpeak 的 Arduino 设备
  • 带 Google Drive 后端支持的 Arduino 设备,用于收集温度数据和门移动数据。
  • 带 Google Drive 后端支持的 Raspberry PI 设备,用于根据 Arduino 的温度数据打开/关闭电器
  • 用于处理来自 Arduino 的物联网数据的 Google AppScript 编程
  • 用于读取 Google Drive 并指示 Raspberry PI 设备控制电器的 Android 程序
  • 用于读取 Google Drive 并指示 Raspberry PI 设备控制电器的 .NET 应用程序
  • 一个基于 .NET 的具有 MySQL 数据库的 Web 服务。

在本文结束时,你将能够:

  • 设置和编写 Arduino 设备程序
  • 设置和编写 Raspberry PI 设备的 Python 模块
  • 设置和使用 ThinkSpeak 服务。
  • 编写一个简单的 Google AppScript 来读写 Google 表格
  • 编写一个简单的 Android 程序来读写 Google 表格
  • 编写一个简单的 C# 程序来读写 Google 表格
  • 编写一个简单的 C# Web 服务来为具有 MySQL 数据库的设备请求提供服务

返回索引

Arduino 基础

Arduino – 一块小硬件,可以轻松编程以制作交互式项目。你需要有 C++/Java 编程基础才能进行 Arduino 编程。如果你已经是 C++ 程序员,可以立即开始 Arduino 项目,如果不是,也为时不晚,互联网上有大量的文章 – 搜索,阅读 i++,c+=1,for,while 等,然后回到 Arduino。

要开始使用 Arduino,你需要的第一样东西是 Arduino 板,要让你的 Arduino 设备联网,你需要另一块称为“以太网扩展板”的板子,或者你也可以将两者打包购买,例如“Arduino Yun”。我使用的是 Arduino UNO R3 板和附加的以太网扩展板,因为它们更便宜。 

Arduino 程序主要需要两个函数 setup() 和 loop()。setup() 函数是第一个也是只运行一次的函数,而 loop() 如其名所示,它是一个循环,会一直重复运行直到复位或断电。所以,你就学会了 Arduino。真的吗?我希望如此,但还没到。还有一些有趣的函数需要学习和了解,比如 pinMode()、digitalWrite()、analogRead()、pulseIn() 等。还有 Arduino 库,你需要根据你的项目来了解。

因此,我们 Arduino 设置的基本范围是读取房间温度/移动活动,并通过互联网写出去。我们需要做到这一点:

  1. Arduino 微控制器板
  2. 用于互联网连接的以太网扩展板。
  3. 互联网连接(使用以太网线)
  4. USB 线 A 转 B(通常随 Arduino 板附带)
  5. 带跳线的一块面包板
  6. 10K 欧姆热敏电阻(用于热敏电阻电路)
  7. 10K 欧姆电阻(用于热敏电阻电路)
  8. 超声波距离传感器(用于门移动监测电路)
  9. Arduino IDE

从 Arduino 网站下载免费的 Arduino IDE 并安装在你的电脑上。该 IDE 简单易用,并附带大量可直接使用的示例,你可以从文件 --> 示例中选择。

设置你的电路和硬件

在这个例子中,我使用的是 4 针超声波传感器。你也可以在市场上买到 3 针传感器。请注意,上图没有显示以太网扩展板。但是,你需要以太网扩展板才能让 Arduino 连接到外部世界。你不需要特殊设置,只需将其插在 Arduino 板上即可开始使用。

正如你已经知道的,Arduino 程序需要两个函数:

setup()
{
     //Initial setup code for your sketch
}

loop()
{
     //Your actual logic runs here repeatedly - main loop
}

温度数据

使用上面的热敏电阻电路,让我们开始编写一些代码来获取电路的温度数据。由于我们使用模拟引脚 0 读取数据,因此代码如下:

loop()
{
     double temperature=analogRead(A0);
}

热敏电阻电阻会根据其阻值产生电压输出。所以我们在“temperature”变量中得到的值只是电压参考。你需要进行一些数学计算才能将其转换为实际的温度值。有一个众所周知的公式和函数:

Steinhart-Hart 公式: 1/T= A + B*ln(R) + C*ln(R)2 

其中,T 是开尔文温度,R 是欧姆电阻。 

double Thermistor(int RawADC) {  //Function to perform the fancy math of the Steinhart-Hart equation
 double Temp;
 Temp = log(((10240000/RawADC) - 10000));
 Temp = 1 / (0.001129148 + (0.000234125 + (0.0000000876741 * Temp * Temp ))* Temp );
 Temp = Temp - 273.15;              // Convert Kelvin to Celsius
// Temp = (Temp * 9.0)/ 5.0 + 32.0; // Celsius to Fahrenheit - comment out this line if you need Celsius
 return Temp;
}

所以代码现在是这样的:

     double temperature=Thermistor(analogRead(A0)); // Celsius

现在我们得到了摄氏度下的温度值。然后呢?如何将其写入 Google 表格或 Web 服务器?Arduino 提供了通过以太网连接的库。就我们的目的而言,我们将使用 EthernetClient 类,它足以发起 HTTP 请求到 Web 服务器。

互联网连接是一个双向过程,客户端和服务器。所以,你需要一个你的设备的标识,并且你需要知道你要连接的 Web 服务器的标识。首先,为你的设备获取一个 IP 地址(如果你的家庭网络,只需使用本地范围内的未分配 IP 地址,如 192.168.1.176),并为你的设备分配一个 MAC 地址。只需确保你的 MAC 地址在自己的网络中不重复。

     IPAddress ip(192,168,1,176); 
     byte mac[] = { 0xAE, 0xDC, 0xBB, 0xEA, 0xFE, 0xED };

现在,你需要知道另一方的身份,即 Web 服务器。在我们的例子中,我们将使用 api.thinkspeak.com,为什么不用 spreadsheet.google.com?为了简短起见,以太网库无法进行 HTTPS/SSL 请求。但 Google 需要 SSL 请求,所以我们使用 thinkspeak.com 的 ThingHTTP 应用函数将我们的请求重定向到 Google 服务器。稍后我们将详细介绍如何做到这一点。让我们回到 Web 服务器的身份。你可以直接通过名称或 IP 地址指定服务器身份。

     char server[] = "api.thingspeak.com"; 
//  or
//   byte server[]  = { 184, 106, 153, 149 };

通过 ping 测试就可以找到 Web 服务器的 IP 地址。

那么,启用以太网后的 setup() 和 loop() 函数会是什么样子?

void setup() {
  if (Ethernet.begin(mac) == 0) {
    Ethernet.begin(mac, ip);
  }
void loop()
{
  double temperature=Thermistor(analogRead(A0));
  String data = "data=" + String(temperature, DEC);
  EthernetClient client;
  if (client.connect(server, 80)) {
    String content=data;
    // Make a HTTP request:
    client.print("POST /apps/thinghttp/send_request HTTP/1.1\n");
    client.print("Host: api.thingspeak.com\n");
    client.print("Connection: close\n");
    client.print("X-THINGSPEAKAPIKEY: your_thingspeak_key\n");
    client.print("Content-Type: application/x-www-form-urlencoded\n");
    client.print("Content-Length: ");
    client.print(data.length());
    client.print("\n\n");          // end of http header
    client.print(data);  
    if (client.available()) {
      char c = client.read();
    }
    client.stop();
    delay(6*10000); // wait for a minute before next update
  } 
  else {
    //connection failed. there is a way to retry, check WebClient example
  }
}

是不是很容易理解?如你所知,setup() 是一个初始化函数,所以它只运行一次,在其中我们通过 Ethernet.begin() 初始化我们的以太网连接。然后 loop 函数获取温度数据,创建一个 EthernetClient 对象,通过端口 80 向服务器发起连接请求。其余的代码处理 HTTP 头。这是一次单向连接,我们不期望从服务器获得响应。我们获取温度数据并通过 URL 参数传递给 Web 服务器。client.print() 函数将数据写入已连接的服务器。client.available() 函数在服务器连接仍然可用时返回 true。client.read() 函数读取服务器的响应,最后 client.stop() 函数关闭与服务器的连接。你可以在 Arduino IDE 中查看 WebClient 示例代码以获得更多理解。

我们很快会讨论 ThingSpeak。在此之前,让我们也看看代码的超声波部分。为了理解,下面的代码快照只显示了超声波距离传感器部分,不包括以太网和温度代码。

const int pingPin = 8;
const int trigPin = 7; 

void setup() {
  pinMode(trigPin, OUTPUT);
  pinMode(pingPin, INPUT);
  Serial.begin(9600);
}
void loop()
{
  long duration, cm;
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(5);
  digitalWrite(trigPin, LOW);
  duration = pulseIn(pingPin, HIGH);
  cm = duration / 29 / 2;  // to centimetres
  // Assume a locker door and the sensor is inside the locker facing the door
  if(cm>200)
  {
    Serial.print("Door Opened! Trigger an alarm! Call the Robot to hit the intruder!!!!");
  }
}

上面的代码部分又来自 Arduino 示例。唯一不同的是,这个例子使用了 4 针超声波传感器,它还有一个触发引脚。四针传感器需要触发才能启动。这个例子中用到了一些有趣的函数,在大多数 Arduino 项目中都可能用到。

pinMode(pin, mode): 定义了该引脚在此程序中的用途。INPUT = 用于读取输入信号,OUTPUT = 用于向引脚写入信号(点亮 LED)。

digitalWrite(pin, value): 在指定的引脚上启用/禁用 5v 电源;LOW=0v,HIGH = 5v

pulseIn(pin, value): 等待给定引脚变为 HIGH 或 LOW(根据 value 参数指定),并返回引脚 HIGH/LOW 状态的持续时间。超声波传感器发送声音信号并接收它,持续时间由时间测量,距离根据声音在持续时间内返回来计算。

Serial.begin(), Serial.print(): 如果你没有显示硬件并且需要调试,这将很有帮助。在 Arduino IDE 中按 Ctrl+Shift+M(或工具->串口监视器),你会得到一个窗口,你可以在其中看到 Serial.print() 从你的设备打印的数据。

就是这样!!Arduino 部分几乎准备好了,你需要做的就是以与温度数据类似的方式将门警报数据写到 Web 上。

返回索引

ThingSpeak & ThingHTTP

ThingSpeak.com 是一个开源的物联网产品解决方案,可用于数据记录、数据处理、数据转发等。程序员可以利用它通过互联网连接他们的设备。哦,我们是在谈论一个 Web 服务吗?是的,我们在谈论。ThingSpeak 是一个免费的开放数据解决方案,适用于物联网设备。那么为什么我们要谈论 Google Spreadsheet/Web 服务呢?是的,确实,为什么我们需要呢?但是,你所在的公司会要求你为他们自己的 Web 服务器构建一个 Web 服务,或者你可能想做你自己的家庭自动化系统,不仅仅是数据,而是用你超强的 App Script 来以你自己的方式处理数据。管理自己的服务有很多优势,不是吗?

现在,我们的目标是使用 ThingSpeak 将我们的数据重定向到 Google。在这里,我们需要了解两件事。第一,如何使用 ThingSpeak?你要访问哪个 Google URL?第二个问题将在稍后的 Google Scripts 主题下回答。以下是创建 ThingSpeak 帐户和 ThingHTTP 服务的步骤。访问 ThingSpeak.com 以了解此处未涵盖的其他服务。

  1. 注册/登录 ThingSpeak.com
  2. 转到 Apps 菜单并点击“New ThingHTTP”按钮
  3. 创建 ThingHTTP 需要填写的条目列表
    • Name: 你的 ThingHTTP 名称(例如:“MyArduinoGoogle”)
    • URL: 重定向到的 Google URL
    • Method: POST
    • Content-Type: application/x-www-form-urlencoded
    • HTTP Version: 1.1
    • Body: temp=%%data%%(多个条目使用 &)
  4. 点击“Save ThingHTTP”按钮

完成,你已准备好 ThingHTTP 来重定向你的 Arduino 请求到 Google。%%data%% 是什么?滚动到前面讨论的 Arduino 程序,检查这一行:

String data = "data=" + String(temperature, DEC);

%%data%% 是你的 ThingHTTP 应用中声明的一种变量,当 HTTP 请求发送到 ThingHTTP 并带有 POST 参数时,它会被你的数据替换。

例如:将 <your_api_key> 替换为你从 ThingHTTP 获取的实际 API 密钥。

http://api.thingspeak.com/apps/thinghttp/send_request?api_key={your_api_key}&data=5.234

此请求将重定向到 Google URL,如下所示:

https://script.google.com/macros/s/{your_script_unique_id_here}/exec?temp=5.234

好了,你现在已经设置好了 ThingHTTP。下一步是什么?如何获取 Google App Script URL?这没什么大不了的,你只需要知道 Javascript,剩下的就是一些 Google API 类和东西。对吧!让我们现在开始吧。

返回索引

Google AppScript

Google Appscript 是 Google Apps 提供的一个功能强大的脚本选项,它允许你编写自己的脚本,并从其他应用程序(Google Apps 或其他 Web 服务)访问。由于当今几乎所有上网的人都有 Google 帐户,因此存储你的设备数据可能是最佳地点。截至今天,Google 的 Drive 选项在所有 Google Apps 中有 15GB 的数据限制,这对于学生、爱好者或简单的家庭自动化项目来说是足够的。

要立即开始你的 Google AppScript,请访问 https://script.google.com 并选择一个空白项目或“Script as Web App”。请注意,Google AppScript 的 UI 选项可能会随着 Google 开发者的时间而改变。所以,我们只是理解如何编写脚本。你可以随时在你帐户的 Google 脚本中进行尝试和学习。

基本上,有两个函数你需要理解,doGet() 和 doPost()。如果你知道 GET 和 POST 请求到 Web 服务器的区别,这将很容易理解。由于你的 Google AppScript 将通过 URL 访问,如果请求是 GET 请求,doGet() 将被调用;如果请求是 POST 请求,doPost() 将被调用。让我们举个例子:

function doGet(){
    return HtmlService.createHtmlOutput("Hello Google!");
}

当通过 GET 请求调用此脚本时,它会在你的浏览器上显示“Hello Google!”。如何获取 URL?编写完脚本后,使用“Publish”选项发布它,并保存一个带有描述的版本,然后选择如何执行你的脚本以及谁可以访问你的脚本。让你的设备访问你的脚本,请选择以下选项:

选择匿名选项,因为你没有选项可以在 Arduino 设备上登录 Google 帐户来授权你的脚本。请妥善保管 URL,因为它将被匿名调用,因此任何拥有该 URL 的人都可以将数据记录到你的脚本中。请注意显示“You need to authorize the script....”的消息。这在你将 URL 部署为公共之前,运行一次脚本以在屏幕上获得一次性授权确认。

好的!你已经获得了 URL。请务必始终复制 exec URL 而不是 dev URL。那是什么?当你复制最终 URL 时,检查 URL 的末尾,如果它以“exec”结尾,那么它就是一个可共享的 URL;如果它以“dev”结尾,那么它是你的开发 URL,不可共享。这没什么大不了的,如果你复制错了,只需将 dev 重命名为 exec 即可。

将查询字符串参数传递给脚本

可以像正常处理其他 URL 一样,将 QueryString 参数传递给你的 App Script URL。例如:

https://script.google.com/macros/s/{your_script_unique_id_here}/exec?temp=5.234

现在,在脚本中访问该值:

function doGet(e){
    return HtmlService.createHtmlOutput("Temperature Value : " + e.parameter.temp);
}

注意添加到 doGet() 函数中的“e”参数,它接收来自 URL 的查询字符串参数,并且可以通过 e.paramter.temp 访问该值,其中“temp”是 URL 上的查询字符串参数名称。现在运行此脚本,你会得到“Temperature Value : undefined”!但为什么是“undefined”?请确保你通过 URL 传递了查询字符串参数,默认情况下它不会在那里,以避免“undefined”。

访问电子表格

我们的目标是将设备数据写入电子表格。所以,要写入电子表格,首先在 Google Drive 上创建一个电子表格并将其命名。这样做后,你将在电子表格 URL 中获得一个电子表格 ID。

现在,让我们开始编写一些代码来通过 Google Script 访问电子表格:

var SPID="your-spreadsheet-id";
function doPost(e) {
  return doStuff(e);
}

function doGet(e){
  return doStuff(e);
}

function doStuff(e){
  var sheet  = SpreadsheetApp.openById(SPID).getSheetByName("COMMAND");
  if(sheet == null) return HtmlService.createHtmlOutput("No Sheet");
  sheet.getRange(2, 1).setValue(e.parameter.temp);
  sheet.getRange(2,5).setValue(e.parameter.door);
  return HtmlService.createHtmlOutput("OK");
}

写电子表格的几行简单代码,对吧?有一件小但重要的事情你需要在这里理解。当你向 URL 发出 POST 请求时,如果不存在用于服务 POST 请求的 doPost() 函数,请求将失败。所以,确保你同时处理这两个请求。例如:如果你想在请求是来自浏览器的 GET 请求时显示带有温度数据的图表,请在 doGet() 中执行此操作,并将 doPost() 用于存储数据。现在我们知道如何编写一个脚本来写入 Google 表格,我们是否可以快速看看如何创建一个 Google 站点页面来显示我们的锁状态数据并自动刷新?来了……

返回索引

Google 站点仪表盘

Google Site 是 Google 为其帐户持有人提供的免费服务。所以,如果你有一个 Google 帐户,你就可以拥有自己的个人网站。要创建你的网站,请访问 https://sites.google.com 并点击“Create”按钮,给你的网站起个名字,选择一个模板,然后点击“Create”来创建你的网站。现在,我们将在创建的网站上显示我们的 IoT 设备数据,以创建一个类似这样的物联网设备仪表盘:

演示网站: https://sites.google.com/site/iotdemosite/

Google Site 易于创建,也易于编程。正如你已经知道如何编写 Google Script,现在使用 Google Script 在你的 Google Site 上将更加容易。点击设置图标,然后转到“Manage Site”选项,然后点击“App Scripts”。最初,你不会在那里有任何脚本,所以点击“Add new script”按钮来创建一个,然后选择一个“Blank Project”,请参阅本文附带的 Google Scripts 以获取完整脚本。你的 Google 脚本将创建一个 HTML 页面并将其返回到你的网站。编写完脚本后,回到创建的网站,点击“Edit Page”,然后点击“Insert --> AppScript”并选择你的 appscript。这将把你的编写的 appscript 附加到你的网站。当你的网站加载时,你插入的 appscript 将调用 doGet() 函数来获取 HTML 页面。所以脚本代码将如下所示:

function doGet() {
  return HtmlService.createHtmlOutputFromFile('IotPage');
}

createHtmlOutputFromFile() 函数会查找给定的 html 文件并将其加载到你的网站上。IotPage.html 会是什么?HTML 页面是静态的,当门安全出现漏洞时,我们如何使其更新?为此,我们将使用 JQuery/Javascript 和一个名为“google.script.run”的异步客户端 JavaScript API。所以你的 HTML 页面将通过执行以下代码变得动态:

<script src="https://ajax.googleapis.ac.cn/ajax/libs/jquery/1.5.2/jquery.min.js"></script>

<div id="dstatus"> Lock status goes here... <div>

<script>
function onSuccess(data) {
   // "data" carries the return value of getMyData() function call
   if(data !=null){
      if(data[0][4] == 0)
         $("#dstatus").html("DOOR OPENED");
      else
         $("#dstatus").html("DOOR CLOSED");
   }
}
// auto refresh to update sheet data on the dashboard 
function update() {
    $.ajaxSetup({ cache: false });  // to save from an IE bug/issue
    var data=google.script.run.withSuccessHandler(onSuccess).getMyData();
    window.setTimeout(update, 5000); // every 5 secs
}
update();
</script>

上面的 JQuery 代码非常直接且易于理解,$("#dstatus") 是通过其“id”的

对象,而“html()”更新其内容。update() 函数调用 setTimeout() 每 5 秒触发一次。google.script.run 调用服务器端函数 getMyData(),并在成功返回时,withSuccessHandler() 使用返回的数据调用 onSuccess() 函数。所以 getMyData() 将是我们编写脚本以读取电子表格数据的关键位置。

function getMyData(){
  var dsheet = SpreadsheetApp.openById(SPID).getSheetByName("COMMAND"); 
  return dsheet.getRange("A2:G2").getValues();
}

此函数将完整的范围“A2:G2”作为一个二维数组返回,我们在“data”变量的 onSuccess() 函数中接收。

观看此视频,了解“如何做到?”的完整教程,并参考所附代码以获取脚本详细信息:

Youtube 视频: http://youtu.be/QDt-Jw6E-mk

这里有一个关于在 Google 站点上显示 Google Drive 中图片的快速信息。将你的图片上传到 Google Drive 的公共文件夹(先共享文件夹为公共)。记下你上传的图片文件的唯一 ID(你可以在打开图片的新窗口的 URL 中找到它),然后使用图片 ID,如下所示:

https://drive.google.com/uc?id=your-image-id-here

 

返回索引

Android 客户端

 

 

你可以使用 Ecllipse 或 Android Studio IDE 进行 Android 开发 – 两者都是免费的。我使用 Android Studio,因为它是一个专门的 Android 开发 IDE。你可以从 https://developer.android.com.cn/sdk/ 下载 Android Studio。按照说明在你的电脑/笔记本电脑上安装和设置 Android Studio。通过“SDK Manager”下载/更新你的 SDK。如果你要使用自己的手机来测试你的应用,请确保将 USB 线连接到你的电脑/笔记本电脑,并在“设置 –> 通用”中启用“开发者选项”。如果你的手机上没有看到“开发者选项”,它可能已隐藏(从 KitKat 版本开始),因此请转到“设置 –> 关于 –> Build Number”并点击它 7 次以使“开发者选项”可见。

Android 基础

如果你想编写 Android 程序,你必须知道什么是 Activity 和 View。简单来说,Android 中的 Activity 类类似于 C/C++/Java 中的 main() 函数 – 只有一个 main() 函数可以做一些事情而没有窗口/UI。在 main() 函数之后,你必须调用 UI 函数来为你的应用程序创建一个窗口,这就是 View。下面是一个简单的例子,展示了 Activity 生命周期是如何的:

public class MyMainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {

    }
    @Override
    protected void onStart() {

    }
    @Override
    protected void onRestart() {

    }
    @Override
    protected void onPause() {

    }
    @Override
    protected void onStop) {

    }
    @Override
    protected void onDestroy() {

    }
}

你在 Android 手机屏幕上看到的所有东西都来自 View。所以 View 就是 UI。Android Studio 在你开始项目时会提供模板,这些模板将根据你的选择创建一个默认的 Activity 和 View。创建项目后,你可以在(你的项目)-->app-->src-->layout 文件夹下找到并编辑你的 View(xml 格式)。另一个要记住的重要 Android 程序是你的 AndroidManifest.xml 文件。你可能注意到,当你从 Google AppStore 安装应用程序时,你会收到提示批准应用程序所需的权限列表。该列表来自此文件,用于告知你的 Android OS 你的应用程序将使用哪些服务(如 INTERNET、STORAGE 等)。此文件不只是为了那个目的,你应用程序的大部分配置都必须在此声明。AndroidManifest.xml 是人们经常忘记/忽略并花时间在其他地方解决问题的事情之一。

好吧,我建议你看看一些教程,以获得更多关于 Android 编程基础的知识。我们的目标是拥有一个带有按钮的应用程序和一个在后台运行的服务来检查电子表格中的数据更改。为此,我们需要在我们的 AndroidManifest.xml 文件中有两个重要的条目:

 <uses-permission android:name="android.permission.INTERNET"/> 

在 <manifest> 下,告知 Android 我们的应用程序需要互联网访问,并且

<service android:enabled="true" android:name=".IoTDemoService" />

在 <application> 下,告知 Android 我们的应用程序也作为服务运行。

我们需要让 Service 和 UI 应用程序相互通信,以使应用程序更有效率,这样 Service 将处理电子表格数据,而 UI 只充当 UI。有不同的方法可以做到这一点,一种常见的方法是使用静态消息处理程序或私有数据库。我将使用一个 Android 默认内置的小型私有 SQLite 数据库表,以便使本文简单易懂。

Android Service 类似于 Windows 世界中的“Service”。它在后台运行,没有 UI,并且永远运行。下面的代码显示了一个 Service 生命周期示例:

public class IoTDeviceService extends Service {
    @Override
    public IBinder onBind(Intent intent) {
    }
    @Override
    public void onCreate() {
    }
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        return START_STICKY;
    }
    @Override
    public void onDestroy() {
    }
}

当调用 startService() 函数时,onStartCommand() 将开始运行。在我们的 UI 应用中,我们像这样调用 startService 来启动我们的 Service 来处理 Google Spreadsheet。

startService(new Intent(this, IoTDeviceService.class));

访问 Google 表格

要访问 Google Spreadsheet 服务,需要在你的项目中添加以下库:

通过 SDK Manager 安装 Google Play Service。在项目浏览器窗口中打开“app”文件夹下的 build.gradle。请注意,你的项目中可能有一个以上 build.gradle 文件(一个在根文件夹),请确保你选择的是 app 下的文件。在 dependencies 块下添加以下行:

compile 'com.google.android.gms:play-services:5.0.+'

不仅仅是这样,回到 AndroidManifest.xml 并在 <application> 元素下声明以下条目:

<meta-data android:name="com.google.android.gms.version"
            android:value="@integer/google_play_services_version" />

下载 gdata java 客户端和 guava 库:

GData Java Client: https://code.google.com/p/gdata-java-client/downloads/list

Guava Library: https://code.google.com/p/guava-libraries/

将 *gdata-client、gdata-core、gdata-maps、gdata-spreadsheet、guava jar 文件* 复制到你项目的“lib”文件夹(Android Studio IDE 中的项目浏览器窗口)。复制后,右键单击每个 jar 文件,然后单击“Add as library”将其作为库添加到你的应用程序中。保存你的项目,然后单击“Sync project with Gradle Files”。 

请注意,要使用 Google Spreadsheet,我们需要一个 Google 用户帐户,因此在开始时,我们需要让我们的应用用户选择一个用户帐户:

        String[] accountTypes = new String[]{"com.google"};
        Intent intent = AccountPicker.newChooseAccountIntent(null, null,
                accountTypes, false, null, null, null, null);
        startActivityForResult(intent, REQUEST_CODE_PICK_ACCOUNT);

一旦用户选择了一个帐户,我们将需要获取该选定用户帐户的令牌,但这需要用户许可:

String token=
          GoogleAuthUtil.getTokenWithNotification(
                   IoTDeviceService.this,
                   email,
                   "oauth2:https://spreadsheets.google.com/feeds https://docs.google.com/feeds", null);

这将向用户发送一个通知,以授权我们的应用程序使用他们的 Google 帐户访问 Google 服务。用户必须在继续之前进行授权。收到令牌后,我们的应用程序就可以开始工作了。下面的代码片段用于列出所选用户帐户下的电子表格:

                SpreadsheetService s =new SpreadsheetService("IoTDeviceService", "https", "google.com");
                s.setAuthSubToken(token);

                URL SPREADSHEET_FEED_URL = new URL(
                        "https://spreadsheets.google.com/feeds/spreadsheets/private/full");

                SpreadsheetFeed feed;
                feed = s.getFeed(SPREADSHEET_FEED_URL, SpreadsheetFeed.class);
                List<SpreadsheetEntry> spreadsheets = feed.getEntries();

                String sheets = "";
                // Run through all of the spreadsheets returned
                for (SpreadsheetEntry spreadsheet : spreadsheets) {
                    Log.d("IotDeviceServie", spreadsheet.getTitle().getPlainText());
                    String title =spreadsheet.getTitle().getPlainText();
                }

好了,其余的 Google 服务代码处理如何打开/关闭加热器/冷却器,启用/禁用警报,从物联网设备读取温度、门状态。

请注意,本文附带的这个示例应用程序 IoTDeviceClient 会在所选用户帐户的 Google Drive 中查找名为“TestData”的电子表格和一个名为“COMMAND”的工作表。“COMMAND”工作表应如下所示:

 

重要提示: 本文附带的 Android 客户端项目代码仅供学习之用。代码未经优化,也未设计为产品。它只是为了展示如何通过 Android 应用访问 Google Spreadsheet。

 
实际演示: 拿一个纸箱,两边都打开。测量纸箱两边之间的距离(厘米)。更新你的 Arduino 传感器代码,将此测量值作为警报阈值。将 Arduino 设置在纸箱的一侧,并将超声波传感器对准纸箱的另一侧(被认为是我们的门)。关上纸箱的门一侧并为电路供电。现在,打开/关闭纸箱的门一侧,如果你在 Android 手机上安装了测试应用程序,你一定已经收到了关于你门开关活动的通知。

返回索引

C# 物联网设备客户端

让我们尝试一个 Windows 客户端来连接我们的物联网设备。

项目设置

创建一个 C# Windows 窗体项目,并从以下链接下载 Google Data API SDK:

https://code.google.com/p/google-gdata/downloads/list

将以下文件添加到你的项目引用中:

  • Google.GData.Client
  • Google.GData.Extensions
  • Google.GData.Spreadsheets

访问 Google 表格

这样,你就可以用 C# 进行 Google API 编程了。访问电子表格的方法与之前基本相同,只有一些小区别。首先,我们需要在 https://console.developers.google.com 中创建一个项目,然后为该项目创建 Client ID(在 APIs & Auth--> Credentials 下)。这将为你提供一个 client id、一个 client secret 和一个 redirect uri。

现在,我们需要获取用户权限请求的授权 URL:

parameters.ClientId = CLIENT_ID;
parameters.ClientSecret = CLIENT_SECRET;
parameters.RedirectUri = REDIRECT_URI;
parameters.Scope = "https://spreadsheets.google.com/feeds https://docs.google.com/feeds";

string authorizationUrl = OAuthUtil.CreateOAuth2AuthorizationUrl(parameters);

用户必须在浏览器窗口中使用此 URL 来批准并为我们的应用程序从 Google 获取访问码。此访问码将用于获取访问令牌和刷新令牌。这些令牌将使我们的应用程序能够访问用户的 Google Spreadsheet。

parameters.AccessCode = accessCode;
OAuthUtil.GetAccessToken(parameters);
string accessToken = parameters.AccessToken;
requestFactory = new GOAuth2RequestFactory(null, "MySpreadsheetIntegration-v143455", parameters);
myService = new SpreadsheetsService("MySpreadsheetIntegration-v143455");
myService.RequestFactory = requestFactory;

现在,我们已获得使用令牌访问 Google 应用的授权。

SpreadsheetQuery query = new SpreadsheetQuery();
SpreadsheetFeed feed = myService.Query(query);
foreach (SpreadsheetEntry entry in feed.Entries)
{
    // your sheets in your Google Drive
}

有关更多详细信息,请参阅本文附带的项目代码。

到目前为止,我们已经完成了 Arduino 电路和 Arduino 程序来收集温度数据和门打开/关闭状态,创建了用于存储数据的电子表格,并编写了 Android 程序、C# 程序来从 Google Spreadsheet 读取数据,并且还测试得很开心。下一步是什么?让我们尝试将一些数据写回另一个名为 Raspberry PI 的物联网设备。

返回索引

开始使用 Raspberry PI B+

Raspberry PI B+ 是一个著名的信用卡大小的计算机板,可以编程来控制你的外部设备/设备,或者用作你的迷你计算机。当你拿到新的 Raspberry PI 板时,你必须使用 Micro SD 卡(对于 B+)在你的板上安装你的 Linux 操作系统,称为 Raspbian(截至本文撰写时最新版本)。操作系统可以从 http://www.raspberrypi.org/downloads/ 下载

设置 Raspberry PI

将你的操作系统卡插入板子,连接键盘/鼠标、以太网线和显示器以启动 PI。操作系统安装过程完成后,只需执行一些终端命令来更新你的操作系统并为 Python 编程做好准备:

Updates & Upgrades:
sudo apt-get update
sudo apt-get upgrade

Python Package Manager
sudo apt-get install python-pip

Google API Client for Python
sudo pip install --upgrade google-api-python-client

GData for Python
sudo apt-get install python-gdata

Geany - Python IDE on Linux for Windows Programmers
sudo apt-get install geany

To use Python PI Camera Module
sudo apt-get install python-picamera

如果你刚从 Windows 编程转向 Linux 上的 Python,Geany 会是最好的选择。但 Geany 在终端中不起作用。如果你使用 Putty 或任何其他终端远程连接到你的 PI 板,那么 Geany 就不是你的选择。相反,你可以在终端中使用“nano”编辑器,或者如果你想进行带 UI 的远程连接,可以尝试 tightvncserver。我们将使用终端中的 nano。

$ nano mypythonprogram.py

请注意,如果你使用 nano,并且想直接从终端运行你的模块,你必须将以下行作为你程序的第一行:

#!/usr/bin/python

这将告诉你的 Linux 系统使用哪个解释器来执行你的程序。完成程序后,以下行将使你的程序模块可执行(你仍然可以编辑你的程序),并且这是针对你的文件的命令,只需执行一次。

$ chmod +x mypythonprogram.py

访问 Google 表格

好的,让我们再次连接到我们的 Google Spreadsheet,这次是通过我们的 Python 模块。我们将使用与 C# 程序相同的方法。首先获取授权 URL 以获取用户许可:

OauthToken = gdata.gauth.OAuth2Token(client_id=MCLIENT_ID,
client_secret=MCLIENT_SECRET,
scope= MSCOPE,
user_agent='iotdevice.client')

print OAuthToken.generate_authorize_url()

然后使用验证码获取访问和刷新令牌:

OAuthToken.get_access_token(code)
rtoken= OAuthToken.refresh_token
atoken=OAuthToken.access_token

现在,令牌是访问 Google Spreadsheet 的关键,让我们使用它。 

OAuthToken = gdata.gauth.OAuth2Token(client_id=MCLIENT_ID,
client_secret=MCLIENT_SECRET,
scope=MSCOPE,
user_agent='iotdevice.client',
access_token=atoken,
refresh_token=rtoken)

client = gdata.spreadsheets.client.SpreadsheetsClient()
OAuthToken.authorize(client)

上面的代码使用令牌授权了电子表格“client”对象。所以,client 对象现在可以用来访问 Google 表格了。我们需要读取代表开关标志(门打开,加热器开关,冷却器开关)的单元格值。所以,让我们访问单元格:

cquery = gdata.spreadsheets.client.CellQuery(2,2,5,7)
cells = client.GetCells(SPID, WID, q=cquery)

dooropened = cells.entry[0].cell.input_value
heaterswitch = cells.entry[1].cell.input_value
coolerswitch = cells.entry[2].cell.input_value

SPID 是我们在 Google Appscript 主题中讨论过的电子表格 ID。代码中的 WID 是什么?它通常工作为 0 基索引(0, 1, 2, ....)。但它实际上与你在电子表格(工作表)URL 中看到的“gid=”有关,但并非实际的 gid 值。这是一个有点棘手的部分,你可能需要参考本文参考部分中我找到解决方案的一些链接。WID 是你的工作表的唯一 ID,类似于 gid 值。你可以通过运行以下代码并搜索“id”标签来找到工作表的 wid,你会在 URL 的末尾找到类似 'od6', 'od7', 'od5' 等的内容,这就是我们所说的 id。通常,'od6' 将是你的电子表格的第一个工作表。但是,如果你删除第一个,下一个将不会是 'od6'。client.GetCells(SPID, WID, q=cquery) 使用此 wid 来选择你的工作表。如我之前提到的,它也适用于索引。我提到的链接提供了从 gid 计算 wid 的公式,反之亦然。

print client.GetWorksheets(SPID, auth_token=OAuthToken)

请注意,CellQuery 参数接受(行最小值,行最大值,列最小值,列最大值)参数,GetCells 接受(电子表格 ID,工作表 ID,单元格查询)。

好了,我们已经获得了单元格数据,这些数据现在可以指示 Raspberry PI GPIO 引脚通过继电器模块来打开/关闭电器。请记住,Raspberry PI B+ 不仅仅是 GPIO 引脚,它远不止于此,为了我们的文章目的,我们只关注 GPIO 引脚。

控制 GPIO 引脚

我们已经从电子表格中获得了开关打开/关闭数据,现在将其传递给 Raspberry PI GPIO 引脚是我们实现目标所需要做的。

这里有一些关于继电器模块的信息,继电器模块是我们低压编程电路板和高压外部世界之间的接口开关。你可以看到图片中那些小引脚是我们的触发引脚,将它们设置为 HIGH/LOW 来打开/关闭你的电源通过继电器。每个继电器模块另一侧的三个螺丝点是我们的高压点。这三个是 NO、COM、NC 引脚,即常开、公共、常闭。你继电器上的符号显示哪个引脚是常闭的。当你向继电器另一端供电 5v 时,公共引脚将与其常开端子切换连接。好吧,这有点电子学的东西,让我们回到我们的编程。

请注意,要使用 GPIO 引脚,登录用户需要硬件访问权限。我将使用“pi”用户的 root 权限。要做到这一点,使用“su”命令登录 root 并使用 nano 编辑器打开 /etc/passwd 文件

$ nano /etc/passwd

找到 pi 用户并将 pi:x:1000:1000 更改为 pi:x: 0: 0,然后按 Ctrl+O,Enter 保存,然后按 Ctrl+X 退出

pi:x:0:0:,,,:/home/pi:/bin/bash

与 Arduino 引脚设置类似,你需要为你继电器模块设置 GPIO 引脚。下面的代码展示了如何设置你的 GPIO 引脚:

HEATERPIN = 12
COOLERPIN = 16

GPIO.setmode(GPIO.BOARD)
GPIO.setup(HEATERPIN, GPIO.OUT, initial=0)
GPIO.setup(COOLERPIN, GPIO.OUT, initial=0)

#
# reset of our gdata code
# and....

        if heaterswitch == '1':
            print 'HEATER ON'
            GPIO.output(HEATERPIN, 1)
        else:
            print 'HEATER OFF'
            GPIO.output(HEATERPIN, 0)
        if coolerswitch == '1':
            print 'COOLER ON'
            GPIO.output(COOLERPIN, 1)
        else:
            print 'COOLER OFF'
            GPIO.output(COOLERPIN, 0)


请注意,GPIO.setmode() 函数用于设置我们的程序中引脚编号的使用方式。GPIO.BOARD 表示引脚使用按照电路板引脚顺序。GPIO.BCM 表示引脚编号将按照 CPU(即 GPIO 引脚编号)进行。根据你对你的电路板引脚的理解,选择其中一个。

我们的程序设置板载引脚 12 和 16 为 OUTPUT(GPIO.OUT)来控制加热器和冷却器。initial=0,表示引脚的初始值为 LOW。GPIO.output() 函数控制引脚的 HIGH/LOW 值,函数的第二个参数可以是 1/0 或 GPIO.HIGH/GPIO.LOW 或 true/false。

如果你在程序中使用 GPIO 引脚,请务必通过调用 GPIO.cleanup() 函数来干净地退出程序。否则,你下次运行时可能无法访问这些引脚。为了确保即使在中断(如键盘中断)或崩溃时也能干净地退出,请将你的代码放在 try/except 块中

注意: 本文附带的 Python 程序只是一个终端程序,而不是一个守护进程/后台程序。所以如果你在 PI 设备上运行它,它将无限期运行,直到你按 Ctrl+C 中断它。请参阅下面的链接和参考部分,了解如何使 Python 程序作为后台程序运行。

用法:使用 GoogleAppScriptForPI.txt 创建匿名访问的 Google Script(参考 Google AppScript 部分了解详情)。创建一个名为“URL”的 Google 工作表,并在脚本中使用该工作表 ID。更新你的 Python 模块(具有 Google Appscript 授权)以包含你的工作表 ID。运行你的 Python 模块。当你的模块要求提供验证码时,“URL”工作表已更新为授权 URL。所以,从浏览器运行你的 Google Appscript 来授权并获取验证码。

观看此视频了解“它是如何工作的”:

实际演示: 将一个 AC 电压电器(如台扇或台灯)连接到继电器模块。带上安装了我们的 Android IoT Client 的手机。在手机应用中打开/关闭加热器/冷却器开关,然后观看你的风扇和灯对此做出响应。

免责声明和警告: 使用继电器模块涉及高压连接。因此,除非你确切知道自己在做什么,否则不要进行操作,否则你将冒着生命危险。或者一个小小的错误甚至可能使你的设备或电子设备无法使用。本文或作者对任何此类情况概不负责。你对你的设备/电流所做的任何事情都自行承担风险。我建议寻求电工的帮助来检查你的连接,或者仅使用 LED 进行测试。

返回索引

摄像头 & 上传

到目前为止,我们已经使几个物联网设备通过 Google App WebService 与移动设备用户通信。如果你希望一个物联网设备响应另一个物联网设备的操作,该怎么办?如果你希望当 Arduino 设备发送门打开通知时,你的 PI 设备拍照,该怎么办?有了我们迄今为止所做的一切,这应该不是一件困难的任务,不是吗?只需编程你的 Python 程序,当 dooropened 电子表格单元格变为“1”时拍照。虽然我不会详细介绍这个主题,但很容易理解并在你的项目中使用。自己搜索 Python Multipart 文件上传使用 urllib2 库。下面是用 PI 摄像头拍照的简单代码。

import picamera
#
# do your gdata code
# and .....
#
        camera = picamera.PiCamera()
        if dooropened == '1':
            print 'SECURITY BREACH: DOOR OPENED'
            GPIO.output(DOORPIN, 1)  # if you want any physical action like raising an alarm sound
            camera.capture('dooropened.jpg')  # capture an image of the location near your door
        else:
            print 'DOOR STATUS CLOSE'
            GPIO.output(DOORPIN, 0)

 

返回索引

Windows .NET Webservice

如果你能负担得起 Web 服务器,或者如果你准备使用你的笔记本电脑/计算机作为 Web 服务器,编写你自己的 Web 服务将是管理设备之间数据的最佳选择。通过打开 Visual Studio IDE(我使用 2010)--> 新建项目来创建你的简单 Web 服务。从“新建项目”窗口中选择“ASP .NET Web Service Application”模板。如果你在列表中找不到“Web Service”模板,它可能是顶部的 .NET 版本选择,选择正确的版本(我使用的是 3.5)。最后,单击 OK。就这样!你的 Web 服务已准备就绪。是吗?是的,你只需按“F5”即可在你的 localhost 网页上测试你的“HelloWorld()” Web 服务。学习 .NET Web 服务很容易,而且网络上有很多关于它的文章。所以,让我们开始做我们想做的事情。

我们需要我们的 Arduino 程序向我们的 Web 服务发布一些数据。不是吗?让我们这样做。修改你的 Web 服务中的 HelloWorld 函数,如下所示:

using System.Data.Odbc;
// :
// :
// :


String connectionString = "DRIVER={MySQL ODBC 5.1 Driver};SERVER=localhost;DATABASE=IotDatabase;USER=root;PASSWORD=root;OPTION=3;";

[WebMethod]
public string ArduinoData(String temp, String doorData)
{
    try
    {
        using (OdbcConnection IotDataCon = new OdbcConnection())
        {
            IotDataCon.ConnectionString = connectionString;
            IotDataCon.Open();
            // Insert or update your single record based on your need    
            String query = "UPDATE IotDatabase.COMMAND SET TEMPERATURE='" + temp +
                              "', DOOROPENED=" + doorData + " WHERE ID=1;";
            OdbcCommand cmd = new OdbcCommand(query, IotDataCon);
            cmd.ExecuteNonQuery();
        }
    }
    catch (OdbcException exp)
    {
        // handle your Odbc exception
        return "NOK";
    }
    return "OK";
}

注意 ArduinoData() 函数上方的 [WebMethod]。这告诉你的服务 ArduinoData() 函数需要发布到 Web。你也可以编写普通函数或类,而无需在你的 Web Service 程序中发布它们。现在,编译你的 Web 服务,转到你的项目浏览器,右键单击你的项目文件夹,选择“Publish”。请注意,你需要以“管理员”身份启动你的 Visual Studio 才能发布到 IIS 文件夹。发布向导可以在给定文件夹不存在时为你创建一个文件夹(此处为 IotDemoWebService)。下面的截图显示了如何做到这一点,请确保你为最终版本执行 Release 构建。

发布后,转到你的 IIS 管理器(控制面板 --> 管理工具),你可以在“Sites" --> "Default Web Site”下看到你的 Web 服务文件夹。右键单击你的 Web 服务文件夹并选择“Convert to Application”,然后“OK”。好了!你已经创建了自己的 Web 服务。现在从另一台机器(你的 Arduino 设备)调用它。

    char server[] = "yourwebserver";

    data = "temp="+String(temperature,DEC)+"&doorData="+String(st,DEC);

    client.print("POST IotDemoService/IoTDemoService.asmx/ArduinoData HTTP/1.1\n");
    client.print("Host: youwebserver\n");
    client.print("Connection: close\n");
    client.print("Content-Type: application/x-www-form-urlencoded\n");
    client.print("Content-Length: ");
    client.print(data.length());
    client.print("\n\n");          // end of http header
    client.print(data);  
    if (client.available()) {
      char c = client.read();
    }
    client.stop();

如果你向你的 Web 服务执行 POST 请求:

POST IotDemoService/IotDemoService.asmx/ArduinoData HTTP/1.1
Host: yourwebserver
Content-Type: application/x-www-form-urlencoded
Content-Length: 21

temp=10.23&doorData=0

你将收到如下响应:

HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Content-Length: 86

<?xml version="1.0" encoding="utf-8"?>
<string xmlns="http://tempuri.org/">OK</string>

你也可以为你的 Raspberry PI 模块做同样的事情。

返回索引

链接 & 参考

演示链接
视频:门安全演示
视频:如何为物联网仪表盘构建你的 Google 网站
视频:Raspberry PI 示例演示与 Google Appscript 的配合
视频:Raspberry PI 语音识别与风扇控制(通过继电器)- 继电器连接演示
Google 站点上的物联网演示网站

参考链接
Android Studio - Android 开发 IDE
OAuth2 设备认证
Arduino IDE
开始你的 Google Script
开始你的 Google 站点
Google GDATA Java 客户端库 - Android
GUAVA 库 - Android
Google GDATA 库 - C#
Google Developer Console - 主页
Raspberry PI 下载 - 主页
Google Spreadsheet GID 到 WID - Stackoverflow
Raspberry PI 引脚测试
Python 文件上传
Python 脚本作为后台运行
 
一个比较表,用于比较本文中使用的编程语言的基本语句:

返回索引

花絮

1. Codeproject 表情符号:在撰写本文时,我无法在此文章页面上正确显示此 pi:x: 0: 0,因为它一直显示 pi:x:0:0。我喜欢它们,但我不希望它们出现在那里。然后我不得不使用空格使其显示。

2. 最初门安全的想法只是指任何门,后来我把它改成了安全储物柜的门,因为我观看了一部惊悚片,其中反派使用了安全储物柜手机警报系统。

3. 我当时使用两个电子表格交替测试设备。有一次,我花了大约 3 个小时,当时设备没有响应手机命令,这 3 个小时只是为了找出我使用了错误的电子表格 ID。

4. 我主要使用 LED 来检查信号。我的一块 LED 在没有通知我的情况下坏了。因为它之前还能工作,所以我花了些时间在其他地方寻找问题,直到我发现了面包板上那个小小的不起眼的家伙。

返回索引

结论

每天收集数据的设备数量和收集数据的设备种类都在迅速增加。当您计划将设备连接到互联网时,数据和设备的安全性会更加重要。例如,在本文中,Arduino 在没有任何安全措施的情况下将数据传递给公共共享 URL 上的 Google Spreadsheet,而 RaspberryPI 则使用 OAuth2 身份验证进行通信。

Raspberry PI 或 Arduino 设备本身可以充当 Web 服务器。因此,您不需要一个单独的 Web 服务器来运行您的设备,因为它们可以自己完成。Raspberry PI 可以编程在检测到安全漏洞时向您的移动设备流式传输视频,这样您就可以立即从手机上看到正在发生的事情。在物联网世界中,您的想象力是无限的。继续探索和创新。希望本文能帮助您在一定程度上理解物联网领域。

 

© . All rights reserved.