整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

开发者尝鲜阿里小程序云平台,实操讲解如何打造智能小车!

松使用阿里云完成智能小车


  • 前言
  • 开发准备
  • 硬件
  • 软件
  • 硬件连接
  • 环境部署
  • 阿里云应用
  • MJPG-Streamer
  • frp
  • 申请域名解析
  • 服务器部署 Nginx
  • 配置测试页面
  • 阿里云微消息队列MQTT
  • 海创物联开发平台部署

前言

智能小车,自娱自乐,希望通过该分享帮助更多爱好者们化繁为简,待我完成到第三季,我将会把程序放出来拱大家使用,我准备分三季来实现,APP后台部署在阿里小程序云,通过阿里云MQTT消息队列服务,来完成指令控制,并实现事件日志机制。

第一季实现小车的控制目标

1、实现小车4驱控制

2、实现摄像头实时查看,借助反向代理来完成内外网的通信

3、实现指令通过阿里云微消息队列MQTT来交互

4、设计APP端的控制界面实现

第二季实现目标

1、实现摄头云端控制

2、人脸检测

3、打包容器

4、热体红外+超声波测距+湿度温度

第三季实现目标

思考中。。

第一季开发准备

硬件

开发准备

硬件

  • 树莓派3b+
  • 小车底座
  • L298N电机驱动模块
  • 杜邦线
  • 充电宝
  • 6v~50V电源
  • 树莓派专用摄像头 Raspberry Pi Camera

软件

  • 阿里小程序云应用
  • MJPG-Streamer
  • frp
  • 阿里云微消息队列MQTT
  • 支付宝小程序开发者工具

硬件连接

整体效果

  1. 树莓派上电,将充电宝用usb线将树莓派于其连接,可看到树莓派红色指示灯常亮,绿色指示灯闪烁。如果发现红色指示灯忽然熄灭或者亮点很低,请检查充电宝输出电压以及电流是否太低
  1. 插入树莓派摄像头,注意不要插反,排线金属侧正对插排口金属侧,插入后扣紧排口

  1. gpio与电机驱动模块in口连接。这边我们选择GPIO5、GPIO6、GPIO12、GPIO13、GPIO19、GPIO16、GPIO26、GPIO20 (GIPIO与针脚值不一致,对应针脚位置请参考下图,针脚39,40的位置在USB口旁边) 与驱动模块的IN1~IN8连接 (连接顺序请自行调整,驱动模块IN1的数字量输入控制OUT1输出,OUT1-OUT2如果连接同一个电机的输入和输出端,那么IN1-IN2对应输入数字信号[1,0]则代表前进,[0,1]代表后退,[0,0]或者[1,1]代表停止,以此类推IN1~IN8,OUT1~OUT8)

环境部署

阿里云应用

云应用是面向小程序应用场景,为开发者提供的一键构建后端应用运行环境、后端服务部署、运维监控等能力的一站式小程序部署服务。

我们需要申请一个云应用充当小程序的服务器以及fpc服务器。现在阿里推出繁星计划,可以免费申请2个月的测试环境以及一个月的生产环境,无需申请,直接在应用界面新建新运用,创建详情请参考文档

在控制台获取服务器ip、用户名(默认root)、密码(需要修改默认密码,然后重启服务器),通过SSH工具连接,用于部署下面步骤

MJPG-Streamer

MJPG-Streamer是一个命令行应用程序,它将JPEG帧从一个或多个输入插件复制到多个输出插件。它可用于通过基于IP的网络将JPEG文件从网络摄像头流式传输到各种类型的查看器,如Chrome,Firefox,Cambozola,VLC,mplayer和其他能够接收MJPG流的软件。

  1. 开启树莓派摄像头
  2. 树莓派摄像头总线是默认没开启的,请在命令行中开启,进入后,选择camera项,再选择enable,然后重启
sudo raspi-config
  1. 安装必要的库
sudo apt-get update
sudo apt-get install subversion
sudo apt-get install libjpeg8-dev
sudo apt-get install imagemagick
sudo apt-get install libv4l-dev
sudo apt-get install cmake
sudo apt-get install git
  1. git开源的project到本地,编译
sudo git clone https://github.com/jacksonliam/mjpg-streamer.git
cd mjpg-streamer/mjpg-streamer-experimental
make all
sudo make install
  1. 解决V4L driver不支持的问题
sudo wget http://www.linux-projects.org/listing/uv4l_repo/lrkey.asc &&
sudo apt-key add ./lrkey.asc

修改sources.list,在末尾添加源,并安装uv4l uv4l-raspicam,然后重启

sudo nano /etc/apt/sources.list
#末尾添加,保存
deb http://www.linux-projects.org/listing/uv4l_repo/raspbian/ wheezy main
sudo apt-get update
sudo apt-get install uv4l uv4l-raspicam
sudo reboot

重启之后:

sudo pkill uv4l
sudo apt-get update
sudo apt-get install uv4l-uvc
sudo apt-get install uv4l-xscreen
sudo apt-get install uv4l-mjpegstream
sudo reboot

再一次重启之后开启视频流服务

sudo modprobe bcm2835-v4l2
./mjpg_streamer -i "./input_uvc.so -d /dev/video0 -n -y -f 25 -r 640x480" -o "./output_http.so -n -w /usr/local/www"

然后打开浏览器输入:http://raspberry-ip-address:8080/?action=stream

应该就可以看到Raspberry Pi Camera采集的动态视频了,延迟大概不超过0.8秒吧。

frp

frp是一个快速反向代理,可帮助您将NAT或防火墙后面的本地服务器暴露给Internet。截至目前,它支持tcp&udp以及http和https协议,其中请求可以通过域名转发到内部服务。

  1. 服务端部署 frps
  2. 在购买的服务端(有公网IP)部署frps,用于穿透树莓派本地的视频流
wget --no-check-certificate https://raw.githubusercontent.com/clangcn/onekey-install-shell/master/frps/install-frps.sh -O ./install-frps.sh
chmod 700
./install-frps.sh
./install-frps.sh install

然后一直回车(默认配置),知道全部安装完成。安装成功截图

  1. 启动frps
frps start

查看frps版本号

frps -v

我这边安装的是version 0.20.0,客户端也要安装对应版本的

  1. 树莓派部署frpc
  2. 由于我们服务器部署frps的版本是version 0.20.0,所以我们本地也要部署相同的版本
wget https://github.com/fatedier/frp/releases/download/v0.20.0/frp_0.20.0_linux_arm.tar.gz
tar zxvf frp_0.20.1_linux_arm.tar.gz
cd frp_0.14.1_linux_arm
vi frpc.ini

修改 frpc.ini 文件

# frpc.ini
[common]
#服务器IP
server_addr = x.x.x.x
#服务器fpcs服务对应端口Bind port
server_port = 5443 
#服务端token
oken = 你的服务端token
[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6000
#[]内名称不能重复,标签作用
[web_raspberry_web]
type = http
#端口号 对应本机视频web服务器的端口
local_port = 8080
#配置穿透外网访问域名,可设置多个
custom_domains = raspberry.你的域名.com

修改好frpc.ini后,启动frpc客户端。如果想在后台运行,可在命令后加 &

./frpc -c frpc.ini 

申请域名解析

将你的的域名主机记录 raspberry A 记录解析到你的服务器IP x.x.x.x

服务器部署 Nginx

Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。

Ubuntu16.04安装及配置nginx

  1. 安装gcc g++的依赖库
apt-get install build-essential
apt-get install libtool
  1. 安装pcre依赖库
sudo apt-get update
sudo apt-get install libpcre3 libpcre3-dev
  1. 安装zlib依赖库
apt-get install zlib1g-dev

4.安装ssl依赖库

apt-get install openssl

安装nginx

#下载最新版本:
wget http://nginx.org/download/nginx-1.16.0.tar.gz
#解压:
tar -zxvf nginx-1.11.3.tar.gz
#进入解压目录:
cd nginx-1.11.3
#配置:
./configure --prefix=/usr/local/nginx 
#编辑nginx:
make
注意:这里可能会报错,提示“pcre.h No such file or directory”,具体详见:http://stackoverflow.com/questions/22555561/error-building-fatal-error-pcre-h-no-such-file-or-directory
需要安装 libpcre3-dev,命令为:sudo apt-get install libpcre3-dev
#安装nginx:
sudo make install
#启动nginx:
sudo /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
注意:-c 指定配置文件的路径,不加的话,nginx会自动加载默认路径的配置文件,可以通过 -h查看帮助命令。
#查看nginx进程:
ps -ef|grep nginx

在浏览器输入 http://raspberry.你的域名.com:8080

出现页面则nginx部署成功

配置测试页面

新建一个index.html文件,用于测试页面,内容如下

<html>
 <head>
 <meta name="generator"
 content="HTML Tidy for HTML5 (experimental) for Windows https://github.com/w3c/tidy-html5/tree/c63cc39" />
 <meta http-equiv="Content-Type" content="text/html;" charset="UTF-8" />
 <meta name="viewport"
 content="width=device-width, initial-scale=1.0, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0" />
 <meta http-equiv="refresh" content="3" />
 <title>树莓派实时监控站</title>
 </head>
 <body>
 <center>
 <font size="20" face="微软雅黑" color="#0074CD">
 <b>树莓派<br>
 实时监控站</b>
 </font>
 <hr />
 frameLabelStart--frameLabelEnd <!--修改此处-->
 <br />
 <p>
 <font size="5" color="#269C5D">
 <b>Design by James</b>
 </font>
 </p>
 <p>
 <font size="5" color="#269C5D">
 <i>a Web Monitoring Based on Raspberry Pi</i>
 </font>
 </p>
 </center>
 </body>
</html>

将该文件替换在nginx配置的web路径的index.html文件,例如/var/www/index.html

在浏览器输入 http://raspberry.你的域名.com:8080

尝试一下能否访问,如果成功出现树莓派实时监控页面,则web页面部署成功

阿里云微消息队列MQTT

微消息队列 MQTT 是阿里云推出的一款面向移动互联网以及物联网领域的轻量级消息中间件,针对移动互联网以及物联网 IoT 场景的消息传输特点,支持了包括 MQTT、STOMP、GB-808、新能源国标等主流通信协议

  1. 创建服务
  2. 打开MQTT控制台,需要登录阿里云账号,若没账号请自行申请。登录后请根据阿里云mqtt说明书创建mqtt服务。创建完毕后如下图,主要用到参数有 实例id、公网接入点、消息存储实例、Topic、Group

海创物联开发平台部署

海创开发平台是海创科技有限公司开发的一款快速编程平台,该平台开发的组件能快速与PLC、GPIO、各式设备进行通讯,有丰富的API支持,基本你们想到的事情它都能干,非常适合做物联网的网关控制中心

  1. 导入程序
  2. 打开海创物联开发平台的控制页 http://树莓派ip:1880/#flow/fd2b8cdb.5b63b

复制以下代码,打开开发平台,点击右上角菜单,选择导入-剪切板,然后粘贴保存,即可看到工作区新增了一个新的流程,该流程用于接受MQTT命令控制小车

[{"id":"9e9c968e.24e348","type":"rpi-gpio out","z":"d99269c6.a2d0b8","name":"","pin":"29","set":true,"level":"0","freq":"","out":"out","x":720,"y":140,"wires":[]},{"id":"37f46ac8.666436","type":"rpi-gpio out","z":"d99269c6.a2d0b8","name":"","pin":"31","set":true,"level":"0","freq":"","out":"out","x":720,"y":180,"wires":[]},{"id":"5f130d8f.f55d84","type":"function","z":"d99269c6.a2d0b8","name":"控制","func":"switch(msg.payload)\n{\n case '0':return [{payload:0},{payload:0},{payload:0},{payload:0},{payload:0},{payload:0},{payload:0},{payload:0}];\n case '1':return [{payload:0},{payload:1},{payload:0},{payload:1},{payload:0},{payload:1},{payload:0},{payload:1}];\n case '2':return [{payload:1},{payload:0},{payload:1},{payload:0},{payload:1},{payload:0},{payload:1},{payload:0}];\n case '4':return [{payload:0},{payload:0},{payload:0},{payload:0},{payload:1},{payload:0},{payload:1},{payload:0}];\n case '3':return [{payload:1},{payload:0},{payload:1},{payload:0},{payload:0},{payload:0},{payload:0},{payload:0}];\n}\n","outputs":8,"noerr":0,"x":510,"y":320,"wires":[["9e9c968e.24e348","676a7be6.b97e14"],["37f46ac8.666436","676a7be6.b97e14"],["2e8cc1ec.6369ce","676a7be6.b97e14"],["c7700a0b.47b378","676a7be6.b97e14"],["676a7be6.b97e14","482e8885.76d548"],["676a7be6.b97e14","62b4d0fc.a93f3"],["676a7be6.b97e14","fd3c406.31fc4c"],["676a7be6.b97e14","6ac88490.ba21bc"]]},{"id":"2e8cc1ec.6369ce","type":"rpi-gpio out","z":"d99269c6.a2d0b8","name":"","pin":"32","set":true,"level":"0","freq":"","out":"out","x":720,"y":240,"wires":[]},{"id":"c7700a0b.47b378","type":"rpi-gpio out","z":"d99269c6.a2d0b8","name":"","pin":"33","set":true,"level":"0","freq":"","out":"out","x":720,"y":280,"wires":[]},{"id":"8e757771.a599e8","type":"inject","z":"d99269c6.a2d0b8","name":"","topic":"停止","payload":"0","payloadType":"str","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":250,"y":260,"wires":[["5f130d8f.f55d84"]]},{"id":"89e33a84.467878","type":"inject","z":"d99269c6.a2d0b8","name":"","topic":"前进","payload":"1","payloadType":"str","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":250,"y":320,"wires":[["5f130d8f.f55d84"]]},{"id":"e521ba16.452cc8","type":"inject","z":"d99269c6.a2d0b8","name":"","topic":"后退","payload":"2","payloadType":"str","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":250,"y":380,"wires":[["5f130d8f.f55d84"]]},{"id":"676a7be6.b97e14","type":"debug","z":"d99269c6.a2d0b8","name":"","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":750,"y":580,"wires":[]},{"id":"482e8885.76d548","type":"rpi-gpio out","z":"d99269c6.a2d0b8","name":"","pin":"35","set":true,"level":"0","freq":"","out":"out","x":720,"y":340,"wires":[]},{"id":"62b4d0fc.a93f3","type":"rpi-gpio out","z":"d99269c6.a2d0b8","name":"","pin":"36","set":true,"level":"0","freq":"","out":"out","x":720,"y":380,"wires":[]},{"id":"fd3c406.31fc4c","type":"rpi-gpio out","z":"d99269c6.a2d0b8","name":"","pin":"37","set":true,"level":"0","freq":"","out":"out","x":720,"y":440,"wires":[]},{"id":"6ac88490.ba21bc","type":"rpi-gpio out","z":"d99269c6.a2d0b8","name":"","pin":"38","set":true,"level":"0","freq":"","out":"out","x":720,"y":480,"wires":[]},{"id":"6473261a.673168","type":"inject","z":"d99269c6.a2d0b8","name":"","topic":"左转","payload":"3","payloadType":"str","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":250,"y":440,"wires":[["5f130d8f.f55d84"]]},{"id":"73eb851c.b88ddc","type":"inject","z":"d99269c6.a2d0b8","name":"","topic":"右转","payload":"4","payloadType":"str","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":250,"y":480,"wires":[["5f130d8f.f55d84"]]},{"id":"bf85c267.64f96","type":"mqtt in","z":"d99269c6.a2d0b8","name":"","topic":"","qos":"2","broker":"bf40108b.620c2","x":235,"y":160,"wires":[["5f130d8f.f55d84","8a1c007d.34912"]]},{"id":"8a1c007d.34912","type":"debug","z":"d99269c6.a2d0b8","name":"","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":435,"y":180,"wires":[]},{"id":"c1f327d8.b01818","type":"inject","z":"d99269c6.a2d0b8","name":"","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":240,"y":40,"wires":[["c4d9812a.7b54b"]]},{"id":"c4d9812a.7b54b","type":"mqtt out","z":"d99269c6.a2d0b8","name":"","topic":"","qos":"","retain":"","x":415,"y":40,"wires":[]},{"id":"bf40108b.620c2","type":"mqtt-broker","z":"","name":"","broker":"","port":"1883","clientid":"","usetls":false,"compatmode":true,"keepalive":"60","cleansession":true,"birthTopic":"","birthQos":"0","birthPayload":"","closeTopic":"","closeQos":"0","closePayload":"","willTopic":"","willQos":"0","willPayload":""}]

导入后效果如下

  1. 修改节点属性
  2. 导入的流程不能直接使用,需要修改一些节点属性配置。

双击mqtt out节点,在属性窗点击服务器右侧的那个小标签按钮进入mqtt服务配置。填好服务器(阿里mqtt实例的外网http接入点)、端口号(默认1883)、客户端id("Group ID@@@任意id" 客户端ID在每个实例每个主题中只能唯一,重复情况下后面连接的自动被阿里断开)、用户名(这边我们使用的是签名鉴权模式,Token鉴权模式参考文档"Signature|Access Key|实例 ID")、密码(参考阿里的签名机制,快捷生成签名请点击签名校验),点击保存返回mqtt属性配置页,填写主题(阿里的Topic ID),QOS选择1(至少上传一次)。mqtt in节点类似,由于接受消息是用于控制小车,所以QOS选择2(仅分发一次),以下是配置详情

PIN控制着电机驱动模块从而控制小车的动作,前进(四个轮子前进)、后退(四个轮子后退)、左转(右侧轮子转)、右转(左侧轮子转)。假设相邻的两个OUT口连接一个电机,那么驱动模块的控制逻辑为

IN1IN2~数字信号10电机前进数字信号01电机后退数字信号00电机停止数字信号11电机停止

根据该逻辑配置function节点(示例已包含,请根据自己的接法设置GPIO口的信号输出)

  1. 部署调试
  2. 点击菜单栏的部署按钮对程序部署,程序正式运行

单击定时器后mqtt out节点会将测试使用的时间戳上传到阿里的mqtt服务器,然后mqtt in会订阅接受到该消息,并在右侧调试窗口输出。正式使用数据请输入0、1、2、3

使用mqtt发送正式消息,操作结果

作者:fengsl

创物联-智能小车第一季

更换封面

00:15 视频尚未发布,暂时无法播放

  • 前言
  • 开发准备
  • 硬件
  • 软件
  • 硬件连接
  • 环境部署
  • 阿里云应用
  • MJPG-Streamer
  • frp反向代理
  • 申请域名解析
  • 服务器部署 Nginx
  • 配置测试页面
  • 阿里云微消息队列MQTT
  • 海创物联开发平台部署

前言

智能小车,自娱自乐,希望通过该分享帮助更多爱好者们化繁为简,待我完成到第三季,我将会把程序放出来拱大家使用,我准备分三季来实现,APP后台部署在阿里小程序云,通过阿里云MQTT消息队列服务,来完成指令控制,并实现事件日志机制。

第一季实现小车的控制目标

1、实现小车4驱控制

2、实现摄像头实时查看,借助反向代理来完成内外网的通信

3、实现指令通过阿里云微消息队列MQTT来交互

4、设计APP端的控制界面实现

第二季实现目标

1、实现摄头云端控制

2、人脸检测

3、打包容器

4、热体红外+超声波测距+湿度温度

第三季实现目标

思考中。。

第一季开发准备

硬件

  • 树莓派3b+
  • 小车底座
  • L298N电机驱动模块
  • 杜邦线
  • 充电宝
  • 6v~50V电源
  • 树莓派专用摄像头 Raspberry Pi Camera

软件

  • 阿里小程序云应用(阿里云小程序繁星计划,目前可以免费申请体验)
  • MJPG-Streamer
  • frp
  • 阿里云微消息队列MQTT

硬件连接

整体效果

  1. 树莓派上电,将充电宝用usb线将树莓派于其连接,可看到树莓派红色指示灯常亮,绿色指示灯闪烁。如果发现红色指示灯忽然熄灭或者亮点很低,请检查充电宝输出电压以及电流是否太低
  2. 插入树莓派摄像头,注意不要插反,排线金属侧正对插排口金属侧,插入后扣紧排口

  1. gpio与电机驱动模块in口连接。这边我们选择GPIO5、GPIO6、GPIO12、GPIO13、GPIO19、GPIO16、GPIO26、GPIO20 (GIPIO与针脚值不一致,对应针脚位置请参考下图,针脚39,40的位置在USB口旁边) 与驱动模块的IN1~IN8连接 (连接顺序请自行调整,驱动模块IN1的数字量输入控制OUT1输出,OUT1-OUT2如果连接同一个电机的输入和输出端,那么IN1-IN2对应输入数字信号[1,0]则代表前进,[0,1]代表后退,[0,0]或者[1,1]代表停止,以此类推IN1~IN8,OUT1~OUT8)

环境部署

阿里云应用

云应用是面向小程序应用场景,为开发者提供的一键构建后端应用运行环境、后端服务部署、运维监控等能力的一站式小程序部署服务。

我们需要申请一个云应用充当小程序的服务器以及fpc服务器。现在阿里推出繁星计划,可以免费申请2个月的测试环境以及一个月的生产环境,无需申请,直接在应用界面新建新运用,创建详情请参考文档

在控制台获取服务器ip用户名(默认root)、密码(需要修改默认密码,然后重启服务器),通过SSH工具连接,用于部署下面步骤

MJPG-Streamer

MJPG-Streamer是一个命令行应用程序,它将JPEG帧从一个或多个输入插件复制到多个输出插件。它可用于通过基于IP的网络将JPEG文件从网络摄像头流式传输到各种类型的查看器,如Chrome,Firefox,Cambozola,VLC,mplayer和其他能够接收MJPG流的软件。

  1. 开启树莓派摄像头
  2. 树莓派摄像头总线是默认没开启的,请在命令行中开启,进入后,选择camera项,再选择enable,然后重启
sudo raspi-config
  1. 安装必要的库

sudo apt-get update

sudo apt-get install subversion

sudo apt-get install libjpeg8-dev

sudo apt-get install imagemagick

sudo apt-get install libv4l-dev

sudo apt-get install cmake

sudo apt-get install git

  1. git开源的project到本地,编译

sudo git clone https://github.com/jacksonliam/mjpg-streamer.git

cd mjpg-streamer/mjpg-streamer-experimental

make all

sudo make install

  1. 解决V4L driver不支持的问题
sudo wget http://www.linux-projects.org/listing/uv4l_repo/lrkey.asc &&
sudo apt-key add ./lrkey.asc

修改sources.list,在末尾添加源,并安装uv4l uv4l-raspicam,然后重启

sudo nano /etc/apt/sources.list

#末尾添加,保存

deb http://www.linux-projects.org/listing/uv4l_repo/raspbian/ wheezy main

sudo apt-get update

sudo apt-get install uv4l uv4l-raspicam

sudo reboot

重启之后:

sudo pkill uv4l
sudo apt-get update
sudo apt-get install uv4l-uvc
sudo apt-get install uv4l-xscreen
sudo apt-get install uv4l-mjpegstream
sudo reboot

再一次重启之后开启视频流服务

sudo modprobe bcm2835-v4l2
./mjpg_streamer -i "./input_uvc.so -d /dev/video0 -n -y -f 25 -r 640x480" -o "./output_http.so -n -w /usr/local/www"

然后打开浏览器输入:http://raspberry-ip-address:8080/?action=stream

应该就可以看到Raspberry Pi Camera采集的动态视频了,延迟大概不超过0.8秒吧。

frp

frp是一个快速反向代理,可帮助您将NAT或防火墙后面的本地服务器暴露给Internet。截至目前,它支持tcp&udp以及http和https协议,其中请求可以通过域名转发到内部服务。

  1. 服务端部署 frps
  2. 在购买的服务端(有公网IP)部署frps,用于穿透树莓派本地的视频流

wget --no-check-certificate https://raw.githubusercontent.com/clangcn/onekey-install-shell/master/frps/install-frps.sh -O ./install-frps.sh

chmod 700

./install-frps.sh

./install-frps.sh install

然后一直回车(默认配置),知道全部安装完成。安装成功截图

  1. 启动frps

frps start

查看frps版本号

frps -v

我这边安装的是version 0.20.0,客户端也要安装对应版本的

3. 树莓派部署frpc

由于我们服务器部署frps的版本是version 0.20.0,所以我们本地也要部署相同的版本

wget https://github.com/fatedier/frp/releases/download/v0.20.0/frp_0.20.0_linux_arm.tar.gz
tar zxvf frp_0.20.1_linux_arm.tar.gz
cd frp_0.14.1_linux_arm
vi frpc.ini

修改 frpc.ini 文件

# frpc.ini
[common]
#服务器IP
server_addr = x.x.x.x
#服务器fpcs服务对应端口Bind port
server_port = 5443 
#服务端token
oken = 你的服务端token
[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6000
#[]内名称不能重复,标签作用
[web_raspberry_web]
type = http
#端口号 对应本机视频web服务器的端口
local_port = 8080
#配置穿透外网访问域名,可设置多个
custom_domains = raspberry.你的域名.com

修改好frpc.ini后,启动frpc客户端。如果想在后台运行,可在命令后加 &

./frpc -c frpc.ini 

申请域名解析

将你的的域名主机记录 raspberry A 记录解析到你的服务器IP x.x.x.x

服务器部署 Nginx

Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。

Ubuntu16.04安装及配置nginx

  1. 安装gcc g++的依赖库

apt-get install build-essential

apt-get install libtool

  1. 安装pcre依赖库
sudo apt-get update
sudo apt-get install libpcre3 libpcre3-dev
  1. 安装zlib依赖库

apt-get install zlib1g-dev

4.安装ssl依赖库

apt-get install openssl

安装nginx

#下载最新版本:
wget http://nginx.org/download/nginx-1.16.0.tar.gz
#解压:
tar -zxvf nginx-1.11.3.tar.gz
#进入解压目录:
cd nginx-1.11.3
#配置:
./configure --prefix=/usr/local/nginx 
#编辑nginx:
make
注意:这里可能会报错,提示“pcre.h No such file or directory”,具体详见:http://stackoverflow.com/questions/22555561/error-building-fatal-error-pcre-h-no-such-file-or-directory
需要安装 libpcre3-dev,命令为:sudo apt-get install libpcre3-dev
#安装nginx:
sudo make install
#启动nginx:
sudo /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
注意:-c 指定配置文件的路径,不加的话,nginx会自动加载默认路径的配置文件,可以通过 -h查看帮助命令。
#查看nginx进程:
ps -ef|grep nginx

在浏览器输入 http://raspberry.你的域名.com:8080

出现页面则nginx部署成功

配置测试页面

新建一个index.html文件,用于测试页面,内容如下

<html>

<head>

<meta name="generator"

content="HTML Tidy for HTML5 (experimental) for Windows https://github.com/w3c/tidy-html5/tree/c63cc39" />

<meta http-equiv="Content-Type" content="text/html;" charset="UTF-8" />

<meta name="viewport"

content="width=device-width, initial-scale=1.0, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0" />

<meta http-equiv="refresh" content="3" />

<title>树莓派实时监控站</title>

</head>

<body>

<center>

<font size="20" face="微软雅黑" color="#0074CD">

<b>树莓派<br>

实时监控站</b>

</font>

<hr />

<iframe src="http://raspberry.gkiiot.com:8080/?action=stream" scrolling=no width="320" height="240"> </iframe> <!--修改此处-->

<br />

<p>

<font size="5" color="#269C5D">

<b>Design by James</b>

</font>

</p>

<p>

<font size="5" color="#269C5D">

<i>a Web Monitoring Based on Raspberry Pi</i>

</font>

</p>

</center>

</body>

</html>

将该文件替换在nginx配置的web路径的index.html文件,例如/var/www/index.html

在浏览器输入 http://raspberry.你的域名.com:8080

尝试一下能否访问,如果成功出现树莓派实时监控页面,则web页面部署成功

阿里云微消息队列MQTT

微消息队列 MQTT 是阿里云推出的一款面向移动互联网以及物联网领域的轻量级消息中间件,针对移动互联网以及物联网 IoT 场景的消息传输特点,支持了包括 MQTT、STOMP、GB-808、新能源国标等主流通信协议

  1. 创建服务
  2. 打开MQTT控制台,需要登录阿里云账号,若没账号请自行申请。登录后请根据阿里云mqtt说明书创建mqtt服务。创建完毕后如下图,主要用到参数有 实例id公网接入点消息存储实例TopicGroup

海创物联开发平台部署

海创开发平台是海创科技有限公司开发的一款快速编程平台,该平台开发的组件能快速与PLC、GPIO、各式设备进行通讯,有丰富的API支持,基本你们想到的事情它都能干,非常适合做物联网的网关控制中心

  1. 导入程序
  2. 打开海创物联开发平台的控制页 http://树莓派ip:1880/#flow/fd2b8cdb.5b63b
  3. 复制以下代码,打开开发平台,点击右上角菜单,选择导入-剪切板,然后粘贴保存,即可看到工作区新增了一个新的流程,该流程用于接受MQTT命令控制小车
[{"id":"9e9c968e.24e348","type":"rpi-gpio out","z":"d99269c6.a2d0b8","name":"","pin":"29","set":true,"level":"0","freq":"","out":"out","x":720,"y":140,"wires":[]},{"id":"37f46ac8.666436","type":"rpi-gpio out","z":"d99269c6.a2d0b8","name":"","pin":"31","set":true,"level":"0","freq":"","out":"out","x":720,"y":180,"wires":[]},{"id":"5f130d8f.f55d84","type":"function","z":"d99269c6.a2d0b8","name":"控制","func":"switch(msg.payload)\n{\n case '0':return [{payload:0},{payload:0},{payload:0},{payload:0},{payload:0},{payload:0},{payload:0},{payload:0}];\n case '1':return [{payload:0},{payload:1},{payload:0},{payload:1},{payload:0},{payload:1},{payload:0},{payload:1}];\n case '2':return [{payload:1},{payload:0},{payload:1},{payload:0},{payload:1},{payload:0},{payload:1},{payload:0}];\n case '4':return [{payload:0},{payload:0},{payload:0},{payload:0},{payload:1},{payload:0},{payload:1},{payload:0}];\n case '3':return [{payload:1},{payload:0},{payload:1},{payload:0},{payload:0},{payload:0},{payload:0},{payload:0}];\n}\n","outputs":8,"noerr":0,"x":510,"y":320,"wires":[["9e9c968e.24e348","676a7be6.b97e14"],["37f46ac8.666436","676a7be6.b97e14"],["2e8cc1ec.6369ce","676a7be6.b97e14"],["c7700a0b.47b378","676a7be6.b97e14"],["676a7be6.b97e14","482e8885.76d548"],["676a7be6.b97e14","62b4d0fc.a93f3"],["676a7be6.b97e14","fd3c406.31fc4c"],["676a7be6.b97e14","6ac88490.ba21bc"]]},{"id":"2e8cc1ec.6369ce","type":"rpi-gpio out","z":"d99269c6.a2d0b8","name":"","pin":"32","set":true,"level":"0","freq":"","out":"out","x":720,"y":240,"wires":[]},{"id":"c7700a0b.47b378","type":"rpi-gpio out","z":"d99269c6.a2d0b8","name":"","pin":"33","set":true,"level":"0","freq":"","out":"out","x":720,"y":280,"wires":[]},{"id":"8e757771.a599e8","type":"inject","z":"d99269c6.a2d0b8","name":"","topic":"停止","payload":"0","payloadType":"str","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":250,"y":260,"wires":[["5f130d8f.f55d84"]]},{"id":"89e33a84.467878","type":"inject","z":"d99269c6.a2d0b8","name":"","topic":"前进","payload":"1","payloadType":"str","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":250,"y":320,"wires":[["5f130d8f.f55d84"]]},{"id":"e521ba16.452cc8","type":"inject","z":"d99269c6.a2d0b8","name":"","topic":"后退","payload":"2","payloadType":"str","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":250,"y":380,"wires":[["5f130d8f.f55d84"]]},{"id":"676a7be6.b97e14","type":"debug","z":"d99269c6.a2d0b8","name":"","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":750,"y":580,"wires":[]},{"id":"482e8885.76d548","type":"rpi-gpio out","z":"d99269c6.a2d0b8","name":"","pin":"35","set":true,"level":"0","freq":"","out":"out","x":720,"y":340,"wires":[]},{"id":"62b4d0fc.a93f3","type":"rpi-gpio out","z":"d99269c6.a2d0b8","name":"","pin":"36","set":true,"level":"0","freq":"","out":"out","x":720,"y":380,"wires":[]},{"id":"fd3c406.31fc4c","type":"rpi-gpio out","z":"d99269c6.a2d0b8","name":"","pin":"37","set":true,"level":"0","freq":"","out":"out","x":720,"y":440,"wires":[]},{"id":"6ac88490.ba21bc","type":"rpi-gpio out","z":"d99269c6.a2d0b8","name":"","pin":"38","set":true,"level":"0","freq":"","out":"out","x":720,"y":480,"wires":[]},{"id":"6473261a.673168","type":"inject","z":"d99269c6.a2d0b8","name":"","topic":"左转","payload":"3","payloadType":"str","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":250,"y":440,"wires":[["5f130d8f.f55d84"]]},{"id":"73eb851c.b88ddc","type":"inject","z":"d99269c6.a2d0b8","name":"","topic":"右转","payload":"4","payloadType":"str","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":250,"y":480,"wires":[["5f130d8f.f55d84"]]},{"id":"bf85c267.64f96","type":"mqtt in","z":"d99269c6.a2d0b8","name":"","topic":"","qos":"2","broker":"bf40108b.620c2","x":235,"y":160,"wires":[["5f130d8f.f55d84","8a1c007d.34912"]]},{"id":"8a1c007d.34912","type":"debug","z":"d99269c6.a2d0b8","name":"","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":435,"y":180,"wires":[]},{"id":"c1f327d8.b01818","type":"inject","z":"d99269c6.a2d0b8","name":"","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":240,"y":40,"wires":[["c4d9812a.7b54b"]]},{"id":"c4d9812a.7b54b","type":"mqtt out","z":"d99269c6.a2d0b8","name":"","topic":"","qos":"","retain":"","x":415,"y":40,"wires":[]},{"id":"bf40108b.620c2","type":"mqtt-broker","z":"","name":"","broker":"","port":"1883","clientid":"","usetls":false,"compatmode":true,"keepalive":"60","cleansession":true,"birthTopic":"","birthQos":"0","birthPayload":"","closeTopic":"","closeQos":"0","closePayload":"","willTopic":"","willQos":"0","willPayload":""}]

导入后效果如下

2. 修改节点属性

导入的流程不能直接使用,需要修改一些节点属性配置。

双击mqtt out节点,在属性窗点击服务器右侧的那个小标签按钮进入mqtt服务配置。填好服务器(阿里mqtt实例的外网http接入点)、端口号(默认1883)、客户端id("Group ID@@@任意id" 客户端ID在每个实例每个主题中只能唯一,重复情况下后面连接的自动被阿里断开)、用户名(这边我们使用的是签名鉴权模式,Token鉴权模式参考文档"Signature|Access Key|实例 ID")、密码(参考阿里的签名机制,快捷生成签名请点击签名校验),点击保存返回mqtt属性配置页,填写主题(阿里的Topic ID),QOS选择1(至少上传一次)。mqtt in节点类似,由于接受消息是用于控制小车,所以QOS选择2(仅分发一次),以下是配置详情

PIN控制着电机驱动模块从而控制小车的动作,前进(四个轮子前进)、后退(四个轮子后退)、左转(右侧轮子转)、右转(左侧轮子转)。假设相邻的两个OUT口连接一个电机,那么驱动模块的控制逻辑为

IN1IN2~数字信号10电机前进数字信号01电机后退数字信号00电机停止数字信号11电机停止

根据该逻辑配置function节点(示例已包含,请根据自己的接法设置GPIO口的信号输出)

  1. 部署调试
  2. 点击菜单栏的部署按钮对程序部署,程序正式运行
  3. 单击定时器后mqtt out节点会将测试使用的时间戳上传到阿里的mqtt服务器,然后mqtt in会订阅接受到该消息,并在右侧调试窗口输出。正式使用数据请输入0、1、2、3
  4. 使用mqtt发送正式消息,操作结果

ublime Text 3是一个轻量级的跨平台文字编辑器,一经面世便被认为是一个杰出的编辑器,而它真正的强大之处在于你可以使用 Package Control 来增加它的功能以及可以进行各种自定义设置。 本文译自realpython.com的一篇教程,可以让你快速地将ST3改造成Python开发环境。——EarlGrey@编程派

在本文章中,我们将会看到如何将 Sublime Text 打造成为 Python 的全栈开发环境(从前端到后端),如何通过自定义主题和插件来增强它的基本功能,并且还将会涉及到很多使 ST3 变得更加强大的常用的命令,特性以及快捷键。

本教程将假定你使用的是 Mac 电脑并且习惯于使用终端。如果你使用的是 Windows 或者 Linux 操作系统,本文涉及到的一些命令将有可能会有所不同,但是你应该仍然可以很容易地通过 Google 来获取到与本教程相关的解答。

特性

让我们从 ST3 的一些默认特性开始着手吧…

Split Layouts

允许你将你的许多文件放到很多分割开来的视窗中。如果你正在进行以测试为目的的开发(将 Python 代码放在一个视窗中,而测试脚本放在另一个视窗中)或者正在进行前端开发(将 HTML 代码放在一个视窗里,CSS/Javascript 代码放在另一个视窗里)的时候将会非常有用。

Vintage Mode

让你能够在 ST3 中使用 vi 模式。

Chrome-like Tabs

让你在多个文件中切换变得更加方便。

Automatic loading of the last session

帮你自动打开你上次关闭的时候编辑器中所有打开的文件。我总是一直开着 ST3,而且其中打开着一大堆项目——当我重启电脑以后, 它能够自动帮我打开所有的这些文件和文件夹。

Code Snippets

允许你通过一两个简单的关键字就能写出一段常用的代码片(Snippets),从而增加你的生产效率。比如,你只需要打开一个文件,输入 “lorem” 然后敲击 tab 键,就会自动生成一段乱数假文(译者注: 一种用于测试文章或文字在不同字型、版型下看起来的效果等的文字)。又比如在 Python 代码中,你可以输入 “defs” 然后敲击 tab 键,你就能得到一段通用的函数定义。

同时,你还可以点击 Tools > New Snippet 来创建属于你自己的代码片。请参照这个 文档来获取帮助,也可以在 这里 查看我个人用到的一些 snippets。

自定义 Sublime Text 3

在你下载完 ST3 以后…

在命令行中添加 subl 命令

就像 TextMate 的 mate 命令一样,Sublime Text 拥有一个叫做 subl 的命令行工具,可以用来通过终端打开一个文件或者一整个文件夹。

你需要建立一个指向 subl 二进制文件的符号链接来使 subl 命令有效:

$ sudo ln -s /Applications/Sublime\ Text.app/Contents/SharedSupport/bin/subl /usr/bin/subl

尝试使用以下命令来打开 Sublime 来确保链接生效了:

$ subl

如果以上命令没有效果,你可能需要将 /bin 添加到你的环境变量中:

$ echo "export PATH=~/bin:$PATH" >> ~/.profile

然后重新尝试第一步。

现在你就可以通过下述命令来打开文件或者文件夹了:

# open the current directory

$ subl .# open a directory called tests

$ subl ~/Documents/test# open a file called text.txt

$ subl test.txt

如果路径中含有空格,你必须使用双引号将路径括起来:

$ subl "~/Documents/test/my test file.txt"

想要查询所有可用的命令,请打开帮助文件:

$ subl --help

安装 Package Control

为了使用众多的插件来扩展 Sublime 的功能,你需要安装一个叫做 Package Control 的插件管理器——这个东西你必须要手动安装。但是一旦你安装好了以后,你就可以使用 Package Control 来安装,移除或者升级所有的 ST3 插件了。

  1. 从 Sublime Text 3 官方获取用于安装的代码。依次点击 View > Show Console 打开 ST3 的控制台。在控制台中粘贴刚才的代码,然后点击回车。最后重启 ST3。

  2. 现在你可以通过快捷键 cmd+shift+P 打开 Package Control 来安装其他的插件了。输入 install 然后你就能看见屏幕上出现了 Package Control: Install Package,点击回车然后搜索你想要的插件。

  3. 其他一些相关命令如下:

  • List Packages 显示所有已安装的插件

  • Remove Packages 移除一个指定的插件

  • Upgrade Package 更新一个指定的插件

  • Upgrade/Overwrite All Packages 更新所有已安装的插件

创建自定义配置文件

你可以通过一个基于 JSON 的配置文件来充分的自定义 Sublime Text,这使得转移或者同步你的自定义文件到另一个系统变得非常容易。首先,我们需要新建我们自己的配置文件。我们最好是为不同的系统环境和编程语言各自创建一个配置文件。

依次点击 Sublime Text > Preferences > Settings – User 来创建一个配置文件。在该文件中添加一个空的 JSON 类然后就可以在其中写入你的配置内容了。如下所示:

{ // base settings

"auto_complete": false,

"sublimelinter": false,

"tab_size": 2,

"word_wrap": true

}

  1. 如果想为特定的编程语言新建配置文件的话,请点击 Sublime Text > Preferences > Settings – More > Syntax Specific – User。然后按照 LANGUAGE.sublime-settings 的格式保存该配置文件。例如想新建一个 Python 专用的配置文件,请将该文件保存为 Python.sublime-settings。

  2. 你完全可以按照你自己的喜好来进行各项配置;不过我强烈推荐以我的这份 配置文件 以及 Python 配置 作为基础,然后修改成你所需要的内容。

  3. 一个可选项: 你可以使用 Dropbox 来同步你的所有配置。你只需要将你的配置文件上传到 Dropbox 然后就可以将你的配置同步到你的任意一台设备上了。

  4. 你可以在 Sublime Text Unofficial Documentation 找到一些非常好的参考配置。


主题

ST3 为你提供了完全自定义化一个适合自己主题的能力。当然,你如果不是那么的挑剔的话,你可以通过 Package Control 从许许多多的由 Sublime 社区设计的 主题 中下载一个。 在下载之前你可以通过 ColorSublime 来预览这些主题。

广受欢迎的的 Soda Dark 和极简风格的 Flatland 是我个人最喜欢的两个主题。

在安装完了主题以后, 请务必更新你的配置文件. Sublime Text > Preferences > Settings – User:

{

"theme": "Flatland Dark.sublime-theme",

"color_scheme": "Packages/Theme - Flatland/Flatland Dark.tmTheme"

}

插件

除了那些主题以外,我还会使用以下这一些插件来提升我的工作效率。

SideBarEnhancements

SideBarEnhancements 扩展了侧边栏中菜单选项的数量,从而提升你的工作效率。诸如”New file” 和 “Duplicate” 这样的选项对于 ST3 来说实在是太重要了, 我甚至觉得 ST3 本来就应该提供这些功能。而且仅凭 “Delete” 这一个功能就让这个插件值得下载。这个功能将你会在你删除文件的时候把它放入回收站。虽然这个功能乍一看没什么用,但是当你没有使用这样的功能而彻底删除了一个文件的时候,除非你用了版本管理软件,否则你将很难恢复这个文件。

现在就下载吧!

Anaconda

Anaconda 是一个终极 Python 插件。它为 ST3 增添了多项 IDE 类似的功能,例如:

  1. Autocompletion

    自动完成,该选项默认开启,同时提供多种配置选项。

  2. Code linting

    使用支持 pep8 标准的 PyLint 或者 PyFlakes。因为我个人使用的是另外的 linting 工具,所以我会在 Anaconda 的配置文件 Anaconda.sublime-settings中将 linting 完全禁用。操作如下: Sublime > Preferences > Package Settings > Anaconda > Settings – User: {"anaconda_linting": false}

  3. McCabe code complexity checker

    让你可以在特定的文件中使用 McCabe complexity checker. 如果你对软件复杂度检查工具不太熟悉的话,请务必先浏览上边的链接。

  4. Goto Definitions

    能够在你的整个工程中查找并且显示任意一个变量,函数,或者类的定义。

  5. Find Usage

    能够快速的查找某个变量,函数或者类在某个特定文件中的什么地方被使用了。

  6. Show Documentation

  7. 能够显示一个函数或者类的说明性字符串(当然,是在定义了字符串的情况下)

你可以通过 ST3 的 Package Settings: Sublime Text > Preferences > Package Settings > Anaconda > README 来查看所有这些特性。

SublimeCodeIntel 是另外一个非常流行的插件,它的许多特性与 Anaconda 类似。我建议同时也试试它。

Djaneiro

Djaneiro 支持 Django 模版和关键字高亮以及许多实用的代码片(snippets)功能。其中的 snippets 绝对是省时神器。你可以通过很少几个关键字就能创建许多常见的 Django 代码块比如 templates,models,forms,以及 views。请查看官方文档获取 snippets 列表。

我个人非常喜欢的以下两个用于创建 template 的代码片:输入 var 就可以新建 {{ }},而输入 tag 就能新建 {% %}。

requirementstxt

Requirementstxt 可以为你的 requirements.txt 文件提供自动补全,语法高亮以及版本管理功能。

SublimeLinter

SublimeLinter 是 ST3 的一个代码静态检查工具框架(linter)。这个插件本身来说并不包含任何的一个 linter,但是你可以通过在 Package Control 中输入 SublimeLinter-[linter_name] 的方式来安装一个 linter。你可以点击这里查看官方的 linter。同时你还可以在 Package Control 中查看到许多的第三方 linter。请点击这里查看安装说明。

对于 Python 的代码静态检查器,我建议使用 SublimeLinter-pyflakes 和 SublimeLinter-pep8。

与此同时,我也会使用 SublimeLinter-jshint, SublimeLinter-pyyaml, SublimeLinter-csslint,SublimeLinter-html-tidy,以及 SublimeLinter-json。

以上大多数的 linter 都需要先安装一些依赖库才能使用,所以在安装前请务必阅读他们的安装说明。

你可以通过修改用户自定义的 SublimeLinter.sublime-settings 文件来对你的每个 linter 个性化:Sublime Text > Preferences > Package Settings > SublimeLinter > Settings – User。 例如我通过以下代码来忽略 pep8 中的错误和警告:

"pep8":

{

"@disable": false,

"args": ,

"excludes": ,

"ignore": "E501,C0301,W0142,W0402,R0201,E1101,E1102,C0103,R0901,R0903,R0904,C1001,W0223,W0232,W0201,E1103,R0801,C0111",

"max-line-length": 100,

"select": ""

},

GitGutter

GitGutter 让 ST3 能在左边栏的位置显示一个小图标,用以表示在最后一次提交以后,代码是否有追加,修改或者删除。

FTPSync

FTPSync 能够将你的项目和远程文件进行同步。你只需要打开文件便可以下载更新(如果你的远端文件比本地更加新的话),而且如果你对本地文件做出了修改可以立即同步到远程服务器。这是非常棒的同步本地文件和远程文件的方法。你可以通过以下的方法来添加你的远程服务器:Sublime Text > Preferences > Package Settings > FTPSync > Setup FTPSync.

Sample settings:

{ 'primary': { host: 'ftp.mywebsite.com', username: 'johnsmith', password: 'secretpassword', path: '/www/', upload_on_save: true, tls: true }}

我个人喜欢把密码设为 因为我不想让我的密码出现在配置文件中。这样 FTPSync 会在我每次保存完文件后要求我输入密码。

AdvancedNewFile

AdvancedNewFile 可以让你在 ST3 中使用简单的几个快捷键便创建一个新的文件夹或者一个新的文件:

你只需要通过几个快捷键便可以打开 AdvancedNewFile 的输入框。然后输入路径和文件名。当你按下回车键后,文件便被创建了。除此之外,如果目标文件夹并不存在的话,该文件夹将会被自动建立。在默认情况下,你创建的文件的路径将会显示在状态栏中。

请查看 Github 上的这篇文档来获取更为详细的使用说明。特别建议请详细阅读TAB自动补全(Tab Completion)以及预定义别名(Predefined Aliases)部分。

我把“cmd+n”设置为了通过 AdvancedNewFile 创建新文件的快捷方式。该快捷键可以通过修改 Key Bindings – User file 来实现 Sublime Text > Preferences > Package Settings > AdvancedNewFile > Key Bindings – User:

[

{ "keys": ["cmd+n"],

"command": "advanced_new_file_new"

} ]

你也可以更改默认打开的文件夹路径:Sublime Text > Preferences > Package Settings > AdvancedNewFile > Settings – User

{"default_initial": "/Users/michaelherman/Documents/repos"}

这样我创建新文件的时候,/Users/michaelherman/Documents/repos将会自动被添加到路径最前方,因为99%的情况下我都会把我的脚本放在这个路径下。

Emmet

Emmet,以前叫做 Zen Coding,让你可以通过简单的缩写来创建 HTML 或者 CSS 的代码块。

例如,你只需要输入感叹号!,然后按下 tab 键,便可以在一个 HTML 文件中创建一段带有几个基本标签的 HTML5 文档类型的代码:

<!doctype html>

<html lang="en">

<head>

<meta charset="UTF-8">

<title>Document</title>

</head>

<body>

</body>

</html>

Markdown Preview

Markdown Preview 可以用来预览和编译 markdown 文件。

你可以打开 Package Manager 然后输入 Markdown Preview 来查看可用的命令:

  1. Markdown Preview: Python Mrakdown: 在浏览器中预览

  2. Markdown Preview: Python Mrakdown: 导出 HTML 文件

  3. Markdown Preview: Python Mrakdown: 拷贝到剪贴板

  4. Markdown Preview: Github风格Markdown: 在浏览器中预览

  5. Markdown Preview: Github风格Markdown: 导出 HTML 文件

  6. Markdown Preview: Github风格Markdown: 拷贝到剪贴板

  7. Markdown Preview: 打开Markdown速查手册

一旦你完成转换,你之后的所有保存都会立即反映到转换的文件中。

快捷键

  1. 跳转到任意内容 (“cmd+p”) 用来快速查找和打开文件。你仅仅只需要工程中文件的一部分路径或者文件名你就可以很容易的打开这个文件。这在一个大型的 Django 工程中显得非常方便。

  2. 跳转到指定行 (“ctrl+g”) 让你在当前文件中跳转到指定行数。

  3. 跳转到标志 (“cmd+r”) 可以列出当前文件中所有的函数或者类,让你更方便查找。你可以通过输入关键字来查找你所需要的函数或者类。

  4. 跳转到行首 (cmd+left-arrow-key) 与 跳转到行尾 (cmd+right-arrow-key)

  5. 删除当前行(ctrl+shift+k)

  6. 多重编辑 是我迄今为止最喜欢的快捷键

    6.1:选定一个单词,点击 “cmd+d”来选择同样的单词,再次点击 “cmd+d”*继续选择下一个单词…

    6.2:或者 “cmd+单击”来指定多个你想要同时修改的地方。

  7. 块编辑 (option+left-mouse-click) 用于选择一整块的内容。通常在整理 CSV 文件的时候用于删除空白内容。

自定义命令

你可以很容易地使用 Python 来编辑你自己的自定义命令和快捷键组合。目前我个人使用的有以下这些:

  1. 拷贝当前文件路径到剪贴板 – 链接

  2. 关闭除当前活动标签页以外的所有其他标签页 – 链接

通过文件选项打开你的 Package 文件夹(Sublime > Preferences > Browse Packages),然后打开 User 文件夹,接下来将上述的 Python 文件添加到 “/Sublime Text 3/Packages/User” 文件夹中。

最后请在 Key Bindings – User file (Sublime Text > Preferences > Package Settings > AdvancedNewFile > Key Bindings – User) 文件中完成快捷键绑定。

[ // Copy file name

{

"keys": ["cmd+shift+c"],

"command": "copy_path_to_clipboard"

}, // Close all other tabs

{

"keys": ["cmd+alt+w"],

"command": "close_tabs"

}

]

(有删减)

译文地址:http://python.jobbole.com/81312/

译者:伯乐在线 - Lane

印度小伙写了套深度学习教程,Github上星标已经5000+

上百个数据文件合并,只能手动复制粘贴?教你一招十秒搞定!

一个提升图像识别准确率的精妙技巧

一文读懂:从 Python 打包到 CLI 工具

如何使用 Python 进行时间序列预测?

美亚Kindle排名第一的Python 3入门书,火遍了整个编程圈

十分钟搭建私有 Jupyter Notebook 服务器

使用 Python 制作属于自己的 PDF 电子书

12步轻松搞定Python装饰器

200 行代码实现 2048 游戏

你喜欢用什么编辑器码Python?

欢迎留言和我们分享

如果觉得文章对你有所帮助,欢迎点赞并且推荐给你的好友。