DIY物联网 5 - 手机控制风扇

《DIY 物联网 4 - 遥控控制风扇》中实现了用空调遥控来控制一台普通的风扇,沿着上-章的基础,这一章我们来一个更酷的:用手机控制风扇。

开发板和手机通讯的方式

上一章我们实现遥控控制风扇,实际上是根据遥控红外信号指令控制连接风扇的继电器开关,现在我们要实现手机控制风扇,把遥控红外指令换成手机发出的指令就能控制风扇了。我们能想到的几种方式:

  • 蓝牙通讯:

利用手机的蓝牙功能,连接开发板,发送蓝牙信号,但是有个缺点是不好扩展,不能实现远程控制。

  • 网络通讯:
    利用开发板的网络访问能力,实现和手机的网络对接。网络通讯可以是简单的 HTTP 协议,也可以使用 TCP 协议,网络连接模型有两种方式:

  • 直连模模式

控制端(手机)直接和开发板进行网络通讯,这只方式只能在局域网中使用,因为公网访问需要为开发板申请公网 ip 不太现实。

  • 服务器中转模式

控制端和开发板都能连上云服务,通过服务器实现交互。这种方式不仅能实现通讯控制、还能采集各端的数据、对数据进行分析,这就是万物连接+大数据的基本模型,当然个人实现成本太大。服务 IoT 的云平台已经有了,阿里云就有这部分的服务。

直连模式实现

作为学习我们先用最简单的连接方式:直连模式。在 Ruff 启动并启动 WIFI 热点之后进入 console.ruff.io ,配置
开发板的网络访问能力,然后就可以对 Ruff 进行网络编程了,Ruff 提供了丰富的 API 满足网络通讯的需求,详细可以了解官方 API 文档:https://ruff.io/zh-cn/api/http.html。 现在我们在 Ruff 实现一个 httpServer 的程序:httpControl.js

        'use strict'; 
        function createServer(callback) {
             var PORT = 3000;
             var http = require('http');
             var url=require('url');
             var queryString  = require("querystring");
             var datas={};
             var server = http.createServer(function (request, response) {
                 var query=url.parse(request.url).query;
                 datas = queryString.parse(query);
                 callback.exeCmd(datas.cmd);
                 response.write(callback.getRelayStatus()? 'true':'false');
                 response.end();
           });
        server.listen(PORT);
        console.log("Server runing at port: " + PORT + ".");
      }
      module.exports.listenCMD = createServer;

这里我们把对 http 的实现简单封装成一个模块,共其他模块使用。逻辑很简单:在 3000 端口监听网络请求,并解析请求参数,把请求参数传入回调函数供调用方使用, 最后把继电器的开关状态响应到客户端。接着上一章的基础,我们来修改 index.js:

       var netControl = require('./netcontrol');
       var relayOpen = false;
       function controlRelay(open){
       
             if (open) {
                  $('#relay').turnOn(function () { 
                        // 打开继电器成功的回调函数
                         console.log('turn on');
                });
          } else {
             $('#relay').turnOff(function () { 
                   // 关闭继电器成功的回调函数
                  console.log('turn off');
              });
         }
          relayOpen = open;
       }
       $.ready(function (error) {
         if (error) {
             console.log(error);
             return;
         }
    
        netControl.listenCMD({
                 exeCmd:function (cmd) {
                     if (cmd === 'openRelay') {
     
                         controlRelay(true)
                    
                     } else {
                         controlRelay(false)
                    
                     }
                 },
                 getRelayStatus: function () {
                     return relayOpen;
                 }
        });
     
     
     });
 
 
     $.end(function () {
         $('#relay').turnOff(function () { 
                  console.log('turn off');
          });
 
     });

客户端实现

客户端实现很简单,就一个简单的静态 html ,提供两个按钮:开和关,按钮被点击的时候向开发板发起 http 请求,你要知道开发板的内内网 ip,访问 192.168.78.1 ,可以看到你的开发板的网络配置包括 ip。

  <!DOCTYPE html>
  <html lang="en">
   <head>
   <meta charset="UTF-8">
   <title>Title</title>
   <style>
       button {
          width: 100%;
          height: 100px;
           color: aliceblue;
           font-size: 50px;
           padding: 16px;
       }
   </style>
   </head>
   <body>
   <div id="status"></div>
   <button style="background: darkgreen" onclick="onButtonClick('openRelay')">打开风扇</button>
   <button style="background: orangered" onclick="onButtonClick('offRelay')">关闭风扇</button>
   </body>
   <script>

   function post(url, content, callback) {
       var xmlhttp;
       if (window.XMLHttpRequest)
       {// code for IE7+, Firefox, Chrome, Opera, Safari
           xmlhttp = new XMLHttpRequest();
       }
       else
       {// code for IE6, IE5
           xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
       }
       xmlhttp.onreadystatechange = function()
       {
           if (xmlhttp.readyState==4 && xmlhttp.status==200)
           {
               callback(null,xmlhttp.responseText);
           } else {

           };
       };
       xmlhttp.open("POST",url,true);
       xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
       xmlhttp.send(content);

   }
   function onButtonClick(cmd){
       // 192.168.1.109 替换成你自己的 ip
       post('http://192.168.1.109:3000?cmd=' + cmd,'',function (err,res) {
           alert(res);
           document.getElementById('status').innerHTML = res;

       })
   }
   </script>
   </html>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 222,104评论 6 515
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,816评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,697评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,836评论 1 298
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,851评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,441评论 1 310
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,992评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,899评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,457评论 1 318
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,529评论 3 341
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,664评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,346评论 5 350
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 42,025评论 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,511评论 0 24
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,611评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 49,081评论 3 377
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,675评论 2 359

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,303评论 25 707
  • 计算机网络概述 网络编程的实质就是两个(或多个)设备(例如计算机)之间的数据传输。 按照计算机网络的定义,通过一定...
    蛋炒饭_By阅读 1,231评论 0 10
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,121评论 4 61
  • 人活着,就是最大的幸福,看着那花开花落,人生需要很多努力,有坚强,有祝福,还有一丝坚强的阳光,这是我梦中的生活,一...
    zmal阅读 163评论 0 0
  • 你有目标吗? 反正我没有! 都说不想当将军的士兵不是好士兵,可是我怎么从来没想过要当将军呢?为此有一段时间觉...
    深吉月阅读 580评论 0 0