So Tired !_! 逆水行舟, 不进则退!

5Dec/19

小米小白摄像头云台版无法更新固件

Posted by Nick Xu

之前买的小米的米家的 小白智能摄像机 摄像头 1080P云台版

之前用的好好的,前不久,无法正常升级固件了:

进去了固件升级页面

当前版本:3.3.6_2018061418

最新版本:3.3.6_2018121218

升级后,还是旧版本

更郁闷的是:监控界面中

(此刻已断点,所以是离线)

反应非常迟钝:

点击摄像头移动方向,结果半天才反应

而且录制存储的历史视频,也是点击了半天才能看,而且很卡顿,不流畅。

之前是正常的。

最近这,无法升级,也不能正常使用。

想办法去解决。

看到

使用帮助中有个我要的:无法在线升级了怎么办

摄像机获取失败/黄灯常亮/无法在线升级怎么办?

您好,出现此问题可以尝试使用SD卡升级,具体方法如下:

1、使用读卡器将Micro-SD卡与电脑连接

2、在电脑端打开链接: http://cdn.cnbj2.fds.api.mi-img.com/chuangmi-cdn/product/ipc004/firmware/IPC004_3.3.6_2018061418.zip

3、下载固件文件:IPC004_3.3.6_2018061418.zip,下载成功后右击鼠标,选择“解压到当前文件夹”,点击进入文件夹

4、将 tf_recovery.img文件(不要解压)复制到Micro-SD卡里,不要放在任何文件夹下

5、摄像机断电->插入Micro-SD卡->摄像机插上电

6、此时摄像机 “黄灯常亮”,持续亮大概2分钟

7、升级成功后,设备自动启动,进入摄像机设置-通用设置-检查固件更新:版本号:3.3.6_2018061418

注:Micro-SD卡升级成功后,卡中的升级包名称,也会变更为:tf_recovery.img.bak

即,用SD卡升级。

所以去拔出摄像头的SD卡(注意:SD卡在摄像头 黑色的圆圈的下面一点,让摄像头方面向上调整,就看到了)

然后接着去想办法去通过SD卡升级固件

之前看到是:

当前版本:3.3.6_2018061418

最新版本:3.3.6_2018121218

此处提示的是:

http://cdn.cnbj2.fds.api.mi-img.com/chuangmi-cdn/product/ipc004/firmware/IPC004_3.3.6_2018061418.zip

不是最新版,试试最新版的地址:

http://cdn.cnbj2.fds.api.mi-img.com/chuangmi-cdn/product/ipc004/firmware/IPC004_3.3.6_2018121218.zip

能否下载,是可以的,下载后,解压得到:

好不容易,找了个micro sd卡读卡器,插上后,mac识别无法支持,所以去格式化为FAT:

然后拷贝进去tf_recovery.img:

即可。

然后放回到摄像头中,去重新上电,看看是否可以正常升级

的确常亮黄灯了:

稍等一下,然后

就正常使用了,可以正常快速的移动摄像头方向了:

去看了看固件版本也是最新的了:

当前版本:3.3.6_2018121218

存储卡也是正常的:

后记:

搜:

http://cdn.cnbj2.fds.api.mi-img.com

基本概念 · Xiaomi Galaxy FDS Doc

http://docs.api.xiaomi.com/fds/basic-concept.html

cnbj2

北京2区

北京-金山云

cnbj2

cnbj2.fds.api.xiaomi.com

cdn.cnbj2.fds.api.mi-img.com

-》

是金山云的cdn的存储

http://cdn.cnbj2.fds.api.mi-img.com/cdn/aqara/documents/Aqara_Product_Brochure.pdf

MI home security camera 360 (MIXJ04CM) – Page3 – Mi Gadgets – Xiaomi MIUI Official Forum

https://en.miui.com/thread-4999422-3-1.html

好像最新版本是:

http://cdn.cnbj2.fds.api.mi-img.com/chuangmi-cdn/product/ipc003/firmware/IPC003_3.4.5_2019010211.zip

-》不一定是适配当前相机的,

看到了,自己此处的地址:

http://cdn.cnbj2.fds.api.mi-img.com/chuangmi-cdn/product/ipc004/firmware/IPC004_3.3.6_2018121218.zip

中:

product=ipc004

上面的是:

product=ipc003

所以不是我们要的

试了试部分的地址直接打开,是不行的

http://cdn.cnbj2.fds.api.mi-img.com ipc004

小米智能摄像机云台版为何不能更新 – 小米社区官方论坛

http://bbs.xiaomi.cn/t-35016196

XIAOMI MIJIA 360 720P I THINK ITS BRICK. – Page2 – Mi Gadgets – Xiaomi MIUI Official Forum

https://en.miui.com/thread-1491166-2-1.html

关于米家智能摄像机在Android手机获取信息失败和苹果手机-1000问题 – 小米社区官方论坛

http://www.hfsgcjs.com/6727/t-34807300-u227177747

【总结】

对于此处的

小白智能摄像机 摄像头 1080P云台版

从产品中的帮助:

右上角设置-》使用帮助-》摄像头获取失败/黄灯常亮/无法在线升级失败怎么办?

摄像机获取失败/黄灯常亮/无法在线升级怎么办?

您好,出现此问题可以尝试使用SD卡升级,具体方法如下:

1、使用读卡器将Micro-SD卡与电脑连接

2、在电脑端打开链接: http://cdn.cnbj2.fds.api.mi-img.com/chuangmi-cdn/product/ipc004/firmware/IPC004_3.3.6_2018061418.zip

3、下载固件文件:IPC004_3.3.6_2018061418.zip,下载成功后右击鼠标,选择“解压到当前文件夹”,点击进入文件夹

4、将 tf_recovery.img文件(不要解压)复制到Micro-SD卡里,不要放在任何文件夹下

5、摄像机断电->插入Micro-SD卡->摄像机插上电

6、此时摄像机 “黄灯常亮”,持续亮大概2分钟

7、升级成功后,设备自动启动,进入摄像机设置-通用设置-检查固件更新:版本号:3.3.6_2018061418

注:Micro-SD卡升级成功后,卡中的升级包名称,也会变更为:tf_recovery.img.bak

得知升级流程。

而从产品固件升级失败的页面可以看到最新版本是:3.3.6_2018121218

所以下载地址是:

http://cdn.cnbj2.fds.api.mi-img.com/chuangmi-cdn/product/ipc004/firmware/IPC004_3.3.6_2018121218.zip

下载后,解压得到tf_recovery.img

放到sd卡根目录,插上,上电,等一会,就好了。

去看看最新版本,果然是最新的:3.3.6_2018121218

备注说明:

(1)其他不同型号的摄像头的产品编号和固件升级地址

Filed under: 其它 Comments Off
7Nov/19

用Privoxy实现SOCKS代理转HTTP

Posted by Nick Xu

这段时间为了出去看看,陆陆续续的折腾各种穿墙术。今天开始折腾用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代理上网了。

Filed under: Linux Comments Off
30Oct/19

ECS无外网IP访问外网(NAT网关)

Posted by Nick Xu

说明
阿里云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 # 设置防火墙开机启动
# 开启转发
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
# 将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实例上的公网端口
————————————————

Filed under: Linux Comments Off
25Aug/19

‘caching_sha2_password’ cannot be loaded

Posted by Nick Xu

django访问mysql数据库报错:

django.db.utils.OperationalError: (2059, "Authentication plugin 'caching_sha2_password' cannot be loaded: dlopen(/usr/local/Cellar/mysql-connector-c/6.1.11/lib/plugin/caching_sha2_password.so, 2): image not found")

mysql8.0用户密码加密方式为caching_sha2_password,django暂不支持,需要修改下mysql的加密方式:

登录mysql:

mysql -u root -p

查看当前加密方式:

use mysql;
select user,plugin from user where user='root';

修改加密方式:

alter user 'root'@'localhost' identified with mysql_native_password by 'password';

生效:

flush privileges;

作者:倪大头
链接:https://www.jianshu.com/p/939eb5157e83
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

Filed under: Mac OS, 数据库 Comments Off
21Aug/19

mac解决安装mysql-python错误my_config.h

Posted by Nick Xu

brew install mysql
brew unlink mysql
brew install mysql-connector-c
sed -i -e 's/libs="$libs -l "/libs="$libs -lmysqlclient -lssl -lcrypto"/g' /usr/local/bin/mysql_config
pip install MySQL-python
brew unlink mysql-connector-c
brew link --overwrite mysql

出现下列错误:

ld: library not found for -lssl

解决:

sudo env LDFLAGS="-I/usr/local/opt/openssl/include -L/usr/local/opt/openssl/lib" pip install MySQL-python

Filed under: Mac OS, Python Comments Off
19Aug/19

macOS Sierra 合上盖子不休眠的问题及解决办法

Posted by Nick Xu

一.问题(15年款的mbp)

本人上个月买的macbook pro,刚开始每天晚上睡觉都是直接合上盖子(开着一堆程序)系统会自动休眠,但是自从前几天升级了新系统Sierra之后就发现合上盖子竟然没有休眠(第二天早上起来发现掉了50%多的电,而且温度堪比暖宝宝),而且有个同事更新Sierra后也产生了和我一样的问题,经过上网查找及调试终于发现问题所在。

系统信息.png

二.解决

1.快速方法

如果是跟我一样在没更新系统之前休眠没有任何问题但是更新之后合上盖子无法休眠,请打开--系统偏好设置->节能->电池,会看到这一栏

节能-电池.png

如果你的电脑这里显示的是2分钟,那么打开terminal终端

终端.png

然后输入pmset -g custom 检查一下电源参数

电源相关参数

看到第二个红框(电池电源参数),然后往下找到displaysleep,sleep,和disksleep参数(找不到可以参考图片里面的红线),这三个参数的意思,我引用网络上的解答

displaysleep
Mac闲置多长时间后进入显示器睡眠,单位是分钟,这个时间不能长于sleep下设置的时间
sleep
Mac闲置多长时间后进入睡眠,这个系统偏好设置里也有,单位是分钟
disksleep
Mac闲置多长时间后关闭硬盘。这个系统偏好里也有,只不过换了一个字眼—如果可能,使硬盘进入睡眠—勾上这个的话系统就会自动根据sleep的时间设一个合适的时间。单位是秒,这个时间不能长于sleep下设置的时间

  • 时间的长度比较:sleep>=displaysleep>=disksleep
    从图中看出disksleep单位是秒,一般都是最短的,而sleep和displaysleep是单位是分,系统要求是sleep的时间要大于等于displaysleep的时间,而我图里sleep(1)小于display(2),它们之间的时间冲突了导致mac在电池状态下没有正常进入休眠,所以你需要回到--系统偏好设置->节能->电池,把时间改成5分钟(反正要大于2)就可以了,改完后这时在terminal输入pmset -g custom 对比这3个参数

    修改之后.png

只要符合sleep(min)>=displaysleep(min)>=disksleep就可以了,这样mac就可以正常休眠了。
ps:这个诡异的系统设置是15年款的macbook升级到sierra后有的,因为我找了很多同事的对比,他们captian系统的电源参数都是正常符合上述的式子的,可以正常休眠,然后15年款之前的升级到sierra参数也符合,就我和另外几个15年款的mac升级sierra后出现无法休眠问题。

2.其他导致无法休眠的原因及解决办法

  • 如果不是上述原因的话,那么就是你可能下载了某些软件会在mac合上盖子还会唤醒mac从而阻止休眠,这时候打开活动监视器然后点能耗查看,把防止睡眠中如果有程序是“是”就改成“否”。
    活动监视器
  • 重置SMC
  • 如果还不行,在terminal终端输入pmset -g assertions 可以查看日志,查出是什么程序唤醒,然后关闭,这里网上有许多教程:
    传送门1
    传送门2
    苹果官方文档

作者:codychen123
链接:https://www.jianshu.com/p/7b55f2bb3cbd
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

Filed under: Mac OS Comments Off
15Aug/19

pycurl libcurl link-time ssl backend (openssl) is different from compile-time ssl backend (none/other)

Posted by Nick Xu

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"

Tagged as: Comments Off
19Jun/19

红外遥控接收发射原理及ESP8266实现

Posted by Nick Xu

红外遥控是利用近红外光进行数据传输的一种控制方式。近红外光波长0.76um~1.5um,红外遥控收发器件波长一般为0.8um~0.94um,具有传输效率高,成本低,电路实现简单,抗干扰强等特点,在家用电器上被广泛使用。

红外遥控一般有发射和接收两部分组成,发射元件为红外发射管,接收一般采用一体化红外接收头,但发射载波频率与接收头固定频率需一致才能正确接收。

一、发射

1. 调制

红外遥控是以调制方式发射数据,将数据调制到固定的载波上发送,调制发送抗干扰能力更强,传送距离也更远。红外发送首先要解决的就是调制问题。

目前主流的调制方式有PPMPWM

  • PPM:脉冲位置调制,调制脉冲宽度不变,用脉冲间隔来区分01。如下图所示,脉冲宽度不变都是560us,脉冲间隔改变。逻辑1总时间为2.25ms,逻辑0中时间长度为1.12ms

 

1PPM调制

  • PWM:脉冲宽度调制,脉冲间隔不变,调制脉冲宽度改变。如下图所示,脉冲间隔
    600us,脉冲宽度不同。逻辑1高电平时间为1.2ms,逻辑0高电平时间为0.6ms

 

2PWM调制

调制载波频率一般在30KHz60KHz之间,常用的载波有33K36K36.6K38K40K56K等,其中38K使用最多。

常用占空比有1/31/21/3最多。

2. 红外传输协议

常用的红外传输协议有ITT协议、NEC协议、Nokia NRC协议、Sharp协议、Philips
RC-5
RC-6 RECS-80协议、Sony SIRC协议等,其中最常见的为NEC协议。

常见NEC协议分析:

载波38KHz,逻辑12.25ms,脉冲时间560us;逻辑01.12ms,脉冲时间560us

 

3NEC逻辑’0’与逻辑’1’

l 协议格式

 

4NEC红外载波发送协议

(1) 首先发送9ms的高电平脉冲

(2) 然后发送4.5ms的低电平

(3) 接下来是8bit的地址码(低位在前)

(4) 然后是8bit的地址反码,用于检验地址码是否出错

(5) 接下来的是8bit的命令码(低位在前)

(6) 然后是8bit的命令反码,用于检验命令码是否出错。

l 重复码

5NEC重复发送载波协议

如果一直按着一个键,将以110ms为周期发送重复码,重复码由9ms高电平、2.25ms低电平及560us高电平组成。

 

6NEC重复码

3. 编码

虽然不同协议都对各自的协议格式做了不同定义,但总体而言还是有高低电平组成的一串数据。

对于红外发射,就是按照协议规定高电平时间内,在红外输出口输出固定频率载波;低电平则直接输出低。红外接收头接到载波时输出高电平,没有载波时输出低电平,完成数据解码。

 

7NEC解码后协议

二、接收

红外接收常采用一体化红外接收头,集红外接收、放大、滤波、比较器输出等功能,并输出MCU可识别的TTL信号的。常用的一体化红外接收头有SCR638HS0038VS1838等。

      

SCR638

HS0038

8:一体化接收头

 

红外接收应用电路图:

9:红外接收典型应用

三、ESP8266红外发送与接收

ESP8266定义了1IR红外遥控接口,IR红外遥控接口由软件实现,接口定义如下:

10ESP8266红外管脚定义

1. 发送

ESP8266上用于发送的载波可以通过以下方式实现:

1) I2SBCK

2) WS管脚产生

3) GPIO中的sigma-delta功能在任意GPIO口产生载波。

其中sigma-delta产生的载波占空比约为20%,推荐使用MTMS管脚(GPIO14),可产生准确的38KHz且占空比为50%的标准方波。

2. 接收

红外接收功能通过GPIO的边沿中断实现,读取系统时间,将2次时间相减可以得到波形持续时间,然后通过软件逻辑实现红外协议处理。

 

Filed under: 嵌入式 Comments Off
15May/19

格力空调红外遥控器编码详解

Posted by Nick Xu

可以用于制作格力红外遥控器,这里边有它的编码定义。
格力小王子

一、基本信息:
型号:YB0F2
采用脉冲间距调制。

 

图1:示波器获取波形

 

报头脉冲:9ms
报头间距:4.5ms
载波频率:37.9KHz(38KHz)
码段1与码段2间距:20ms
“1”:脉宽,656us。间距,1640us。
“0”:脉宽,656us。间距,544us。

 

二、编码信息:
1-3位:模式
  • 送风:
图标:风扇。代码:110
  • 自动:
图标:循环箭头。代码:000
  • 除湿:
图标:水滴。代码:010
  • 制冷:
图标:雪花。代码:100
  • 制热:
图标:太阳。代码:001
4位(加68位):开机关机
开机:1
关机:068位取反。
5-6位:风速
一级:10
二级:01
三级:11
自动:00
73741(加65位):扫风
上下扫风110。第65位取反
左右扫风:101
上下左右:111
无扫风:000
8位:睡眠
睡眠:1
不睡眠:0
9-12位与65-68位:温度
制冷模式下:
温度
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位:睡眠定时
时间
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
21位:超强
超强:1
普通:0
22位:灯光
亮:1
灭:0
23位与25位:健康,换气
健康:10
换气:01
健康+换气:11
普通:00
24位:制冷模式下-干燥;制热模式下-辅热;
干燥:1
普通:0
45-46位:显示温度
不显示:00
显示:10
显示室内温度:01
显示室外温度:11
其他位:
除了293134位为“1”外,均为“0。其他位功能不详(遥控器无对应项)。
36位和69位分别是码段1和码段2的最后一位,无所谓“0”“1”。
三、其他说明
自动模式下只可以设置的项目有:风速123级、自动;上上下左右扫风;显示温度;灯光;睡眠定时(非睡眠)。其他项均不可以设置。此时温度不可设置,温度段的代码为:10011101

 

关机状态下,可以设置定时开机,代码与睡眠定时关机一样。也可以设置灯光。
制冷模式下,可以设置的项有:温度;扫风;健康换气,节能(仅在此状态下可以设置);风速;定时;超强;睡眠;灯光;温度显示。
除湿模式下,可以设置的项有:温度;扫风;健康换气;干燥;温度显示;定时;睡;灯光。
送风模式下,可以设置的项有:温度;风速;健康换气;扫风;温度显示;定时;灯光。
制热模式下,可以设置的项有:温度;风速;扫风;辅热;温度显示;定时;超强;睡眠;灯光。

 


MGQ 2012-04-14
1、 格力YB0F2红外信号命令格式

红外信号主要包括CMD1和CMD2两部分,其中CMD1包括35 位的命令 和一位停止位,CMD2包括32位的命令和一位停止位。
表格 1 CMD1
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

 

表格 2 CMD2
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
温度

 

Filed under: 单片机 Comments Off
10May/19

深度学习:Keras入门(一)之基础篇

Posted by Nick Xu

1.关于Keras

1)简介

Keras是由纯python编写的基于theano/tensorflow的深度学习框架。

Keras是一个高层神经网络API,支持快速实验,能够把你的idea迅速转换为结果,如果有如下需求,可以优先选择Keras:

a)简易和快速的原型设计(keras具有高度模块化,极简,和可扩充特性)

b)支持CNN和RNN,或二者的结合

                c)无缝CPU和GPU切换

2)设计原则

a)用户友好:Keras是为人类而不是天顶星人设计的API。用户的使用体验始终是我们考虑的首要和中心内容。Keras遵循减少认知困难的最佳实践:Keras提供一致而简洁的API, 能够极大减少一般应用下用户的工作量,同时,Keras提供清晰和具有实践意义的bug反馈。

b)模块性:模型可理解为一个层的序列或数据的运算图,完全可配置的模块可以用最少的代价自由组合在一起。具体而言,网络层、损失函数、优化器、初始化策略、激活函数、正则化方法都是独立的模块,你可以使用它们来构建自己的模型。

c)易扩展性:添加新模块超级容易,只需要仿照现有的模块编写新的类或函数即可。创建新模块的便利性使得Keras更适合于先进的研究工作。

d)与Python协作:Keras没有单独的模型配置文件类型(作为对比,caffe有),模型由python代码描述,使其更紧凑和更易debug,并提供了扩展的便利性。

 

2.Keras的模块结构

 

3.使用Keras搭建一个神经网络

 

4.主要概念

1)符号计算

Keras的底层库使用Theano或TensorFlow,这两个库也称为Keras的后端。无论是Theano还是TensorFlow,都是一个“符号式”的库。符号计算首先定义各种变量,然后建立一个“计算图”,计算图规定了各个变量之间的计算关系。

符号计算也叫数据流图,其过程如下(gif图不好打开,所以用了静态图,数据是按图中黑色带箭头的线流动的):

2)张量

张量(tensor),可以看作是向量、矩阵的自然推广,用来表示广泛的数据类型。张量的阶数也叫维度。

0阶张量,即标量,是一个数。

1阶张量,即向量,一组有序排列的数

2阶张量,即矩阵,一组向量有序的排列起来

3阶张量,即立方体,一组矩阵上下排列起来

4阶张量......
依次类推

重点:关于维度的理解

假如有一个10长度的列表,那么我们横向看有10个数字,也可以叫做10维度,纵向看只能看到1个数字,那么就叫1维度。注意这个区别有助于理解Keras或者神经网络中计算时出现的维度问题。

3)数据格式(data_format)

目前主要有两种方式来表示张量:
a) th模式或channels_first模式,Theano和caffe使用此模式。
b)tf模式或channels_last模式,TensorFlow使用此模式。
下面举例说明两种模式的区别:
对于100张RGB3通道的16×32(高为16宽为32)彩色图,
th表示方式:(100,3,16,32)
tf表示方式:(100,16,32,3)
唯一的区别就是表示通道个数3的位置不一样。

4)模型

Keras有两种类型的模型,序贯模型(Sequential)和函数式模型(Model),函数式模型应用更为广泛,序贯模型是函数式模型的一种特殊情况。
a)序贯模型(Sequential):单输入单输出,一条路通到底,层与层之间只有相邻关系,没有跨层连接。这种模型编译速度快,操作也比较简单
b)函数式模型(Model):多输入多输出,层与层之间任意连接。这种模型编译速度慢。

 

5.第一个示例

这里也采用介绍神经网络时常用的一个例子:手写数字的识别。

在写代码之前,基于这个例子介绍一些概念,方便大家理解。

PS:可能是版本差异的问题,官网中的参数和示例中的参数是不一样的,官网中给出的参数少,并且有些参数支持,有些不支持。所以此例子去掉了不支持的参数,并且只介绍本例中用到的参数。

1)Dense(500,input_shape=(784,))

a)Dense层属于网络层-->常用层中的一个层

b) 500表示输出的维度,完整的输出表示:(*,500):即输出任意个500维的数据流。但是在参数中只写维度就可以了,比较具体输出多少个是有输入确定的。换个说法,Dense的输出其实是个N×500的矩阵。

c)input_shape(784,) 表示输入维度是784(28×28,后面具体介绍为什么),完整的输入表示:(*,784):即输入N个784维度的数据

2)Activation('tanh')

a)Activation:激活层

b)'tanh' :激活函数

3)Dropout(0.5)

在训练过程中每次更新参数时随机断开一定百分比(rate)的输入神经元,防止过拟合。

4)数据集

数据集包括60000张28×28的训练集和10000张28×28的测试集及其对应的目标数字。如果完全按照上述数据格式表述,以tensorflow作为后端应该是(60000,28,28,3),因为示例中采用了mnist.load_data()获取数据集,所以已经判断使用了tensorflow作为后端,因此数据集就变成了(60000,28,28),那么input_shape(784,)应该是input_shape(28,28,)才对,但是在这个示例中这么写是不对的,需要转换成(60000,784),才可以。为什么需要转换呢?

如上图,训练集(60000,28,28)作为输入,就相当于一个立方体,而输入层从当前角度看就是一个平面,立方体的数据流怎么进入平面的输入层进行计算呢?所以需要进行黄色箭头所示的变换,然后才进入输入层进行后续计算。至于从28*28变换成784之后输入层如何处理,就不需要我们关心了。(喜欢钻研的同学可以去研究下源代码)。

并且,Keras中输入多为(nb_samples, input_dim)的形式:即(样本数量,输入维度)。

5)示例代码

from keras.models import Sequential  
from keras.layers.core import Dense, Dropout, Activation  
from keras.optimizers import SGD  
from keras.datasets import mnist  
import numpy 
'''
    第一步:选择模型
'''
model = Sequential()
'''
   第二步:构建网络层
'''
model.add(Dense(500,input_shape=(784,))) # 输入层,28*28=784  
model.add(Activation('tanh')) # 激活函数是tanh  
model.add(Dropout(0.5)) # 采用50%的dropout

model.add(Dense(500)) # 隐藏层节点500个  
model.add(Activation('tanh'))  
model.add(Dropout(0.5))

model.add(Dense(10)) # 输出结果是10个类别,所以维度是10  
model.add(Activation('softmax')) # 最后一层用softmax作为激活函数

'''
   第三步:编译
'''
sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True) # 优化函数,设定学习率(lr)等参数  
model.compile(loss='categorical_crossentropy', optimizer=sgd, class_mode='categorical') # 使用交叉熵作为loss函数

'''
   第四步:训练
   .fit的一些参数
   batch_size:对总的样本数进行分组,每组包含的样本数量
   epochs :训练次数
   shuffle:是否把数据随机打乱之后再进行训练
   validation_split:拿出百分之多少用来做交叉验证
   verbose:屏显模式 0:不输出  1:输出进度  2:输出每次的训练结果
'''
(X_train, y_train), (X_test, y_test) = mnist.load_data() # 使用Keras自带的mnist工具读取数据(第一次需要联网)
# 由于mist的输入数据维度是(num, 28, 28),这里需要把后面的维度直接拼起来变成784维  
X_train = X_train.reshape(X_train.shape[0], X_train.shape[1] * X_train.shape[2]) 
X_test = X_test.reshape(X_test.shape[0], X_test.shape[1] * X_test.shape[2])  
Y_train = (numpy.arange(10) == y_train[:, None]).astype(int) 
Y_test = (numpy.arange(10) == y_test[:, None]).astype(int)

model.fit(X_train,Y_train,batch_size=200,epochs=50,shuffle=True,verbose=0,validation_split=0.3)
model.evaluate(X_test, Y_test, batch_size=200, verbose=0)

'''
    第五步:输出
'''
print("test set")
scores = model.evaluate(X_test,Y_test,batch_size=200,verbose=0)
print("")
print("The test loss is %f" % scores)
result = model.predict(X_test,batch_size=200,verbose=0)

result_max = numpy.argmax(result, axis = 1)
test_max = numpy.argmax(Y_test, axis = 1)

result_bool = numpy.equal(result_max, test_max)
true_num = numpy.sum(result_bool)
print("")
print("The accuracy of the model is %f" % (true_num/len(result_bool)))

 

Tagged as: Comments Off
site
site