当前位置: 首页 > 科技观察

使用Node.js和Twilio实现手机控制门锁

时间:2023-03-21 01:59:37 科技观察

想象一下,如果忘记带钥匙,但是带了手机,就可以打开门锁了。或者,你还在赶回家,但你的朋友已经到了你家门口,你通过手机远程开门,让朋友进去看会儿电视。这不是科幻,也不需要先进的设备,而是我们自己研发的。本文基于我在波兰Makerland会议上的研讨会演讲。本文将教您如何在不破坏或修改锁的情况下通过手机控制您家的门锁。我们需要使用微控制器(ArduinoUno)、电机和Node.js来通过短信远程打开和关闭锁。我的灵感来自Twilio驱动的Lockitron。Step1:DeviceParts1.一个门锁2.胶带,硬纸板3.电机(我用的是HS-322HD)4.微控制器(ArduinoUno)+转接线准备1.来自http://arduino.cc/en/Main/Software用于下载和安装ArduinoIDE。2、从http://nodejs.org/获取并安装3、从https://ngrok.com/download下载并安装ngrok(内网穿透程序)。我将使用ArduinoIDE编写代码并上传到控制器中的微信。我使用node.js脚本语言与Arduino微处理器通信,使用Expressweb框架发送请求并响应它们。最后,我们使用ngrok将这个Express网络服务器暴露给外界,这样我们就可以让Twilio通过SMS与您的微控制器通信。现在,我们可以开始将我的微控制器连接到门锁了。第2步:组装我们将使用伺服电机来控制门锁。它只是一个电机,动力轴需要是可以旋转180度的那种,这样我们才能打开和关闭门锁。该伺服电机具有三根电线-火线(红色)、零线(黑色)和控制线(通常为黄色或白色)。微处理器上有许多端口。将电机的火线接到5v电源口,零线接到GND地口,控制线接到DigitalPin12口,如下图:这样我的电机和单片机就完成了连接到一起,然后我们将其与门锁组装在一起。我喜欢用普通的家居用品开发这些设备,但如果你能连接3D打印机,你就可以设计和打印自己的锁定机制。由于这是演示,我用硬纸板和胶带将电机和门锁固定在一起。用两根金属棒(或其他结实的细棒)来帮助电机,并用东西垫住它。用硬纸板(或其他比较硬的东西)作为门锁和电机的连接填充物:用胶带把电机和门锁绑在一起,一定要绑在正确的一边,这样电机的方向旋转是开锁或关锁的方向:最后,我们将电机轴连接到锁按钮上:现在我们已经将电机和门锁牢固地固定在一起了:#p#第三步:编写控制程序电机和微控制器已经连接好,Node.js、Arduino等软件也已经安装好,现在我们需要运行以下命令来安装必要的node.js模块。请注意,如果您使用的是Windows,则需要按照node-serialportWindows安装说明进行操作。npminstallserialporttwilioexpressNode-Serialport允许您通过Arduino微控制器串口轻松地与Node.js程序交互。我们将使用它来接受来自Twilio的SMS请求,并将命令传递给Arduino微控制器以解锁或解锁锁。Express是一个简单的node.jsWeb框架。twilio模块使我们能够轻松地与TwilioAPI进行交互。首先,我们打开ArduinoIDE,新建一个Arduino开发框架。第一步我们需要打开一个9600波特的串口连接到伺服电机(端口12)。#includeServomyservo;intservoPin=12;intlock=0;intunlock=180;voidsetup(){//initializeserial:Serial.begin(9600);myservo.attach(servoPin);myservo.write(lock);}我们告诉微处理器,伺服电机0位置“锁定”,180位置“解锁”。根据您将电机连接到门锁的方式,可能需要调换此位置。当微控制器启动时,它告诉电机移动到“锁定”位置。接下来,我们将从串行连接中读取一个字符以确定是否应打开电机。voidloop(){//从Node接收数据并将其写入aStringwhile(Serial.available()){charinChar=(char)Serial.read();if(inChar=='V'){//endcharacterforlockingif(myservo.read()>=90){Serial.println("L");myservo.write(lock);delay(3000);}else{Serial.println("U");myservo.write(unlock);delay(3000);}}}}Arduino用于分析的串口输入是node.js脚本的输出,我们将在下面介绍。在ArduinoIDE的开发环境之外,我们使用文本编辑器创建一个名为nodelock.js的新文件。文件开头是导入我们之前用npm安装的模块:vartwilio=require('twilio'),SerialPort=require("serialport").SerialPort,express=require('express');接下来我们将建立一个新的expressweb服务器和serialPort连接:varapp=express();varserialPort=newSerialPort("/dev/tty.usbmodem1411",{baudrate:9600});请注意,我们指定了要连接的USB端口和波特率。您可能需要根据您的计算机修改此USB端口。您可以在Arduino->Tools->Port菜单中找到可用的USB端口号。接下来我们需要设置HTTP相关信息,调用/sms:app.use(express.bodyParser());app.post('/sms',twilio.webhook('yourauthtoken',{host:'foo.herokuapp.com',协议:'https'}),函数(req,res){});我们需要通过/sms地址告诉expressserver接受POST请求,使用bodyParser解析请求内容,从Twilio获取短信信息。我们使用twilio的webhook方法来验证请求来源的真实性。现在我们有了一个接收短信的地址,我们应该在尝试之前检查短信号码是否是我们用来控制锁的号码。app.post('/sms',twilio.webhook('yourauthtoken',{host:'foo.herokuapp.com',protocol:'https'}),function(req,res){if(req.body.From=="+12128675309"){console.log("verifiednumber!");}else{console.log("Wrongnumber!");sendMessage(res,"Invalidnumber!");}});验证码部分的代码,我们可以在相应的Arduino单片机上添加一个处理发送和串口连接的函数。serialPort.once('data',function(data){if(data.toString().indexOf('U')>-1){//checkiftheArduinoreturnedaUforunlockingsendMessage(res,'Unlocking!');}elseif(data.toString().indexOf('L')>-1){sendMessage(res,'Locking!');}else{sendMessage(res,'ERROR');}console.log('datareceived:'+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。functionsendMessage(res,message){varresp=newtwilio.TwimlResponse();resp.message(message);res.type('text/xml');res.send(resp.toString());}调用sendMessage函数将给用户发送一条TwiML响应消息。TwiML是Twilio用于传递短消息指令的XML子集。在我们的例子中,我们用它来告诉Twilio响应我发送的SMS消息。用户可以发送“unlock”,程序会回复“Unlocking!”通过Twilio短信。我们已经配置好了SMShandler,最后我们只需要打开SerialPort,启动Expresswebserver,我们的应用就开发好了:serialPort.open(function(){app.listen(3000);console.log('Listeningonport3000');});这就是我们需要的所有代码。现在,如果您上传我们之前编写的Arduino代码,通过在终端中执行nodenodelock.js来运行nodelock.js,程序将启动。如果在开发过程中遇到错误,可以和这些代码进行对比,看看是什么问题。创建并登录您的Twilio帐户后,转到Twilio控制台,单击“数字”选项卡,然后选择您希望用于控制锁的数字。您将看到两个框,语音请求URL和消息请求URL。我们使用消息请求URL来发送我们的SMS文本消息。因为Twilio通过HTTP请求进行通信,所以我们需要有一个可以从公共网络访问的地址。当消息到达时,Twilio会将信息传递到该地址。所以我们之前安装的ngrok可以工作。当您的node.js服务器启动时,打开一个终端窗口并在您安装ngrok的目录中输入./ngrok3000。在这里您需要指定一个地址,外部服务可以通过该地址访问您的本地服务器。在这个地址后面加上/sms,填写TwilioMessagingRequestURL字段,保存设置,然后尝试发送短信!您的门锁应该会自动打开或关闭,并显示一条短信。祝大家游戏愉快,编程愉快!英文原文:BuildYourOwnLockitronWithTwilio,Arduino,andNode.js翻译链接:http://www.vaikan.com/lockitron-with-twilio-arduino-and-node-js/