MIUI ROM接收WAP PUSH短信的补丁

我的HTC Desire HD一直在用小米MIUI ROM,一切都好,唯有个问题就是收不到WAP PUSH的短信。在MIUI的论坛上叫了好久都没解决,于是决定自己尝试一下。

好久没碰Java了,又是第一次做Android的程序,发现对于WAP PUSH的编码资料很少,而且很多都不正确,好不容易折腾出来了个原型,基本满足自己的需要就差不多了。

此程序为MIUI ROM接收WAP PUSH短信的补丁,仅在HTC DHD和小米手机上测试通过(理论上Andoird 2.3.3或以上都应该可以)。


程序主界面:Andoird是消息驱动,安装包写好直接就注册到系统,使用时都不需要运行程序,主界面主要是信息提示


接收到第一条WAP PUSH信息时,MIUI会有一个接收WAP PUSH的授权,可以选择“下次不再询问”并“允许”就不会再出现了


接收到的WAP PUSH都存放到短信收件箱里面了,只是暂时没获取到手机号码,提供显示为“WAP PUSH”


MIUI 1.11.18官方版本已经支持
【短信】新增 短信支持WAP PUSH:http://www.miui.com/thread-329468-1-1.html
获取手机号码的问题MIUI开发组也进行了答复:源号码需要framework从sms header中提取,而wap push广播不带这个东西。应用层是无法实现的。

版本201109083
已知问题:
1)未获取到手机号码,发件人显示为“WAP PUSH”;
2)主界面和屏锁界面短信图标没有更新未读信息数量标识

版本20110908
已知问题:
1)未获取到手机号码,发件人显示为“WAP PUSH”;(Intent中Extra只有pduType, data, header, transactionId四个Bundle,貌似没发现有手机号码,header转换为byte[]长度只有1,内核问题?!)

安装包下载:WapPushReceiver.apk
源码下载:WapPushReceiver.rar

供爱好者参考学习,其中对于WAP PUSH数据的解析应该还是不很完整,不过测试了飞信PC客户端发送文件到手机、移动号簿管家客户端下载到手机、无线音乐12530音乐下载到手机发送的WAP PUSH都是可以正常解析的,只是MIUI的浏览器对于一些WAP接入的下载似乎支持还有问题,改用UC浏览器基本就没啥问题了。

一些网上搜索到的WAP PUSH资源:
《Another WAP Push over SMS encoding》:http://mobiletidings.com/2009/02/26/wap-push-over-sms-si-encoding/
《WAPPUSH 原理 基于短信网关WAP推送的实现》:http://tinymce.moxiecode.cp/mce_temp_url
《通过短信网关发送Wappush》:http://hi.baidu.com/lrxin0630/blog/item/e96e15d4e588e60aa18bb7da.html
《Android中WAP PUSH的实现分析》:http://www.iandroid.cn/bbs/android-9312-1-1.html
《Android 短信 彩信 wap push的接收》:http://blog.csdn.net/zengyangtech/article/details/5885508

如何在ipv4的主机中免费使用ipv6

无为而为 说两句:
不错,使用隧道突破了主机没有ipv6的问题
原文地址:http://www.hostloc.com/thread-66033-1-1.html

PHP的file_get_contents不支持gzip编码过的页面?

PHP的file_get_contents获取远程页面内容,如果是gzip编码过的,返回的字符串就是编码后的乱码

1、解决方法,找个ungzip的函数来转换下

2、给你的url加个前缀,这样调用
[quote]$content = file_get_contents("compress.zlib://".$url);[/quote]
无论页面是否经过gzip压缩,上述代码都可以正常工作!

PHP 4.3.0以后版本支持,还可以用于fopen之类的函数~!

ThinkPad X200 QQ语音对方听不到声音的解决方法

解决方法来源于:《解决X200声卡(conexant 20561)XP下不能QQ语音的问题》,原文地址:http://www.thinkpad.cn/forum/viewthread.php?tid=1078018&page=1(需要登录论坛才能看到内容)

即使是最新的X200声卡驱动依然有这个问题,解决方法是用东芝Satellite M300系列笔记本的XP声卡驱动代替原有驱动,下载地址为http://pcdrivers.toshiba.com.cn/upload/Satellite/M300/Conexant_Sound_Driver_V3.47.1.50.ZIP,解压后修改TE1HER5a.inf文件的[Conexant]段,在最后加一行[quote]%HdAudioFunctionDriver.Hermosa5051.DeviceDesc% = HdAudModel,HDAUDIO\FUNC_01&VEN_14F1&DEV_5051&SUBSYS_17AA20FF[/quote]
安装更新即可。

如何获取和展示视频网站内容的截图

互联网视频网站已经成为大家娱乐不可缺少的一部分,博客、微博、SNS都在大量的转发视频链接,如何在用户粘贴的视频网站链接后面增加对应视频的截图显示呢?这里提供我的解决思路和片段PHP代码。

1、如何在文本中获得URL?
获得诸如“http://www.xxx.com/.....”的URL地址,这个可以使用正则式来解决,执行后$urls就是输入$text字符串中找到的全部URL组成的一维数组:
[quote] preg_match_all("/(http:\/\/[a-z0-9:;&#@=_~%\?\/\.\,\+\-]+)/i", $text, $matches);
$urls = $matches[0];[/quote]

2、如何还原短链接?
在转发中,很多链接都被转换成了短链接,例如视频地址http://www.tudou.com/programs/view/K2xBz5JFBdY/在在转发中被转换成了短地址http://t.cn/hghgjz,一般主要是为了微博节省文字的长度。常见的方法是调用对应短地址的API,还原得到长地址,但是各个短地址提供的方法不一样。短地址实际就是在访问过程中,使用了HTTP 301跳转(Permanently Moved),会在返回的HTTP头中带上真实的地址,使得浏览器可以跳转,这样的话,我们就可以模拟浏览器获得原始地址即可。

片段代码如下,其中$s_url是短地址,$l_url是还原的原始长地址:
[quote]$SHORT_URL = array (
"t.cn",
"url.cn",
"tinyurl.com",
"goo.gl",
......
);

//检查是否是短地址
$found = false;
foreach ($SHORT_URL as $v)
{
$pattern = "/{$v}/i";
if (preg_match($pattern, $s_url, $ret) == 1)
{
$found = true;
break;
}
}

if (!$found)
{
//不是短地址,直接返回
$l_url = $s_url;
}
else
{

//模拟HTTP访问,还原短地址
$u = parse_url($s_url);
$host_ip = gethostbyname($u["host"]);
$host_port = 80;

$request_header = "";
$request_header .= "GET {$u['path']} HTTP/1.1\r\n";
$request_header .= "Host:{$u['host']}\r\n";
$request_header .= "User-Agent: Mozilla/5.0\r\n";
$request_header .= "Accept: */*\r\n";
$request_header .= "Cache-Control: no-cache\r\n";
$request_header .= "Connection: Close\r\n";
$request_header .= "\r\n";
$request_header .= "\r\n";

$fh = fsockopen($host_ip, $host_port);
fputs($fh, $request_header);
$response = "";
while(!feof($fh))
{
$response .= fread($fh, 1);
}
fclose($fh);

if (preg_match("/Location:(.*?)\r\n/i", $response, $ret) != 0)
{
$l_url = rtrim(ltrim($ret[1]));
}

}[/quote]

3、如何获取原始视频链接对应视频的截图?
常见的视频网站在视频播放页面的源码中都会有对应截图的URL地址,我们只需要打开视频地址,分析源码获取即可,这个就没有统一的方法来实现,例如土豆tudou的视频播放页面源码中看到类似“,thumbnail = 'http://i3.tdimg.com/080/946/236/p.jpg'”的这样一行,这个就是视频对应的截图地址。

片段代码如下,其中$url是视频网站地址,$img_url是对应截图URL地址:
[quote]//构建各个视频网站的截图地址分析正则式,这个需要根据不同网站的情况设定
$VIDEO_SITE = array (
"youku.com" => "/\+0800\|(.*?)\|\">/i",
"ku6.com" => "/<span class=\"s_pic\">(.*?)<\/span>/i",
"tudou.com" => "/thumbnail = '(.*?)'/i",
"56.com" => "/\"img\":\"(.*?)\"/i",
"video.sina.com.cn" => "/pic: '(.*?)'/i",
......
);

//检查是否是视频网站地址
$pattern_img = "";
foreach ($VIDEO_SITE as $k => $v)
{
$pattern_site = "/{$k}/i";
if (preg_match($pattern_site, $url, $ret) == 1)
{
$pattern_img = $v;
break;
}
}

//获得网页源码,分析截图URL
$content = file_get_contents($url);
preg_match($pattern_img, $content, $ret);
$img_url = $ret[1];[/quote]


最后,由于我们需要连接获取的数据的短地址和视频网站可能访问速度不快,如果有大量重复的URL要处理(例如“我的微博”,展现的是最新20条,所以在一定时间内反复访问的也就是这20条中的URL),所以可以考虑自己做本地缓存,我是采用将短地址和长地址、视频地址和截图地址的对应关系作为二维数组保存,然后serialize保存到缓冲文件,同时考虑了缓冲过期(我设定为7天)删除的刷法,以免累计的旧数据太多,这里就不详细写了。

OK,打完,收工~~~!

在xajax中控制函数的执行顺序

引子:xajax是一个开源的PHP类库,它能够让你黏合HTML、CSS、Javascrīpt和PHP,轻而易举的开发功能强大、基于WEB的AJAX应用软件. 使用xajax开发的应用软件,无需重新调入页面,就能够异步调用服务器端的PHP函数和更新内容。

xajax具体的用法不说了,直接说问题:想做一个页面的刷新效果,在获取数据过程中提示用户“正在获取数据”,数据获取完毕后,再将提示语替换成实际的数据,很简单,用xajax做两个PHP函数:
[quote]function show_loading()
{
...
$objResponse->assign("my_text", "innerHTML", "正在获取数据");
...
}

function show_data()
{
...
获取数据$data
$objResponse->assign("my_text", "innerHTML", $data);
...
}[/quote]
再用JavaScript调用
[quote]xajax_show_loading();
xajax_show_data();[/quote]
测试发现,大多数情况,都可以得到想要的结果,但是偶尔会出现一直是“正在获取数据”,无法展现数据的问题。检查发现这种情况数据是获取成功的,进一步debug发现是由于先调用的函数不一定先执行造成的,也就是show_data成功展示了数据,但又被执行较慢的show_loading用“正在获取数据”覆盖了本该显示数据,导致看起来像是获取数据失败,执行出错或卡死的感觉。

最初用了个笨办法,延缓获取数据和展示的行为,JavaScript改为
[quote]xajax_show_loading();
setTimeout(xajax_show_data(), 200);[/quote]
也能达到效果,但是方法很撮。。。


最后翻了xajax的文档,发现可以call或者script调用JavaScript,于是改为
[quote]function show_data()
{
...
$objResponse->assign("my_text", "innerHTML", "正在获取数据");
$objResponse->script("xajax_update_data()");
...
}

function update_data()
{
...
获取数据$data
$objResponse->assign("my_text", "innerHTML", $data);
...
}[/quote]
JavaScript改为
[quote]xajax_show_data();[/quote]

这样就可以确保先执行show_data更新等待提示语完成后,再执行update_data展现数据了。解决~~!

WIN7无法连接L2TP IPSec VPN

同一个L2TP IPSec VPN,在XP可以连接,但是在WINDOW7却不行,表现为很久都不进入校验用户名和密码的提示,最终超时。

对比XP和WIN7的安全配置如下:

XP默认使用的是“典型”,具体是啥子方法不知。


WIN7默认使用的是CHAP和MS-CHAP v2,没有类似XP“典型”的设置。


解决方式:
修改服务器端/etc/xl2tpd/xl2tpd.conf中refuse chap = no,重启xl2tpd,WIN7再连接就正常了

Linux 下 OpenVPN 安装和 Windows OpenVPN GUI 安装笔记

无为而为 说两句:
还有一篇介绍windows下服务器端和客户端配置的,http://hi.baidu.com/smallchunhui/blog/item/16ce88d3c873f937960a1624.html
原文地址:http://www.chinaunix.net/jh/50/935322.html

BuyVM OpenVZ VPS CentOS搭建PPTP VPN

无为而为 说两句:

A:注意OpenVZ和Xen的区别,否则在OpenVZ中执行iptables会提示“iptables: unknown error 4294967295”或者“iptables: no chain/target/match by that name”

B:pptp拨号如果提示619错误,执行“mknod /dev/ppp c 108 0”,如果文件已经存在,先删除再重新执行;如果还是619错误,多半就是NAT出口不支持pptp或者禁止了,这个就自己无法解决了。


原文地址:http://qiaodahai.com/personal/article/2010/buyvm-openvz-vps-centos-pptp-vpn.htm



------以下2011-04-13补充-----------
如果使用上面B方法无法解决拨号的619错误,可以检查下日志/var/log/messages,如果有下面的错误:

1、pppd[4048]: Couldn't load plugin /usr/lib/pptpd/pptpd-logwtmp.so
这个是由于/etc/pptpd.conf中开启了logwtmp,但是没有找到对应的库文件,可以在编译的目录中找到或者安装目录,创建/usr/lib/pptpd/目录后拷贝进入即可。不知道路径就搜索一下find / -name "pptpd-logwtmp.so"

2、pppd[3793]:Plugin /usr/lib/pptpd/pptpd-logwtmp.so is for pppd version 2.4.3, this is 2.4.4
这个是因为库文件版本不对,已有的pppd版本高于pptpd支持的库文件,找不到对应版本的文件就在/etc/pptpd.conf中注释掉logwtmp吧

PPTPD一键安装包

原文地址:http://blog.diahosting.com/linux-tutorial/pptpd/