如何用手機控制你的鎖----手機編程

    

準備 node

1. 從http://arduino.cc/en/Main/Software下載和安裝Arduino IDE。 git

2. 從http://nodejs.org/獲取並安裝 github

3. 從https://ngrok.com/download下載並安裝 ngrok  web

使用Arduino IDE寫代碼並上傳到往微控制器裏。我使用node.js腳本語言來和Arduino微處理器進行通訊,利用Express web框架發送請求和相應請求。最後,咱們使用ngrok將這個Express web Server暴露到外網,這樣咱們就能夠經過短信讓Twilio通訊給你的微控制器。 express

編寫控制程序 npm

Node.js和Arduino等軟件也已經安裝了,如今咱們須要運行下面的命令來安裝必要的node.js模塊。注意,若是你使用的是Windows,你須要按照node-serialportWindows安裝指令windows

 
  1. npm install serialport twilio express 

Node-Serialport可以讓你輕鬆的經過Arduino微控制器串口跟Node.js程序交互。咱們將要使用它從Twilio裏接受短信請求,並傳遞指令給Arduino微控制器讓它關鎖或開鎖。 服務器

Express是一個簡單的node.js web框架。而twilio模塊能讓咱們輕鬆的和Twilio API交互。 app

首先,咱們打開Arduino IDE,創建一個新的Arduino開發框架。第一步咱們須要打開一個9600波特的串口鏈接,跟伺服馬達接通(12口)。 框架

 
  1. #include  
  2.  
  3. Servo myservo; 
  4. int servoPin = 12; 
  5. int lock = 0; 
  6. int unlock = 180; 
  7.  
  8. void setup() { 
  9.   // initialize serial: 
  10.   Serial.begin(9600); 
  11.   myservo.attach(servoPin); 
  12.   myservo.write(lock); 

咱們告訴微處理器,伺服馬達的0位置是「鎖住」,180位置是「解鎖」。跟據你是如何將馬達跟門鎖捆綁的,也許須要交換調整這個位置。當微控制器啓動時,它會告訴馬達移動到「鎖住」位置。

接下來,咱們將從串口鏈接上讀取一個字符,來斷定是否應該調動馬達運行。

 
  1. void loop() { 
  2.    // Recieve data from Node and write it to a String 
  3.    while (Serial.available()) { 
  4.     char inChar = (char)Serial.read(); 
  5.     if(inChar == 'V'){ // end character for locking 
  6.      if (myservo.read() >= 90) { 
  7.        Serial.println("L"); 
  8.        myservo.write(lock); 
  9.        delay(3000); 
  10.      } 
  11.      else { 
  12.        Serial.println("U"); 
  13.        myservo.write(unlock); 
  14.        delay(3000); 
  15.      } 
  16.     } 
  17.   }   

Arduino用來分析的串口輸入是來自node.js腳本的輸出,下面咱們會介紹這個腳本。

在Arduino IDE開發環境外,咱們用一個文本編輯器建立一個新文件,叫作nodelock.js,文件的開頭是導入前面咱們用npm安裝的模塊:

 
  1. var twilio = require('twilio'), 
  2.    SerialPort = require("serialport").SerialPort, 
  3.    express = require('express'); 

下面咱們將創建新express web serverserialPort鏈接

 
  1. var app = express(); 
  2. var serialPort = new SerialPort("/dev/tty.usbmodem1411", { 
  3.  baudrate: 9600 
  4. }); 

注意,咱們指定了要鏈接的USB端口和波特率。你可能須要根據你的計算機的狀況修改這個USB端口。你能夠在Arduino->Tools->Port菜單上找到你的可用的USB端口號。

下面咱們要設定HTTP相關信息,調用/sms:

 
  1. app.use(express.bodyParser()); 
  2.  
  3. app.post('/sms', twilio.webhook('your auth token', { host:'foo.herokuapp.com', protocol:'https' }), function(req, res){ 
  4. }); 

咱們須要告訴express服務器經過/sms地址接受POST請求,使用bodyParser分析請求內容,獲取來自Twilio的短信信息。咱們使用twilio的webhook方法來驗證請求來源的可靠性。

如今,咱們有了接收短信的地址,在試一下以前,咱們應該檢查一下發短信的號碼是不是咱們用來控制鎖的號碼。

 
  1. app.post('/sms', twilio.webhook('your auth token', { host:'foo.herokuapp.com', protocol:'https' }), function(req, res){ 
  2.  if (req.body.From == "+12128675309") { 
  3.    console.log("verified number!"); 
  4.  } else { 
  5.    console.log("Wrong number!"); 
  6.    sendMessage(res, "Invalid number!"); 
  7.  } 
  8.  
  9. }); 

在驗證號碼的代碼段裏,咱們能夠加入一個處理髮送和相應Arduino微控制器上串口鏈接的功能。

 
  1. serialPort.once('data'function(data) { 
  2.      if (data.toString().indexOf('U') > -1) { //check if the Arduino returned a U for unlocking 
  3.        sendMessage(res, 'Unlocking!'); 
  4.      } 
  5.      else if (data.toString().indexOf('L') > -1) { 
  6.        sendMessage(res, 'Locking!'); 
  7.      } 
  8.      else { 
  9.        sendMessage(res, 'ERROR'); 
  10.      } 
  11.      console.log('data received: ' + data); 
  12.    }); 
  13.  
  14.    serialPort.write("V"function(err, results) { 
  15.      if (err) { 
  16.        console.log('err ' + err); 
  17.      } 
  18.      console.log('results ' + results); 
  19.    }); 

這代碼看起來很雜亂,但這是至關直接的寫法。咱們設定了事件處理器從微控制器裏接受數據。這個事件處理器會檢查Arduino微控制器發送的是 「U」 仍是 「L」 ,咱們獲取這個值,並用sendMessage函數將信息反饋給用戶。

設定了事件處理器後,咱們向Arduino微控制器裏寫入「V」字符,告訴它接收到了短信,它如今應該打開/關閉門鎖。

咱們如今往文件中加入sendMessage函數,它有2個參數:res和message。

 
  1. function sendMessage(res, message) { 
  2.  var resp = new twilio.TwimlResponse(); 
  3.  resp.message(message); 
  4.  res.type('text/xml'); 
  5.  res.send(resp.toString()); 

調用sendMessage函數會給用戶發送TwiML響應信息。TwiML是XML的子集,Twilio用它來傳遞短消息指令。在咱們這裏,咱們用它告訴Twilio響應我發送的SMS信息。用戶也許會發送「unlock」,程序會經過Twilio SMS回覆 「Unlocking!」

咱們已經配置了SMS處理器,最後只須要打開SerialPort,啓動Express web server,咱們的應用就開發完了:

 
  1. serialPort.open( function () { 
  2.  app.listen(3000); 
  3.  console.log('Listening on port 3000'); 
  4. }); 

這就是全部咱們須要的代碼。如今,若是你上傳咱們以前寫的Arduino代碼,運行nodelock.js,方法是在終端裏執行node nodelock.js,程序就啓動了。

若是你在開發的過程當中遇到了錯誤,可跟這些代碼對比一下看是什麼問題。

在建立並登錄你的Twilio賬號後,到 Twilio控制檯,點擊號碼標籤,選擇你但願用來控制鎖的號碼。你會看到兩個框,語音請求地址(Voice Request URL)和消息請求地址(Messaging Request URL)。咱們使用Messaging Request URL來傳遞咱們的短信文本信息。

由於Twilio是經過HTTP請求通訊的,咱們須要有一個能從公網上訪問的地址,當有消息到達時,Twilio會將信息傳遞跟這個地址。因而咱們以前安裝的ngrok就起做用了。

等你的node.js服務器起來,開一個終端窗口,在你安裝ngrok的目錄下輸入./ngrok 3000,這裏你須要指定一個地址,經過它,外部服務能訪問你的本地服務器。在這個地址後面跟上/sms,填入Twilio Messaging Request URL欄裏,保存設置,試着發送一個短信!你的門鎖應該隨着短信自動打開或關閉。

相關文章
相關標籤/搜索