Skip to content

6. 附录

本文将说明如何在 Windows 7 至 10 系统上安装本文档中使用的工具。读者应根据自身环境调整这些说明。

6.1. 安装 Arduino IDE

Arduino 官方网站为 [http://www.arduino.cc/]。您可以在该网站上找到 Arduino 的开发 IDE [http://arduino.cc/en/Main/Software]:

 

下载的文件 [1] 是一个 ZIP 压缩包,解压后会生成目录结构 [2]。您可以通过双击可执行文件 [3] 来启动 IDE。

6.2. 安装 Arduino 驱动程序

为了使 IDE 能与 Arduino 通信,主机电脑必须能够识别 Arduino。请按照以下步骤操作:

  • 将 Arduino 连接到主机电脑的 USB 端口;
  • 系统将尝试为新连接的 USB 设备查找驱动程序。此时系统无法自动找到驱动程序。您需要手动指定驱动程序位于 <arduino>/drivers 目录下,其中 <arduino> 是 Arduino IDE 的安装文件夹。

6.3. 测试 IDE

要测试 IDE,请按照以下步骤操作:

  • 启动 IDE;
  • 使用 USB 数据线将 Arduino 连接至电脑。目前请勿连接网卡;
  • 在 [1] 中,选择连接到 USB 端口的 Arduino 板类型;
  • 在 [2] 中,指定 Arduino 连接的 USB 端口。要确定该端口,请先拔下 Arduino 并记下端口编号。重新插入后再次检查端口:新增的那个就是 Arduino 的端口;

运行 IDE 中包含的一些示例:

 

示例已加载并显示:

 

IDE 随附的示例极具教育意义,且注释详尽。Arduino 代码采用 C 语言编写,由两个截然不同的部分组成:

  • 一个 [setup] 函数,该函数在应用程序启动时运行一次,无论是从主机电脑“上传”到 Arduino 时,还是应用程序已存在于 Arduino 上且按下 [Reset] 按钮时。此处用于放置应用程序的初始化代码;
  • 一个 [loop] 函数,该函数会持续运行(无限循环)。应用程序的核心功能应置于此处。

在此,

  • [setup] 函数将引脚 13 配置为输出;
  • [loop] 函数则反复控制其开关:LED 每秒闪烁一次。
 

通过[1]按钮将显示的程序上传至Arduino。上传完成后,程序开始运行,LED 13将无限期地闪烁。

6.4. Arduino 网络连接

Arduino(或多个Arduino)与主机电脑必须位于同一局域网内:

如果只有一块 Arduino 开发板,可以使用一根简单的 RJ-45 网线将其连接到主机电脑。如果有两块或更多,则需通过一个迷你集线器将主机电脑和 Arduino 开发板连接到同一个网络中。

主机电脑和Arduino将部署在192.168.2.x私有网络中。

  • Arduino的IP地址由源代码设定。我们将了解具体方法;
  • 主机计算机的 IP 地址可按以下方式设置:
  • 进入 [控制面板\网络和互联网\网络和共享中心]:
 
  • 在 [1] 中,点击 [本地连接] 链接
  • 在 [2] 中,查看连接属性;
  • 在 [4] 中,查看连接的 IPv4 属性 [3];
 
  • 在 [5] 中,为主机分配 IP 地址 [192.168.2.1];
  • 在[6]中,为该网络分配子网掩码[255.255.255.0];
  • 在[7]中确认所有设置。

6.5. 测试网络应用程序

使用 IDE 加载示例 [Examples / Ethernet / WebServer]:


/*
  Web Server
 
 A simple web server that shows the value of the analog input pins.
 using an Arduino Wiznet Ethernet shield. 
 
 Circuit:
 * Ethernet shield attached to pins 10, 11, 12, 13
 * Analog inputs attached to pins A0 through A5 (optional)
 
 created 18 Dec 2009
 by David A. Mellis
 modified 9 Apr 2012
 by Tom Igoe
 
 */
 
#include <SPI.h>
#include <Ethernet.h>
 
// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = { 
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,1, 177);
 
// Initialize the Ethernet server library
// with the IP address and port you want to use 
// (port 80 is default for HTTP):
EthernetServer server(80);
 
void setup() {
 // Open serial communications and wait for port to open:
  Serial.begin(9600);
   while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }
 
 
  // start the Ethernet connection and the server:
  Ethernet.begin(mac, ip);
  server.begin();
  Serial.print("server is at ");
  Serial.println(Ethernet.localIP());
}
 
 
void loop() {
  // listen for incoming clients
  EthernetClient client = server.available();
  if (client) {
    Serial.println("new client");
    // an http request ends with a blank line
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        Serial.write(c);
        // if you've gotten to the end of the line (received a newline
        // character) and the line is blank, the http request has ended,
        // so you can send a reply
        if (c == '\n' && currentLineIsBlank) {
          // send a standard http response header
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println("Connection: close");
          client.println();
          client.println("<!DOCTYPE HTML>");
          client.println("<html>");
                    // add a meta refresh tag, so the browser pulls again every 5 seconds:
          client.println("<meta http-equiv=\"refresh\" content=\"5\">");
          // output the value of each analog input pin
          for (int analogChannel = 0; analogChannel < 6; analogChannel++) {
            int sensorReading = analogRead(analogChannel);
            client.print("analog input ");
            client.print(analogChannel);
            client.print(" is ");
            client.print(sensorReading);
            client.println("<br />");       
          }
          client.println("</html>");
          break;
        }
        if (c == '\n') {
          // you're starting a new line
          currentLineIsBlank = true;
        } 
        else if (c != '\r') {
          // you've gotten a character on the current line
          currentLineIsBlank = false;
        }
      }
    }
    // give the web browser time to receive the data
    delay(1);
    // close the connection:
    client.stop();
    Serial.println("client disconnected");
  }
}

该应用程序在第 25 行指定的 IP 地址上,通过第 30 行设置的 80 端口创建一个 Web 服务器。第 23 行中的 MAC 地址即为 Arduino 网络板上指定的 MAC 地址。

[setup] 函数用于初始化 Web 服务器:

  • 第 34 行:初始化应用程序将用于记录数据的串口。我们将监控这些日志;
  • 第 41 行:初始化 TCP/IP 节点(IP 地址、端口);
  • 第 42 行:在该网络节点上启动第 30 行定义的服务器;
  • 第 43–44 行:记录 Web 服务器的 IP 地址;

[loop] 函数实现了 Web 服务器:

  • 第 50 行:如果客户端连接到 Web 服务器,[server].available 返回该客户端;否则,返回 null
  • 第 51 行:如果客户端不为 null
  • 第 55 行:只要客户端保持连接;
  • 第 56 行:如果客户端已发送字符,[client].available 为 true。这些字符存储在缓冲区中。只要该缓冲区不为空,[client].available 便返回 true;
  • 第 57 行:读取客户端发送的字符;
  • 第 58 行:将该字符输出到日志控制台;
  • 第 62 行:在 HTTP 协议中,客户端和服务器交换文本行。
    • 客户端通过发送一系列以空行结尾的文本行向 Web 服务器发送 HTTP 请求;
    • 随后,服务器通过发送响应并关闭连接来回应客户端;

第 62 行:服务器对从客户端接收到的 HTTP 头部不做任何处理。它只是等待空行:即仅包含字符 \n 的行;

  • 第 64–67 行:服务器向客户端发送 HTTP 协议的标准文本行。这些行以空行结尾(第 67 行);
  • 从第 68 行开始,服务器向客户端发送文档。该文档由服务器动态生成,且采用 HTML 格式(第 68–69 行);
  • 第 71 行:一条特殊的 HTML 行,用于指示客户端浏览器每 5 秒刷新一次页面。因此,浏览器将每 5 秒请求同一页面;
  • 第73–80行:服务器将Arduino的6个模拟输入值发送给客户端浏览器;
  • 第81行:关闭HTML文档;
  • 第 82 行:退出第 55 行开始的 while 循环;
  • 第 97 行:关闭与客户端的连接;
  • 第 98 行:将事件记录到日志控制台中;
  • 第 100 行:循环回到 loop 函数的开头:服务器将恢复监听客户端。我们提到客户端浏览器会每 5 秒请求同一页面。届时服务器将再次响应。

请修改第25行的代码,加入您的Arduino IP地址,例如:

IPAddress ip(192,168,2,2);

将程序上传至 Arduino。启动日志控制台(Ctrl-M)(M 为大写):

  • 在 [1] 中,即日志控制台。服务器已启动;
  • 在 [2] 中,使用浏览器请求 Arduino 的 IP 地址。此处,[192.168.2.2] 默认会被解析为 [http://198.162.2.2:80];
  • 在 [3] 中,显示了 Web 服务器发送的信息。若查看浏览器页面的源代码,将看到:
<!DOCTYPE HTML>
<html>
<meta http-equiv="refresh" content="5">
analog input 0 is 1023<br />
analog input 1 is 1023<br />
analog input 2 is 727<br />
analog input 3 is 543<br />
analog input 4 is 395<br />
analog input 5 is 310<br />
</html>

在这里,我们可以看到服务器发送的文本行。在 Arduino 端,日志控制台显示了客户端发送的内容:

new client
GET /favicon.ico HTTP/1.1
Host: 192.168.2.2
Connection: keep-alive
Accept: */*
User-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22
Accept-Encoding: gzip,deflate,sdch
Accept-Language: fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3

client disconnected
  • 第 2–9 行:标准 HTTP 头;
  • 第 10 行:结束这些标头的空行。

请仔细研究这个示例。它将帮助你理解实验中使用的 Arduino 编程。

6.6. aJson 库

在即将编写的实验作业中,Arduino 会与客户端交换 JSON 格式的文本行。默认情况下,Arduino IDE 并未包含用于处理 JSON 的库。我们将安装可在 [https://github.com/interactive-matter/aJson] 获取的 aJson 库。

  • 在 [1] 中,从 GitHub 仓库下载压缩包;
  • 解压文件夹,并将 [aJson-master] 文件夹 [2] 复制到 [<arduino>/libraries] 文件夹 [3] 中,其中 <arduino> 代表 Arduino IDE 的安装目录;
  • 在 [4] 中,将该文件夹重命名为 [aJson];
  • 在 [5] 中,其内容。

现在,启动 Arduino IDE:

 

请确认示例目录中现已包含 aJson 库的示例。运行并研究这些示例。

6.7. Android 平板电脑

这些示例已在三星 Galaxy Tab 2 上经过测试。

要在平板电脑上测试示例,您必须先在开发机上安装该平板电脑的驱动程序。三星 Galaxy Tab 2 的驱动程序可通过以下网址获取:[http://www.samsung.com/fr/support/usefulsoftware/KIES/]:

 

要测试示例,您需要将平板电脑连接到网络(通常是 Wi-Fi),并了解其在该网络中的 IP 地址。具体操作步骤如下(三星 Galaxy Tab 2):

  • 打开平板电脑;
  • 在平板电脑的可用应用列表(右上角)中,找到带有齿轮图标的[设置]应用;
  • 在左侧区域,开启 Wi-Fi;
  • 在右侧区域,选择一个 Wi-Fi 网络;
  • 连接到网络后,轻点所选网络。平板电脑的 IP 地址将显示出来。请将其记录下来。您之后会用到它;

仍在[设置]应用中,

  • 在左侧(选项列表最底部)选择 [开发者选项];
  • 确保右侧的 [USB 调试] 选项已勾选。

要返回菜单,请点击底部状态栏中的中间图标——那个看起来像房子形状的图标。 仍在底部的状态栏中,

  • 最左侧的图标是返回按钮:它可带您返回上一屏幕;
  • 最右侧的图标是任务管理器。您可以在此查看并管理平板电脑上当前正在运行的所有任务;

使用随附的 USB 数据线将平板电脑连接到电脑。

将 Wi-Fi 适配器插入电脑的 USB 接口,然后连接到与平板电脑相同的 Wi-Fi 网络。完成上述操作后,在 DOS 窗口中输入命令 [ipconfig]:

dos>ipconfig

Configuration IP de Windows

Carte Ethernet Connexion au réseau local :

   Suffixe DNS propre à la connexion. . . :
   Adresse IPv6 de liaison locale. . . . .: fe80::698b:455a:925:6b13%4
   Adresse IPv4. . . . . . . . . . . . . .: 192.168.2.1
   Masque de sous-réseau. . . . . . . . . : 255.255.255.0
   Passerelle par défaut. . . . . . . . . :

Carte réseau sans fil Wi-Fi :

   Suffixe DNS propre à la connexion. . . :
   Adresse IPv6 de liaison locale. . . . .: fe80::39aa:47f6:7537:f8e1%2
   Adresse IPv4. . . . . . . . . . . . . .: 192.168.1.25
   Masque de sous-réseau. . . . . . . . . : 255.255.255.0
Passerelle par défaut. . . . . . . . . : 192.168.1.1

您的电脑有两块网卡,因此有两个 IP 地址:

  • 第 9 行中的地址,即电脑在有线网络上的地址;
  • 第 17 行中的地址,即该电脑在 Wi-Fi 网络上的地址;

请记下这两项信息。您后续会用到它们。当前您的网络配置如下:

平板电脑需要连接到您的电脑。您的电脑通常由防火墙保护,该防火墙会阻止任何外部设备与其建立连接。因此,您需要禁用防火墙。请通过 [控制面板\系统和安全\Windows 防火墙] 选项进行操作。有时您还需要禁用杀毒软件设置的防火墙。这取决于您使用的杀毒软件。

现在,在您的电脑上,使用命令 [ping 192.168.1.y] 检查与平板电脑的网络连接,其中 [192.168.1.y] 是平板电脑的 IP 地址。您应该会看到类似以下的内容:

dos>ping 192.168.1.26

Envoi d'une requête 'Ping'  192.168.1.26 avec 32 octets de données :
Réponse de 192.168.1.26 : octets=32 temps=244 ms TTL=64
Réponse de 192.168.1.26 : octets=32 temps=199 ms TTL=64
Réponse de 192.168.1.26 : octets=32 temps=28 ms TTL=64
Réponse de 192.168.1.26 : octets=32 temps=88 ms TTL=64

Statistiques Ping pour 192.168.1.26:
    Paquets : envoyés = 4, reçus = 4, perdus = 0 (perte 0%),
Durée approximative des boucles en millisecondes :
Minimum = 28ms, Maximum = 244ms, Moyenne = 139ms

第 4–7 行表明 IP 地址 [192.168.1.y] 响应了 [ping] 命令。

6.8. 安装 JDK

最新版本的 JDK 可在网址 [http://www.oracle.com/technetwork/java/javase/downloads/index.html] 获取(2016 年 6 月)。此后我们将把 JDK 安装文件夹称为 <jdk-install>。

 

6.9. 安装 Genymotion 模拟器管理器

[Genymotion] 公司提供了一款高性能的 Android 模拟器。该模拟器可通过网址 [https://cloud.genymotion.com/page/launchpad/download/] 获取(2016 年 6 月)。

您需要注册才能获取个人版。请下载包含 VirtualBox 虚拟机的 [Genymotion] 产品:

Image

此后我们将把 [Genymotion] 的安装文件夹称为 <genymotion-install>。启动 [Genymotion]。然后下载一个平板电脑的镜像:

 
  • 在[1]中,添加[2]中描述的虚拟终端;
 
  • 在 [3] 中,配置该终端;
  • 在 [4-5] 中,根据您的环境自定义终端;
  • 在 [6] 中,启动虚拟终端;

如果一切顺利,您将看到 Android 模拟器窗口:

Image

有时,Android 模拟器无法启动。在 Windows 机器上,您可以检查以下两点:

  • 请确认未安装 [Hyper-V] 虚拟机。如有必要,请将其卸载 [1-2];
  • 然后在配置向导 [网络和共享中心] [1] 中:
 
  • 在 [3] 中,选择与 VirtualBox 虚拟机关联的网络适配器;
 
  • 请确认在 [6] 中,VirtualBox 的驱动程序已被选中。对与 VirtualBox 虚拟机关联的所有网络适配器重复此步骤;

6.10. 安装 Maven

Maven 是一款用于管理 Java 项目依赖关系及其他功能的工具。其下载地址为 [http://maven.apache.org/download.cgi]。

 

下载并解压压缩包。我们将 Maven 安装文件夹称为 <maven-install>。

  
  • 在 [1] 中,[conf/settings.xml] 文件用于配置 Maven;

其中包含以下内容:


  <!-- localRepository
   | The path to the local repository maven will use to store artifacts.
   |
   | Default: ${user.home}/.m2/repository
  <localRepository>/path/to/local/repo</localRepository>
-->

如果第 4 行中的默认值——就像我的情况一样——你的 {user.home} 路径中包含空格(例如 [C:\Users\Serge Tahé]),可能会导致某些软件出现问题。在这种情况下,你应该写成如下形式:


  <!-- localRepository
   | The path to the local repository maven will use to store artifacts.
   |
   | Default: ${user.home}/.m2/repository
  <localRepository>/path/to/local/repo</localRepository>
  -->
<localRepository>D:\Programs\devjava\maven\.m2\repository</localRepository>

在第 7 行,我们将避免使用包含空格的路径。

6.11. 安装 Android Studio IDE

Android Studio 社区版 IDE 可从 [https://developer.android.com/studio/index.html] 下载(2016 年 6 月):

 

安装 IDE 并启动它。按照步骤 [1-8] 安装后续示例所需的 SDK Manager 组件。如果您决定安装更新版本的组件,Android Studio 可能会提示警告,指出示例配置引用了您当前环境中不存在的 SDK 组件。此时,您可以按照 IDE 提供的建议进行操作。

 
 
  • 在 [9] 中,查看包的详细信息:
  • 在上文的 [11] 中,示例使用的是 SDK Build-Tools 23.0.3;
  • 在下文的[9-12]中,请指定您安装模拟器管理器[Genymotion]的文件夹;
  • 在[13-18]中,配置默认项目类型;
  • 在 [17] 中,默认值通常是正确的;
  • 在 [18] 中,请确保您已安装 JDK 1.8;

在下面的 [19-26] 中,请禁用拼写检查功能,该功能默认设置为英语;

 
  • 在下方 [27-28] 中,选择您想要的键盘快捷键类型。您可以保留 IntelliJ 的默认设置,也可以选择您更习惯的另一款 IDE 中的快捷键;
 
  • 在下方 [29-30] 中,启用代码中的行号;
 
  • 在下文的 [31-34] 中,请指定在启动 IDE 时如何处理第一个项目以及后续项目;
 

在 Android 2.1(2016 年 5 月)版本中,[即时运行] 功能有时会导致问题。因此,我们已在此文档中将其禁用:

  • 在 [3-4] 中,所有功能均已被禁用;

6.12. 使用示例

示例的 Android Studio 项目可在此处获取|。请下载它们。

  

这些示例是使用之前定义的组件构建的:

  • JDK 1.8;
  • 运行时使用的 Android SDK 平台 23;

以下 SDK 工具:

 

如果您的环境与上述描述不符,则需要更改项目配置。这可能会相当繁琐。起初,建立一个与上述描述类似的工作环境可能更为简单。

启动 Android Studio,然后打开 [example-07] 项目,例如:

 
  • 在 [1-3] 中,打开 [Example-07] 项目;
  • 在 [4] 中,查看 [local.properties] 文件;
  • 在第 11 行处,输入 Android SDK Manager <sdk-manager-install> 的安装路径。您可以通过执行步骤 [1-4] 找到该路径:
 

本文档中的所有示例均为通过 [build.gradle] 文件配置的 Gradle 项目 [1-2]:

 

示例 07 的 [build.gradle] 文件如下:


buildscript {
  repositories {
    mavenCentral()
    mavenLocal()
  }
  dependencies {
    // replace with the current version of the Android plugin
    classpath 'com.android.tools.build:gradle:2.1.0'
    // Since Android's Gradle plugin 0.11, you have to use android-apt >= 1.3
    classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
  }
}
 
apply plugin: 'com.android.application'
apply plugin: 'android-apt'
def AAVersion = '4.0.0'
 
dependencies {
  apt "org.androidannotations:androidannotations:$AAVersion"
  compile "org.androidannotations:androidannotations-api:$AAVersion"
  compile 'com.android.support:appcompat-v7:23.4.0'
  compile 'com.android.support:design:23.4.0'
  compile fileTree(dir: 'libs', include: ['*.jar'])
}
 
repositories {
  jcenter()
}
 
apt {
  arguments {
    androidManifestFile variant.outputs[0].processResources.manifestFile
    resourcePackageName android.defaultConfig.applicationId
  }
}
 
android {
  compileSdkVersion 23
  buildToolsVersion "23.0.3"
  defaultConfig {
    applicationId "android.exemples"
    minSdkVersion 15
    targetSdkVersion 23
    versionCode 1
    versionName "1.0"
  }
 
  buildTypes {
    release {
      minifyEnabled false
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
  }
 
  compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_7
    targetCompatibility JavaVersion.VERSION_1_7
  }
}

根据您设置的 Android 环境(SDK 和工具),您可能需要修改第 8、21、22、38 和 39 行中的版本号。Android Studio 会提供建议以协助您。最简单的方法是遵循这些建议。

还可以通过另一种方式访问 [build.gradle] 文件中的元素:

  • [3] 中的各个选项卡反映了 [build.gradle] 文件中的不同值。因此,您可以通过这种方式进行配置,从而避免 [build.gradle] 文件中的语法问题;

另一个需要检查的点是 IDE [5] 所使用的 JDK:

 

在[6]中,请检查JDK。

所有示例均为 Gradle 项目,其中包含需要下载的依赖项。请按以下步骤操作:

  • 在 [5] 中,编译该项目;

一旦项目没有错误,您必须创建一个运行配置 [1-8]:

  • 在 [8] 中,您可以指定始终使用同一终端进行执行。通常,勾选此选项可避免每次执行时都需要指定终端。在此,我们不勾选该选项,因为我们将测试不同的 Android 设备;
  • 创建运行配置后,启动 Android 模拟器管理器 [1-3];
  • 如果 Android 模拟器未启动,请检查第 6.11 节中提到的要点;

要在模拟器上启动应用程序,请按以下步骤操作 [1-4]:

  • 在 [2] 中,您应能看到之前启动的模拟器;
  • 在 [5] 中,是模拟器显示的视图;

现在将一台 Android 平板电脑连接到电脑的 USB 端口,并在其上运行该应用程序:

 
  • 在[6]中,选择安卓平板电脑并测试该应用程序。

在[7]中,我们预先定义了虚拟终端。我们将学习如何添加和删除它们。

  

在上方的截图中,列出的所有设备均运行 API 22。我们将移除所有这些设备,因为我们希望使用 API 23。我们将按照步骤 [2-3] 移除这些设备。

Image

 
  • 在[4-5]中,我们添加了一台平板电脑;
 
  • 在[6]中,我们选择了一个API。在上文中,我们为64位Windows选择了API 23;
 
  • 在[7]中,显示了配置摘要;
  • 在[8]中,可以进行虚拟终端的更高级配置;

向导完成后,创建的终端将显示在[9]中。

完成上述操作后,若重新运行 [Example-07],您将看到如下窗口:

 
  • 在 [1] 中,新的虚拟终端出现;
  • 在 [2] 中,您可以创建新的终端;

请尝试确定最适合您系统的虚拟终端。本文中的示例主要是在 Genymotion 模拟器上测试的。

无论选择哪个虚拟终端,日志都会显示在名为 [Logcat] [1-2] 的窗口中:

Image

请定期检查这些日志。导致程序崩溃的异常信息将在此处报告。

您还可以使用标准调试工具对程序进行调试:

  • 在 [2] 中,单击目标行左侧的列即可设置断点。再次单击可移除断点;
 
  • 在 [3] 中,到达断点时,按:
  • [F6] 以不进入方法的方式执行该行(如果该行包含方法调用),
  • [F5],若该行包含方法调用,则进入方法执行该行,
  • [F8] 跳至下一个断点;
  • [Ctrl-F2] 停止调试;

6.13. 安装 Chrome 插件 [Advanced Rest Client]

本文档使用 Google 的 Chrome 浏览器(http://www.google.fr/intl/fr/chrome/browser/)。我们将向其中添加 [ Advanced Rest Client] 扩展程序。操作步骤如下:

 
  • 随后即可下载该应用:
  • 要获取该应用,您需要创建一个 Google 账户。随后 [Google 应用商店] 会要求您进行确认 [1]:
  • 在 [2] 中,已添加的扩展程序可在 [应用程序] 选项 [3] 中找到。该选项会显示在您通过浏览器创建的每个新标签页(CTRL-T)上。

6.14. 在 Java 中管理 JSON

对开发者而言,[Spring MVC] 框架会透明地使用 [Jackson] JSON 库。为说明 JSON(JavaScript 对象表示法)的含义,我们在此展示一个程序,该程序将对象序列化为 JSON,并通过反序列化生成的 JSON 字符串来重建原始对象。

“Jackson”库允许您构建:

  • 对象的 JSON 字符串:new ObjectMapper().writeValueAsString(object);
  • 从 JSON 字符串中读取对象:new ObjectMapper().readValue(jsonString, Object.class)

这两种方法都可能抛出 IOException。以下是一个示例。

  

上述项目是一个 Maven 项目,其 [pom.xml] 文件如下:


<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
 
  <groupId>istia.st.pam</groupId>
  <artifactId>json</artifactId>
  <version>1.0-SNAPSHOT</version>
 
  <dependencies>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.3.3</version>
    </dependency>
  </dependencies>
</project>
  • 第 12–16 行:包含 'Jackson' 库的依赖项;

[Person] 类如下所示:


package istia.st.json;
 
public class Personne {
    // data
    private String nom;
    private String prenom;
    private int age;
 
    // manufacturers
    public Personne() {
 
    }
 
    public Personne(String nom, String prénom, int âge) {
        this.nom = nom;
        this.prenom = prénom;
        this.age = âge;
    }
 
    // signature
    public String toString() {
        return String.format("Personne[%s, %s, %d]", nom, prenom, age);
    }
 
    // getters and setters
...
}

[Main] 类如下所示:


package istia.st.json;
 
import com.fasterxml.jackson.databind.ObjectMapper;
 
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
 
public class Main {
  // the serialization / deserialization tool
  static ObjectMapper mapper = new ObjectMapper();
 
  public static void main(String[] args) throws IOException {
    // creation of a person
    Personne paul = new Personne("Denis", "Paul", 40);
    // json display
    String json = mapper.writeValueAsString(paul);
    System.out.println("Json=" + json);
    // person instantiation from Json
    Personne p = mapper.readValue(json, Personne.class);
    // person display
    System.out.println("Personne=" + p);
    // a picture
    Personne virginie = new Personne("Radot", "Virginie", 20);
    Personne[] personnes = new Personne[]{paul, virginie};
    // json display
    json = mapper.writeValueAsString(personnes);
    System.out.println("Json personnes=" + json);
    // dictionary
    Map<String, Personne> hpersonnes = new HashMap<String, Personne>();
    hpersonnes.put("1", paul);
    hpersonnes.put("2", virginie);
    // json display
    json = mapper.writeValueAsString(hpersonnes);
    System.out.println("Json hpersonnes=" + json);
  }
}

执行此类将产生以下屏幕输出:

1
2
3
4
Json={"nom":"Denis","prenom":"Paul","age":40}
Personne=Personne[Denis, Paul, 40]
Json personnes=[{"nom":"Denis","prenom":"Paul","age":40},{"nom":"Radot","prenom":"Virginie","age":20}]
Json hpersonnes={"2":{"nom":"Radot","prenom":"Virginie","age":20},"1":{"nom":"Denis","prenom":"Paul","age":40}}

示例要点:

  • 用于 JSON/对象转换所需的 [ObjectMapper] 对象:第 11 行;
  • [Person] 到 JSON 的转换:第 17 行;
  • JSON 转 [Person] 的转换:第 20 行;
  • 两个方法均抛出的 [IOException]:第 13 行。

6.15. 安装 [ WampServer]

[WampServer] 是一套用于在 Windows 机器上进行 PHP / MySQL / Apache 开发的软件套件。我们将仅将其用于 MySQL 数据库管理系统。

  • 在 [WampServer] 网站 [1] 上,选择合适的版本 [2],
  • 下载的可执行文件是一个安装程序。安装过程中会要求您提供各种信息。这些信息与 MySQL 无关,因此您可以忽略它们。安装结束时会出现窗口 [3]。启动 [WampServer],
 
  • 在 [4] 中,[WampServer] 图标会出现在屏幕右下角的任务栏中 [4],
  • 点击它后,会出现 [5] 菜单。该菜单允许您管理 Apache 服务器和 MySQL 数据库管理系统。要管理后者,请使用 [PhpMyAdmin] 选项,
  • 这将打开如下所示的窗口,

Image

本文将简要介绍 [PhpMyAdmin] 的使用方法。具体操作示例请参见文档。