|
@@ -150,73 +150,80 @@ code > span.er { color: #ff0000; font-weight: bold; }
|
|
|
<li><a href="#判断是否是-restful的约束条件-restapi"><span class="toc-section-number">10.2</span> 判断是否是 RESTful的约束条件 </a></li>
|
|
|
<li><a href="#设计restful资源"><span class="toc-section-number">10.3</span> 设计RESTful资源</a></li>
|
|
|
<li><a href="#设计restful-uri"><span class="toc-section-number">10.4</span> 设计RESTful URI</a></li>
|
|
|
-<li><a href="#laravel"><span class="toc-section-number">10.5</span> Laravel</a><ul>
|
|
|
-<li><a href="#安装-laravel"><span class="toc-section-number">10.5.1</span> 安装 Laravel</a></li>
|
|
|
</ul></li>
|
|
|
-<li><a href="#mysql"><span class="toc-section-number">10.6</span> MySQL</a><ul>
|
|
|
-<li><a href="#安装mysql"><span class="toc-section-number">10.6.1</span> 安装MySQL</a></li>
|
|
|
-<li><a href="#配置mysql"><span class="toc-section-number">10.6.2</span> 配置MySQL</a></li>
|
|
|
+<li><a href="#创建rest服务"><span class="toc-section-number">11</span> 创建REST服务</a><ul>
|
|
|
+<li><a href="#laravel"><span class="toc-section-number">11.1</span> Laravel</a><ul>
|
|
|
+<li><a href="#安装-laravel"><span class="toc-section-number">11.1.1</span> 安装 Laravel</a></li>
|
|
|
</ul></li>
|
|
|
-<li><a href="#数据库迁移"><span class="toc-section-number">10.7</span> 数据库迁移</a><ul>
|
|
|
-<li><a href="#创建表"><span class="toc-section-number">10.7.1</span> 创建表</a></li>
|
|
|
-<li><a href="#数据库迁移-1"><span class="toc-section-number">10.7.2</span> 数据库迁移</a></li>
|
|
|
+<li><a href="#mysql"><span class="toc-section-number">11.2</span> MySQL</a><ul>
|
|
|
+<li><a href="#安装mysql"><span class="toc-section-number">11.2.1</span> 安装MySQL</a></li>
|
|
|
+<li><a href="#配置mysql"><span class="toc-section-number">11.2.2</span> 配置MySQL</a></li>
|
|
|
</ul></li>
|
|
|
-<li><a href="#创建restful"><span class="toc-section-number">10.8</span> 创建RESTful</a></li>
|
|
|
-<li><a href="#laravel-resources"><span class="toc-section-number">10.9</span> Laravel Resources</a><ul>
|
|
|
-<li><a href="#修改create"><span class="toc-section-number">10.9.1</span> 修改Create()</a></li>
|
|
|
-<li><a href="#创建表单"><span class="toc-section-number">10.9.2</span> 创建表单</a></li>
|
|
|
-<li><a href="#编辑模板"><span class="toc-section-number">10.9.3</span> 编辑模板</a></li>
|
|
|
+<li><a href="#数据库迁移"><span class="toc-section-number">11.3</span> 数据库迁移</a><ul>
|
|
|
+<li><a href="#创建表"><span class="toc-section-number">11.3.1</span> 创建表</a></li>
|
|
|
+<li><a href="#数据库迁移-1"><span class="toc-section-number">11.3.2</span> 数据库迁移</a></li>
|
|
|
</ul></li>
|
|
|
+<li><a href="#创建restful"><span class="toc-section-number">11.4</span> 创建RESTful</a></li>
|
|
|
+<li><a href="#laravel-resources"><span class="toc-section-number">11.5</span> Laravel Resources</a><ul>
|
|
|
+<li><a href="#修改create"><span class="toc-section-number">11.5.1</span> 修改Create()</a></li>
|
|
|
+<li><a href="#创建表单"><span class="toc-section-number">11.5.2</span> 创建表单</a></li>
|
|
|
+<li><a href="#编辑模板"><span class="toc-section-number">11.5.3</span> 编辑模板</a></li>
|
|
|
</ul></li>
|
|
|
-<li><a href="#restful-evertywhere"><span class="toc-section-number">11</span> RESTful Evertywhere</a><ul>
|
|
|
-<li><a href="#javascript与ajax"><span class="toc-section-number">11.1</span> Javascript与ajax</a><ul>
|
|
|
-<li><a href="#jquery"><span class="toc-section-number">11.1.1</span> jQuery</a></li>
|
|
|
</ul></li>
|
|
|
-<li><a href="#java与json"><span class="toc-section-number">11.2</span> Java与json</a><ul>
|
|
|
-<li><a href="#android"><span class="toc-section-number">11.2.1</span> Android</a></li>
|
|
|
+<li><a href="#restful-evertywhere"><span class="toc-section-number">12</span> RESTful Evertywhere</a><ul>
|
|
|
+<li><a href="#javascript与ajax"><span class="toc-section-number">12.1</span> Javascript与ajax</a><ul>
|
|
|
+<li><a href="#jquery"><span class="toc-section-number">12.1.1</span> jQuery</a></li>
|
|
|
</ul></li>
|
|
|
-<li><a href="#python与json"><span class="toc-section-number">11.3</span> Python与json</a><ul>
|
|
|
-<li><a href="#requests"><span class="toc-section-number">11.3.1</span> requests</a></li>
|
|
|
+<li><a href="#java与json"><span class="toc-section-number">12.2</span> Java与json</a><ul>
|
|
|
+<li><a href="#android"><span class="toc-section-number">12.2.1</span> Android</a></li>
|
|
|
</ul></li>
|
|
|
+<li><a href="#python与json"><span class="toc-section-number">12.3</span> Python与json</a><ul>
|
|
|
+<li><a href="#requests"><span class="toc-section-number">12.3.1</span> requests</a></li>
|
|
|
</ul></li>
|
|
|
-<li><a href="#前端显示"><span class="toc-section-number">12</span> 前端显示</a><ul>
|
|
|
-<li><a href="#jquery-mobile"><span class="toc-section-number">12.1</span> jQuery Mobile</a></li>
|
|
|
-<li><a href="#bootstrap"><span class="toc-section-number">12.2</span> Bootstrap</a></li>
|
|
|
-<li><a href="#库与车轮子"><span class="toc-section-number">12.3</span> 库与车轮子</a></li>
|
|
|
-<li><a href="#网站前台显示"><span class="toc-section-number">12.4</span> 网站前台显示</a><ul>
|
|
|
-<li><a href="#highchart"><span class="toc-section-number">12.4.1</span> Highchart</a></li>
|
|
|
</ul></li>
|
|
|
-<li><a href="#coap-嵌入式系统的rest"><span class="toc-section-number">12.5</span> CoAP: 嵌入式系统的REST</a></li>
|
|
|
-<li><a href="#coap-命令行工具"><span class="toc-section-number">12.6</span> CoAP 命令行工具</a><ul>
|
|
|
-<li><a href="#node-coap-cli"><span class="toc-section-number">12.6.1</span> Node CoAP CLI</a></li>
|
|
|
-<li><a href="#libcoap"><span class="toc-section-number">12.6.2</span> libcoap</a></li>
|
|
|
+<li><a href="#前端显示"><span class="toc-section-number">13</span> 前端显示</a><ul>
|
|
|
+<li><a href="#jquery-mobile"><span class="toc-section-number">13.1</span> jQuery Mobile</a></li>
|
|
|
+<li><a href="#bootstrap"><span class="toc-section-number">13.2</span> Bootstrap</a></li>
|
|
|
+<li><a href="#库与车轮子"><span class="toc-section-number">13.3</span> 库与车轮子</a></li>
|
|
|
+<li><a href="#网站前台显示"><span class="toc-section-number">13.4</span> 网站前台显示</a><ul>
|
|
|
+<li><a href="#highchart"><span class="toc-section-number">13.4.1</span> Highchart</a></li>
|
|
|
</ul></li>
|
|
|
-<li><a href="#coap-helloworld"><span class="toc-section-number">12.7</span> CoAP Hello,World</a><ul>
|
|
|
-<li><a href="#node-coap"><span class="toc-section-number">12.7.1</span> Node-CoAP</a></li>
|
|
|
-<li><a href="#node-coap示例"><span class="toc-section-number">12.7.2</span> Node CoAP示例</a></li>
|
|
|
</ul></li>
|
|
|
-<li><a href="#coap-数据库查询"><span class="toc-section-number">12.8</span> CoAP 数据库查询</a><ul>
|
|
|
-<li><a href="#node-module"><span class="toc-section-number">12.8.1</span> Node Module</a></li>
|
|
|
-<li><a href="#node-sqlite3"><span class="toc-section-number">12.8.2</span> Node-Sqlite3</a></li>
|
|
|
-<li><a href="#查询数据"><span class="toc-section-number">12.8.3</span> 查询数据</a></li>
|
|
|
-<li><a href="#get"><span class="toc-section-number">12.8.4</span> GET</a></li>
|
|
|
-<li><a href="#iot-coap"><span class="toc-section-number">12.8.5</span> IoT CoAP</a></li>
|
|
|
-<li><a href="#判断请求的方法"><span class="toc-section-number">12.8.6</span> 判断请求的方法</a></li>
|
|
|
-<li><a href="#database与回调"><span class="toc-section-number">12.8.7</span> Database与回调</a></li>
|
|
|
+<li><a href="#构建基于coap协议的物联网系统"><span class="toc-section-number">14</span> 构建基于CoAP协议的物联网系统</a><ul>
|
|
|
+<li><a href="#coap-嵌入式系统的rest"><span class="toc-section-number">14.1</span> CoAP: 嵌入式系统的REST</a></li>
|
|
|
+<li><a href="#coap-命令行工具"><span class="toc-section-number">14.2</span> CoAP 命令行工具</a><ul>
|
|
|
+<li><a href="#node-coap-cli"><span class="toc-section-number">14.2.1</span> Node CoAP CLI</a></li>
|
|
|
+<li><a href="#libcoap"><span class="toc-section-number">14.2.2</span> libcoap</a></li>
|
|
|
</ul></li>
|
|
|
-<li><a href="#coap-block"><span class="toc-section-number">12.9</span> CoAP Block</a><ul>
|
|
|
-<li><a href="#coap-post"><span class="toc-section-number">12.9.1</span> CoAP POST</a></li>
|
|
|
-<li><a href="#json请求"><span class="toc-section-number">12.9.2</span> JSON请求</a></li>
|
|
|
-<li><a href="#coap-content-types"><span class="toc-section-number">12.9.3</span> CoAP Content Types</a></li>
|
|
|
+<li><a href="#coap-helloworld"><span class="toc-section-number">14.3</span> CoAP Hello,World</a><ul>
|
|
|
+<li><a href="#node-coap"><span class="toc-section-number">14.3.1</span> Node-CoAP</a></li>
|
|
|
+<li><a href="#node-coap示例"><span class="toc-section-number">14.3.2</span> Node CoAP示例</a></li>
|
|
|
</ul></li>
|
|
|
-<li><a href="#coap-json"><span class="toc-section-number">12.10</span> CoAP JSON</a><ul>
|
|
|
-<li><a href="#返回json"><span class="toc-section-number">12.10.1</span> 返回JSON</a></li>
|
|
|
-<li><a href="#coap客户端代码"><span class="toc-section-number">12.10.2</span> CoAP客户端代码</a></li>
|
|
|
-<li><a href="#coap-server端代码"><span class="toc-section-number">12.10.3</span> CoAP Server端代码</a></li>
|
|
|
+<li><a href="#coap-数据库查询"><span class="toc-section-number">14.4</span> CoAP 数据库查询</a><ul>
|
|
|
+<li><a href="#node-module"><span class="toc-section-number">14.4.1</span> Node Module</a></li>
|
|
|
+<li><a href="#node-sqlite3"><span class="toc-section-number">14.4.2</span> Node-Sqlite3</a></li>
|
|
|
+<li><a href="#查询数据"><span class="toc-section-number">14.4.3</span> 查询数据</a></li>
|
|
|
+<li><a href="#get"><span class="toc-section-number">14.4.4</span> GET</a></li>
|
|
|
+<li><a href="#iot-coap"><span class="toc-section-number">14.4.5</span> IoT CoAP</a></li>
|
|
|
+<li><a href="#判断请求的方法"><span class="toc-section-number">14.4.6</span> 判断请求的方法</a></li>
|
|
|
+<li><a href="#database与回调"><span class="toc-section-number">14.4.7</span> Database与回调</a></li>
|
|
|
</ul></li>
|
|
|
+<li><a href="#coap-block"><span class="toc-section-number">14.5</span> CoAP Block</a><ul>
|
|
|
+<li><a href="#coap-post"><span class="toc-section-number">14.5.1</span> CoAP POST</a></li>
|
|
|
+<li><a href="#json请求"><span class="toc-section-number">14.5.2</span> JSON请求</a></li>
|
|
|
+<li><a href="#coap-content-types"><span class="toc-section-number">14.5.3</span> CoAP Content Types</a></li>
|
|
|
</ul></li>
|
|
|
-<li><a href="#mqtt"><span class="toc-section-number">13</span> MQTT</a><ul>
|
|
|
-<li><a href="#nodejs-mqtt"><span class="toc-section-number">13.1</span> Nodejs MQTT</a></li>
|
|
|
+<li><a href="#coap-json"><span class="toc-section-number">14.6</span> CoAP JSON</a><ul>
|
|
|
+<li><a href="#返回json"><span class="toc-section-number">14.6.1</span> 返回JSON</a></li>
|
|
|
+<li><a href="#coap客户端代码"><span class="toc-section-number">14.6.2</span> CoAP客户端代码</a></li>
|
|
|
+<li><a href="#coap-server端代码"><span class="toc-section-number">14.6.3</span> CoAP Server端代码</a></li>
|
|
|
+</ul></li>
|
|
|
+<li><a href="#使用iot-coap构建物联网"><span class="toc-section-number">14.7</span> 使用IoT-CoAP构建物联网</a></li>
|
|
|
+<li><a href="#iot-coap-1"><span class="toc-section-number">14.8</span> IoT-CoAP</a></li>
|
|
|
+<li><a href="#install"><span class="toc-section-number">14.9</span> install</a></li>
|
|
|
+</ul></li>
|
|
|
+<li><a href="#mqtt"><span class="toc-section-number">15</span> MQTT</a><ul>
|
|
|
+<li><a href="#nodejs-mqtt"><span class="toc-section-number">15.1</span> Nodejs MQTT</a></li>
|
|
|
</ul></li>
|
|
|
</ul>
|
|
|
</div>
|
|
@@ -1296,6 +1303,7 @@ a process or set of rules to be followed in calculations or other problem-solvin
|
|
|
<p>Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的UNIX工具软件、应用程序和网络协议。它支持32位和64位硬件。Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。</p>
|
|
|
<p>Raspberry Pi相比于一般的ARM开发板来说,由于其本身搭载着Linux操作系统,可以用诸如Python、Ruby或Bash来执行脚本,而不是通过编译程序来运行,具有更高的开发效率。</p>
|
|
|
<h2 id="raspberry-pi-初始化"><span class="header-section-number">8.2</span> Raspberry Pi 初始化</h2>
|
|
|
+<p>今天的Raspberry Pi默认已经安装<code>openssh-server</code>,并已经可以登陆上去了。</p>
|
|
|
<h1 id="http与restful"><span class="header-section-number">9</span> HTTP与RESTful</h1>
|
|
|
<h2 id="你所没有深入的http"><span class="header-section-number">9.1</span> 你所没有深入的HTTP</h2>
|
|
|
<p>Internet有两个核心协议: IP和TCP,这样讲述起来似乎会很漫长。</p>
|
|
@@ -1469,7 +1477,8 @@ Content-Type: text/html; charset=utf-8
|
|
|
</ul>
|
|
|
<h2 id="设计restful资源"><span class="header-section-number">10.3</span> 设计RESTful资源</h2>
|
|
|
<h2 id="设计restful-uri"><span class="header-section-number">10.4</span> 设计RESTful URI</h2>
|
|
|
-<h2 id="laravel"><span class="header-section-number">10.5</span> Laravel</h2>
|
|
|
+<h1 id="创建rest服务"><span class="header-section-number">11</span> 创建REST服务</h1>
|
|
|
+<h2 id="laravel"><span class="header-section-number">11.1</span> Laravel</h2>
|
|
|
<blockquote>
|
|
|
<p>Laravel是一套简洁、优雅的PHP Web开发框架(PHP Web Framework)。它可以让你从面条一样杂乱的代码中解脱出来;它可以帮你构建一个完美的网络APP,而且每行代码都可以简洁、富于表达力。</p>
|
|
|
</blockquote>
|
|
@@ -1483,29 +1492,29 @@ Content-Type: text/html; charset=utf-8
|
|
|
<li>强大的社区支持: 无论你是一个PHP新手还是经验丰富的架构师,都能在社区中找到需要的知识。你可以在IRC中讨论Idea,或者在论坛中发布问题。</li>
|
|
|
<li>测试、重构: Laravel 从开始就将测试作为重点功能。我们提供了灵活的IoC容器,集成了PHPUnit 测试工具。不用担心,这些都很容易上手。</li>
|
|
|
</ul>
|
|
|
-<h4 id="为什么是-laravel"><span class="header-section-number">10.5.0.1</span> 为什么是 Laravel</h4>
|
|
|
+<h4 id="为什么是-laravel"><span class="header-section-number">11.1.0.1</span> 为什么是 Laravel</h4>
|
|
|
<ul>
|
|
|
<li>因为个人喜爱,你也可以用 Ruby On Rails来搭建这样一个功能,或者是Java。</li>
|
|
|
<li>PHP在我的服务器上运行得挺不错的,而且我又不需要重新去写配置那些配置。</li>
|
|
|
<li>Laravel 可以简单的开发我们所需要的功能,换句话说他是 PHP 世界的 Ruby On Rails。</li>
|
|
|
</ul>
|
|
|
<p>这里不会再重述之前的问题,这里只是将需要的步骤一个个写下来,然后丢到这里好好说一下。至于RESTful是什么,前面已经介绍了,就不再重复了。那么下面,我们就用Laravel来搭建一个平台给物联网用的。</p>
|
|
|
-<h3 id="安装-laravel"><span class="header-section-number">10.5.1</span> 安装 Laravel</h3>
|
|
|
-<h4 id="第一步-安装composer"><span class="header-section-number">10.5.1.1</span> 第一步 安装Composer</h4>
|
|
|
-<h5 id="gnulinux安装composer"><span class="header-section-number">10.5.1.1.1</span> GNU/Linux安装Composer</h5>
|
|
|
+<h3 id="安装-laravel"><span class="header-section-number">11.1.1</span> 安装 Laravel</h3>
|
|
|
+<h4 id="第一步-安装composer"><span class="header-section-number">11.1.1.1</span> 第一步 安装Composer</h4>
|
|
|
+<h5 id="gnulinux安装composer"><span class="header-section-number">11.1.1.1.1</span> GNU/Linux安装Composer</h5>
|
|
|
<p>GNU/Linux Ubuntu/OpenSUSE下可以执行</p>
|
|
|
<pre><code>$ curl -sS https://getcomposer.org/installer | php</code></pre>
|
|
|
-<h5 id="windows安装composer"><span class="header-section-number">10.5.1.1.2</span> Windows安装Composer</h5>
|
|
|
+<h5 id="windows安装composer"><span class="header-section-number">11.1.1.1.2</span> Windows安装Composer</h5>
|
|
|
<p>请直接下载</p>
|
|
|
<p><a href="https://getcomposer.org/Composer-Setup.exe">Composer-Setup</a></p>
|
|
|
-<h5 id="mac-os安装composer"><span class="header-section-number">10.5.1.1.3</span> Mac OS安装Composer</h5>
|
|
|
+<h5 id="mac-os安装composer"><span class="header-section-number">11.1.1.1.3</span> Mac OS安装Composer</h5>
|
|
|
<pre><code>brew install homebrew/php/composer</code></pre>
|
|
|
-<h4 id="安装-laravel-第二步-安装laravel"><span class="header-section-number">10.5.1.2</span> 安装 Laravel 第二步 安装Laravel</h4>
|
|
|
+<h4 id="安装-laravel-第二步-安装laravel"><span class="header-section-number">11.1.1.2</span> 安装 Laravel 第二步 安装Laravel</h4>
|
|
|
<pre><code>composer global require "laravel/installer=~1.1"</code></pre>
|
|
|
-<h4 id="安装-laravel-第三步-创建laravel工程"><span class="header-section-number">10.5.1.3</span> 安装 Laravel 第三步 创建Laravel工程</h4>
|
|
|
+<h4 id="安装-laravel-第三步-创建laravel工程"><span class="header-section-number">11.1.1.3</span> 安装 Laravel 第三步 创建Laravel工程</h4>
|
|
|
<pre><code>composer create-project laravel/laravel your-project-name --prefer-dist </code></pre>
|
|
|
-<h2 id="mysql"><span class="header-section-number">10.6</span> MySQL</h2>
|
|
|
-<h3 id="安装mysql"><span class="header-section-number">10.6.1</span> 安装MySQL</h3>
|
|
|
+<h2 id="mysql"><span class="header-section-number">11.2</span> MySQL</h2>
|
|
|
+<h3 id="安装mysql"><span class="header-section-number">11.2.1</span> 安装MySQL</h3>
|
|
|
<p><code>出于某些原因,我建议用MariaDB替换MySQL,如果你"真正"需要mysql,将mariadb替换为mysql</code></p>
|
|
|
<p>ps: 在下文中我会继续用MySQL,而不是MariaDB,MairaDB是MySQL的一个分支,真正的开源分支。</p>
|
|
|
<p>Ubuntu/Debian/Mint</p>
|
|
@@ -1516,7 +1525,7 @@ Content-Type: text/html; charset=utf-8
|
|
|
<pre><code>$ sudo zypper install mariadb-server</code></pre>
|
|
|
<p>Mac OS</p>
|
|
|
<pre><code> $ brew install mariadb</code></pre>
|
|
|
-<h3 id="配置mysql"><span class="header-section-number">10.6.2</span> 配置MySQL</h3>
|
|
|
+<h3 id="配置mysql"><span class="header-section-number">11.2.2</span> 配置MySQL</h3>
|
|
|
<p>修改database.php</p>
|
|
|
<pre><code>app/config/database.php</code></pre>
|
|
|
<p>要修改的就是这个</p>
|
|
@@ -1542,9 +1551,9 @@ Content-Type: text/html; charset=utf-8
|
|
|
"sensors2": 12,
|
|
|
"led1": 0
|
|
|
}</code></pre>
|
|
|
-<h2 id="数据库迁移"><span class="header-section-number">10.7</span> 数据库迁移</h2>
|
|
|
+<h2 id="数据库迁移"><span class="header-section-number">11.3</span> 数据库迁移</h2>
|
|
|
<p>这个名字是源自于Ruby On Rails在那时候的印象,不直接使用MySQL的目的在于让我们可以专注于过程。</p>
|
|
|
-<h3 id="创建表"><span class="header-section-number">10.7.1</span> 创建表</h3>
|
|
|
+<h3 id="创建表"><span class="header-section-number">11.3.1</span> 创建表</h3>
|
|
|
<p>表的概念,类似于在Excel中的表,如果你真实不懂数据库。 让我们创建一个athomes的表,为什么是athomes,因为以前在写android程序的时候就叫的是athome,忽略掉这些次要的因素吧。</p>
|
|
|
<pre><code>$ php artisan migrate:make create_athomes_table</code></pre>
|
|
|
<p>打开 app/database/migrations/<strong><em>create_athomes_table.php这里的</em></strong>是由日期和某些东西组成的,修改生成的代码为下面。</p>
|
|
@@ -1573,7 +1582,7 @@ class CreateAthomesTable extends Migration {
|
|
|
|
|
|
}</code></pre>
|
|
|
<p>意思大致就是id是自加的,也就是我们在localhost/athome/{id},当我们创建一个新的数据的时候,会自动加上去,最后一个timestamps批的是时间,会包含创建时间和修改时间。 剩下的temperature,sensors1,sensors2是小数,以及只有真和假的led1。</p>
|
|
|
-<h3 id="数据库迁移-1"><span class="header-section-number">10.7.2</span> 数据库迁移</h3>
|
|
|
+<h3 id="数据库迁移-1"><span class="header-section-number">11.3.2</span> 数据库迁移</h3>
|
|
|
<p>我们只是写了我们需要的数据的格式而并没有丢到数据库里,</p>
|
|
|
<pre><code>$ php artisan migrate</code></pre>
|
|
|
<p>这个就是我们执行迁移的命令,如果你用phpmyadmin可以直接打开查看,没有的话,可以。</p>
|
|
@@ -1582,7 +1591,7 @@ class CreateAthomesTable extends Migration {
|
|
|
use iot;
|
|
|
select * from athomes;</code></pre>
|
|
|
<p>就可以看到我们写的东西,那么接下来就是创建RESTful服务了</p>
|
|
|
-<h2 id="创建restful"><span class="header-section-number">10.8</span> 创建RESTful</h2>
|
|
|
+<h2 id="创建restful"><span class="header-section-number">11.4</span> 创建RESTful</h2>
|
|
|
<p>用下面的代码实现我们称之为Athomes控制器的创建</p>
|
|
|
<pre><code>$ php artisan controller:make AthomesController </code></pre>
|
|
|
<p>就会在app/controllers下面生成下面的代码</p>
|
|
@@ -1617,7 +1626,7 @@ select * from athomes;</code></pre>
|
|
|
}
|
|
|
|
|
|
}</code></pre>
|
|
|
-<h2 id="laravel-resources"><span class="header-section-number">10.9</span> Laravel Resources</h2>
|
|
|
+<h2 id="laravel-resources"><span class="header-section-number">11.5</span> Laravel Resources</h2>
|
|
|
<p>上面的代码过于沉重,请让我用 Ctrl+C 来带来点知识吧。</p>
|
|
|
<table>
|
|
|
<thead>
|
|
@@ -1790,7 +1799,7 @@ select * from athomes;</code></pre>
|
|
|
}</code></pre>
|
|
|
<p>希望你能读懂,没有的话,关注下一节。</p>
|
|
|
<p>下面这部分来自于之前的博客,这里就不多加论述了。 这个也就是我们要的模板,</p>
|
|
|
-<h3 id="修改create"><span class="header-section-number">10.9.1</span> 修改Create()</h3>
|
|
|
+<h3 id="修改create"><span class="header-section-number">11.5.1</span> 修改Create()</h3>
|
|
|
<pre><code class="php">
|
|
|
public function create()
|
|
|
{
|
|
@@ -1806,8 +1815,8 @@ select * from athomes;</code></pre>
|
|
|
}
|
|
|
</code></pre>
|
|
|
<p>这里只是对其中代码的进行一下说明。</p>
|
|
|
-<h3 id="创建表单"><span class="header-section-number">10.9.2</span> 创建表单</h3>
|
|
|
-<h4 id="创建表单之前"><span class="header-section-number">10.9.2.1</span> 创建表单之前</h4>
|
|
|
+<h3 id="创建表单"><span class="header-section-number">11.5.2</span> 创建表单</h3>
|
|
|
+<h4 id="创建表单之前"><span class="header-section-number">11.5.2.1</span> 创建表单之前</h4>
|
|
|
<p>由于使用到了bootstrap以及bootstrap-select,记得添加css。</p>
|
|
|
<pre><code><link rel="stylesheet" type="text/css" href="<?= url('css/bootstrap.min.css') ?>" />
|
|
|
<link rel="stylesheet" type="text/css" href="<?= url('css/bootstrap-select.min.css') ?>" /></code></pre>
|
|
@@ -1818,7 +1827,7 @@ select * from athomes;</code></pre>
|
|
|
<script>
|
|
|
$('.selectpicker').selectpicker();
|
|
|
</script></code></pre>
|
|
|
-<h4 id="创建表单-1"><span class="header-section-number">10.9.2.2</span> 创建表单</h4>
|
|
|
+<h4 id="创建表单-1"><span class="header-section-number">11.5.2.2</span> 创建表单</h4>
|
|
|
<p>这里用到的是之前提到的那个作者写下的,稍微修改了一下。</p>
|
|
|
<pre><code><div class="row-fluid">
|
|
|
{{ HTML::ul($errors->all()) }}
|
|
@@ -1880,7 +1889,7 @@ $('.selectpicker').selectpicker();
|
|
|
return Redirect::to('athome');
|
|
|
}
|
|
|
}</code></pre>
|
|
|
-<h3 id="编辑模板"><span class="header-section-number">10.9.3</span> 编辑模板</h3>
|
|
|
+<h3 id="编辑模板"><span class="header-section-number">11.5.3</span> 编辑模板</h3>
|
|
|
<p>完整的 blade 模板文件</p>
|
|
|
<pre><code><!DOCTYPE html lang="zh-cn">
|
|
|
<html>
|
|
@@ -1958,21 +1967,21 @@ $('.selectpicker').selectpicker();
|
|
|
</html></code></pre>
|
|
|
<p>最后效果见:[http://b.phodal.com/][bphodal]</p>
|
|
|
<p>代码位置:[http://b.phodal.com/js/app.js][appjs]</p>
|
|
|
-<h1 id="restful-evertywhere"><span class="header-section-number">11</span> RESTful Evertywhere</h1>
|
|
|
-<h2 id="javascript与ajax"><span class="header-section-number">11.1</span> Javascript与ajax</h2>
|
|
|
+<h1 id="restful-evertywhere"><span class="header-section-number">12</span> RESTful Evertywhere</h1>
|
|
|
+<h2 id="javascript与ajax"><span class="header-section-number">12.1</span> Javascript与ajax</h2>
|
|
|
<blockquote>
|
|
|
<p>AJAX即“Asynchronous Javascript And XML”(异步JavaScript和XML),是指一种创建交互式网页应用的网页开发技术。AJAX = 异步 JavaScript和XML(标准通用标记语言的子集)。</p>
|
|
|
</blockquote>
|
|
|
-<h3 id="jquery"><span class="header-section-number">11.1.1</span> jQuery</h3>
|
|
|
+<h3 id="jquery"><span class="header-section-number">12.1.1</span> jQuery</h3>
|
|
|
<blockquote>
|
|
|
<p>Jquery是继prototype之后又一个优秀的Javascript框架。它是轻量级的js库 ,它兼容CSS3,还兼容各种浏览器(IE 6.0+, FF 1.5+, Safari 2.0+, Opera 9.0+),jQuery2.0及后续版本将不再支持IE6/7/8浏览器。jQuery使用户能更方便地处理HTML(标准通用标记语言下的一个应用)、events、实现动画效果,并且方便地为网站提供AJAX交互。jQuery还有一个比较大的优势是,它的文档说明很全,而且各种应用也说得很详细,同时还有许多成熟的插件可供选择。jQuery能够使用户的html页面保持代码和html内容分离,也就是说,不用再在html里面插入一堆js来调用命令了,只需定义id即可。</p>
|
|
|
</blockquote>
|
|
|
-<h2 id="java与json"><span class="header-section-number">11.2</span> Java与json</h2>
|
|
|
+<h2 id="java与json"><span class="header-section-number">12.2</span> Java与json</h2>
|
|
|
<blockquote>
|
|
|
<p>Gson(又称Google Gson)是Google公司发布的一个开放源代码的Java库,主要用途为串行化Java对象为JSON字符串,或反串行化JSON字符串成Java对象。</p>
|
|
|
</blockquote>
|
|
|
-<h3 id="android"><span class="header-section-number">11.2.1</span> Android</h3>
|
|
|
-<h2 id="python与json"><span class="header-section-number">11.3</span> Python与json</h2>
|
|
|
+<h3 id="android"><span class="header-section-number">12.2.1</span> Android</h3>
|
|
|
+<h2 id="python与json"><span class="header-section-number">12.3</span> Python与json</h2>
|
|
|
<blockquote>
|
|
|
<p>使用pySerial可以使Python很好地在Windows/Linux/BSD上执行串口操作。</p>
|
|
|
</blockquote>
|
|
@@ -1986,7 +1995,7 @@ url="http://b.phodal.com/athome/1"
|
|
|
date=urllib2.urlopen(url)
|
|
|
result=json.load(date)
|
|
|
print result</code></pre>
|
|
|
-<h3 id="requests"><span class="header-section-number">11.3.1</span> requests</h3>
|
|
|
+<h3 id="requests"><span class="header-section-number">12.3.1</span> requests</h3>
|
|
|
<blockquote>
|
|
|
<p>Python 标准库中的 urllib2 模块提供了你所需要的大多数 HTTP 功能,但是它的 API 烂出翔来了。它是为另一个时代、另一个互联网所创建的。它需要巨量的工作,甚至包括各种方法覆盖,来完成最简单的任务。</p>
|
|
|
</blockquote>
|
|
@@ -2005,19 +2014,19 @@ url = "http://b.phodal.com/athome/1"
|
|
|
data = {"temperature": 19, "sensors1": 32, "sensors2": 7.5, "led1": 0, "method": "PUT"}
|
|
|
r = requests.put(url, data)
|
|
|
print r.text</code></pre>
|
|
|
-<h1 id="前端显示"><span class="header-section-number">12</span> 前端显示</h1>
|
|
|
-<h2 id="jquery-mobile"><span class="header-section-number">12.1</span> jQuery Mobile</h2>
|
|
|
+<h1 id="前端显示"><span class="header-section-number">13</span> 前端显示</h1>
|
|
|
+<h2 id="jquery-mobile"><span class="header-section-number">13.1</span> jQuery Mobile</h2>
|
|
|
<blockquote>
|
|
|
<p>jQuery Mobile是jQuery 在手机上和平板设备上的版本。jQuery Mobile不仅会给主流移动平台带来jQuery核心库,而且会发布一个完整统一的jQuery移动UI框架。支持全球主流的移动平台。jQuery Mobile开发团队说:能开发这个项目,我们非常兴奋。移动Web太需要一个跨浏览器的框架,让开发人员开发出真正的移动Web网站。</p>
|
|
|
</blockquote>
|
|
|
-<h2 id="bootstrap"><span class="header-section-number">12.2</span> Bootstrap</h2>
|
|
|
+<h2 id="bootstrap"><span class="header-section-number">13.2</span> Bootstrap</h2>
|
|
|
<blockquote>
|
|
|
<p>Bootstrap是Twitter推出的一个开源的用于前端开发的工具包。它由Twitter的设计师Mark Otto和Jacob Thornton合作开发,是一个CSS/HTML框架。Bootstrap提供了优雅的HTML和CSS规范,它即是由动态CSS语言Less写成。Bootstrap一经推出后颇受欢迎,一直是GitHub上的热门开源项目,包括NASA的MSNBC(微软全国广播公司)的Breaking News都使用了该项目。</p>
|
|
|
</blockquote>
|
|
|
-<h2 id="库与车轮子"><span class="header-section-number">12.3</span> 库与车轮子</h2>
|
|
|
+<h2 id="库与车轮子"><span class="header-section-number">13.3</span> 库与车轮子</h2>
|
|
|
<p>在多数的情况下我们都没有理由也没有必要去重新发明我们的车轮,在这时使用库会是一个比较好的做法。</p>
|
|
|
-<h2 id="网站前台显示"><span class="header-section-number">12.4</span> 网站前台显示</h2>
|
|
|
-<h3 id="highchart"><span class="header-section-number">12.4.1</span> Highchart</h3>
|
|
|
+<h2 id="网站前台显示"><span class="header-section-number">13.4</span> 网站前台显示</h2>
|
|
|
+<h3 id="highchart"><span class="header-section-number">13.4.1</span> Highchart</h3>
|
|
|
<p>Highcharts有以下的特点</p>
|
|
|
<ul>
|
|
|
<li>兼容性:兼容当今所有的浏览器,包括 iPhone、IE 和火狐等等;</li>
|
|
@@ -2030,8 +2039,9 @@ print r.text</code></pre>
|
|
|
<li>易用性:无需要特殊的开发技能,只需要设置一下选项就可以制作适合自己的图表;</li>
|
|
|
<li>时间轴:可以精确到毫秒;</li>
|
|
|
</ul>
|
|
|
-<p>在这里只需将需要处理的数据存储到数组中,便可以将其渲染成为图形,下面的温度走势图便是基于Highcharts的结果 #构建基于CoAP协议的物联网系统</p>
|
|
|
-<h2 id="coap-嵌入式系统的rest"><span class="header-section-number">12.5</span> CoAP: 嵌入式系统的REST</h2>
|
|
|
+<p>在这里只需将需要处理的数据存储到数组中,便可以将其渲染成为图形,下面的温度走势图便是基于Highcharts的结果</p>
|
|
|
+<h1 id="构建基于coap协议的物联网系统"><span class="header-section-number">14</span> 构建基于CoAP协议的物联网系统</h1>
|
|
|
+<h2 id="coap-嵌入式系统的rest"><span class="header-section-number">14.1</span> CoAP: 嵌入式系统的REST</h2>
|
|
|
<p>引自维基百科上的介绍,用的是谷歌翻译。。。</p>
|
|
|
<blockquote>
|
|
|
<p>受约束的应用协议(COAP)是一种软件协议旨在以非常简单的电子设备,使他们能够在互联网上进行交互式通信中使用。它特别针对小型低功率传感器,开关,阀门和需要被控制或监督远程,通过标准的Internet网络类似的组件。 COAP是一个应用层协议,该协议是用于在资源受限的网络连接设备,例如无线传感器网络节点使用。 COAP被设计为容易地转换为HTTP与Web简化集成,同时也能满足特殊的要求,例如多播支持,非常低的开销,和简单性。多播,低开销,以及简单性是因特网极其重要物联网(IOT)和机器对机器(M2M)设备,这往往是积重难返,有太多的内存和电源,比传统的互联网设备有。因此,效率是非常重要的。 COAP可以在支持UDP或UDP的模拟大多数设备上运行。</p>
|
|
@@ -2043,11 +2053,11 @@ print r.text</code></pre>
|
|
|
<li>CoAP减少了一些HTTP的方法</li>
|
|
|
<li>CoAP可以支持检测装置</li>
|
|
|
</ul>
|
|
|
-<h2 id="coap-命令行工具"><span class="header-section-number">12.6</span> CoAP 命令行工具</h2>
|
|
|
+<h2 id="coap-命令行工具"><span class="header-section-number">14.2</span> CoAP 命令行工具</h2>
|
|
|
<p>开始之前,我们需要一个CoAP的命令行工具,以方便我们测试我们的代码是否是正确工作。</p>
|
|
|
-<h3 id="node-coap-cli"><span class="header-section-number">12.6.1</span> Node CoAP CLI</h3>
|
|
|
+<h3 id="node-coap-cli"><span class="header-section-number">14.2.1</span> Node CoAP CLI</h3>
|
|
|
<pre><code> npm install coap-cli -g </code></pre>
|
|
|
-<h4 id="coap命令行"><span class="header-section-number">12.6.1.1</span> CoAP命令行</h4>
|
|
|
+<h4 id="coap命令行"><span class="header-section-number">14.2.1.1</span> CoAP命令行</h4>
|
|
|
<p>在coap-cli中,一共有四个方法。</p>
|
|
|
<pre><code>Commands:
|
|
|
|
|
@@ -2062,13 +2072,13 @@ I-D</code></pre>
|
|
|
<p>测试一下现在的最小的物联网系统CoAP版</p>
|
|
|
<pre><code>coap get coap://iot-coap.phodal.com/id/1
|
|
|
(2.05) [{"id":1,"value":"is id 1","sensors1":19,"sensors2":20}]</code></pre>
|
|
|
-<h3 id="libcoap"><span class="header-section-number">12.6.2</span> libcoap</h3>
|
|
|
-<h4 id="mac-os-libcoap安装"><span class="header-section-number">12.6.2.1</span> mac os libcoap安装</h4>
|
|
|
+<h3 id="libcoap"><span class="header-section-number">14.2.2</span> libcoap</h3>
|
|
|
+<h4 id="mac-os-libcoap安装"><span class="header-section-number">14.2.2.1</span> mac os libcoap安装</h4>
|
|
|
<p>Mac OS下可以直接用</p>
|
|
|
<pre><code>brew install libcoap</code></pre>
|
|
|
-<h4 id="ubuntu-libcoap安装"><span class="header-section-number">12.6.2.2</span> Ubuntu libcoap安装</h4>
|
|
|
+<h4 id="ubuntu-libcoap安装"><span class="header-section-number">14.2.2.2</span> Ubuntu libcoap安装</h4>
|
|
|
<p>Ubuntu GNU/Linux下</p>
|
|
|
-<h4 id="windows-libcoap安装"><span class="header-section-number">12.6.2.3</span> Windows libcoap安装</h4>
|
|
|
+<h4 id="windows-libcoap安装"><span class="header-section-number">14.2.2.3</span> Windows libcoap安装</h4>
|
|
|
<p>Windows 下</p>
|
|
|
<p>安装完libcoap,我们可以直接用自带的两个命令</p>
|
|
|
<pre><code>coap-client
|
|
@@ -2081,15 +2091,15 @@ coap-server</code></pre>
|
|
|
<pre><code>v:1 t:0 tkl:0 c:1 id:37109
|
|
|
This is a test server made with libcoap (see http://libcoap.sf.net)
|
|
|
Copyright (C) 2010--2013 Olaf Bergmann <bergmann@tzi.org></code></pre>
|
|
|
-<h2 id="coap-helloworld"><span class="header-section-number">12.7</span> CoAP Hello,World</h2>
|
|
|
+<h2 id="coap-helloworld"><span class="header-section-number">14.3</span> CoAP Hello,World</h2>
|
|
|
<p>接着我们便开始试试做一个简单的CoAP协议的应用,</p>
|
|
|
-<h4 id="开始之前-2"><span class="header-section-number">12.7.0.1</span> 开始之前</h4>
|
|
|
+<h4 id="开始之前-2"><span class="header-section-number">14.3.0.1</span> 开始之前</h4>
|
|
|
<p>为了能访问<a href="coap://localhost/" class="uri">coap://localhost/</a>,于是我们便需要安装一个Firefox并安装一个名为Copper的插件。</p>
|
|
|
<ol style="list-style-type: decimal">
|
|
|
<li><p>下载地址: <a href="https://addons.mozilla.org/en-US/firefox/addon/copper-270430/" class="uri">https://addons.mozilla.org/en-US/firefox/addon/copper-270430/</a></p></li>
|
|
|
<li><p>作为测试我们同样可以访问 <a href="coap://vs0.inf.ethz.ch:5683/" class="uri">coap://vs0.inf.ethz.ch:5683/</a></p></li>
|
|
|
</ol>
|
|
|
-<h3 id="node-coap"><span class="header-section-number">12.7.1</span> Node-CoAP</h3>
|
|
|
+<h3 id="node-coap"><span class="header-section-number">14.3.1</span> Node-CoAP</h3>
|
|
|
<p>这里用到的是一个Nodejs的扩展Node-CoAP</p>
|
|
|
<blockquote>
|
|
|
<p>node-coap is a client and server library for CoAP modelled after the http module.</p>
|
|
@@ -2103,7 +2113,7 @@ Copyright (C) 2010--2013 Olaf Bergmann <bergmann@tzi.org></code></pre>
|
|
|
<p>接着执行</p>
|
|
|
<pre><code>npm install</code></pre>
|
|
|
<p>就可以安装好这个库</p>
|
|
|
-<h3 id="node-coap示例"><span class="header-section-number">12.7.2</span> Node CoAP示例</h3>
|
|
|
+<h3 id="node-coap示例"><span class="header-section-number">14.3.2</span> Node CoAP示例</h3>
|
|
|
<p>接着,创建这样一个app.js</p>
|
|
|
<pre class="sourceCode javascript"><code class="sourceCode javascript"><span class="kw">const</span> coap = <span class="fu">require</span>(<span class="st">'coap'</span>)
|
|
|
, server = <span class="ot">coap</span>.<span class="fu">createServer</span>()
|
|
@@ -2130,8 +2140,8 @@ Copyright (C) 2010--2013 Olaf Bergmann <bergmann@tzi.org></code></pre>
|
|
|
<p>就可以在console上输出</p>
|
|
|
<pre><code>Hello World </code></pre>
|
|
|
<p>也就达到了我们的目的,用CoAP协议创建一个服务,接着我们应该用它创建更多的东西,如产生JSON数据,以及RESTful。和HTTP版的最小物联网系统一样,CoAP版的最小物联网系统也是要返回JSON的。</p>
|
|
|
-<h2 id="coap-数据库查询"><span class="header-section-number">12.8</span> CoAP 数据库查询</h2>
|
|
|
-<h3 id="node-module"><span class="header-section-number">12.8.1</span> Node Module</h3>
|
|
|
+<h2 id="coap-数据库查询"><span class="header-section-number">14.4</span> CoAP 数据库查询</h2>
|
|
|
+<h3 id="node-module"><span class="header-section-number">14.4.1</span> Node Module</h3>
|
|
|
<p>这说里Module的意义是因为我们需要在别的地方引用到db_helper这个库,也就是下一小节要的讲的内容。</p>
|
|
|
<p>这样我们就可以在server.js类似于这样去引用这个js库。</p>
|
|
|
<pre class="sourceCode javascript"><code class="sourceCode javascript"><span class="kw">var</span> DBHelper = <span class="fu">require</span>(<span class="st">'./db_helper.js'</span>);
|
|
@@ -2142,9 +2152,9 @@ Copyright (C) 2010--2013 Olaf Bergmann <bergmann@tzi.org></code></pre>
|
|
|
<span class="ot">DBHelper</span>.<span class="fu">initDB</span> = <span class="kw">function</span>(){};
|
|
|
<span class="ot">module</span>.<span class="fu">exports</span> = DBHelper;</code></pre>
|
|
|
<p>虽然这里的功能很简单,简单也能做我们想做的事情。</p>
|
|
|
-<h3 id="node-sqlite3"><span class="header-section-number">12.8.2</span> Node-Sqlite3</h3>
|
|
|
+<h3 id="node-sqlite3"><span class="header-section-number">14.4.2</span> Node-Sqlite3</h3>
|
|
|
<p>这次我们用的是SQLite3(你可以用MySQL,出于安全考虑用SQLite3,SQLite3产生的是一个文件)</p>
|
|
|
-<h4 id="一个简单的initdb函数"><span class="header-section-number">12.8.2.1</span> 一个简单的initDB函数</h4>
|
|
|
+<h4 id="一个简单的initdb函数"><span class="header-section-number">14.4.2.1</span> 一个简单的initDB函数</h4>
|
|
|
<pre class="sourceCode javascript"><code class="sourceCode javascript"><span class="kw">var</span> db = <span class="kw">new</span> <span class="ot">sqlite3</span>.<span class="fu">Database</span>(config[<span class="st">"db_name"</span>]);
|
|
|
<span class="kw">var</span> create_table = <span class="st">'create table if not exists basic ('</span> + config[<span class="st">"db_table"</span>] + <span class="st">');'</span>;
|
|
|
|
|
@@ -2177,9 +2187,9 @@ Copyright (C) 2010--2013 Olaf Bergmann <bergmann@tzi.org></code></pre>
|
|
|
});
|
|
|
};</code></pre>
|
|
|
<p>将URL传进来,便解析这个参数,接着再放到数据库中查询,再回调回结果。这样我们就可以构成之前所说的查询功能,而我们所谓的post功能似乎也可以用同样的方法加进去。</p>
|
|
|
-<h3 id="查询数据"><span class="header-section-number">12.8.3</span> 查询数据</h3>
|
|
|
+<h3 id="查询数据"><span class="header-section-number">14.4.3</span> 查询数据</h3>
|
|
|
<p>简单地记录一下在IoT-CoAP中一次获取数据地过程。</p>
|
|
|
-<h3 id="get"><span class="header-section-number">12.8.4</span> GET</h3>
|
|
|
+<h3 id="get"><span class="header-section-number">14.4.4</span> GET</h3>
|
|
|
<p>先看看在示例中的Get.js的代码,这关乎在后面server端的代码。</p>
|
|
|
<pre class="sourceCode javascript"><code class="sourceCode javascript"><span class="kw">const</span> coap = <span class="fu">require</span>(<span class="st">'coap'</span>)
|
|
|
,requestURI = <span class="st">'coap://localhost/'</span>
|
|
@@ -2200,8 +2210,8 @@ Copyright (C) 2010--2013 Olaf Bergmann <bergmann@tzi.org></code></pre>
|
|
|
<p>我们构建了一个请求的URL</p>
|
|
|
<pre><code> coap://localhost/id/1/</code></pre>
|
|
|
<p>我们对我们的请求添加了一个Header,内容是Accept,值是’application/json’也就是JSON格式。接着,便是等待请求回来,再处理返回的内容。</p>
|
|
|
-<h3 id="iot-coap"><span class="header-section-number">12.8.5</span> IoT CoAP</h3>
|
|
|
-<h3 id="判断请求的方法"><span class="header-section-number">12.8.6</span> 判断请求的方法</h3>
|
|
|
+<h3 id="iot-coap"><span class="header-section-number">14.4.5</span> IoT CoAP</h3>
|
|
|
+<h3 id="判断请求的方法"><span class="header-section-number">14.4.6</span> 判断请求的方法</h3>
|
|
|
<p>在这里先把一些无关的代码删除掉,并保证其能工作,so,下面就是简要的逻辑代码。</p>
|
|
|
<pre class="sourceCode javascript"><code class="sourceCode javascript"><span class="kw">var</span> coap = <span class="fu">require</span>(<span class="st">'coap'</span>);
|
|
|
<span class="kw">var</span> server = <span class="ot">coap</span>.<span class="fu">createServer</span>({});
|
|
@@ -2229,7 +2239,7 @@ Copyright (C) 2010--2013 Olaf Bergmann <bergmann@tzi.org></code></pre>
|
|
|
}
|
|
|
};</code></pre>
|
|
|
<p>如果是json刚调用returnJSON,</p>
|
|
|
-<h3 id="database与回调"><span class="header-section-number">12.8.7</span> Database与回调</h3>
|
|
|
+<h3 id="database与回调"><span class="header-section-number">14.4.7</span> Database与回调</h3>
|
|
|
<p>而这里为了处理回调函数刚分为了两部分</p>
|
|
|
<pre class="sourceCode javascript"><code class="sourceCode javascript"><span class="ot">query_helper</span>.<span class="fu">returnJSON</span> = <span class="kw">function</span>(req, res) {
|
|
|
<span class="ot">DBHelper</span>.<span class="fu">urlQueryData</span>(<span class="ot">req</span>.<span class="fu">url</span>, <span class="kw">function</span> (result) {
|
|
@@ -2260,7 +2270,7 @@ Copyright (C) 2010--2013 Olaf Bergmann <bergmann@tzi.org></code></pre>
|
|
|
};</code></pre>
|
|
|
<p>当resulst的结果为空时,返回一个404,因为没有数据。这样我们就构成了整个的链,再一步步返回结果。</p>
|
|
|
<p>在<a href="https://github.com/gmszone/iot-coap">IoT-CoAP</a>中我们使用到了一个Block2的东西,于是便整理相关的一些资料,作一个简单的介绍,以及在代码中的使用。</p>
|
|
|
-<h2 id="coap-block"><span class="header-section-number">12.9</span> CoAP Block</h2>
|
|
|
+<h2 id="coap-block"><span class="header-section-number">14.5</span> CoAP Block</h2>
|
|
|
<p>CoAP是一个RESTful传输协议用于受限设备的节点和网络。基本的CoAP消息是一个不错的选择对于小型载荷如</p>
|
|
|
<ul>
|
|
|
<li>温度传感器</li>
|
|
@@ -2271,7 +2281,7 @@ Copyright (C) 2010--2013 Olaf Bergmann <bergmann@tzi.org></code></pre>
|
|
|
<p>CoAP是同UDP与DLTS一样是基于数据报传输的,这限制了资源表示(resource representation)的最大大小,使得传输不需要太多的分割。虽然UDP支持通过IP分片传输更大的有效载荷,且仅限于64KiB,更重要的是,并没有真正很好地约束应用和网络。</p>
|
|
|
<p>而不是依赖于IP分片,这种规范基本COAP了对“块”选项,用于传输信息从多个资源区块的请求 - 响应对。在许多重要的情况下,阻止使服务器能够真正无状态:服务器可以处理每块分开传输,而无需建立连接以前的数据块传输的其他服务器端内存。</p>
|
|
|
<p>综上所述,块(Block)选项提供了传送一个最小的在分块的方式更大的陈述。</p>
|
|
|
-<h3 id="coap-post"><span class="header-section-number">12.9.1</span> CoAP POST</h3>
|
|
|
+<h3 id="coap-post"><span class="header-section-number">14.5.1</span> CoAP POST</h3>
|
|
|
<p>看看在IoT CoAP中的post示例。</p>
|
|
|
<pre class="sourceCode javascript"><code class="sourceCode javascript"><span class="kw">const</span> coap = <span class="fu">require</span>(<span class="st">'coap'</span>)
|
|
|
,request = <span class="ot">coap</span>.<span class="fu">request</span>
|
|
@@ -2303,9 +2313,9 @@ Copyright (C) 2010--2013 Olaf Bergmann <bergmann@tzi.org></code></pre>
|
|
|
<p>就有</p>
|
|
|
<pre><code>[ '1', '\'must\'', '23', '12' ]</code></pre>
|
|
|
<p>便可以很愉快地将其post到数据库中了,</p>
|
|
|
-<h3 id="json请求"><span class="header-section-number">12.9.2</span> JSON请求</h3>
|
|
|
+<h3 id="json请求"><span class="header-section-number">14.5.2</span> JSON请求</h3>
|
|
|
<p>在做IoT-CoAP的过程中只支持JSON,查阅CoAP的草稿时发现支持了诸多的Content Types。</p>
|
|
|
-<h3 id="coap-content-types"><span class="header-section-number">12.9.3</span> CoAP Content Types</h3>
|
|
|
+<h3 id="coap-content-types"><span class="header-section-number">14.5.3</span> CoAP Content Types</h3>
|
|
|
<p>以下文字来自谷歌翻译:</p>
|
|
|
<blockquote>
|
|
|
<p>互联网媒体类型是通过HTTP字符串标识,如“application/xml”。该字符串是由一个顶层的类型“applicaion”和子类型的“XML”。为了尽量减少使用这些类型的媒体类型来表示的开销消息有效载荷,COAP定义一个标识符编码方案互联网媒体类型的子集。预计这桌将可扩展标识符的值的IANA维护。内容类型选项被格式化为一个8位无符号整数。初始映射到一个合适的互联网媒体类型标识符表所示。复合型高层次类型(multipart和不支持消息)。标识符值是从201-255保留的特定于供应商的,应用程序特定的或实验使用和不由IANA。</p>
|
|
@@ -2478,7 +2488,7 @@ Copyright (C) 2010--2013 Olaf Bergmann <bergmann@tzi.org></code></pre>
|
|
|
</table>
|
|
|
<p>简单地说就是:</p>
|
|
|
<p><code>诸如application/json的Content Types在CoAP中应该是50</code>。如上表所示的结果是其对应的结果,这样的话可以减少传递的信息量。</p>
|
|
|
-<h2 id="coap-json"><span class="header-section-number">12.10</span> CoAP JSON</h2>
|
|
|
+<h2 id="coap-json"><span class="header-section-number">14.6</span> CoAP JSON</h2>
|
|
|
<p>于是在一开始的时候首先支持的便是“application/json”这样的类型。</p>
|
|
|
<p>首先判断请求的header</p>
|
|
|
<pre class="sourceCode javascript"><code class="sourceCode javascript"><span class="ot">request_helper</span>.<span class="fu">getHandler</span> = <span class="kw">function</span>(req, res) {
|
|
@@ -2500,9 +2510,9 @@ Copyright (C) 2010--2013 Olaf Bergmann <bergmann@tzi.org></code></pre>
|
|
|
<span class="fu">registerFormat</span>(<span class="st">'application/json'</span>, <span class="dv">50</span>)</code></pre>
|
|
|
<p>对应地我们需要在一发出请求的时候设置好Accept,要不就没有办法返回我们需要的结果。</p>
|
|
|
<pre class="sourceCode javascript"><code class="sourceCode javascript"><span class="ot">req</span>.<span class="fu">setHeader</span>(<span class="st">"Accept"</span>, <span class="st">"application/json"</span>);</code></pre>
|
|
|
-<h3 id="返回json"><span class="header-section-number">12.10.1</span> 返回JSON</h3>
|
|
|
+<h3 id="返回json"><span class="header-section-number">14.6.1</span> 返回JSON</h3>
|
|
|
<p>在给IoT CoAP添加了JSON支持之后,变得非常有意思,至少我们可以获得我们想要的结果。在上一篇中我们介绍了一些常用的工具——<a href="http://www.phodal.com/blog/coap-command-line-tools-set/">CoAP 命令行工具集</a>。</p>
|
|
|
-<h3 id="coap客户端代码"><span class="header-section-number">12.10.2</span> CoAP客户端代码</h3>
|
|
|
+<h3 id="coap客户端代码"><span class="header-section-number">14.6.2</span> CoAP客户端代码</h3>
|
|
|
<p>开始之前我们需要有一个客户端代码,以便我们的服务端可以返回正确的数据并解析</p>
|
|
|
<pre class="sourceCode javascript"><code class="sourceCode javascript"><span class="kw">var</span> coap = <span class="fu">require</span>(<span class="st">'coap'</span>);
|
|
|
<span class="kw">var</span> requestURI = <span class="st">'coap://localhost/'</span>;
|
|
@@ -2528,7 +2538,7 @@ Copyright (C) 2010--2013 Olaf Bergmann <bergmann@tzi.org></code></pre>
|
|
|
<span class="co">//do something</span>
|
|
|
};</code></pre>
|
|
|
<p>这样就可以返回数据了</p>
|
|
|
-<h3 id="coap-server端代码"><span class="header-section-number">12.10.3</span> CoAP Server端代码</h3>
|
|
|
+<h3 id="coap-server端代码"><span class="header-section-number">14.6.3</span> CoAP Server端代码</h3>
|
|
|
<p>Server端的代码比较简单,判断一下</p>
|
|
|
<pre class="sourceCode javascript"><code class="sourceCode javascript"><span class="kw">if</span> (<span class="ot">req</span>.<span class="fu">headers</span>[<span class="st">'Accept'</span>] == <span class="st">'application/json'</span>) {
|
|
|
<span class="fu">parse_url</span>(<span class="ot">req</span>.<span class="fu">url</span>, <span class="kw">function</span>(result){
|
|
@@ -2550,12 +2560,63 @@ Copyright (C) 2010--2013 Olaf Bergmann <bergmann@tzi.org></code></pre>
|
|
|
})
|
|
|
}</code></pre>
|
|
|
<p>并且全部都显示出来,设计得真是有点不行,不过现在已经差不多了。</p>
|
|
|
-<h1 id="mqtt"><span class="header-section-number">13</span> MQTT</h1>
|
|
|
+<h2 id="使用iot-coap构建物联网"><span class="header-section-number">14.7</span> 使用IoT-CoAP构建物联网</h2>
|
|
|
+<h2 id="iot-coap-1"><span class="header-section-number">14.8</span> IoT-CoAP</h2>
|
|
|
+<h2 id="install"><span class="header-section-number">14.9</span> install</h2>
|
|
|
+<p><code>注意</code>:windows系统npm install失败时,需要自己建立一个C:and Settings[USERNAME]Data文件</p>
|
|
|
+<pre><code>npm install iot-coap</code></pre>
|
|
|
+<p>new a file <code>index.js</code>(新建index.js)</p>
|
|
|
+<p><code>注意</code>: 如果已经存在一个index.js文件,请将下面内容添加到文件末尾(create index.js, and add)</p>
|
|
|
+<pre><code>var iotcoap = require('iot-coap');
|
|
|
+
|
|
|
+iotcoap.run();
|
|
|
+iotcoap.rest.run();</code></pre>
|
|
|
+<p><code>注意</code>:在db配置可以选择mongodb和sqlite3,替换所需要的数据库即可。(you can choice db on iot.js with ‘sqlite’ or ‘mongodb’)</p>
|
|
|
+<p>创建iot.js(Create iot.js)</p>
|
|
|
+<pre><code>exports.config = {
|
|
|
+ "db_name": "iot.db",
|
|
|
+ "mongodb_name": "iot",
|
|
|
+ "mongodb_documents": "iot",
|
|
|
+ "db": "mongodb",
|
|
|
+ "table_name": "basic",
|
|
|
+ "keys":[
|
|
|
+ "id",
|
|
|
+ "value",
|
|
|
+ "sensors1",
|
|
|
+ "sensors2"
|
|
|
+ ],
|
|
|
+ "db_table": "id integer primary key, value text, sensors1 float, sensors2 float",
|
|
|
+ "mongodb_init":[
|
|
|
+ {
|
|
|
+ id: 1,
|
|
|
+ value: "is id 1",
|
|
|
+ sensors1: 19,
|
|
|
+ sensors2: 20
|
|
|
+ },
|
|
|
+ {
|
|
|
+ id: 2,
|
|
|
+ value: "is id 2",
|
|
|
+ sensors1: 20,
|
|
|
+ sensors2: 21
|
|
|
+ }
|
|
|
+ ],
|
|
|
+ "init_table":[
|
|
|
+ "insert or replace into basic (id,value,sensors1,sensors2) VALUES (1, 'is id 1', 19, 20);",
|
|
|
+ "insert or replace into basic (id,value,sensors1,sensors2) VALUES (2, 'is id 2', 20, 21);"
|
|
|
+ ],
|
|
|
+ "query_table":"select * from basic;",
|
|
|
+ "rest_url": "/id/:id",
|
|
|
+ "rest_post_url": "/",
|
|
|
+ "rest_port": 8848
|
|
|
+};</code></pre>
|
|
|
+<p>接着运行(run)</p>
|
|
|
+<pre><code>node index.js</code></pre>
|
|
|
+<h1 id="mqtt"><span class="header-section-number">15</span> MQTT</h1>
|
|
|
<blockquote>
|
|
|
<p>MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是IBM开发的一个即时通讯协议,有可能成为物联网的重要组成部分。该协议支持所有平台,几乎可以把所有联网物品和外部连接起来,被用来当做传感器和致动器(比如通过Twitter让房屋联网)的通信协议。</p>
|
|
|
</blockquote>
|
|
|
<p>早在1999年,IBM的Andy Stanford-Clark博士以及Arcom公司ArlenNipper博士发明了MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)技术[1] 。据Andy Stanford-Clark博士称,MQTT将在今年和明年呈现爆炸式增长。</p>
|
|
|
-<h2 id="nodejs-mqtt"><span class="header-section-number">13.1</span> Nodejs MQTT</h2>
|
|
|
+<h2 id="nodejs-mqtt"><span class="header-section-number">15.1</span> Nodejs MQTT</h2>
|
|
|
<blockquote>
|
|
|
<p><a href="https://github.com/adamvr/MQTT.js/">mqtt.js</a> is a library for the MQTT protocol, written in JavaScript to be used in node.js.</p>
|
|
|
</blockquote>
|
|
@@ -2578,8 +2639,8 @@ client.end();</code></pre>
|
|
|
<li id="fn2"><p>形如http://www.phodal.com<a href="#fnref2">↩</a></p></li>
|
|
|
<li id="fn3"><p>URL 是 URI 的子集<a href="#fnref3">↩</a></p></li>
|
|
|
<li id="fn4"><p>curl是利用URL语法在命令行方式下工作的开源文件传输工具。<a href="#fnref4">↩</a></p></li>
|
|
|
-<li id="fn5"><p>https://github.com/jiukunz/tw-ruby-training/blob/master/slides/contents/7-rest-and-restful-web-api.md #创建REST服务<a href="#fnref5">↩</a></p></li>
|
|
|
-<li id="fn6"><p>https://github.com/jiukunz/tw-ruby-training/blob/master/slides/contents/7-rest-and-restful-web-api.md #创建REST服务<a href="#fnref6">↩</a></p></li>
|
|
|
+<li id="fn5"><p>https://github.com/jiukunz/tw-ruby-training/blob/master/slides/contents/7-rest-and-restful-web-api.md<a href="#fnref5">↩</a></p></li>
|
|
|
+<li id="fn6"><p>https://github.com/jiukunz/tw-ruby-training/blob/master/slides/contents/7-rest-and-restful-web-api.md<a href="#fnref6">↩</a></p></li>
|
|
|
</ol>
|
|
|
</div>
|
|
|
</body>
|