<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></title> 
<link>https://jackxiang.com/index.php</link> 
<description><![CDATA[赢在IT，Playin' with IT,Focus on Killer Application,Marketing Meets Technology.]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></copyright>
<item>
<link>https://jackxiang.com/post//</link>
<title><![CDATA[raspberry pi 开机wifi自动启动并发邮件通知]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[系统架构与硬件]]></category>
<pubDate>Tue, 20 Aug 2013 13:33:10 +0000</pubDate> 
<guid>https://jackxiang.com/post//</guid> 
<description>
<![CDATA[ 
	<br/>raspberry pi 开机wifi自动启动并发邮件通知<br/>　安装好USB的wifi模块，自动获取IP地址。获取到IP后邮件通知。这样每次重启就不用再连显示器了。<br/>以下几个的安装是为了方便使用与本次无关。<br/>安装vim<br/>$ sudo apt-get install vim<br/>将时区改为上海<br/>$ sudo cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime<br/>安装校时工具<br/>$ sudo apt-get install ntpdate<br/>通过网络同步时间<br/>$ /usr/sbin/ntpdate stdtime.gov.hk<br/>　　把USB的wifi接口接好。<br/>　　我接了一个腾达W311M的wifi无线，用命令看到无线网卡已经加载。如下：<br/>$ lsusb<br/>Bus 001 Device 004: ID 148f:5370 Ralink Technology, Corp. RT5370 Wireless Adapter<br/>image<br/>　　然后可以在图形化界面中wpa_gui配置。如果使用命令行可以用wpa_cli。我是直接修改配置文件。我的配置文件如下:<br/>无线配置文件位置/etc/wpa_supplicant/wpa_supplicant.conf<br/>文件内容如下:<br/>ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev<br/>update_config=0<br/>network=&#123;<br/>ssid=”simonzhang”<br/>psk=”xxxxxxx”<br/>proto=RSN<br/>key_mgmt=WPA-PSK<br/>pairwise=CCMP<br/>auth_alg=OPEN<br/>&#125;<br/>网络部分配置/etc/network/interface<br/>文件内容如下：<br/>auto lo<br/>iface lo inet loopback<br/>iface eth0 inet dhcp<br/>allow-hotplug wlan0<br/>iface wlan0 inet manual<br/>wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf<br/>iface default inet dhcp<br/>　　配置完毕，将启动后发送邮件的脚本放到家目录中，脚本如下，如果邮件服务器认证不严的话用sendmail会更简单：<br/>#!/bin/env python<br/># -*- coding:utf-8 -*-<br/># -------------------------------<br/># Filename:&nbsp;&nbsp; <br/># Revision:<br/># Date:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2012-12-5<br/># Author:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;simonzhang<br/># Email:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; simon-zzm@163.com<br/># Web:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; www.simonzhang.net<br/># -------------------------------<br/>import os<br/>import time<br/>import socket<br/>import fcntl<br/>import struct<br/>import smtplib<br/>from email.mime.text import MIMEText<br/>mail_host = &#039;smtp.exmail.qq.com&#039;<br/>mail_user = &#039;xxxxxxx&#039;<br/>mail_pwd = &#039;xxxxxxx&#039;<br/>def get_ip_address(ifname):<br/>&nbsp;&nbsp;&nbsp;&nbsp;s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)<br/>&nbsp;&nbsp;&nbsp;&nbsp;try:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return socket.inet_ntoa(fcntl.ioctl(<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s.fileno(),<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x8915,&nbsp;&nbsp;# SIOCGIFADDR<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct.pack(&#039;256s&#039;, ifname[:15])<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )[20:24])<br/>&nbsp;&nbsp;&nbsp;&nbsp;except IOError, e:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return e<br/>def mail_send(content, mailto, get_sub):<br/>&nbsp;&nbsp;&nbsp;&nbsp;msg = MIMEText(content.encode(&#039;utf8&#039;), _subtype=&#039;html&#039;,&nbsp;&nbsp;_charset=&#039;utf8&#039;)<br/>&nbsp;&nbsp;&nbsp;&nbsp;msg[&#039;From&#039;] = mail_user<br/>&nbsp;&nbsp;&nbsp;&nbsp;msg[&#039;Subject&#039;] = u&#039;%s&#039; % get_sub<br/>&nbsp;&nbsp;&nbsp;&nbsp;msg[&#039;To&#039;] = mailto<br/>&nbsp;&nbsp;&nbsp;&nbsp;try:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s = smtplib.SMTP()<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s.connect(mail_host)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s.login(mail_user,mail_pwd)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s.sendmail(mail_user,[mailto],msg.as_string())<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s.close()<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;send = &quot;OK&quot;<br/>&nbsp;&nbsp;&nbsp;&nbsp;except Exception ,e:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;send = &quot;ERROR! %s&quot; % e<br/>&nbsp;&nbsp;&nbsp;&nbsp;return send<br/>def main():<br/>&nbsp;&nbsp;&nbsp;&nbsp;_count_loop = 0<br/>&nbsp;&nbsp;&nbsp;&nbsp;while 1:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ip_list = []<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if _count_loop == 0:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;os.system(&#039;sudo wpa_supplicant -B -i wlan0 -c /etc/wpa_supplicant/wpa_supplicant.conf&#039;)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;time.sleep(0.5)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;os.system(&#039;sudo dhclient wlan0&#039;)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ip_list.append(get_ip_address(&#039;eth0&#039;))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;except:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pass<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ip_list.append(get_ip_address(&#039;wlan0&#039;))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;except Except,e:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pass<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_get_send_status =&nbsp;&nbsp;mail_send(&#039;my pi ip&#039;, &#039;simon-zzm@163.com&#039;, &#039;%s&#039; % ip_list)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_count_loop +=1<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (_get_send_status == &quot;OK&quot;) or (_count_loop == 3):<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;time.sleep(3)<br/>if __name__ == &quot;__main__&quot;:<br/>&nbsp;&nbsp;&nbsp;&nbsp;main()<br/>　　脚本测试通过，配置开机启动。<br/>$ sudo vim /etc/rc.local<br/># Print the IP address<br/>_IP=$(hostname -I) &#124;&#124; true<br/>if [ &quot;$_IP&quot; ]; then<br/>printf “My IP address is %s&#92;n” “$_IP”<br/>fi<br/># start wifi<br/>echo “Starting WiFi…”<br/>wpa_supplicant -B -i wlan0 -c /etc/wpa_supplicant/wpa_supplicant.conf<br/>sleep .5s<br/>dhclient wlan0<br/>echo “WiFi should be started”<br/># notification my ip<br/>python /home/pi/script/NotificationIP.py<br/>exit 0<br/>失败经验总结：<br/>1）之前是用的下面代码，但是在除掉网线后路由里的默认网关没有，用“sudo route add default gw 192.168.1.1”添加,如果有网线只是报有一个ip。<br/>def get_local_ip_address():<br/>ipaddr = ”<br/>try:<br/>s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)<br/>s.connect((’1.1.1.1′, 8000))<br/>ipaddr = s.getsockname()[0]<br/>s.close()<br/>except:<br/>ipaddr = “ERROR”<br/>return ipaddr<br/>2）系统应该不支持热插拔，每次查usb wifi时都会重启。<br/>3）不知道是电力原因，还是USB wifi原因，连接质量很不好，容易断开。<br/>参考文档：<br/>http://stinebaugh.info/auto-start-your-wifi-on-raspberry-pi/<br/>raspberry pi 开机wifi自动启动并发邮件通知<br/>比之前脚本添加了，测试公网IP的函数。<br/>def get_global_ip():<br/>get_html = urllib2.urlopen(‘http://iframe.ip138.com/ic.asp’).read()<br/>_re_ip = re.compile(r’&#92;d&#123;2,3&#125;&#92;.&#92;d&#123;1,3&#125;&#92;.&#92;d&#123;1,3&#125;&#92;.&#92;d&#123;1,3&#125;’, re.DOTALL)<br/>_global_ip = _re_ip.findall(get_html)[0]<br/>return _global_ip<br/>代码:NotificationIP.py<br/>#!/bin/env python<br/># -*- coding:utf-8 -*-<br/># -------------------------------<br/># Filename:&nbsp;&nbsp; <br/># Revision:&nbsp;&nbsp;&nbsp;&nbsp;2.0<br/># Date:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2012-12-5<br/># Author:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;simonzhang<br/># Email:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; simon-zzm@163.com<br/># Web:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; www.simonzhang.net<br/># <br/># 1.0 create script<br/># 2.0 add check global ip&nbsp;&nbsp;<br/># -------------------------------<br/>import os<br/>import re<br/>import urllib2<br/>import time<br/>import socket<br/>import fcntl<br/>import struct<br/>import smtplib<br/>from email.mime.text import MIMEText<br/>mail_host = &#039;smtp.exmail.qq.com&#039;<br/>mail_user = &#039;warning@qq.net&#039;<br/>mail_pwd = &#039;aaabbbb&#039;<br/>def get_ip_address(ifname):<br/>&nbsp;&nbsp;&nbsp;&nbsp;s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)<br/>&nbsp;&nbsp;&nbsp;&nbsp;try:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return socket.inet_ntoa(fcntl.ioctl(<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s.fileno(),<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x8915,&nbsp;&nbsp;# SIOCGIFADDR<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct.pack(&#039;256s&#039;, ifname[:15])<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )[20:24])<br/>&nbsp;&nbsp;&nbsp;&nbsp;except IOError, e:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return e<br/>def get_global_ip():<br/>&nbsp;&nbsp;&nbsp;&nbsp;get_html =&nbsp;&nbsp;urllib2.urlopen(&#039;http://iframe.ip138.com/ic.asp&#039;).read()<br/>&nbsp;&nbsp;&nbsp;&nbsp;_re_ip = re.compile(r&#039;&#92;d&#123;2,3&#125;&#92;.&#92;d&#123;1,3&#125;&#92;.&#92;d&#123;1,3&#125;&#92;.&#92;d&#123;1,3&#125;&#039;, re.DOTALL)<br/>&nbsp;&nbsp;&nbsp;&nbsp;_global_ip = _re_ip.findall(get_html)[0]<br/>&nbsp;&nbsp;&nbsp;&nbsp;return _global_ip<br/>def mail_send(content, mailto, get_sub):<br/>&nbsp;&nbsp;&nbsp;&nbsp;msg = MIMEText(content.encode(&#039;utf8&#039;), _subtype=&#039;html&#039;,&nbsp;&nbsp;_charset=&#039;utf8&#039;)<br/>&nbsp;&nbsp;&nbsp;&nbsp;msg[&#039;From&#039;] = mail_user<br/>&nbsp;&nbsp;&nbsp;&nbsp;msg[&#039;Subject&#039;] = u&#039;%s&#039; % get_sub<br/>&nbsp;&nbsp;&nbsp;&nbsp;msg[&#039;To&#039;] = mailto<br/>&nbsp;&nbsp;&nbsp;&nbsp;try:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s = smtplib.SMTP()<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s.connect(mail_host)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s.login(mail_user,mail_pwd)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s.sendmail(mail_user,[mailto],msg.as_string())<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s.close()<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;send = &quot;OK&quot;<br/>&nbsp;&nbsp;&nbsp;&nbsp;except Exception ,e:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;send = &quot;ERROR! %s&quot; % e<br/>&nbsp;&nbsp;&nbsp;&nbsp;return send<br/>def main():<br/>&nbsp;&nbsp;&nbsp;&nbsp;_count_loop = 0<br/>&nbsp;&nbsp;&nbsp;&nbsp;while 1:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ip_list = []<br/>&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;&nbsp;&nbsp;&nbsp;if _count_loop == 0:<br/>&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;os.system(&#039;sudo wpa_supplicant -B -i wlan0 -c /etc/wpa_supplicant/wpa_supplicant.conf&#039;)<br/>&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;time.sleep(0.5)<br/>&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;os.system(&#039;sudo dhclient wlan0&#039;)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ip_list.append(&quot;eth0: %s&quot; % get_ip_address(&#039;eth0&#039;))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;except:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pass<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ip_list.append(&quot;wlan0: %s&quot; % get_ip_address(&#039;wlan0&#039;))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;except Except,e:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pass<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_global_ip = get_global_ip()<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ip_list.append(&#039;global ip: %s&#039; % _global_ip)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;except :<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pass<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_get_send_status =&nbsp;&nbsp;mail_send(&#039;my pi ip&#039;, &#039;simon-zzm@139.com&#039;, &#039;%s&#039; % ip_list)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_count_loop +=1<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (_get_send_status == &quot;OK&quot;) or (_count_loop == 3):<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;time.sleep(3)<br/>if __name__ == &quot;__main__&quot;:<br/>&nbsp;&nbsp;&nbsp;&nbsp;main()<br/>来自：http://www.simonzhang.net/?p=1501<br/>http://www.simonzhang.net/?p=1668
]]>
</description>
</item><item>
<link>https://jackxiang.com/post//#blogcomment</link>
<title><![CDATA[[评论] raspberry pi 开机wifi自动启动并发邮件通知]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>https://jackxiang.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>