• ESP8266 ESP-12E Flash NodeMCU Firmware / 刷NodeMCU固件

    After googling this topic, I used to think it’s easy to flash the firmware to an ESP-12/12E, just connect the wires and simply click will do it. However I encountered some problems and I managed to solve it. So I write this post to share my experience.

    My NodeMCU firmware is built on http://nodemcu-build.com/

    After flashing with esptoolnodemcu_flasher from bbs.nodemcu.com / official ESP8266 Flash Tool, the ESP-12E could not boot normaly, I got outputs from baudrate 115200 or 74880 such as:

    Fatal exception 28(LoadProhibitedCause):
    epc1=0x40224847, epc2=0x00000000, epc3=0x00000000, excvaddr=0x03001581, depc=0x00000000
    
     ets Jan  8 2013,rst cause:2, boot mode:(3,0)
    
    load 0x40100000, len 29804, room 16 
    tail 12
    chksum 0x4a
    ho 0 tail 12 room 4
    load 0x3ffe8000, len 2208, room 12 
    tail 4
    chksum 0xb7
    load 0x3ffe88a0, len 8, room 4 
    tail 4
    chksum 0xfb
    csum 0xfb
    don't use rtc mem data

    or

    Fatal exception 0(IllegalInstructionCause):
    epc1=0x40210354, epc2=0x00000000, epc3=0x00000000, excvaddr=0x00000000, depc=0x00000000
    
     ets Jan  8 2013,rst cause:2, boot mode:(3,0)
    
    load 0x40100000, len 29804, room 16 
    tail 12
    chksum 0x4a
    ho 0 tail 12 room 4
    load 0x3ffe8000, len 2208, room 12 
    tail 4
    chksum 0xb7
    load 0x3ffe88a0, len 8, room 4 
    tail 4
    chksum 0xfb
    csum 0xfb
    don't use rtc mem data

    It’s something like this post, maybe it’s not enough to flash firmware to 0x00 and esp_init_data_default.bin to 0x3fc000. What I know is that the chip can’t boot.

    After few days, I had an idea. I grabbed an NodeMCU Dev Board, and used esptool’s read_flash command to dump the 4 MByte flash:

    $ sudo esptool.py --port /dev/ttyUSB0 read_flash 0x00 4194304 4m.bin
     # 4194304 = 4*1024*1024  4MByte

    And, I successfully flashed it to an ESP-12E module by official ESP8266 Flash Tool with the config

    20160331135207After a restart, try using 115200 baudrate to connect it. And everything seems good.

     

    At last of this post, is my hardware connections and the 4MByte flash dump file. Make sure that GPIO0 is low if you want it to boot  flash mode and high(or float) for normal mode.

    20160331141407

    4MByte binary file: 4m.7z

     

    ================== Below is the Chinese version =======================

    本来以为刷个ESP-12E很简单的,但是我刷了就不行,后来找了个NodeMCU把它的flash整个读取了再整刷编程器固件就好了。

    后来做了个用GPIO0做输出的电路,但是之后发现容易导致GPIO0电平不对(GPIO0有连外部电路,开机时GPIO0大约只有1.7V,导致无限进入刷机模式,后来把外部输出换了,GPIO0悬空,开机时就变回高电平了)。感觉GPIO0、2、15还是不要乱来比较好。

     

     

    ================================================================

    Later I encountered a problem like

    “boot mode:(7,7)
    waiting for host”

    And the solution is that make sure GPIO15 is LOW, instead of float.

  • 京东被ISP劫持 怎么破?

    表现有两个:

    第一,会被跳转到如 http://www.jd.com/?utm_source=xxxxx&utm_medium=xxxxxx&utm_campaign=xxxxxx&utm_term=xxxx 这样的地址,百度一轮发现应该是TCP劫持。

    第二,在浏览商品时,页面被插入广告,按F12发现在<head>里面被插入了一段script。

     

    怎么破?

    1. 换DNS是没用的。
    2. 改host,或者配置路由器的dnsmasq。可以解决第二个问题。
    3. 使用https而不是http。在greasyfork找https的脚本,让它给 http://*.jd.com/* 自动跳转到https,可以解决问题一和二。这点还是阿里系做得好,全是https了。
    4. 找工信部投诉,从根本解决流氓行径。
  • 使用 IPv6 通过 SSH 代理上网

    服务器为Linux系统,要架设代理服务器,若是http/SOCKS代理则需要安装软件;若是用自带的ssh来作为代理,就可以少装一个软件。

    前提

    服务器与客户端均可用IPv6。

    SSH的配置

    打开/etc/ssh/sshd_config,保证 ListenAddress 没有禁止IPv6地址,然后找到下面的 AddressFamily ,把它默认的 inet 改为 any。(inet即仅IPv4,inet6为仅IPv6,any为二者都监听)

    重启SSH服务,运行

    netstat -a

    发现 tcp 和 tcp6 都有ssh的LISTEN,就对了。

    Windows客户端的连接

    我这里用的是putty,如果是其他系统或其他客户端,请自行百度相应教程。

    在putty中,填好服务器的IPv6地址和端口后,找到 Connection→SSH→Tunnels,输入一个本地端口,然后选择 Dynamic ,点 Add ,就可以连接了。认证完成,代理就可以用了。接下来就是在浏览器中配置一个 127.0.0.1:本地端口 的SOCKS5代理,大功告成。

    20160115162622

    OpenSSH 客户端的连接(Windows/Linux)

    如果是自带 OpenSSH 客户端,如 Windows 10 或各 Linux 发行版,一条命令即可解决(先在远程服务器放好SSH公钥):

    ssh -N -D 127.0.0.1:8888 root@remote_ip

  • 让 Aliyun ECS 支持 IPv6

    转自 https://i-meto.com/post/82/

    我校夜间断网,然而IPv6不受影响,手上有一个Aliyun的ECS,于是打算给ECS弄个IPv6,再架设一个代理。

    申请

    我们利用 HE.net 提供的免费 IPv6 隧道来实现,这种方法有一个前提,就是你的 VPS 必须是独立 IP 的,并且支持双向 Ping 通。
    首先我们进入官网申请一个用户,这个没什么难点,用户信息可以填写真实的,不用担心泄露问题。
    然后点击左上角的 Create Regular Tunnel 创建一个 IPv6 隧道。在 IPv4 那一栏填入自己 VPS 的 IP,节点选择 HK 或者 JP。
    申请成功后打开 Example configurations 选项卡,OS 选择 Linux-route2,会看到类似以下配置信息:

    modprobe ipv6
    ip tunnel add he-ipv6 mode sit remote ***.***.***.*** local ***.***.***.*** ttl 255
    ip link set he-ipv6 up
    ip addr add 2001:470:***:***::2/64 dev he-ipv6
    ip route add ::/0 dev he-ipv6
    ip -f inet6 addr

    在运行这些命令之前,我们还需要做一件事。

    配置

    阿里云默认禁用掉了 IPv6 支持,所以我们需要在配置文件里面将其打开:

    1. 打开 /etc/sysctl.conf
    2. 修改其中的 net.ipv6.conf.all.disable_ipv6net.ipv6.conf.default.disable_ipv6net.ipv6.conf.lo.disable_ipv6,把后面的值 1 全部改为 0
    3. reboot 重启

    验证

    运行 ifconfig ,查看接口是否正常。

    添加 DNS 记录

    为了方便,可以给获得的 IPv6 地址绑一个域名,加上一个AAAA记录即可。

  • U盘 grub4dos / GRUB2 引导 Deepin 2015 ISO进入 LiveCD 安装

    GRUB2的commandline:

    set isofile="/deepin-15-alpha2-amd64.iso"
    search --file $isofile --set=root
    loopback loop $isofile
    linux (loop)/live/vmlinuz.efi boot=live union=overlay username=user quiet live-config findiso=$isofile locales=zh_CN.UTF-8
    initrd (loop)/live/initrd.lz
    boot

     

    grub4dos的 menu.lst 写法,需要先在iso的live目录下提取 vmlinuz 和 inirtd.lz :

    title Deepin 2015 Live CD
    find --set-root /deepin-15-alpha2-amd64.iso
    kernel /vmlinuz boot=live union=overlay username=user quiet live-config findiso=/deepin-15-alpha2-amd64.iso locales=zh_CN.UTF-8
    initrd /initrd.lz
    boot

     

    相关参考:

    http://bbs.deepin.org/forum.php?mod=viewthread&tid=33602

    http://bbs.deepin.org/forum.php?mod=viewthread&tid=33785

  • 【坐在马桶上看算法】最常用的排序——快速排序

    最近在学习数据结构,真的是不简单。看到这篇文章,简单易懂,转载下来给自己回味。原文:http://bbs.ahalei.com/thread-4419-1-1.html

     

           假设我们现在对“6  1  2 7  9  3  4  5 10  8”这个10个数进行排序。首先在这个序列中随便找一个数作为基准数(不要被这个名词吓到了,就是一个用来参照的数,待会你就知道它用来做啥的了)。为了方便,就让第一个数6作为基准数吧。接下来,需要将这个序列中所有比基准数大的数放在6的右边,比基准数小的数放在6的左边,类似下面这种排列。
          3  1  2 5  4  6  9 7  10  8
           在初始状态下,数字6在序列的第1位。我们的目标是将6挪到序列中间的某个位置,假设这个位置是k。现在就需要寻找这个k,并且以第k位为分界点,左边的数都小于等于6,右边的数都大于等于6。想一想,你有办法可以做到这点吗?
           给你一个提示吧。请回忆一下冒泡排序,是如何通过“交换”,一步步让每个数归位的。此时你也可以通过“交换”的方法来达到目的。具体是如何一步步交换呢?怎样交换才既方便又节省时间呢?先别急着往下看,拿出笔来,在纸上画画看。我高中时第一次学习冒泡排序算法的时候,就觉得冒泡排序很浪费时间,每次都只能对相邻的两个数进行比较,这显然太不合理了。于是我就想了一个办法,后来才知道原来这就是“快速排序”,请允许我小小的自恋一下(^o^)。
           方法其实很简单:分别从初始序列“6  1  2 7  9  3  4  5 10  8”两端开始“探测”。先从右往左找一个小于6的数,再从左往右找一个大于6的数,然后交换他们。这里可以用两个变量i和j,分别指向序列最左边和最右边。我们为这两个变量起个好听的名字“哨兵i”和“哨兵j”。刚开始的时候让哨兵i指向序列的最左边(即i=1),指向数字6。让哨兵j指向序列的最右边(即j=10),指向数字8。
    1

    阅读更多…

  • scapy 学习小记

    前几天用scapy写了个用于802.1x认证的小程序。写完了回顾一下,虽然花了自己两天,但是其实是相当简单的。

    今天找了一下,发现 http://blog.csdn.net/wang_walfred/article/details/40044141 一文,对入门非常有帮助。如果当时看了,至少能少耗一天呀。

    在这里补充一下我的一点心得。

     

    我的开发是从抓包开始的。抓包之后,就可以通过

    pkts = rdpcap('xxxx.pcap')

    读取,读取之后就可以用类似列表的办法如 pkgs[1] 来操作特定的数据包。

    下面是一些命令:

    hexdump(pkt) 	#have an hexadecimal dump
    pkt.command() 	#return a Scapy command that can generate the packet
    pkt.show() 	#for a developped view of the packet

    其中 pkt.command() 可以返回一个string,运行就可以生成相应的packet,之后的修改就很方便了。

     

    最后的心得是sniff:

    sniff(filter='your filter', prn = lambda x: x.show())   # -> list of packets

    可以调用prn指定的函数对过滤到的包进行处理。

  • OpenWRT配置IPv6的NAT

    本人所在学校的IPv6因为各种原因(好吧其实是因为我不懂),默认情况下只能让路由器获得正常的IPv6访问,又或者是不用路由器直接接PC,PC可以正常使用IPv6。使用了路由器,下面的设备可以获取IPv6地址,可以通过IPv6 Ping通路由器,然而不能访问外网的IPv6地址。

    尝试过各种方案,如已经被OpenWRT抛弃的6relayd,还有ndppd和北邮的napt66(insmod之后路由就重启了),均失败。最后只能在路由器上架设代理,PC通过代理才勉强解决。

    今天偶然得知:ip6tables可以NAT IPv6,而且是相当久之前的功能了,怎么我之前就不知道呢 (;´д`)ゞ

     

    好了进入正题。

    首先我们需要在基于OpenWRT的路由器上安装两个kernel modules: kmod-ip6tables 和 kmod-ipt-nat6,如果提示内核版本不对,刷固件换内核吧。(自己编译固件就没这样的问题)

    之后,运行

    ip6tables -t nat -L

    如果有输出就说明NAT表可用。

    然后,在开机启动脚本上添加一行

    #有人说这样比较不优雅,其实也可以直接改LAN的配置
    ifconfig br-lan xxxx:xxxx:xxxx:xxxx::1/64

    其中,IPv6地址是路由器WAN6自动获取到的地址的前4段。

     

    之后是在 /etc/config/network 里删除 IPv6 ULA prefix。

     

    然后打开 /etc/config/dhcp ,config dhcp ‘lan’ 里改成类似这样:

    config dhcp 'lan'
        option interface 'lan'
        option start '100'
        option limit '150'
        option leasetime '12h'
        option ra 'server'
        option dhcpv6 'server'
        option ra_management '1'
        option ndp 'relay'

    最重要的应该是 option ra ‘server’ 和 option dhcpv6 ‘server’ 两行。(改成server或者hybrid)

    最后配置ip6tables。在 /etc/firewall.user 中加入

    ip6tables -t nat -I POSTROUTING -s xxxx:xxxx:xxxx:xxxx::/64 -j MASQUERADE  #其中的IP是LAN的前4段

    然后重启路由器,应该就OK了。

     

    相关参考:

    1. OpenWRT配置IPv6的NAT(一般结合isatap使用):https://blog.blahgeek.com/2014/02/22/openwrt-ipv6-nat/

  • 在Windows环境下让 Python CGI 输出二进制文件

    服务器是Windows的,现在的需求是通过一个CGI脚本输出一个pdf(或者是一个图片)。发现出来的文件的大小变大了,然后内容显示不出来或者乱码,估计是\r\n导致的问题。折腾了一下午,找到了答案。现在的代码如下:

    filename = r'D:\example.pdf'  #我这里要输出pdf
    print 'Content-type: application/pdf\n\n'
    
    import msvcrt
    msvcrt.setmode(1, os.O_BINARY)   #使stdout为二进制
    
    pdf_file = open(filename, 'rb')
    data = pdf_file.read()
    pdf_file.close()
    print data