0%

原文:《Shell脚本编程30分钟入门

首先要安装一个wget插件

1
2
3
yum install -y wget
yum install -y setup
yum install -y perl

一、Shell脚本

1. 脚本示例

1
2
3
4
5
6
7
8
#!/bin/sh
cd ~
mkdir shell_tut
cd shell_tut

for ((i=0; i<10; i++)); do
touch test_$i.txt
done

2. 代码解释

  • 第1行:指定脚本解释器,这里是用/bin/sh做解释器的
  • 第2行:切换到当前用户的home目录
  • 第3行:创建一个目录shell_tut
  • 第4行:切换到shell_tut目录
  • 第6行:循环条件,一共循环10次
  • 第7行:创建一个test_0…9.txt文件
  • 第8行:循环体结束

mkdir, touch都是系统自带的程序,一般在/bin或者/usr/bin目录下。for, do, done是sh脚本语言的关键字。

二、Shell相关概念

1. 基础概念

shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务,Windows Explorer是一个典型的图形界面Shell。

shell脚本 ,shell script,是一种为shell编写的脚本程序。业界所说的shell通常都是指shell脚本。shell和shell script是两个不同的概念。由于习惯的原因,简洁起见,本文出现的“shell编程”都是指shell脚本编程,不是指开发shell自身(如Windows Explorer扩展开发)。

sh命令 是shell命令语言解释器,执行命令从标准输入读取或从一个文件中读取。通过用户输入命令,和内核进行沟通。

2. Shell类型

如果要查看某一个用户使用的是什么 shell 可以通过 finger [USERNAME]命令来查看。 (kt)sh,Ken Thompson Shell,历史上第一个Unix shell,1971年由肯·汤普逊写作出第一版并加入UNIX之中。它是一个简单的命令行解释器,但不能被用来运行 指令稿(Shell script)。它的许多特征影响了以后命令行界面的发展。至Version 7 Unix之后,被Bourne shell取代。

sh,Bourne Shell,是Version 7 Unix默认的Unix shell,替代执行文件同为.sh的Thompson shell。

bash ,Bourne Again Shell,Unix shell的一种,在1987年由布莱恩·福克斯为了GNU计划而编写,与Bourne Shell兼容,还继承了C Shell、Korn Shell等优点。

zsh, Z shell是一款可用作交互式登录的shell及脚本编写的命令解释器。Zsh对Bourne shell做出了大量改进,同时加入了Bash、ksh及tcsh的某些功能。

3. Shell模式

3.1 login shell 和 no-login shell

login shell 代表用户登入, 比如使用 su - 命令, 或者用 ssh 连接到某一个服务器上, 都会使用该用户默认 shell 启动 login shell 模式。

该模式下的 shell 会去自动执行 /etc/profile~/.profile 文件, 但不会执行任何的 bashrc 文件, 所以一般在 /etc/profile 或者 ~/.profile 里我们会手动去 source bashrc 文件。

no-login shell 的情况是我们在终端下直接输入 bash 或者 bash -c “CMD” 来启动的 shell。

该模式下是不会自动去运行任何的 profile 文件。

3.2 interactive shell 和 non-interactive shell

interactive shell 是交互式shell, 顾名思义就是用来和用户交互的, 提供了命令提示符可以输入命令。

该模式下会存在一个叫 PS1 的环境变量, 如果还不是 login shell 的则会去 source /etc/bash.bashrc~/.bashrc 文件。

non-interactive shell 则一般是通过 bash -c “CMD” 来执行的bash。

该模式下不会执行任何的 rc 文件 (不过还存在一种特殊情况这个我之后详细讲述)

4. profile和bashrc

profile用于交互式login shell,bashrc用于交互式non-login shell。系统中存在许多bashrc和profile文件。 /etc/profile~/.profile分别对应 所有用户单个用户(bashrc同理)。

4.1 profile

profile 是用户唯一的用来设置环境变量的地方, 因为用户可以有多个 shell 比如 bash, sh, zsh 之类的, 但像环境变量这种其实只需要在统一的一个地方初始化就可以了, 而这就是 profile。/etc/profile中设定的变量(全局)的可以作用于任何用户,profile文件是在用户登录的时候进行初始化的。

4.2 bashrc

bashrc 是专门用来给 bash 做初始化的比如用来初始化 bash 的设置, bash 的代码补全, bash 的别名, bash 的颜色. 以此类推也就还会有 shrc, zshrc 这样的文件存在了, 只是 bash 太常用了而已。~/.bashrc等中设定的变量(局部)只能继承/etc/profile中的变量,他们是"父子"关系。(此句话待考究!!!!)

三、环境

shell编程跟java、php编程一样,只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了。

1. OS

当前主流的操作系统都支持shell编程,本文档所述的shell编程是指Linux下的shell,讲的基本都是POSIX标准下的功能,所以,也适用于Unix及BSD(如Mac OS)。

Linux默认安装就带了shell解释器。Mac OS不仅带了sh、bash这两个最基础的解释器,还内置了ksh、csh、zsh等不常用的解释器。windows出厂时没有内置shell解释器,需要自行安装,为了同时能用grep, awk, curl等工具,最好装一个cygwin或者mingw来模拟linux环境。

2. 脚本解释器

2.1 sh

即Bourne shell,POSIX(Portable Operating System Interface)标准的shell解释器,它的二进制文件路径通常是/bin/sh,由Bell Labs开发。

本文讲的是sh,如果你使用其它语言用作shell编程,请自行参考相应语言的文档。

2.2 bash

Bash是Bourne shell的替代品,属GNU Project,二进制文件路径通常是/bin/bash。业界通常混用bash、sh、和shell,比如你会经常在招聘运维工程师的文案中见到:熟悉Linux Bash编程,精通Shell编程。

在CentOS里,/bin/sh是一个指向/bin/bash的符号链接:

1
2
3
4
[root@centosraw ~]# ls -l /bin/*sh
-rwxr-xr-x. 1 root root 903272 Feb 22 05:09 /bin/bash
-rwxr-xr-x. 1 root root 106216 Oct 17 2012 /bin/dash
lrwxrwxrwx. 1 root root 4 Mar 22 10:22 /bin/sh -> bash

但在Mac OS上不是,/bin/sh和/bin/bash是两个不同的文件,尽管它们的大小只相差100字节左右:

1
2
3
4
5
6
7
iMac:~ wuxiao$ ls -l /bin/*sh
-r-xr-xr-x 1 root wheel 1371648 6 Nov 16:52 /bin/bash
-rwxr-xr-x 2 root wheel 772992 6 Nov 16:52 /bin/csh
-r-xr-xr-x 1 root wheel 2180736 6 Nov 16:52 /bin/ksh
-r-xr-xr-x 1 root wheel 1371712 6 Nov 16:52 /bin/sh
-rwxr-xr-x 2 root wheel 772992 6 Nov 16:52 /bin/tcsh
-rwxr-xr-x 1 root wheel 1103984 6 Nov 16:52 /bin/zsh

2.3 高级编程语言

理论上讲,只要一门语言提供了解释器(而不仅是编译器),这门语言就可以胜任脚本编程,常见的解释型语言都是可以用作脚本编程的,如:Perl、Tcl、Python、PHP、Ruby。Perl是最老牌的脚本编程语言了,Python这些年也成了一些linux发行版的预置解释器。

编译型语言,只要有解释器,也可以用作脚本编程,如C shell是内置的(/bin/csh),Java有第三方解释器Jshell,Ada有收费的解释器AdaScript。

如下是一个PHP Shell Script示例(假设文件名叫test.php):

1
2
3
4
#!/usr/bin/php
<?php
for ($i=0; $i < 10; $i++)
echo $i . "\n";

执行:

1
/usr/bin/php test.php

或者:

1
2
chmod +x test.php
./test.php
chmod命令用来变更文件或目录的权限

四、选择Shell编程语言

1. 熟悉 vs 陌生

如果你已经掌握了一门编程语言(如PHP、Python、Java、JavaScript),建议你就直接使用这门语言编写脚本程序,虽然某些地方会有点啰嗦,但你能利用在这门语言领域里的经验(单元测试、单步调试、IDE、第三方类库)。

新增的学习成本很小,只要学会怎么使用shell解释器(Jshell、AdaScript)就可以了。 ## 2. 简单 vs 高级 如果你觉得自己熟悉的语言(如Java、C)写shell脚本实在太啰嗦,你只是想做一些备份文件、安装软件、下载数据之类的事情,学着使用sh,bash会是一个好主意。

shell只定义了一个非常简单的编程语言,所以,如果你的脚本程序复杂度较高,或者要操作的数据结构比较复杂,那么还是应该使用Python、Perl这样的脚本语言,或者是你本来就已经很擅长的高级语言。因为sh和bash在这方面很弱,比如说:

  • 它的函数只能返回字串,无法返回数组
  • 它不支持面向对象,你无法实现一些优雅的设计模式
  • 它是解释型的,一边解释一边执行,连PHP那种预编译都不是,如果你的脚本包含错误(例如调用了不存在的函数),只要没执行到这一行,就不会报错

3. 环境兼容性

如果你的脚本是提供给别的用户使用,使用sh或者bash,你的脚本将具有最好的环境兼容性,perl很早就是linux标配了,python这些年也成了一些linux发行版的标配,至于mac os,它默认安装了perl、python、ruby、php、java等主流编程语言。

五、 第一个Shell脚本

1. 编写

打开文本编辑器,新建一个文件,扩展名为.sh(sh代表shell),扩展名并不影响脚本执行,见名知意就好,如果你用php写shell 脚本,扩展名就用.php好了。

输入一些代码,第一行一般是这样:

1
2
#!/bin/bash
#!/usr/bin/php
“#!”是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行。

2. 运行

运行Shell脚本有两种方法: ### 2.1 作为可执行程序

1
2
chmod +x test.sh
./test.sh
注意 一定要写成./test.sh,而不是test.sh,运行其它 二进制的程序 也一样,直接写test.sh,linux系统会去PATH里寻找有没有叫test.sh的,而只有/bin, /sbin, /usr/bin,/usr/sbin等在PATH里,你的当前目录通常不在PATH里,所以写成test.sh是会找不到命令的,要用./test.sh告诉系统说,就在当前目录找。 ./表示当前目录。

通过这种方式运行bash脚本,第一行一定要写对,好让系统查找到正确的解释器。

这里的"系统",其实就是shell这个应用程序(想象一下Windows Explorer),但我故意写成系统,是方便理解,既然这个系统就是指shell,那么一个使用/bin/sh作为解释器的脚本是不是可以省去第一行呢?是的。

2.2 作为解释器参数

这种运行方式是,直接运行解释器,其参数就是shell脚本的文件名,如:

1
2
/bin/sh test.sh
/bin/php test.php
这种方式运行的脚本,不需要在第一行指定解释器信息,写了也没用。

参考链接

  1. chmod命令
  2. Thompson shell
  3. Bourne shell
  4. bash
  5. 理解 bashrc 和 profile

本文将直接摘抄和引用ESPRESSIF官网文档对ESP32 SDK配置的描述,并对具体执行步骤加一些自己的备注和注意事项。

本文中以Ubuntu为Linux系统的代表,在所有安装步骤apt-get install及涉及到其他读写cpmkdirrm的操作中,如遇到Permission denied等权限不够的问题,请在命令开头添加sudo或直接另起一行输入sudo -s,然后输入密码(有些命令不需要输入密码)获取 root 权限。

Eclipse的使用可以在三大平台上进行,但是用.bin文件烧录到开发板的过程目前仅在Windows平台找得到烧录工具,望悉知。

为方便描述,本文定义终端为MSYS2及Terminal的统称,XXXXX为你电脑的用户名,*为你的端口号数字。

本文分为三部分: - 工具及SDK的下载及配置 - 使用终端运行工程 - 使用Eclipse运行工程

一、工具及SDK的下载及配置

本节共有五部分: - 工具(MSYS2和Git) - ESP-IDF - Xtensa - 环境变量设置 - python依赖包

1. 工具

此部分在官方文档里面称为“设置工具链”。

1.1 MSYS2(for Windows only)

跟Git Bash Shell同理,直接从MSYS2官网下载和安装到C盘根目录C:/下即可。或者直接下载ESPRESSIF提供的.zip文件,解压到C:/

能不能放到其他盘,暂时没有试验过,对于使用MSYS2的开发者而言,最好是到C:\msys32\mingw32.exe文件属性中设置好管理员权限。

本下载仅用于windows平台,对于Mac及Linux平台而言,可以直接调用Terminal进行后续步骤。

1.2 Git(for Mac & Linux)

此步骤要在Terminal中进行,便于将ESPRESSIF保存在Github的ESP-IDF下载到本地。

运行以下命令安装(Debian/Ubuntu):

1
apt-get install git
以及(Mac):Git下载

ESP-IDF 是ESP32设备的SDK,另外,MSYS2自带Git工具。如果已经安装过Git工具了,可以使用gitgit version语句进行查看。

2. ESP-IDF

在创建文件夹esp的过程中,确保自己没有使用到root权限来创建文件夹,查看的方法是打开Files应用,看看esp文件夹上面是否有个锁的图表。因为后续添加的环境变量局限于 XXXXX 用户,而执行文件因为在创建的过程中就属于 root 用户了,就不能够识别个人用户创建的环境变量IDF_PATH。为ESP-IDF的获取创建好文件夹,运行以下命令:

1
2
3
cd ~/
mkdir -p esp
cd esp
如果使用了 root 权限来创建esp文件夹,请使用命令rm -d -f ~/esp来删除 空的esp文件夹 或 使用命令rm -r -f ~/esp非空的esp文件夹。然后重启终端,使用普通用户权限再次创建。

msys2-terminal-window 然后运行下面语句,ESP-IDF 将会被下载到 ~/esp/esp-idf 目录下。

1
git clone --recursive https://github.com/espressif/esp-idf.git

注意: 上面克隆仓库的语句中有个 --recursive 选项。如果你克隆 ESP-IDF 时 没有带这个选项 ,你还需要运行额外的命令(如下)来获取子模块:

1
2
cd esp-idf
git submodule update --init

3. Xtensa(for MAC & Linux only)

Windows平台因为使用MSYS2的原因,自带了Xtensa,因此可以忽略此步骤。

Linux平台 Xtensa-Linux-64bit下载解压。 执行如下命令:

1
2
cd ~/esp
tar -xzf ~/Downloads/xtensa-esp32-elf-linux64-1.22.0-80-g6c4433a-5.2.0.tar.gz

MAC平台 Xtensa-MAC

1
2
cd ~/esp
tar -xzf ~/Downloads/xtensa-esp32-elf-osx-1.22.0-80-g6c4433a-5.2.0.tar.gz

4. 环境变量设置

Windows平台: 寻找到路径C:/msys32/etc/profile.d/,然后使用记事本或其他文本工具新建一个名为export_idf_path.sh的文件,然后将你的esp-idf路径写入文件中,如:

1
export IDF_PATH="C:/msys32/home/XXXXX/esp/esp-idf"

安装vim工具或使用其他文本工具,打开~/.profile文件。使用vim工具的话,单击i健进行插入,鼠标点击粘贴以下代码后,按ESC键,然后输入:w进行保存,再次输入:q推出vim工具,ubuntu平台的vim工具安装命令:

1
apt-get install vim

Linux平台

1
2
export PATH="$HOME/esp/xtensa-esp32-elf/bin:$PATH"
export IDF_PATH=~/esp/esp-idf

MAC平台

1
2
export PATH=$HOME/esp/xtensa-esp32-elf/bin:$PATH
export IDF_PATH=~/esp/esp-idf

完成修改后重启终端,并在终端中输入以下命令可以查看是否设置成功,如果不成功或者后续步骤中出现No such file or directory的错误提示,请尝试重启系统。

1
2
printenv IDF_PATH
printenv PATH

Environment_Setting_PATH

5. python依赖包安装

直接输入以下命令,安装依赖于Python的软件包:

1
python -m pip install --user -r $IDF_PATH/requirements.txt

注意 在终端输入python可查看版本,如果你的电脑安装的是不同版本的Python,则调用不同的语句进行安装,如python2 python2.7Tools_Downloads_Python

1
python2.7 -m pip install --user -r $IDF_PATH/requirements.txt

如果在此步骤出现/usr/bin/python2.7: No module named pip的问题,则输入以下命令进行pip module安装:

1
apt-get install python-pip

二、使用终端运行工程

本节共有四部分: - 工程样例复制 - 开发板连接 - 工程参数设置 - 命令行烧录

1. 工程样例复制

C:/msys32/home/XXXXX/esp/esp-idf/examples/下面会有很多ESP-IDF自带的工程样例,按照用途分类。本节将使用/get-started/hello_world作为示范。

拷贝样例:

1
2
cd ~/esp
cp -r $IDF_PATH/examples/get-started/hello_world .

要注意的是,拷贝样例的语句中,那个点.必不可少,且和前面的路径中有个空格

2. 开发板连接

将 ESP32 开发板连接到 PC,然后检查串口号,看看它能否正常通信。 ### 2.1 驱动 以下是乐鑫 ESP32 开发板驱动程序的链接:

ESP32-PICO-KIT 和 ESP32-DevKitC - CP210x USB to UART Bridge VCP Drivers ESP32-WROVER-KIT 和 ESP32 Demo Board - FTDI Virtual COM Port Drivers

装完驱动之后,Windows平台的设备管理器中是如下显示的: esp32-devkitc-in-device-manager1

2.2 端口号

Windows平台:设备管理器中查看端口并记录下其设备尾部标注的端口号COM*esp32-devkitc-in-device-manager1

Linux和Mac的平台: 在终端里面,分别运行查看端口命令两次,一次是在插入开发板前,一次是在插入开发板后。 Linux:

1
ls /dev/tty*
Mac:
1
ls /dev/cu.*
另外,Linux平台还需要为登录用户添加串口读写权限:
1
sudo usermod -a -G dialout $XXXXX

Putty工具 下载和使用Putty工具对开发板进行串口连接确认。

运行终端,设置串口:波特率 = 115200,数据位 = 8,停止位 = 1,奇偶校验 = N。

以下是设置串口和在 Windows 和 Linux 上传输参数(如 115200-8-1-N)的一些截屏示例。注意选择上述步骤中确认的串口进行设置。

putty-settings-windows1 putty-settings-linux1

3. 工程参数设置

在终端窗口中,输入cd ~/esp/hello_world进入hello_world所在目录,然后启动工程配置工具:

1
make menuconfig
project-configuration1

在菜单中,进入Serial flasher config>Default serial port输入之前记录下来的串口号(/dev/tty*/dev/cu.*/COM*),工程会加载到该串口上。输入回车确认选择,选择< Save >保存配置,然后选择< Exit >退出应用程序。

以下是menuconfig的使用小技巧: 1. 使用 up & down 组合键在菜单中上下移动 2. 使用 Enter 键进入一个子菜单,Escape 键退出子菜单或退出整个菜单 3. 输入 ? 查看帮助信息,Enter 键退出帮助屏幕 4. 使用空格键或 YN 键来使能 (Yes) 和禁止 (No) 带有复选框 “[*]” 的配置项 5. 当光标在某个配置项上面高亮时,输入 ? 可以直接查看该项的帮助信息 6. 输入 / 搜索配置项

注意 如果再此步骤出现<command-line>:0:12: fatal error: curses.h: No such file or directory的错误提示,则

4. 命令行烧录

4.1 烧录

这条命令会编译应用程序和所有的 ESP-IDF 组件,生成 bootloader、分区表和应用程序 bin 文件,并将这些 bin 文件烧写到 ESP32 板子上。

1
make flash
烧写成功的话,板子将会复位,应用程序 “hello_world” 开始启动,在终端显示如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
esptool.py v2.0-beta2
Flashing binaries to serial port /dev/ttyUSB0 (app at offset 0x10000)...
esptool.py v2.0-beta2
Connecting........___
Uploading stub...
Running stub...
Stub running...
Changing baud rate to 921600
Changed.
Attaching SPI flash...
Configuring flash size...
Auto-detected Flash size: 4MB
Flash params set to 0x0220
Compressed 11616 bytes to 6695...
Wrote 11616 bytes (6695 compressed) at 0x00001000 in 0.1 seconds (effective 920.5 kbit/s)...
Hash of data verified.
Compressed 408096 bytes to 171625...
Wrote 408096 bytes (171625 compressed) at 0x00010000 in 3.9 seconds (effective 847.3 kbit/s)...
Hash of data verified.
Compressed 3072 bytes to 82...
Wrote 3072 bytes (82 compressed) at 0x00008000 in 0.0 seconds (effective 8297.4 kbit/s)...
Hash of data verified.

Leaving...
Hard resetting...

4.2 端口监控

如果要查看 “hello_world” 程序是否真的在运行,输入命令 make monitor。这个命令会启动 IDF Monitor 程序(ESP-IDF自带工具),也可以使用其他串口助手进行查看。

1
make monitor
串口启动时,在终端显示如下:
1
2
3
4
5
6
7
8
9
$ make monitor
MONITOR
--- idf_monitor on /dev/ttyUSB0 115200 ---
--- Quit: Ctrl+] | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H ---
ets Jun 8 2016 00:22:57

rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
ets Jun 8 2016 00:22:57
...
开发板输出到串口的信息,在终端显示如下:
1
2
3
4
5
6
7
...
Hello world!
Restarting in 10 seconds...
I (211) cpu_start: Starting scheduler on APP CPU.
Restarting in 9 seconds...
Restarting in 8 seconds...
Restarting in 7 seconds...

三、 使用Eclipse运行工程

本节共有四部分: - JRE & Eclipse - Eclipse项目运行 - Build Project - Flash tools烧录

1. JRE & Eclipse

1.1 JRE安装

JRE(Java Runtime Environment)要在Eclipse之前安装,并在终端使用如下命令验证是否安装成功并查看版本:

1
java -version

1.2 Eclipse安装

Eclipse IDE 是一个可视化的集成开发环境,可用于编写、编译和调试 ESP-IDF 项目。

下载相应的Eclipse并安装到电脑:eclipse.org,在安装的过程中记得要选择Eclipse for C/C++ Development(有的版本也可能显示为 CDT)。

2. Eclipse项目运行

2.1 导入工程样例

  1. 运行 Eclipse,选择 File -> Import…

  2. 弹出的对话框中选择 C/C++ -> Existing Code as Makefile Project,然后点击 Next

  3. 在下个界面中 Existing Code Location 位置输入您的 IDF 项目的路径(如:C:/msys32/home/XXXXX/esp/hello_world)。 注意:这里应输入 ESP-IDF 项目的路径,而非 ESP-IDF 本身的路径。

  4. 在本界面,找到 Toolchain for Indexer Settings,选择 Cross GCC,最后点击 Finish

2.2 设置工程项目属性

Eclipse_Project_Properties

在本小节中,会 添加或修改三个主要的环境变量BTACH_BUILDIDF_PATHPATH。这些变量可以只在 项目属性 中修改,也可以直接到 系统环境变量 中修改。(添加到系统环境变量中的方法本文无讲解)

Eclipse_Project_Properties_Environment_Value
  1. 新项目将出现在Eclipse左侧的 Project Explorer 选项卡中。选择导入的项目,在右键菜单中选择 Properties

  2. 点击 C/C++ Build 下的 Environment 属性页,点击 Add… 按钮,输入 BATCH_BUILD1

  3. 点击 Add…,输入 IDF_PATH 中输入 ESP-IDF 所在的完整安装路径 C:/msys32/home/XXXXX/esp/esp-idf 。Linux及MAC平台的安装路径 /home/XXXXX/esp/esp-idf .

  4. 选择 PATH 环境变量,不要改变默认值。

Windows 用户:C:\msys32\mingw32\bin;C:\msys32\opt\xtensa-esp32-elf\bin;C:\msys32\usr\bi 添加到 PATH 环境变量的靠前位置(如果您将 msys32 安装到了其它目录,则需要更改对应的路径以匹配您的本地环境)。

  1. 在 macOS 平台上,增加一个 PYTHONPATH 环境变量,并将其设置为 /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages, 保证系统中预先安装的 Python (需安装 pyserial 模块)可以覆盖 Eclipse 内置的任何 Python。
Eclipse_Project_Properties_Preprocessor_Include
  1. 前往 C/C++ General -> Preprocessor Include Paths 属性页面,点击 Providers 选项卡:

选择 CDT Cross GCC Built-in Compiler Settings,将 Command to get compiler specs 修改为 xtensa-esp32-elf-gcc ${FLAGS} -std=c++11 -E -P -v -dD "${INPUTS}"

选择 “CDT GCC Build Output Parser,将 Compiler command pattern 修改为 xtensa-esp32-elf-(gcc|g\+\+|c\+\+|cc|cpp|clang)

Eclipse_Project_Properties_Indexer
  1. 前往 C/C++ General -> Indexer 属性页面,选择 Enable project specific settings 以启用本页上的其他设置。然后去除 Allow heuristic resolution of includes 勾选,因为启用此选项时,Eclipse 有时无法找到正确的头文件目录。
Eclipse_Project_Properties_Build_Behavior
  1. 点击 C/C++ Build -> Behavior 属性页,选中 Enable parallel build 以启用多任务并行构建。

  2. 保存项目属性并退出属性设置界面。

3. Build Project

选择菜单栏中的 Project -> Build Project。在此步骤中,将会调用ESP-IDF生成三个文件:bootloader.binpartition_singleapp.binhello_world.bin。分别对应的是启动程序、分区程序和应用主程序。

成功构建工程项目之后,Eclipse下方的 Console 选项卡将会显示如下: build_successfully

4. Flash tools烧录

Flash tools(仅在ESPRESSIF官网上找到Windows版本)下载并解压到相应位置,打开后进行如下配置。 正确配置后便可成功烧录,要注意的是,bootloader.bin对应放在地址0x1000的位置,partition_singleapp.bin对应放在地址0x8000的位置,helloworld.bin对应放在地址0x10000的位置。 flash_download

参考链接

  1. ubuntu下文件拷贝命令cp命令
  2. ubuntu rm命令
  3. mkdir命令

原文中的URIBeacon已被Google Eddystone替代,因此本文并非完全由原文转载,有小幅度更改。

蓝牙低功耗(BLE)信标

有几种类型(Eddystone,AltBeacon,iBeacon),每种类型都有自己的标准和优势。有些是开放和免费的,有些是封闭的,需要花钱。本文将介绍可用信标的三种主要类型,它们的优点,缺点,衍生物以及有关信标如何工作的一些低级实现细节。确保查看所有可用作BLE信标的已启用mbed的BLE平台。

概观

蓝牙低功耗(BLE)能够以两种状态之一交换数据:连接和广告模式。连接模式使用通用属性(GATT)层以一对一的方式传输数据。广告模式使用通用访问配置文件(GAP)层向正在收听的任何人广播数据。广告模式是一对多转移,无法保证数据的一致性。

BLE Beacons利用GAP广告模式以定期的,特殊格式的广告包广播数据。每种类型的信标都使用自定义规范来对广告数据进行分区,从而赋予其意义。我将看看三种现有类型的信标,URI Beacons,iBeacons和AltBeacons。mbed BLE团队页面支持所有信标类型,如果您想尝试它们,请提供包含文档的示例项目。

iBeacon

Apple的iBeacon是第一款出现的BLE Beacon技术,因此大多数信标都从iBeacon数据格式中获取灵感。iBeacons在几个Apple SDK中启用,可以从任何支持BLE的iDevice读取和广播。iBeacon是一种专有的封闭式标准。iBeacons有一个庞大的生态系统,并为开发人员提供了大量资源,但您必须成为Apple开发人员社区的一员。

数据规格

iBeacons播放了四条信息: 1. 标识信标的UUID。 2. 标识大组中信标子集的主要编号。 3. 标识特定信标的次要编号。 4. TX功率电平为2的补码,表示距设备一米的信号强度。必须由用户或制造商为每个设备校准此编号。

扫描应用程序读取UUID,主要编号和次要编号,并针对数据库引用它们以获取有关信标的信息; 信标本身不包含描述性信息 - 它要求此外部数据库有用。TX功率字段与测量的信号强度一起使用以确定信标距智能电话的距离。请注意,用户必须在信标的基础上校准TxPower才能准确。

iBeacon-Diagramredo

iBeacon前缀包含十六进制数据:0x02 01 06 1A FF 00 4C 02 15。这分解如下:

  • 0x020106将广告包定义为BLE General Discoverable和BR / EDR高速不兼容。实际上它说它只是广播,而不是连接。
  • 0x1AFF表示以下数据长度为26个字节,并且是制造商特定数据。
  • 0x004C是Apple的蓝牙Sig ID,是该规范的一部分,使其依赖于Apple。
  • 0x02是表示邻近信标的辅助ID,由所有iBeacons使用。
  • 0x15将剩余长度定义为21个字节(16 + 2 + 2 + 1)。

其余的字段相当自我解释。邻近UUID是标准的16byte / 128bit BLE UUID,通常是公司独有的。主要和次要数字用于表示UUID内的资产; 常见用途是主要数字是商店(因此可能有65,536个商店),其中次要数字是商店内的单个标签(每个商店还有65,536个可能的标签)。

例子

  1. 一家咖啡店在一个咖啡架和一个寄存器上放置了iBeacons。当顾客走进咖啡店足够近时,智能手机应用程序会看到iBeacon,搜索咖啡店的iBeacon数据库,将iBeacon识别为属于coffeeShop X,然后看到咖啡有效的优惠券,并通知优惠券的用户。
  2. iDevices可以广播iBeacon。这可用于在活动中自动登记并跟踪整个场地的移动。
  3. 请参阅mbed iBeacon设备页面上的嵌入式设备代码。

这是如何设置iBeacon设备以使用mbed BLE_API广播具有主要和次要号码的UUID的示例。请注意,tx功率水平应根据设备的1米测量用户校准。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include "mbed.h"
#include "iBeaconService.h"
...
BLEDevice ble;
const uint8_t uuid[] = {0xE2, 0x0A, 0x39, 0xF4, 0x73, 0xF5, 0x4B, 0xC4, // 16Byte UUID
0xA1, 0x2F, 0x17, 0xD1, 0xAD, 0x07, 0xA9, 0x61
};
uint16_t majorNumber = 1122; // 2 byte major number
uint16_t minorNumber = 3344; // 2 byte minor number
uint16_t txPower = 0xC8; // 1 byte tx power level
...
int main(void){
...
iBeaconService ibeacon(ble, uuid, majorNumber, minorNumber, txPower);
....
while(1){
ble.waitForEvent();
}
}

思考

iBeacons非常酷,得到广泛支持,因为它们是Apple产品,所以每个人都在与它们合作,生态系统尽可能健壮。唯一的限制是需要数据库来为iBeacon数据赋予意义。没有数据库,UUID就毫无意义。你可以在这里找到mbed iBeacon的例子。

衍生品

一个流行的衍生产品是用不同的公司代码替换0x004C代码,例如分配给Nordic Semiconductor的0x0059。该NRF烽火台应用和nrf51822蓝牙智能灯塔套件就是这样的例子。 一些公司提供的示例未明确使用iBeacon规范。

AltBeacon

AltBeacons是Radius Networks提供的开放式免费信标设计。它似乎正在获得一些动力。AltBeacon规范似乎是对Apple正在使用的闭源iBeacon规范的直接反应; 它涵盖了与iBeacon相同的功能,但不是公司特定的。也就是说,它尚未获得广泛支持。

值得注意的是,虽然iBeacons有20个27字节可用于用户数据(UUID + Major + Minor),但AltBeacons有28个28字节可用(MFG ID,BeaconCode,BeaconID,MFG RSVD)。这意味着每条消息可以传送更多数据。

数据规格

所述AltBeacon规格是28bytes(26B是用户可修改的)。AltBeacon的前两个字节不是用户可修改的,而是由BLE堆栈设置的。ADV长度为0x1B,ADV类型为0xFF; 这些将分别指定广告数据包的长度和类型作为制造数据。之后,一切都由用户决定,可以推送到广告制造商数据字段。请注意,在大多数情况下,MFG ID将与Bluetooth Sig分配的号码文档相关联。

altbeacon-spec-exploded-view

例子

用于iBeacons的相同示例适用于AltBeacons,具有以下修改:

  1. 具有不同制造商ID的能力。
  2. 具有不同信标码的能力。
  3. 最后保留数据的一个字节,用于保存特定的制造商信息。

使用AltBeacon,可以使用特定于应用程序的UUID而不是特定于公司的UUID,从而可以更改公司ID。虽然目前没有任何东西正在利用这一点,但我可以想象信标广播UUID用于信标服务,比如温度服务,然后提供制造公司的信息和温度,这样提供任何人的温度值。步行可以查看。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include "mbed.h"
#include "AltBeaconService.h"
...
BLEDevice ble;
uint8_t beaconID[] = { 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09, // 16B of UUID + 4B subdivided as needed.
0x10,0x11,0x12,0x13,0x14,0x15,0x00,0x01,0x00,0x02 };
uint16_t manufacturerID = 0x5900; //Nordic SIG ID
int8_t rssi = -122;
...
int main(void){
...
AltBeaconService altbeacon(ble, manufacturerID, beaconID, rssi); // Add AltBeacon service to BLE object
...
while(1){
ble.waitForEvent();
}
}

思考

AltBeacons有很大的可能性。它们充分利用了它们所拥有的空间,或多或少地向后兼容iBeacons,并且是开源的。这说它是一个非常新的规范,几乎没有人使用它,并且它与iBeacons的市场渗透作斗争是一场艰苦的战斗。我认为,越来越多的人会使用AltBeacons,因为他们可以携带更多的数据并拥有更广泛的用例 - 这是开放式蛋糕上的一个樱桃。您可以在此处找到mbed AltBeacon示例代码。

Eddystone

Eddystone前身为URIBeacon(发音为YUR-ee-BEE-kun)

Eddystone是由Google开发的开放式信标格式,其设计考虑了透明度和稳健性。Android和iOS设备都可以检测到Eddystone。Eddystone格式建立在现有部署中与行业合作伙伴合作的经验教训的基础上,以及更广泛的灯塔社区。帧格式中可以包含几种不同类型的有效载荷,包括:

  • Eddystone-UID:一个唯一的静态ID,带有一个10字节的命名空间组件和一个6字节的实例组件。
  • Eddystone-URL:经过解析和解压缩后,可由客户端直接使用的压缩URL。
  • Eddystone-TLM:信标状态数据,可用于信标队维护,并为Google Proximity Beacon API的诊断端点提供支持。-TLM应与识别帧交错,例如Eddystone-UID或Eddystone-EID(加密的eTLM版本保留安全性)。
  • Eddystone-EID:时变信标帧,可通过链接解析器(例如Proximity Beacon API)解析为稳定标识符。

此外,Eddystone还包括配置服务和品牌材料。为确保您的部署完全支持Google信标平台,您应该使用Eddystone-UID或-EID设置信标,并可选择添加-URL和-TLM。

DHCP

Dynamic Host Configuration Protocol, 动态主机设置协议, 是一个局域网的网络协议,使用UDP协议工作,主要有两个用途: 1. 用于内部网或网络服务供应商自动分配IP地址给用户 2. 用于内部网管理员作为对所有计算机作中央管理的手段

TCP/IP Stack Library (LwIP)

LwIP是瑞典计算机科学院的一个开源的TCP/IP协议栈实现。

LwIP协议栈主要关注的是怎么样减少内存的使用和代码的大小,这样就可以让lwIP适用于资源有限的小型平台例如嵌入式系统。为了简化处理过程和内存要求,lwIP对API进行了裁减,可以不需要复制一些数据。

lwIP是TCP / IP协议套件的一个小型独立实现,最初由Adam Dunkels开发,现在继续在这里。

lwIP TCP / IP实现的重点是减少资源使用,同时仍然具有全面的TCP。这使得lwIP适用于具有数十千字节空闲RAM的嵌入式系统,并且可以容纳大约40千字节的代码ROM。

lwIP主要功能

协议

IP,IPv6,ICMP,ND,MLD,UDP,TCP,IGMP,ARP,PPPoS,PPPoE

客户端

DHCP客户端 DNS客户端(包括mDNS主机名解析器),AutoIP / APIPA(Zeroconf),SNMP agent(v1,v2c,v3,私有MIB支持和MIB编译器)

API

用于增强性能的专用API,可选的Berkeley-socket套接字API

扩展功能

通过多个网络接口进行IP转发,TCP拥塞控制,RTT估计和快速恢复/ fast retransmit

Addon应用程序

HTTP(S)服务器,SNTP客户端,SMTP(S)客户端,ping,NetBIOS名称服务器,mDNS响应器,MQTT客户端,TFTP服务器

lwIP根据BSD风格许可证授权:http://lwip.wikia.com/wiki/License

TTL

TTL(Time- To-Live),简单的说它表示一条域名解析记录在DNS服务器上缓存时间.当各地的DNS服务器接受到解析请求时,就会向域名指定的DNS服务器发出解析请求从而获得解析记录;在获得这个记录之后,记录会在DNS服务器中保存一段时间,这段时间内如果再接到这个域名的解析请求,DNS服务器将不再向DNS服务器发出请求,而是直接返回刚才获得的记录;而这个记录在DNS服务器上保留的时间,就是TTL值。

参考链接

1.《lwIP》 2.《lwIP - A Lightweight TCP/IP stack - Summary》 3.《TTL值的含义以及与域名DNS TTL值的区别

蓝牙有超过20种不同的配置文件,涵盖了从手机到打印机,耳机,麦克风,笔记本电脑,车辆以及现在用于物联网/ M2M应用的蓝牙的各种不同类型的蓝牙设备,它还涵盖了各种可能的设备在这些场景中也会遇到。

A2DP

Advanced Audio Distribution Profile,蓝牙音频传输模型协定。

L2CAP

Logic Link Control and Adaptation Protocol, 逻辑链路控制和适配协议。是蓝牙系统中的核心协议,负责适配基带中的上层协议。

GAP & GATT

GAP(Generic Access Profile,通用访问协议)、GATT(Generic Attribute Profile,通用属性协议)。 两个协议都隶属于Host层,直接关系到应用层开发,与BLE开发人员的关系比较密切,其分别负责连接前数据广播和连接后的数据传输。

SPP

Serial Port Profile,蓝牙串口协议,用于蓝牙设备和其他设备之间的串口数据传输。

SPI

Serial peripheral interface, 串行外围设备接口,是由Motorola首先在其MC68HCxx系列单片机上定义的,基于高速全双工总线的通讯协议。

VFS

Virtual File System,虚拟文件系统组件。为可以对类文件对象执行操作的驱动程序提供统一接口。这可以是真实的文件系统(FAT、SPIFFS等),也可以是暴露文件类接口的驱动程序。

Initiator & Acceptor

BT SPP Initiator 和 BT SPP Acceptor,就是蓝牙串口数据发送端和蓝牙串口数据接收端,跟GATT服务有关。

引用原文《ESP32 BT & BLE Dual-mode Bluetooth》 > After the initialization of both the controller and the host, the BT SPP acceptor and the BLE GATT server are initialized. > After the DEV_A is powered on, the functions of the BT SPP initiator and the BLE GATT client are initialized.

MTU size

Maximum Transmission Unit,最大传输单元,是指一种通信协议的某一层上面所能通过的最大数据包大小(以字节为单位)。最大传输单元这个参数通常与通信接口有关(网络接口卡、串口等)。

BLE Scan Duplicate Options

The maximum number of devices in scan duplicate filter depends on the free heap size.

Eddystone

Eddystone是由Google开发的开放式信标(Beacon)格式,其设计考虑了透明度和稳健性。

iBeacon

iBeacon是苹果公司提出的“一种可以让附近手持电子设备检测到的一种新的低功耗、低成本信号传送器”的一套可用于室内定位系统的协议。

iBeacon和EddyStone的比较

iBeacon和EddyStone的比较

HID

Human Interface Device, 人类接口设备,或称人体学输入设备,是一种与人类在直接交互的计算设备,通常提供一种人类可用的输入方法,以及可能将输出信息传递给人类。

UUID

Universally Unique Identifier, 通用唯一识别码,是用于计算机体系中以识别信息数目的一个128位标识符。

GUID

Global Unique Indentifier,全局唯一标识符。

参考链接

  1. 蓝牙配置文件
  2. List of Bluetooth protocols
  3. Bluetooth L2CAP介绍

MQTT全称Message Queue Telemetry Transport,是一个针对轻量级的发布/订阅式消息传输场景的协议,同时也是被推崇的物联网传输协议。 MQTT:http://mqtt.org

在以Linux为内核的服务器上,可以有很多种方法来搭建MQTT服务,如Apache Apollo、Emqttd和Eclipse Mosquitto等等。 本文以将在阿里云Ubuntu云服务器上,创建专门用作MQTT服务器的账户,然后安装、开启并测试Mosquitto。

1. MQTT服务(官网):

Apache Apollo:http://activemq.apache.org/apollo/ EMQTTD:http://emqttd.com Eclipse Mosquitto: http://mosquitto.org

2. 准备工作

2.1 创建新用户

创建新用户是为了防止用户账户及密码泄露造成服务器root账号的信息安全及管理问题,因此很有必要单独创建一个用于MQTT服务的账户。 请在Terminal输入以下命令,XXXXX为你要新建的用户名称。

1

2.2 安装Mosquitto

3. 测试MQTT

3.1 电脑客户端安装

MQTT.fx ## 3.2 测试 ### 3.2.1 登录 在两台连接到不同IP的设备上(这里要求这两台设备不会连接到同一个网段,包括同一个WiFi)分别填写MQTT服务器的信息,包括: * 服务器的IP(或绑定了IP的域名) * 端口号(物联网用的MQTT端口号默认为:1883) * 用户名 * 密码 * 作为订阅者/发布者的昵称(大致是这个意思)

3.2.2 主题订阅及收信

在其中一台设备上填写订阅信息的主题名称,填写好后点Subscribe按钮。 在另一台设备上,填写发布信息的主题名称,填写好后在文本发送框填写发布内容并点击Publish按钮。

然后就可以欢快地在两台设备上发布和接收信息了,测试结束。

参考链接

  1. 【MQTT】在Ubuntu下搭建MQTT服务器
  2. micropython之动手搭建自己的MQTT服务器并实现通信(点亮led)
  3. 如何在Ubuntu 16.04上安装和保护Mosquitto MQTT消息传递代理
  4. ubuntu用户添加adduser, useradd

在计算机系统中,CPU和外部通信有两种通信方式:并行通信串行通信 。 而按照串行数据的时钟控制方式,串行通信又可分为 同步通信异步通信

数据层标准:I2C、SPI、UART、USB、SATA 硬件层标准:RS232、TTL

某些协议可能对于数据层或硬件层有着不同的规定,因此请自行了解并加以区分。

串行通信

Serial communication,指所有的串行的通信协议。是相对并行通信(Parallel communication) 而言的。

同步串行通信

Synchronous serial communication,指发送端在发送串行数据的同时,提供一个时钟信号,并按照一定的约定(例如在时钟信号的上升沿的时候,将数据发送出去)发送数据,接收端根据发送端提供的时钟信号,以及大家的约定,接收数据的。

如:I2C、SPI。

异步串行通信

Asynchronous serial communication,指发送端在数据发送之前和之后,通过特定形式的信号(例如START信号和STOP信号),告诉接收端,可以开始(或者停止)接收数据了。与此同时,收发两方会约定一个数据发送的速度(波特率),发送端在发送START信号之后,就按照固定的节奏发送串行数据,与此同时,接收端在收到START信号之后,也按照固定的节奏接收串行数据。

如:UART、USB。

在传送数据的过程中,字符与字符之间的传送是完全异步的,位与位之间的传送基本上是同步的,其特点可以概括为: 1. 以字符为单位传送信息。 2. 相邻两字符间的间隔是任意长。 3. 因为一个字符中的比特位长度有限,所以需要的接收时钟和发送时钟只要相近就可以。 4. 异步方式特点简单的说就是:字符间异步,字符内部各位同步。

串行协议标准介绍

本节仅对SPI、I2C、UART、RS232、TTL及COM接口做详细介绍,其他标准作为粗略的补充或拓展之用。

SPI

Serial Peripheral Interface Bus,串行外设接口。是一种用于短程通信的串行通信同步接口规范,也是一种同步串行通信协议,主要应用于单片机系统中。

典型应用包含SD卡、液晶显示器、RFID读卡模块MFRC-522。 SPI设备之间使用全双工模式通信,包含一个主机和一个或多个从机。主机产生待读或待写的帧数据,多个从机通过一个片选线路 决定哪个来响应主机的请求。 有时SPI接口被称作四线程接口,SPI准确来讲称为同步串行接口,但是与同步串行接口协议(SSI)不同,SSI是一个四线程 同步通信协议,但是使用差分信号输入同时仅提供一个单工通信信道。

SPI总线规定了4个保留逻辑信号接口: - SCLK(Serial Clock):串列时脉,由主机发出 - MOSI(Master Output,Slave Input):主机输出从机输入信号,由主机发出 - MISO(Master Input,Slave Output):主机输入从机输出信号,由从机发出 - SS(Slave Selected):选择信号,由主机发出,一般是低电位有效

尽管上面的引脚名称是最常用的,但在过去,有时会使用其他引脚命名约定,因此旧IC产品的SPI端口引脚名称可能有所不同。

SPI总线:单一主机对单一从机
SPI总线:单一主机对复合从机

I²C

Inter-Integrated Circuit,字面上的意思是集成电路之间,是I²C Bus简称。也称集成电路总线,它是一种同步串行通信协议,使用多主从架构总线。

I2C bus

UART

Universally Asynchronous Receiver/Transmitter,通用异步接收/传输器,是指以某个固定的速率(1200bps、9600bps、115200bps等)进行数据传输,且一次只能传输一个bit(所以叫做串行传输)的异步串行通信协议 。 有时候UART会与TTL(Transistor-Transistor Logic)Serial混为一谈,这是因为TTL虽然可以采用其他串行通信协议(如I2C和SPI),但很多PC硬件上支持服务复杂,所以一般用UART协议导致的。 常见的微控制器中,都有内置UART协议接口。

RS232

RS232或者RS485,相较于UART是通信协议的标准,RS232或RS485d规定的是电路的物理层协议(电平标准)。 因为它规定了电气特性和各个引脚的功能定义,如 用-3V— -15V之间的任意电平表示逻辑“1” ;用+3V — +15V电平表示逻辑“0”,这里采用的是负逻辑。

TTL

Transistor-transistor Logic, 晶体管-晶体管逻辑集成电路,这种串行通信对应的物理电平始终是在0V和Vcc之间,其中常见的Vcc是5V或3.3V。 TTL指的是电路的 物理层协议 (电平标准)。电压>=2.4V时代表高电平1,电压<=0.5V时代表低电平0(对于5V或3.3V电源电压),这里是正逻辑。TTL接口在Minnow板子上如图: pic3

在TTL与RS232的互相转换中,使用的芯片是MAX3232(3.3V)或者MAX232(5V),里面就只涉及到电压转换的问题了,没有数据的改变和封装,因为他们在数据层的协议是一样的。 比如,对于同样传输0b01010101来说,RS232和TTL的时序对比如下图所示。 pic4 当然,RS232和TTL之间的转换,不仅仅是简单的电平转换,还要考虑到其他一些因素,比如调节和矫正一些电平(提高或降低对应的电平),确保可能的有害的RS232电压不会破坏微控制器的串口针脚。

如何分辨究竟是TTL还是RS232呢? - 一般来说,由SOC芯片引脚直接引出的一般是TTL,其高低电平不需要任何转换,可以由芯片之间驱动,节省费用;而中间接有转换芯片的可能就是RS232了,可以根据电路图的芯片型号google即可。 - 另一个原则是RS232通常出现在传统的PC和服务器领域,TTL通常用于嵌入式设备。

COM接口

Cluster Communication Port,串行通讯端口,简称串口。微机上的串口通常是9针(如下图示),也有25针的接口,最大速率115200bps。 pic1 PC计算机背板的COM口通常采用RS232标准,其高电平定义为-12V,低电平定义为+12V。 在嵌入式设备上的4针杜邦线接口也算COM接口,采用的是TTL标准或RS232标准。但如果谈论到COM接口,一般是指RS232标准的PC背板的9pin的COM口。 pic2

转换方式 芯片型号
TTL-RS232 MAX3232 或者 ST3232
USB-TTL PL2303HX 或者 CP2102

如果要转换USB-RS232的话,则要使用USB-TTL和TTL-RS232两种芯片。

其他

USB

Universal Serial Bus,通用串行总线。是连接计算机系统与外部设备的一种串口总线标准,也是一种输入输出接口的技术规范。 USB使用NRZI编码方式:当数据为0时,电平翻转;数据为1时,电平不翻转。为了防止出现过长时间电平不变化现象,在发送数据时采用位填充处理。具体过程如下: - 当遇见连续6个高电平时,就强制插入一个0。 - 经过位填充后的数据由串行接口引擎(SIE)将数据串行化和NRZI编码后,发送到USB的差分数据线上。 - 接收端完成的过程和发送端刚好相反。

SATA

Serial Advanced Technology Attachment,串行高级技术附件。 是一种计算机总线,负责主板和大容量存储设备(如硬盘及光盘驱动器)之间的数据传输,主要用于个人计算机,用以取代PATA或称IDE接口。 串行ATA与串列SCSI(SAS: Serial Attached SCSI)的两者排线兼容,SATA硬盘可接上SAS接口。

参考资料

  1. Serial Peripheral Interface
  2. 同步串口和异步串口的区别及使用情况
  3. UART、RS232、TTL关系浅析
  4. UART、TTL、RS232等概念的区别与联系
  5. 串口、COM口、TTL、RS-232、RS-485区别详解
  6. 一文看懂sp3232与max3232区别
  7. USB

心血来潮,2019年伊始的第四天,我要搭建我自己的个人博客,作为个人工作学习和生活的一种记录方式。

这前面的路或许会有困难,但我喜欢“挑战成功”的快感!

本博文部分语句和教程是适用于Windows平台的,mac及其他平台请依据官方文档进行操作,本博文较长,请耐心阅读并多多实践。欢迎大家留言,提出问题,ありがとうございます。

一、前置准备工作

本博文将叙述如何基于Hexo静态博客生成器快速搭建托管于GitHub的自建博客。

首先,我们要在本地电脑端配置环境,并完成本地个人博客的搭建,然后申请GitHub账户和仓库,并上传本地个人博客到仓库,最后申请域名“XXXXX.com/XXXXX.cn” 并解析到对应的GitHub地址“XXXXX.github.io” 。

本文所示操作方法都是在Windows环境下利用Git Bash Shell进行的。

本文中出现的所有下载连接如果无法进行下载或下载速度极慢时,可以到文末找到对应的百度云盘链接。

首先我们要安装几个工具:Git、Node.js、hexo和hexo-git(第二节 3.2中)上传工具。

1. 基础知识

个人博客,可以分为传统博客和自建博客两种。

传统博客像是新浪博客、网易博客和QQ空间等,主要依托于自身强大的博客门户运营能力,能够为用户提供安全便捷的博客环境,缺点就是兼容性不够强,并且个性化定制能力稍差。

自建博客根据服务器管理方式也可以分为两种。一种是基于第三方服务器托管的自建博客,像GitHub这种;另一种是基于自有服务器的博客。

自建博客根据博客生成器来分也可以分为两种,分别是动态博客和静态博客。其中,动态博客以WordPress、FarBox、Ghost等为代表。静态博客以Hexo、Jekyll、Octopress、Hugo为代表。

以下为动态博客和静态博客的几点主要区别:

  • 资源占用上,静态的相比动态占用服务器资源少,还可以托管在Github Pages上;
  • 发布更新操作上,由于静态博客没有管理后台,所以发布更新内容要比动态博客繁琐;
  • 访问速度上,由于静态博客没有数据库,所以访问速度更快;
  • 安全性上,静态博客相比动态博客免疫了很多Web攻击套路;

除了Hexo以外,还有其他的静态博客生成器推荐,见文章《11个最流行的静态(博客)网站生成工具》。

2. Git配置

2.1 Git Bash Shell下载

Windows平台: https://gitforwindows.org/ Hexo提供的Git-SCM网址的Git Bash shell: https://git-scm.com/downloads

2.2 Git安装验证

为了确保安装成功,我们可以在Bash Shell或Windows CMD中,使用以下代码进行验证:

1
git version
若成功安装,则会提示以下结果:
1
git version 2.20.1.windows.1

3. Node.js配置

3.1 Node.js下载

Windows平台: https://nodejs.org/en/

3.2 Node.js安装验证

为了确保安装成功,我们可以在Bash Shell或Windows CMD中,使用以下代码进行验证:

1
node -v

若成功安装,则会提示以下结果:

1
v10.15.0

4. Hexo配置

4.1 Hexo安装

成功安装Git和Node.js之后,(关闭窗口并重启命令终端)则可以使用npm命令语句安装Hexo:

1
npm install -g hexo-cli

4.2 Hexo初始化

为本地博客创建文件夹,以下代码中的”XXXXX”为该文件夹的名称,为避免出错,请勿输入中文。

1
2
3
4
5
6
7
cd ~/                          //跳转到根目录
mkdir XXXXX //创建一个文件夹
hexo init XXXXX //初始化该服务器文件夹
cd XXXXX //跳转到该服务器文件夹
npm install //博客环境安装
hexo g //博客生成
hexo s //博客服务器开启(本地预览用)
### 4.3 注意事项 在每次重新打开命令窗口,并生成本地服务器预览页面之前,都必须跳转到该服务器的文件夹中。即:
1
cd XXXXX                       //跳转到该服务器文件夹

到此步骤为止,本地服务器配置已经全部完成。可以根据hexo官方文档给出的参数格式说明来对博客进行个性修改,这些请看第3节。

二、上传到GitHub仓库

在这部分中,我们将会申请到一个Github账户,并建立好对应博客代码的储存仓库,也会将本地生成的公钥SSH Key中。

1. GitHub账户申请及Repository(仓库)建立

1.1 GitHub注册

在这里偷个懒,引用别人的文章作为参考: 《GitHub注册》 GitHub官方网址:https://github.com

1.2 Repository建立

在创建Repository的时候一定要注意,仓库名应该为:XXXXX.github.io。 这个XXXXX使用你的GitHub帐号名称代替,这是固定写法。

比如我的名字是liewzheng,则我对应的仓库名称应该是:liewzheng.githug.io 不然在后续上传本地博客到仓库之后,会发现仓库无法打开的情况,因为DNS寻址会不成功。

2. SSH Key配置

此步骤是为了让Github给你的电脑访问授权,如果没有此步骤,则无法上传到Github。

2.1 本地生成SSH Key

请执行以下命令:

1
ssh-keygen
三次回车之后,可以生成id_rsa.pub文件,这里面就是SSH key的内容,然后使用Vim编辑器打开这个文件,复制里面的全部内容
1
vim ~/.ssh/id_rsa.pub
然后在键盘上敲击以下命令并回车退出Vim编辑器:
1
:q
附带Vim编辑器的其他使用教程: 1. 《Vim入门基础》:https://www.jianshu.com/p/bcbe916f97e1

2.2 拷贝到GitHub记录该Key

在自己的GitHub主页,点击右上角头像,点击Setting,点击左侧边栏的SSH and GPG keys,点击New SSH key

然后将SSH-key粘贴到Key文本框中,在Title文本框键入对该Key的备注并保存即可。

2.3 验证SSH Key

回到命令行,输入:

1
ssh -T git@github.com
如果得到以下提示,则说明你已经配置好SSH-Key了。
1
2
Hi! You've successfully authenticated, but GitHub
does not provide shell access.

3. 上传到GitHub仓库

3.1 本地参数修改

首先找到本地博客的服务器文件夹下的_config.yml文件,然后打开并滑动到最底下,其原始文件应该是如下的:

1
2
3
4
# Deployment
## Docs: https://hexo.io/docs/deployment.html
deploy:
type:

然后我们要对其进行上传参数修改,XXXXX为你对应的账户名:

1
2
3
4
5
6
# Deployment
## Docs: https://hexo.io/docs/deployment.html
deploy:
type: git #为Git,旧写法为github
repo: git@github.com:XXXXX/XXXXX.github.io.git #输入你对应的Git仓库地址,SSH写法
branch: master #可以为其他分支,默认为master

3.2 上传插件安装

接下来安装hexo对应Github的上传插件:

1
npm install hexo-deployer-git --save
显示如下文字说明插件安装成功了:
1
2
3
4
5
6
7
8
9
10
11
  npm WARN deprecated swig@1.4.2: This package is no longer maintained

> fsevents@1.2.4 install /Users/apple/liewzheng/node_modules/fsevents
> node install

[fsevents] Success: "/Users/apple/liewzheng/node_modules/fsevents/lib/binding/Release/node-v64-darwin-x64/fse.node" already installed
Pass --update-binary to reinstall or --build-from-source to recompile
+ hexo-deployer-git@0.3.1
added 68 packages from 33 contributors, updated 1 package and audited 5870 packages in 12.563s
found 1 low severity vulnerability
run `npm audit fix` to fix them, or `npm audit` for details

3.3 用户名称及邮箱配置

(更新日期:2021年2月5日)

向cmd或者terminal内设置两个变量,分别是 user.nameuser.email

1
2
git config --global user.email "you@example.com"
git config --global user.name "Your Name"

三、博客主题配置

1. 选择博客主题

本步骤需要在Hexo的官网上进行主题挑选及预览,然后再跳转到对应的GitHub仓库中下载主题Zip包,并解压放在对应的位置/themes/下面。

然后在根目录下找到文件_config.yml

并在其文件下方XXXXX处替换刚下载好的主题名称(其文件夹名称):

1
theme:   XXXXX

2. 主题配置

请打开对应的主题文件夹下的\_config.yml文件,如:

1
XXXXX\themes\hexo-theme-pln-master\_config.yml
然后对照着Hexo对config.yml文件的说明进行编辑。

官方文档如下: 《配置

3. 注意事项

大概是因为Hexo免费的原因,其主题很多都是资源上传,且无人维护的,因此需要多下载几个主题,一个一个进行尝试,在本地博客服务器上尝试到所有网页跳转正常无BUG之后再进行主题配置,按需修改。

四、博客撰写及文件更新

1. 博客撰写

使用Hexo创建的静态网页之后,在编写博文之时,一般都是使用轻量级标记语言(MarkDown,文件名如:XXXX.md)来编写的。然后利用脚本语言将md格式文件自动转换成html5文件,并上传到服务器仓库。

这时候,熟练使用MarkDown这种纯文本文档语言来编写博客,是为广大博客爱好者提供了便利的。

由于MarkDown是纯文本文档,在文章撰写中无法使用图片直接插入和预览功能,因此最好选择合适的稳定的图库网站来保存自己的图片,并生成对应url,再使用如下引用方法来插入图片:

1
![说明](url地址)
url地址的填项也可以是相对(物理)地址。

科普 相对地址和绝对地址(相对路径和绝对路径)。 这一点,学计算机和电子的人可能会比较懂。 详细科普还是请参考链接6吧。

另外,推荐使用Atom文本编辑器对本博文中出现的各种文件进行编辑,自带各种显示优化,地址如下: https://atom.io/

更多MarkDown的使用方法,请循: 1. 《Markdown编辑器editor.md的使用》 2. 《Github上README.md的简单使用方法

2. 文件更新(利用Git Bash Shell)

再次更新本地服务器文件,并保存生成预览之后,如果想要更新对应git仓库里的文件,最好每一次都按照以下代码进行操作,避免出现不必要的意外。

1
2
3
hexo clean
hexo g
hexo d
之所以强调需要每一次都这样操作,是因为本人就有过偷懒,在本地博客预览成功后选择直接部署,都没有提示错误,也没有部署成功(输入对应网址后无法显示更新)。

3. 注意事项

可以在本地博客服务器开启的情况下,实时修改服务器文件并刷新网页进行查看,这样创建文章和预览网页的效率有极大的提升。

五、博客展示

1. 域名申请

域名申请比较靠谱的,可以选择国内的阿里云、百度云和腾讯云等等。

由于此步骤较为简单,不做多介绍。域名申请参考文章如下: 1. 《免费申请域名》 2. 《教你如何申请域名和解析域名

2. 域名解析

域名解析是指将指定的域名与指定的服务器或其他地址绑定在一起,能够在DNS服务器中被检索得到,通过输入域名A并跳转到指定位置。

有两种方法可以用来将自己的域名指向到Github Pages: - A类型解析:将域名定向解析到一个IPv4地址,只要将获取到个人博客的IPv4地址就可以定向解析了 - CNAME类型解析:将自己的域名(定向域名或子域名)指向另一个域名(博客地址)

本人使用阿里云域名解析服务,具体步骤请参考以下链接: 1. 《github pages+阿里云域名绑定搭建个人博客》 2. 《github pages 绑定阿里云域名》 3. 《github怎么绑定自己的域名?

六、博客个性化

1. 图床服务器

对于博客而言,有两项因素关乎着“我是否需要图床服务器”这项问题: 1. 本博客是否有数量庞大的访客; 2. 本博客是否有插入数量庞大的多媒体(动画、视频和图片等等);

对于以上两种因素而言,图床服务器都能够很好的减轻博客服务器的访客压力,减少因为访客众多或者多媒体加载时的网页载入缓慢或崩溃。对于自有服务器的博客而言,图床服务器能够降低租用服务器的流量消耗,加快访问速度。

理论上说,只要另外申请一个服务器,专门用来存放图片的,就能被称作图床服务器。 因此图床服务器也有自建服务器和门户服务器的区别。 你也可以上传到微博相册或者QQ空间相册,然后引用超链接到.md文件里。

本人用阿里云OSS(Object Storage Service,对象存储服务),搭配Mac平台的 iPic插件 ,有兴趣也可以参考一下: 《对象存储OSS》 《在 iPic 中添加阿里云 OSS

然后再推荐个口碑不错的七牛云,注册和使用方法请遵循技术文档吧,链接如下: 七牛云

推荐网友Mashiro的自建图床服务器: 《搭了一个图床

其他推荐链接: 《免费图床

2. .YML

.YML是YAML语言的文件格式。

YAML是"YAML Ain't a Markup Language"(YAML不是一种标记语言)的递归缩写。在开发的这种语言时,YAML 的意思其实是:"Yet Another Markup Language"(仍是一种标记语言),但为了强调这种语言以数据做为中心,而不是以标记语言为重点,而用反向缩略语重命名。——摘自wikipedia.org

请自行以Hexo官方针对_config.yml文件做出的解释进行.yml学习,并针对个人博客进行适当的修改即可。

七、后续总结

1. 如何GitHub自建博客和自有服务器博客的区别

这个问题,相当于我给自己挖了个坑,之前打算长篇大论来着,发现自己也并没有那么深的体会。

自由服务器博客最大的问题是,一般都会有自己的系统。 这样的服务器系统分为两类:应用镜像和系统镜像。

应用镜像的代表是:WordPress、LAMP、Drupal、Node.js、ECShop等等。 系统镜像的代表是:CentOS、Ubuntu、Debian和Windows。

自己管理服务器的话,最好是有一个自己的博客应用镜像,如WordPress,WordPress也是基于CentOS打造的,是功能非常强大的博客和内容管理工具平台。

而GitHub的话更多的是静态博客的搭建,没有操作系统这种东西。

2. 做好更换设备前的备份工作

对了,值得一提的是,如果你准备在多台电脑之间编辑你的博文,最好是能够把本地博客服务器拷贝到U盘或者移动硬盘上面。

假如,尝试着从GitHub再次git clone到本地的话,你会发现里面的内容和本地博客服务器的内容完全不一样。这是因为本地博客服务器使用.md文件进行编辑,之后在hexo d的过程中会把.md文件转换成.html文件,而使用.html文件编辑的话会变得更加复杂。

因此,为了避免在转移到另一台电脑上编辑的时候出现这种尴尬问题,还是备份到U盘更方便。

参考链接

  1. GitHub+Hexo 搭建个人网站详细教程
  2. 在github上搭建hexo个人博客(Linux-Ubuntu)
  3. 搭建个人博客,你需要知道这些
  4. Hexo官方帮助文档
  5. MarkDown
  6. 相对路径和绝对路径

下载链接

  1. 安装工具合集(更新时间2019/01/05)》 提取码:28wj