Raspbot改造远程联网监控
既然$Raspbot$小车上面既有摄像头又有轮子,那么也许可以尝试做一个可以遥控行驶的监控器,这样即可非常方便地远程观察家中的情况,甚至脱离了固定监控的位置限制,它可以去到各个房间探查。下面就是实现这个功能的完整过程。 设备联网 (注:电脑上需要下载的应用有VNCviewer以及nmap,其中nmap可以通过其官网直接下载安装,而VNCviewer可以通过RealVNC官网安装,如果连接不上官网,可以在亚博智能网站提供的资源中下载远程登录软件.zip文件,解压后同样可以找到VNCviewer的安装包) 如果想要通过网络对小车进行控制,首先要让小车联网。本身按照官方的说法,直接用手机App中的配网按钮,生成一个专用的联网二维码,放到小车摄像头面前扫描即可,但这种方式实测并不可靠,本身如果有一根Micro-HDMI转HDMI的传输线,就可以把小车主板直接接到显示器上面,选择网络连接即可,但如果手头并没有线,必须通过远程才能访问到小车的桌面,那么就需要按照以下步骤联网: 用一根网线直接插入主板上的网线连接口,和路由器连接,强制通过有线连接的方式让它联网; 将电脑连入和小车同样的网络,运行ipconfig命令,找到WLAN的IPV4地址,可以发现显示的是一个形似A.B.C.D的局域网地址,记下四个数字,并将下文中的字母均替换为查询到的数字; 由于此时小车已经有线连接在同一个网络下,故在命令行中运行nmap -sn A.B.C.1/24命令,即可查找和电脑连接在同一网络下的所有设备。此时nmap会默认在括号中打印出设备的制造商和其局域网地址,找到括号中写着Raspberry Pi (Trading)的设备,下面的IPV4一栏即为小车的局域网地址; 打开VNCviewer,在左上角File一栏中找到New Connection,点击添加新的连接,并在弹出对话框的VNCserver一栏中填写刚刚查到的小车局域网地址,Name中填上Raspbot,其他默认即可,点击OK; 这时VNCviewer的主页中新增了一个名为Raspbot的设备,双击即可进入小车的桌面啦!至此,远程访问小车系统就已经实现了。 在小车桌面的左上角点击命令行的图标,打开命令行,开始设置无线网卡的联网: 运行以下命令,查询附近可用网络,这时会列出附近的网络名称和信号强度,如果要连接的网络在显示的列表中,即可连接; sudo nmcli device wifi list 按q退出网络查找模式,运行以下命令,将无线网卡连入网络:(注意双引号不要删掉了) sudo nmcli device wifi connect "你的WiFi名称" password "你的WiFi密码" ifname wlan0 如果连接成功,命令行就会返回: Device 'wlan0' successfully activated with 'X-X-X-X-X'. 这时,在小车的命令行中运行ifconfig,找到wlan0对应的信息,其中第二行的inet后面即为小车无线联网的局域网IPV4地址了,此时,再在VNCviewer中新建一个连接,将无线联网的这个地址输入VNCserver,重新取个名字,这样,就算将网线拔了,双击这个新增的设备也可以通过局域网无线访问小车桌面了! 但这时如果重启小车,它依然会优先进入热点模式而非连接网络,所以需要修改小车系统中连接网络和开启热点的优先级,用以下命令: sudo nmcli connection modify "你的WiFi名称" connection.autoconnect-priority 10 sudo nmcli connection modify "Raspbot" connection.autoconnect-priority 1 第一句设置连接wifi的优先级为10,第二句设置开启热点的优先级为1,提高wifi优先级,即可保证小车开机首选自动连接wifi。 至此,小车启动自连网设置完毕。 搭建网页 联网之后就需要选择一个信号传输的方式,我个人认为搭建一个网页并通过网络发送信号是最方便的,当然可以开发一个手机App,再通过网络连接小车,但这就和亚博智能官方的应用没什么区别了,甚至还更麻烦。以下就是搭建网页的步骤。 这里通过python第三方包flask进行网页搭建,这样,只需要在树莓派中运行一个.py文件,即可打开一个地址类似A.B.C.D:X的端口,其中A.B.C.D是小车自己的IP地址,而X则是一个可以在flask中自定义的一个端口编号,这样,只需用手机访问这个网址,即可开始和小车进行信号传输。 我的小车网页总共分四部分:主页、遥控页面、人脸识别页面、聊天室,其中: 主页集成了监控画面和三个功能页面的跳转按钮; 遥控页面中功能较多,集成了以下功能: 监控画面; 摄像头角度控制; 小车行驶控制; 蜂鸣器控制; 抓拍并下载监控当前画面; 人脸识别页面在进入时,小车会将摄像头转到几个设定的角度,寻找人脸,在找到人脸后自动调整摄像头角度使得人脸居于画面中央,并在对应人脸上标明绿色方框,如果人脸已经录入在人脸数据库中则会在方框右上角标注人名; 聊天室中集成以下功能: 发送信息,记录并显示聊天历史; 根据发送信息的IP地址不同,调用不同的人声对信息进行阅读; 可在后台修改不同IP对应的昵称,用于聊天历史的显示。 下面是具体代码,注意这些网页均需要用.py文件和.html文件联合搭建。 一些基本搭建网页的代码如下: python语句: from flask import Flask, request, render_template, url_for, Response, send_file, jsonify # 初始化网页对象,之后所有网页地址对应功能的实现都需要靠它 app = Flask(__name__) # @app.route(path)命令需要配合在其下方的函数一起执行,表示当网址"A.B.C.D:X"+path被访问的时候,下方的函数就会开始运行。传入path表示网页路径,单一的"/"表示根目录 @app.route("/") def home(): # render_template函数中传入的是当前要渲染的网页对应html文件的名字,通常文件结构如下: # │————当前.py文件 # └────templates # │————homePage.html # └────所有html文件均在templates目录下 return render_template("homePage.html") # 以下语句需要写在@app.route()语句下面的函数中 # 返回一个字典化的东西,使得html可以读取到函数返回的信息 return jsonify({"status":"ok"}) # 当html在运行时转到了类似:A.B.C.D:X/something?button=xxx的网址时,"?"后面的东西相当于对python函数中给出了一些变量,必须通过request.args.get()语句获得,并且里面填入的名称必须和传入的变量名相同 button = request.args.get("button") # 实现抓拍并下载监控当前画面功能时,需要用到send_file命令,它会将抓拍下来的照片tmp.jpg作为网页附件发送给手机并自动开始下载,其中download_name表示手机下载时的图片名 send_file('tmp.jpg', as_attachment=True, download_name=curTime+'.jpg') # 实现实时预览监控画面的功能时,需要用到Response函数,其中generate_frames()函数是自己定义的一个获取图像并用yield函数生成数据流的函数,后面的mimetype告诉了浏览器这个地方需要用多个图像不断替换的 return Response( generate_frames(), mimetype="multipart/x-mixed-replace; boundary=frame" ) # 可以在下面的函数中写入资源释放的语句,例如car.Car_Stop(),当Ctrl+C中断程序时就会自动执行该函数 def cleanup_and_exit(signum, frame): sys.exit(0) signal.signal(signal.SIGINT, cleanup_and_exit) signal.signal(signal.SIGTERM, cleanup_and_exit) # 这一句放在if __name__ == "__main__":中,启动网页,开启5000端口 app.run(host = '0.0.0.0', port = 5000, use_reloader = False) html语句: ...