準備 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
- 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口)。 框架
- #include
- Servo myservo;
- int servoPin = 12;
- int lock = 0;
- int unlock = 180;
- void setup() {
- // initialize serial:
- Serial.begin(9600);
- myservo.attach(servoPin);
- myservo.write(lock);
- }
咱們告訴微處理器,伺服馬達的0位置是「鎖住」,180位置是「解鎖」。跟據你是如何將馬達跟門鎖捆綁的,也許須要交換調整這個位置。當微控制器啓動時,它會告訴馬達移動到「鎖住」位置。
接下來,咱們將從串口鏈接上讀取一個字符,來斷定是否應該調動馬達運行。
- void loop() {
- // Recieve data from Node and write it to a String
- while (Serial.available()) {
- char inChar = (char)Serial.read();
- if(inChar == 'V'){ // end character for locking
- if (myservo.read() >= 90) {
- Serial.println("L");
- myservo.write(lock);
- delay(3000);
- }
- else {
- Serial.println("U");
- myservo.write(unlock);
- delay(3000);
- }
- }
- }
- }
Arduino用來分析的串口輸入是來自node.js腳本的輸出,下面咱們會介紹這個腳本。
在Arduino IDE開發環境外,咱們用一個文本編輯器建立一個新文件,叫作nodelock.js,文件的開頭是導入前面咱們用npm安裝的模塊:
- var twilio = require('twilio'),
- SerialPort = require("serialport").SerialPort,
- express = require('express');
下面咱們將創建新express web server和serialPort鏈接:
- var app = express();
- var serialPort = new SerialPort("/dev/tty.usbmodem1411", {
- baudrate: 9600
- });
注意,咱們指定了要鏈接的USB端口和波特率。你可能須要根據你的計算機的狀況修改這個USB端口。你能夠在Arduino->Tools->Port菜單上找到你的可用的USB端口號。
下面咱們要設定HTTP相關信息,調用/sms:
- app.use(express.bodyParser());
- app.post('/sms', twilio.webhook('your auth token', { host:'foo.herokuapp.com', protocol:'https' }), function(req, res){
- });
咱們須要告訴express服務器經過/sms地址接受POST請求,使用bodyParser分析請求內容,獲取來自Twilio的短信信息。咱們使用twilio的webhook方法來驗證請求來源的可靠性。
如今,咱們有了接收短信的地址,在試一下以前,咱們應該檢查一下發短信的號碼是不是咱們用來控制鎖的號碼。
- app.post('/sms', twilio.webhook('your auth token', { host:'foo.herokuapp.com', protocol:'https' }), function(req, res){
- if (req.body.From == "+12128675309") {
- console.log("verified number!");
- } else {
- console.log("Wrong number!");
- sendMessage(res, "Invalid number!");
- }
- });
在驗證號碼的代碼段裏,咱們能夠加入一個處理髮送和相應Arduino微控制器上串口鏈接的功能。
- serialPort.once('data', function(data) {
- if (data.toString().indexOf('U') > -1) { //check if the Arduino returned a U for unlocking
- sendMessage(res, 'Unlocking!');
- }
- else if (data.toString().indexOf('L') > -1) {
- sendMessage(res, 'Locking!');
- }
- else {
- sendMessage(res, 'ERROR');
- }
- console.log('data received: ' + data);
- });
- serialPort.write("V", function(err, results) {
- if (err) {
- console.log('err ' + err);
- }
- console.log('results ' + results);
- });
這代碼看起來很雜亂,但這是至關直接的寫法。咱們設定了事件處理器從微控制器裏接受數據。這個事件處理器會檢查Arduino微控制器發送的是 「U」 仍是 「L」 ,咱們獲取這個值,並用sendMessage函數將信息反饋給用戶。
設定了事件處理器後,咱們向Arduino微控制器裏寫入「V」字符,告訴它接收到了短信,它如今應該打開/關閉門鎖。
咱們如今往文件中加入sendMessage函數,它有2個參數:res和message。
- function sendMessage(res, message) {
- var resp = new twilio.TwimlResponse();
- resp.message(message);
- res.type('text/xml');
- res.send(resp.toString());
- }
調用sendMessage函數會給用戶發送TwiML響應信息。TwiML是XML的子集,Twilio用它來傳遞短消息指令。在咱們這裏,咱們用它告訴Twilio響應我發送的SMS信息。用戶也許會發送「unlock」,程序會經過Twilio SMS回覆 「Unlocking!」
咱們已經配置了SMS處理器,最後只須要打開SerialPort,啓動Express web server,咱們的應用就開發完了:
- serialPort.open( function () {
- app.listen(3000);
- console.log('Listening on port 3000');
- });
這就是全部咱們須要的代碼。如今,若是你上傳咱們以前寫的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欄裏,保存設置,試着發送一個短信!你的門鎖應該隨着短信自動打開或關閉。