解决python3.7与openssl的低版本不兼容的问题
安装了Python3.7之后,遇到的一个很麻烦的坑就是与系统自带的ssl版本不兼容, Python3.7需要的openssl的版本为1.0.2
或者1.1.x,这个requirements在config Python3.7的时候使用“
--with-ssl”选项会报出。
-
Could not build the ssl module!
-
Python requires an OpenSSL 1.0.2 or 1.1 compatible libssl with X509_VERIFY_PARAM_set1_host().
Linux系统默认的openssl版本通常是:OpenSSL 1.0.1,可以使用命令查询系统的openssl版本:
openssl version
当前版本低于Python3.7的需求,会导致一些运行错误,比如pip3 install命令的失败,故需要进行openssl版本升级。
(1)下载较高版本的openssl
https://www.openssl.org/source/openssl-1.1.1g.tar.gz (2)解压安装包
tar -xvzf openssl-1.1.1g.tar.gz
(3)编译安装
-
cd openssl-1.1.1g
-
./config --prefix=/usr/local/openssl no-zlib # 新版openssl将安装在/usr/local/openssl目录下
-
make
-
make install
这样的话,新版本的openssl已经安装完毕,但是需要进行一些环境配置才能够继续使用。
来到/usr/bin目录下,可以发现已经有一个openssl可执行文件,这个就是系统自带的低版本,这里我们对它进行一个备份。
(4)备份原openssl配置
备份是个好的习惯,至少在安装新版本出错的时候可以回滚旧版本继续使用。
-
mv /usr/bin/openssl /usr/bin/openssl_bak # backup
-
mv /usr/include/openssl/ /usr/include/openssl_bak
(5)备份好之后就可以为新版openssl配置软连接了
-
# 将安装好的openssl的openssl命令软连到/usr/bin/openssl
-
ln -s /usr/local/openssl/include/openssl /usr/include/openssl
-
# 软链到升级后的libssl.so
-
ln -s /usr/local/openssl/lib/libssl.so.1.1 /usr/local/lib64/libssl.so
-
# 将安装好的openssl命令软连到/usr/bin/openssl
-
ln -s /usr/local/openssl/bin/openssl /usr/bin/openssl
(6)最后再修改下系统配置即可
-
# 写入openssl库文件的搜索路径
-
echo "/usr/local/openssl/lib" >> /etc/ld.so.conf # 需要root权限
-
# 使修改后的/etc/ld.so.conf生效
-
ldconfig -v
(7)验证安装结果
第二步:安装 LibreSSL
从 LibreSSL 官网 http://www.libressl.org/ 下载源代码。此处使用“libressl-2.8.2.tar.gz”。
以此执行以下命令安装:
#wget https://ftp.openbsd.org/pub/OpenBSD/LibreSSL/libressl-2.8.2.tar.gz
#tar xzvf libressl-2.8.2.tar.gz
#cd libressl-2.8.2
#./config
#make
#make install
此时再验证 OpenSSL 版本,如下:
#openssl version
LibreSSL 2.8.2
pyenv 让 python 版本完美切换
前言
我觉得如果使用 python 开发的话,还是在 unix/linux 的环境下吧,shell 工具的效率比 windows 高得多,尽管 windows 下也有 cmder 这种神器,而且现在 windows store 也很好的开发出了 linux 子系统,但是瑕疵非常多,unix/linux 才是完美的环境。本文用到的是 archlinux ,另外 debian/ubuntu、centos 也完全适用。mac 用户也可以参考,不过 homebrew 也提供了非常方便的安装方法,但是建议使用文本做法。
背景
python 版本比较多,2 和 3 相差非常大,很多项目需要跑在同一台服务器上,我们可以选择直接运行,也可以选择使用 docker。如果用 docker 那就不需要隔离环境了,如果要直接运行在服务器上,那就必须有隔离环境。比如有的项目使用 python 3.5,有的项目使用 python 3.7,此时我们可以借助 pyenv 帮助我们完美的隔离环境,让多个版本的 python 没有任何冲突,完美共存。
任务
使用 pyenv 和 pyenv-virtualenv ,在 linux 下完美隔离 python 各个版本
第 1 章:使用环境
请注意,接下来所有的操作都在 archlinux 下进行,本文不涉及 windows
清单
- git
- zsh 或者 bash
- pyenv
- pyenv-virtualenv
1、安装 git
在各大 linux 的发行版下安装 git 都非常简单,此处只展示部分示例
archlinux
sudo pacman -S git
debian/ubuntu
sudo apt-get install git
centos
sudo yum install git
2、开启终端
本文使用 zsh
3、安装 pyenv
说明:本文的所有安装都严格遵守官方文档,与官方文档完全保持一致。
git 地址:https://github.com/pyenv/pyenv
在你的终端中执行如下命令,安全无毒,请放心食用:
首先把项目克隆下来,放在家目录下的隐藏文件夹中:.pyenv
git clone https://github.com/pyenv/pyenv.git ~/.pyenv
然后配置环境变量
如果你使用 bash,就依次执行如下命令:
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n eval "$(pyenv init -)"\nfi' >> ~/.bashrc
如果你使用 zsh,就依次执行如下命令:
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zshrc
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zshrc
echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n eval "$(pyenv init -)"\nfi' >> ~/.zshrc
echo 命令的含义是:将引号中内容写入某文件中
请注意,以上的三条 echo 命令的最后一条长长的命令,请你保证它引号中的内容处于 ~/.bashrc 或者 ~/.zshrc 的最底部。
因为在 pyenv 初始化期间会操作 path 环境变量,导致不可预测的行为。
查看文件的底部内容,可以使用 tail 命令,用法:tail ~/.bashrc 或者 tail ~/.zshrc,编辑文件可以使用 vim 或者 vscode
最后,在使用 pyenv 之前,重新初始化 shell 环境,执行如下命令
exec $SHELL
不执行该命令也是完全可以的,你可以关闭当前的终端窗口,重新启动一个就可以了。
此时,你已经完成了 pyenv 的安装了,你使用可以它的全部命令了,但是我建议你先别急着用,一口气装完 pyenv 的一个插件,那就是 pyenv-virtualenv
4、安装 pyenv-virtualenv
git 地址:https://github.com/pyenv/pyenv-virtualenv
把插件克隆在刚才已经安装完毕的 pyenv 的 plugins 文件夹中
git clone https://github.com/pyenv/pyenv-virtualenv.git $(pyenv root)/plugins/pyenv-virtualenv
然后配置环境变量
如果你使用 bash,就执行如下命令:
echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.bashrc
如果你使用 zsh,就执行如下命令:
echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.zshrc
最后,在使用 pyenv 之前,重新初始化 shell 环境,执行如下命令
exec $SHELL
不执行该命令也是完全可以的,你可以关闭当前的终端窗口,重新启动一个就可以了。
到此,我们的所有重要安装已经全部完成了,可以开始体验了。
第 2 章:使用 pyenv
此处仅仅展示 pyenv 和 virtualenv 的日常用法
检查安装是否正确
检查 pyenv 的版本
pyenv version
查看 pyenv 已经托管了哪些 python 版本
pyenv versions
如果你看到了正常的版本信息,就说明可以了,如果看到了类似于 command not found 之类的,就说明安装失败了。
安装 3.6.6 版本的 python
pyenv install 3.6.6
这里有个问题,某些情况下会安装失败,报错就告诉你 Build failed
这个时候,pyenv 已经在它的 github wiki 里面为我们准备了一篇错误应对方案,原文地址 https://github.com/pyenv/pyenv/wiki
大意如下,只需要执行对应的命令即可:
archlinux 用户
sudo pacman -S base-devel openssl zlib
mac 用户
brew install openssl readline sqlite3 xz zlib
Ubuntu/Debian/Mint 用户
sudo apt-get install -y make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev libffi-dev
CentOS/Fedora <= 21 用户,请你保证已经安装了 xz 工具
sudo yum install gcc zlib-devel bzip2 bzip2-devel readline-devel sqlite sqlite-devel openssl-devel tk-devel libffi-devel
Fedora >= 22 用户,请你保证已经安装了 xz 工具
sudo dnf install -y gcc zlib-devel bzip2 bzip2-devel readline-devel sqlite sqlite-devel openssl-devel tk-devel
openSUSE 用户
zypper install gcc automake openssl-devel ncurses-devel readline-devel zlib-devel tk-devel
Solus 用户
sudo eopkg it -c system.devel
sudo eopkg install git gcc make zlib-devel bzip2-devel readline-devel sqlite3-devel openssl-devel tk-devel
Linuxbrew 用户
brew install bzip2 openssl readline sqlite xz
安装完这些补充的工具之后,再次执行:
pyenv install 3.6.6
就可以成功了,你可以不断的使用
pyenv versions
来查看被 pyenv 托管的 python 版本
而且你想装什么版本就装什么版本,想装几个装几个,都是完美共存,完美隔离,你可以在终端里输入
pyenv install
然后按下 tab 键,就可以看到所有可选的安装版本了
使用刚才安装的 python 3.6.6
首先我们需要明确一个概念,pyenv 和 pyenv-virtualenv 他们是如何协作的,你可以这么认为:
pyenv 托管 python 版本,virtualenv 使用 python 版本
好了,之前已经装好了版本,那么现在就来使用吧
第 1 步:创建虚拟环境
首先需要创建一个虚拟环境,执行命令:
pyenv virtualenv 3.6.6 my-env
它的格式就是这样固定的,最后一个是你自己想要的环境的名字,可以随便取。稍等片刻,你将会看到:
Looking in links: /tmp/tmp0eywgc7v
Requirement already satisfied: setuptools in /home/joit/.pyenv/versions/3.6.6/envs/my-env/lib/python3.6/site-packages (39.0.1)
Requirement already satisfied: pip in /home/joit/.pyenv/versions/3.6.6/envs/my-env/lib/python3.6/site-packages (10.0.1)
类似于这样的回显信息,说明环境已经创建成功了,它还告诉了你,该虚拟环境的绝对路径,如果你进去看了,你就会发现,所谓的虚拟环境,就是把 python 装在 pyenv 的安装目录的某个文件夹中,以供它自己调用。
第 2 步:激活虚拟环境
在任意目录下,执行命令:
pyenv activate my-env
你会发现,在你的终端里面,多了一个类似于 (my-env)
这样的一个东西,这时候你如果执行:
python --version
那就是 python 3.6.6 了
如果你执行:
pip --version
它会告诉你 pip 包安装的绝对路径,也是 pyenv 安装目录下的某个文件夹
如果你关掉了终端,那么下次启动你又得重新激活一次了,你可以使用如下命令:
首先 cd 到某一个目录,比如 ~/test
cd ~/test
然后在该目录下执行:
pyenv local my-env
你会发现已经被激活了,那么 local 命令和刚才有啥不同呢。如果你执行:
ls -al
你就会发现,在 ~/test 目录下,有个隐藏文件 .python-version,你可以看到这个文件里面,只写了一句话 my-env
这样你只要进入 ~/test 目录,就会自动激活虚拟环境
在虚拟环境下,你如果直接执行
python
就会进入到 python 的交互环境
如果你写了一个文件,名字叫做 app.py ,里面的内容只有一句代码:print(1)
然后执行:
python app.py
这时候,系统就会调用虚拟环境中的 python 解释器来执行这些代码了
第 3 章:更新 pyenv
由于我们是 git 克隆的,所以更新非常简单
cd ~/.pyenv
或者 cd $(pyenv root)
git pull
第 4 章:卸载 pyenv
由于 pyenv 把一切都放在 ~/.pyenv 下了,所以卸载很方便,两个步骤就行了
首先你需要删除环境变量
然后你需要执行:
rm -rf ~/.pyenv
或者 rm -rf $(pyenv root)
作者:JoiT
链接:https://www.jianshu.com/p/3e93311fe6cb
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
pip下载库超时Connection to files.pythonhosted.org timed out问题解决(换源)
1、国内镜像大全
阿里云 http://mirrors.aliyun.com/pypi/simple/
中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/
豆瓣(douban) http://pypi.douban.com/simple/
清华大学 https://pypi.tuna.tsinghua.edu.cn/simple/
中国科学技术大学 http://pypi.mirrors.ustc.edu.cn/simple/
2、换源命令
临时:pip命令+ -i +镜像地址。例如 pip install numpy -i https://mirrors.aliyun.com/pypi/simple/
永久:在更新到最新版本pip后,pip config set global.index-url+国内镜像地址,例如
pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/
ubuntu编译安装php7
https://www.php.net/downloads.php
下载php7源码解压
下载 https://github.com/kkos/oniguruma 源码编译安装或者不使用mbstring的正则功能,即在“--enable-mbstring”后再添加“--disable-mbregex”参数。这样的配置将不再需要oniguruma库
./configure \
--prefix=/usr/local/php7 \
--exec-prefix=/usr/local/php7 \
--bindir=/usr/local/php7/bin \
--sbindir=/usr/local/php7/sbin \
--includedir=/usr/local/php7/include \
--libdir=/usr/local/php7/lib/php \
--mandir=/usr/local/php7/php/man \
--with-zip \
--enable-pdo \
--enable-inline-optimization \
--enable-shared \
--enable-xml \
--enable-bcmath \
--enable-shmop \
--enable-sysvsem \
--enable-mbregex \
--enable-mbstring \
--enable-ftp \
--enable-pcntl \
--enable-sockets \
--enable-fileinfo \
--enable-filter \
--enable-soap \
--enable-session \
--enable-opcache \
--enable-fpm \
--disable-debug \
--disable-rpath \
--with-config-file-path=/usr/local/php7/etc \
--with-mysql-sock=/var/run/mysql/mysql.sock \
--with-mhash \
--with-openssl \
--with-mysqli=mysqlnd \
--with-pdo-mysql=mysqlnd \
--enable-gd \
--with-iconv \
--with-zlib \
--with-xmlrpc \
--with-gettext \
--with-curl \
--with-fpm-user=php \
--with-fpm-group=php \
--with-pear=/usr/local/php7/bin
sudo make && make install
将/usr/local/php7加入环境变量
增加php-fpm命令:
sudo cp sapi/fpm/init.d.php-fpm /usr/local/php7/bin/php-fpm
sudo chmod +x /usr/local/php7/bin/php-fpm
初始化 PHP 和 PHP-FPM 的配置
sudo cp php.ini-production /usr/local/php7/etc/php.ini
sudo cp /usr/local/php7/etc/php-fpm.conf.default /usr/local/php7/etc/php-fpm.conf
将PHP-FPM加入系统服务
cp sapi/fpm/php-fpm.service /etc/systemd/system/
chmod +x /etc/systemd/system/php-fpm.service
设置开机自启以及开启服务:
systemctl enable php-fpm.service
systemctl start php-fpm.service
用Privoxy实现SOCKS代理转HTTP
这段时间为了出去看看,陆陆续续的折腾各种穿墙术。今天开始折腾用Bitvise做代理,过程很简单,唯一的问题就是Bitvise只支持SOCKS和HTTPS协议,而像我的Lumia800或者同学的Surface只支持HTTP。所以需要用Privoxy来实现SOCKS转HTTP。
Privoxy的原理就是监听HTTP代理的端口,把数据转成SOCKS协议,再发给SOCKS代理端口。
Privoxy官网: http://www.privoxy.org/
下载安装后,找到Options > Edit Main Configurationg打开配置文件,找到
# forward-socks5 / 127.0.0.1:9050 .
,去掉#号注释,把后面的IP和端口号改为SOCKS的端口号。然后再找到
listen-address 127.0.0.1:8118
在这里可以修改HTTP代理的IP和端口号,如果只对本机服务,默认的127.0.0.1即可,要公开服务,可以填写0.0.0.0,这样局域网中所有用户都可以通过这台主机代理上网。
然后重启一下Privoxy,不出意外的话已经可以通过HTTP代理上网了。
ECS无外网IP访问外网(NAT网关)
说明
阿里云CentOS 7无外网IP的ECS访问外网,有两台以上ECS实例,其中只有一台分配了公网IP,无外网IP的ECS需要访问外网
1
自建NAT网关配置SNAT和DNAT转发规则
阿里云-NAT网关(推荐:需要外网访问内网时使用,绑定弹性公网IP,减少端口冲突)(要钱)
搭建NAT网关就是为了实现在相同VPC内,没有公网IP的ECS借助有公网的ECS访问外网,或者是外网通过端口映射访问到内网服务器。
SNAT:实现没有公网IP的ECS实例借助有公网的ECS访问外网,但是外网无法访问到内网IP;
DNAT:实现外网通过端口映射访问到内网服务器,但是不能实现内网ECS访问到外网。
自建NAT网关配置SNAT和DNAT转发规则
centos7 为例,在有公网的ECS(192.168.0.81)上操作:
设置SNAT规则
# 开启转发
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
# 生效
sysctl -p
# 配置iptables做SNAT:iptables -t nat -I POSTROUTING -s VPC的IP段 -j SNAT --to-source 有公网IP的ECS内网IP
iptables -t nat -I POSTROUTING -s 192.168.0.0/24 -j SNAT --to-source 192.168.0.81
# iptables规则重启会清空,永久生效,还需要保存在iptables配置文件中:
service iptables save
# 如果没有安装iptables
service iptables status #检查是否安装了iptables
yum install -y iptables #安装iptables
yum update iptables #升级iptables
yum install iptables-services #安装iptables-services
systemctl enable iptables.service # 设置防火墙开机启动
————————————————
设置VPC路由条目
阿里云 -> 专有网络 -> 管理 -> 路由表 -> 管理 -> 添加路由条目
设置DNAT规则
# 将192.168.0.81的公网 80 端口映射给192.168.0.82
# iptables -t nat -I PREROUTING -p tcp --dport 有公网IP的ECS端口号 -j DNAT --to 目标内网ECS的内网IP
# iptables -t nat -I POSTROUTING -p tcp --dport 有公网IP的ECS端口号 -j MASQUERADE
iptables -t nat -I PREROUTING -p tcp --dport 80 -j DNAT --to 192.168.0.82
iptables -t nat -I POSTROUTING -p tcp --dport 80 -j MASQUERADE
service iptables save
————————————————
前后端口映射不一致,需在/etc/sysconfig/iptables文件nat表的dnat转发规则(目标IP)后面,直接加特定的端口号就行:
重启iptables使规则生效:
systemctl restart iptables.service
参考:三步搭建VPC专有网络NAT网关,配置SNAT和DNAT规则
CentOS7安装iptables防火墙
阿里云-NAT网关
使用场景:
iptables规则冲突。如果ECS内安装了docker,docker自带的nat转发规则会有影响,需要合理的网段规划和路由规划。
外网端口占用过大,加上需要部署如:Rancher这种容器集群平台,还是推荐搭建使用阿里云-NAT网关,以绑定弹性公网IP的方式实现,这样就不需要占用ECS实例上的公网端口
————————————————
pycurl libcurl link-time ssl backend (openssl) is different from compile-time ssl backend (none/other)
export PYCURL_SSL_LIBRARY=openssl
pip install pycurl --compile --no-cache-dir --global-option=build_ext --global-option="-L/usr/local/opt/openssl/lib" --global-option="-I/usr/local/opt/openssl/include"
红外遥控接收发射原理及ESP8266实现
红外遥控一般有发射和接收两部分组成,发射元件为红外发射管,接收一般采用一体化红外接收头,但发射载波频率与接收头固定频率需一致才能正确接收。
一、发射
1. 调制
红外遥控是以调制方式发射数据,将数据调制到固定的载波上发送,调制发送抗干扰能力更强,传送距离也更远。红外发送首先要解决的就是调制问题。
目前主流的调制方式有PPM和PWM。
- PPM:脉冲位置调制,调制脉冲宽度不变,用脉冲间隔来区分0和1。如下图所示,脉冲宽度不变都是560us,脉冲间隔改变。逻辑1总时间为2.25ms,逻辑0中时间长度为1.12ms。
图1:PPM调制
- PWM:脉冲宽度调制,脉冲间隔不变,调制脉冲宽度改变。如下图所示,脉冲间隔
为600us,脉冲宽度不同。逻辑1高电平时间为1.2ms,逻辑0高电平时间为0.6ms。
图2:PWM调制
调制载波频率一般在30KHz到60KHz之间,常用的载波有33K,36K,36.6K,38K,40K,56K等,其中38K使用最多。
常用占空比有1/3、1/2,1/3最多。
2. 红外传输协议
常用的红外传输协议有ITT协议、NEC协议、Nokia NRC协议、Sharp协议、Philips
RC-5、RC-6 RECS-80协议、Sony SIRC协议等,其中最常见的为NEC协议。
常见NEC协议分析:
l 载波38KHz,逻辑1为2.25ms,脉冲时间560us;逻辑0为1.12ms,脉冲时间560us
图3:NEC逻辑’0’与逻辑’1’
l 协议格式
图4:NEC红外载波发送协议
(1) 首先发送9ms的高电平脉冲
(2) 然后发送4.5ms的低电平
(3) 接下来是8bit的地址码(低位在前)
(4) 然后是8bit的地址反码,用于检验地址码是否出错
(5) 接下来的是8bit的命令码(低位在前)
(6) 然后是8bit的命令反码,用于检验命令码是否出错。
l 重复码
图5:NEC重复发送载波协议
如果一直按着一个键,将以110ms为周期发送重复码,重复码由9ms高电平、2.25ms低电平及560us高电平组成。
图6:NEC重复码
3. 编码
虽然不同协议都对各自的协议格式做了不同定义,但总体而言还是有高低电平组成的一串数据。
对于红外发射,就是按照协议规定高电平时间内,在红外输出口输出固定频率载波;低电平则直接输出低。红外接收头接到载波时输出高电平,没有载波时输出低电平,完成数据解码。
图7:NEC解码后协议
二、接收
红外接收常采用一体化红外接收头,集红外接收、放大、滤波、比较器输出等功能,并输出MCU可识别的TTL信号的。常用的一体化红外接收头有SCR638、HS0038、VS1838等。
SCR638
HS0038
图8:一体化接收头
红外接收应用电路图:
图9:红外接收典型应用
三、ESP8266红外发送与接收
ESP8266定义了1个IR红外遥控接口,IR红外遥控接口由软件实现,接口定义如下:
图10:ESP8266红外管脚定义
1. 发送
在ESP8266上用于发送的载波可以通过以下方式实现:
1) I2S的BCK
2) WS管脚产生
3) 由GPIO中的sigma-delta功能在任意GPIO口产生载波。
其中sigma-delta产生的载波占空比约为20%,推荐使用MTMS管脚(GPIO14),可产生准确的38KHz且占空比为50%的标准方波。
2. 接收
红外接收功能通过GPIO的边沿中断实现,读取系统时间,将2次时间相减可以得到波形持续时间,然后通过软件逻辑实现红外协议处理。
格力空调红外遥控器编码详解
可以用于制作格力红外遥控器,这里边有它的编码定义。
格力小王子

- 送风:
- 自动:
- 除湿:
- 制冷:
- 制热:
温度
|
9-12位
|
65-68位
|
30
|
0111
|
1000
|
29
|
1011
|
0000
|
28
|
0011
|
1111
|
27
|
1101
|
0111
|
26
|
0101
|
1011
|
25
|
1001
|
0011
|
24
|
0001
|
1101
|
23
|
1110
|
0101
|
22
|
0110
|
1001
|
21
|
1010
|
0001
|
20
|
0010
|
1110
|
19
|
1100
|
0110
|
18
|
0100
|
1010
|
17
|
1000
|
0010
|
16
|
0000
|
1100
|
温度
|
9-12位
|
65-68位
|
30
|
0111
|
0010
|
29
|
1011
|
1100
|
28
|
1101
|
0100
|
27
|
1101
|
1000
|
26
|
0101
|
0000
|
25
|
1001
|
1111
|
24
|
0001
|
0111
|
23
|
1110
|
1011
|
22
|
0110
|
0011
|
21
|
1010
|
1101
|
20
|
0010
|
0101
|
19
|
1100
|
1001
|
18
|
0100
|
0001
|
17
|
1000
|
1110
|
16
|
0000
|
0110
|
温度
|
9-12位
|
65-68位
|
30
|
0111
|
0100
|
29
|
1011
|
1000
|
28
|
0011
|
0000
|
27
|
1101
|
1111
|
26
|
0101
|
0111
|
25
|
1001
|
1011
|
24
|
0001
|
0011
|
23
|
1110
|
1101
|
22
|
0110
|
0101
|
21
|
1010
|
1001
|
20
|
0010
|
0001
|
19
|
1100
|
1110
|
18
|
0100
|
0110
|
17
|
1000
|
1010
|
16
|
0000
|
0010
|
温度
|
9-12位
|
65-68位
|
30
|
0111
|
1100
|
29
|
1011
|
0100
|
28
|
0011
|
1000
|
27
|
1101
|
0000
|
26
|
0101
|
1111
|
25
|
1001
|
0111
|
24
|
0001
|
1011
|
23
|
1110
|
0011
|
22
|
0110
|
1101
|
21
|
1010
|
0101
|
20
|
0010
|
1001
|
19
|
1100
|
0001
|
18
|
0100
|
1110
|
17
|
1000
|
0110
|
16
|
0000
|
1010
|
时间
|
13-20位
|
0.5
|
10010000
|
1
|
00011000
|
1.5
|
10011000
|
2
|
00010100
|
2.5
|
10010100
|
3
|
00011100
|
3.5
|
10011100
|
4
|
00010010
|
4.5
|
10010010
|
5
|
00011010
|
5.5
|
10011010
|
6
|
00010110
|
6.5
|
10010110
|
7
|
00011110
|
7.5
|
10011110
|
8
|
00010001
|
8.5
|
10010001
|
9
|
00011001
|
9.5
|
10011001
|
10
|
01010000
|
10.5
|
11010000
|
11
|
01011000
|
11.5
|
11011000
|
12
|
01010100
|
12.5
|
11010100
|
13
|
01011100
|
13.5
|
11011100
|
14
|
01010010
|
14.5
|
11010010
|
15
|
01011010
|
15.5
|
11011010
|
16
|
01010110
|
16.5
|
11010110
|
17
|
01011110
|
17.5
|
11011110
|
18
|
01010001
|
18.5
|
11010001
|
19
|
01011001
|
19.5
|
11011001
|
20
|
00110000
|
20.5
|
10110000
|
21
|
00111000
|
21.5
|
10111000
|
22
|
00110100
|
22.5
|
10110100
|
23
|
00111100
|
23.5
|
10111100
|
24
|
00110010
|
0
|
00000000
|
MGQ 2012-04-141、 格力YB0F2红外信号命令格式
Bit:1~3
|
4
|
5~6
|
7
|
8
|
|||
模式
|
开关机(CMD2 32bit取反)
|
风速
|
是否扫风
|
是否睡眠
|
|||
9~12
|
13~16
|
||||||
温度
|
睡眠1
|
||||||
17~20
|
21
|
22
|
23
|
24
|
|||
睡眠2
|
超强
|
灯光
|
健康
|
干燥/辅热
|
|||
25
|
26
|
27
|
28
|
29
|
30
|
31
|
32
|
换气
|
0
|
0
|
0
|
1
|
0
|
1
|
0
|
33
|
34
|
35
|
|||||
0
|
1
|
0
|
Bit:1
|
2
|
3
|
4
|
5
|
6
|
7
|
8
|
上下扫风
|
0
|
0
|
0
|
左右扫风
|
0
|
0
|
0
|
9~10
|
11
|
12
|
13
|
14
|
15
|
16
|
|
显示温度
|
0
|
0
|
0
|
0
|
0
|
0
|
|
17
|
18
|
19
|
20
|
21
|
22
|
23
|
24
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
25
|
26
|
27
|
28
|
29~32
|
|||
0
|
0
|
0
|
0
|
温度
|
MySQL error: table is marked as crashed and should be repaired
You may experience crashed MyISAM tables in MySQL from times to times, especially after a forced shutdown (kill -9
) of MySQL or a crash of the entire server.
The errors will look like this in your logs. InnoDB has good crash recovery on its own and will probably never give you these errors as it self-repairs upon MySQL restart.
[ERROR] /usr/libexec/mysqld: Table './dbname/table_name' is marked as crashed and should be repaired [ERROR] /usr/libexec/mysqld: Table './dbname/table_name' is marked as crashed and should be repaired [ERROR] /usr/libexec/mysqld: Table './dbname/table_name' is marked as crashed and should be repaired
You can also find broken tables with the myisamchk tool that is provided by the MySQL server installation.
# myisamchk -s /var/lib/mysql/*/*.MYI MyISAM-table '/var/lib/mysql/dbname/table_name.MYI' is marked as crashed and should be repaired
The above command will show you each table that is in need of repair.
If a table is reported as damaged, repair it with that same tool.
# myisamchk -r /var/lib/mysql/dbname/table_name.MYI
That solves the problem in most cases. If it doesn't, make sure to stop your webservice (so no new MySQL requests are being made), stop the MySQLd daemon itself and run the following command.
# myisamchk -r --update-state /var/lib/mysql/dbname/table_name.MYI
The --update-state
tells MySQL to mark the table as "checked". Restart your MySQLd and webservice and you should be good go to.
If you're up for more mild reading, have a look at the good documentation of MySQL itself on MyISAM repairs.
Try running the following query:
repair table <table_name>;
mysqlcheck -r --all-databases -u root -p