Archive for the ‘C/C++’ Category

September 5th, 2010

如何监听飞信消息并转发为邮件

  本文适用于满足以下条件的读者:日常使用的是电信或者联通的手机,没有移动手机号,并且重度依赖邮件,或者手机终端支持email/push的同学(android和iphone最给力了)。

  众所周知,飞信是中国移动旗下一款超级得力的产品,平时有个班长通知什么的,很多都是使用飞信来通知的,方便、及时,而且对方不在线的话可以直接发送到移动手机上,甚至阿土伯说现在小学生的老师发个作业要求什么的都用飞信发给家长。这一点曾经让我等电信/联通用户困扰不已,现在好了,levin同学写了一个开源的基于GTK+2.0的ofetion,我使用他的fetion库写了一个命令行下的监听飞信消息并且转发邮件的小工具。

  思路很简单,无非就是先登录验证用户名密码(视情况决定是否需要加挂http代理),然后起一个进程,每隔180s向移动的飞信服务器发送一个keep alive的包,另外主进程实时来监控是否接收到新的消息。如果有新的消息过来,则判断其消息类型,剔除掉ACK等系统消息,将真正的飞信消息通过sendmail发送邮件给指定地址。有一点需要注意,一旦接收到这种真正的飞信消息时,需要发出一个ACK包,以确认自己收到,不然对方的客户端会认为这边未收到消息,然后显示发送不成功。

  因为levin同学写的代码可读性比较强,所以我修改的时候没有遇到太多麻烦。下周开始自己和给阿土伯试用,哈哈,这回再也不怕没法收班长通知了。

[UPDATE 2010/12/09]:谢谢同学们关注,我把基于openfetion 2.0.2版的openfetion-notify代码托管在github的这里了,有需要的同学自己去试试吧,已经能正常工作,但是还非常ugly,希望能有时间改改。最近太忙了,Sigh。

Tags:

June 16th, 2010

如何建立android的C/C++交叉编译环境

  Android的底层是纯粹的linux内核,可以简单的理解为上面跑了个Dalvik Java虚拟机而已。因此,构建android上C/C++的交叉编译环境也就成为了一个很大的需求。特别是对于已经取得root权限的机器,如果能直接运行按需编译的二进制文件,那么将可以做很多有意义和有趣的事情。

  很不幸,Google没有直接给出如何建立这个交叉编译环境,但是我们可以借助Google提供的强大的NDK (Native Development Tools)来达到这一目的。NDK的本来目标是编译得到.so动态链接库文件,然后通过JNI提供给上层的Java调用,从而实现C/C++程序的简易迁移。而编译.so和编译成二进制可执行文件的过程是完全一样的,这就给了我们可以发挥的空间。

  有两种方式获取交叉编译所需的工具链:git下prebuilt这个project或者直接去下载NDK,我这里arm-eabi的版本是最新的4.4.0。

1
git clone git://android.git.kernel.org/platform/prebuilt.git

  然后创建一个helloworld.c文件。

1
2
3
4
5
6
//// root@delleon:~/android/myapp# cat helloworld.c
#include <stdio.h> 
int main() { 
  printf("HelloWorld!n"); 
  return 0; 
}

  接下来创建Makefile文件。注意修改其中的NDK_DIR和SDKTOOL为自己的目录,修改APP为自己的待编译程序主文件名。另外注意自己的arm-eabi的版本,若有变化则也需要修改。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#### root@delleon:~/android/myapp# cat Makefile 
APP=helloworld
 
NDK_DIR := ~/android/android-ndk-r4
NDK_HOST := linux-x86
SDKTOOL := ~/android/android-sdk-linux_86/tools
 
TOOLCHAIN_PREFIX := $(NDK_DIR)/build/prebuilt/$(NDK_HOST)/arm-eabi-4.4.0/bin/arm-eabi-
CC := $(TOOLCHAIN_PREFIX)gcc
CPP := $(TOOLCHAIN_PREFIX)g++
LD := $(CC)
 
COMMON_FLAGS := -mandroid -ffunction-sections -fdata-sections -Os -g 
	--sysroot=$(NDK_DIR)/build/platforms/android-5/arch-arm 
	-fPIC 
	-fvisibility=hidden 
	-D__NEW__
 
CFLAGS := $(COMMON_FLAGS)
 
CFLAGS += -D__ARM_ARCH_5__ -D__ARM_ARCH_5T__ -D__ARM_ARCH_5E__ -D__ARM_ARCH_5TE__ -DANDROID -DSK_RELEASE -DNDEBUG
 
CFLAGS += -UDEBUG -march=armv5te -mtune=xscale -msoft-float -mthumb-interwork -fpic -ffunction-sections -funwind-tables -fstack-protector -fmessage-length=0 -Bdynamic
 
CPPFLAGS := $(COMMON_FLAGS) 
	-fno-rtti -fno-exceptions 
	-fvisibility-inlines-hidden 
 
LDFLAGS += --sysroot=$(NDK_DIR)/build/platforms/android-5/arch-arm 
LDFLAGS +=  -Bdynamic -Wl,-dynamic-linker,/system/bin/linker -Wl,--gc-sections -Wl,-z,nocopyreloc   
LDFLAGS += -L$(NDK_DIR)/build/prebuilt/$(NDK_HOST)/arm-eabi-4.4.0/lib/gcc/arm-eabi/4.4.0 
LDFLAGS += -L$(NDK_DIR)/build/prebuilt/$(NDK_HOST)/arm-eabi-4.4.0/lib/gcc 
LDFLAGS += -L$(NDK_DIR)/build/prebuilt/$(NDK_HOST)/arm-eabi-4.4.0/arm-eabi/lib 
LDFLAGS += -nostdlib -lc -llog -lgcc 
	--no-undefined -z $(NDK_DIR)/build/platforms/android-5/arch-arm/usr/lib/crtbegin_dynamic.o $(NDK_DIR)/build/platforms/android-5/arch-arm/usr/lib/crtend_android.o 
 
OBJS += $(APP).o 
 
all:    $(APP) 
 
$(APP):    $(OBJS) 
	$(LD) $(LDFLAGS) -o $@ $^ 
 
%.o:    %.c 
	$(CC) -c $(CFLAGS) $< -o $@ 
 
%.o:    %.cpp 
	$(CPP) -c $(CFLAGS) $(CPPFLAGS) $< -o $@ 
 
install: $(APP) 
	$(SDKTOOL)/adb push $(APP) /data/local/bin/$(APP) 
	$(SDKTOOL)/adb shell chmod 755 /data/local/bin/$(APP) 
 
run: 
	$(SDKTOOL)/adb shell /data/local/bin/$(APP) 
 
clean: 
	@rm -f $(APP).o $(APP)

  最后直接make,然后make install进手机里看一下吧。通过adb shell和手机里的Terminal等软件执行的结果是一样的。

toolchain

  后记:还有一个叫Codesourcery的工具链,下载下来有130多M,我使用它来编译helloworld时无误但是放到手机上则运行不起来。不想细究了,我认为NDK提供的工具链已经非常优秀。感兴趣的朋友可以自己试试Codesourcery。

Tags: , , , , , ,

March 21st, 2009

fGmail 0.2版发布

  新版本特点:主要解决了明文存储Gmail账号信息和飞信账号信息而导致的不安全问题。可以真正的worry free。

  其实很好办,无非是通过shc来将shell脚本加密,生成二进制文件,就无法明文观察到密码了。有人会问,shc的加密真的那么可靠吗?一般来说是安全的,除非使用gdb等调试工具来获取源代码,这种安全级别对我们来说已经足够了。

  如同前一版本一样,fGmail的获取地址在这个Google Code的工程里面。欢迎试用。

Tags: , , , , ,

March 3rd, 2009

fGmail发布!

  Gmail难道开通了新邮件免费短信通知?失望的是,仍然没有。不过,我做了一个“曲线救国”的方案,运用Gmail Feed + wget + sed + libfetion + cron + 我写的小程序fGmail,然后有一台在网的linux主机,即可实现这个功能!

  OK,实现思路如下:Gmail提供了通过Feed访问新邮件的功能,我们通过wget来抓取它并保存成xml文件,然后写个shell脚本运用sed将新邮件数、邮件标题和发送者解析出来,传递给另一个小程序,这个程序利用DDD开发的libfetion库,实现向自己的手机发送短信的功能。将那个shell脚本放在cron中,设定每隔一段时间执行一次即可。是不是很简单?

  我把所有程序都放在了这个Google Code的工程中,直接下载地址在这。除了libfetion等已经声明版权的内容外,fGmail遵从GPLv3协议。

  使用时,只需解压后按照README安装即可。

  费了这么多周折,终于实现了Gmail的新邮件短信通知。不过其局限性也是很显而易见的,如只是Gmail,没有其他邮件,只能是中国移动飞信的已注册用户,要有一个linux系统来跑等等。不过这些限制对我自己来说,刚好已经满足了。

  基于libfetion开发的项目很多,网上最常见的例子比如免费天气预报之类。如果有好的构思,完全可以做出非常实用的东西来。也希望我的这个fGmail小例子能实现抛砖引玉的作用。最后希望能早日实现上手G2的梦想,爽歪歪的直接用手机收发邮件。

Q & A :

Q:Why fGmail?
A:I choose `f’ and `Gmail’ to name it simply for fetion Gmail or fetch Gmail.

Q:Hey, but how about its safety, I mean the Gmail and fetion account information?
A:Your Gmail account information is directly stored in the file `account’, and I am sorry for that. Maybe I will fix it in the next version.

Tags: , , , , , ,

July 25th, 2008

基于linux平台的聊天软件——TextTalk

实习成果终于出来了,三个周的心血呐……

不多说,下午赶火车时间紧,上PPT,想说的都在里面了。

演讲稿下载:GaoLei’s Summer Intern Report.pdf

源代码下载:texttalk.1.0.tar.gz

Tags: , , ,

July 13th, 2008

Socket网络编程

Server side:

socket > bind > listen > accept

Client side:

socket > connect

一个周的实习成果总结成上面的简单描述,安静而强大。

Tags: , , ,

May 26th, 2008

“im”leon,互联网中心第一天

实习单位:电信系互联网中心无线多媒体技术VoIP组

下午跟老师打了声招呼。师兄mutecat说正好实验室还有一个空位,让我直接过去就行。正好和他背对,很近,有什么问题请教和交流就方便多了,真不错。

老师在隔间里面忙,直接把我交给mutecat了。开始时有点小紧张,拿电脑,分配IP都让我出了不少汗,还好空调吹的爽,很快就凉快了下来,Hoho……

之前老师给的课题是“基于linux平台的im软件”,应该是她在带研究生做的一个xmpp项目的缩减版本吧,基本要求是异步文字聊天、用户管理和认证服务器、聊天记录转发、存储、历史记录。

要读的资料很多,基于xmpp标准协议来写的话,有RFC3920、3921两个权威的文档。模范产品以Gtalk为首,然后用开源的c++类库libJingle,还有基于libjingle的一个开源软件MyJingle可以参考,这个软件的登录应该会是我学习的重点,然后其中的Call功能涉及到语音,可能做不了。用心把文字功能做好再说。

mutecat师兄建议我先看libjingle,Google Code上面libjingle的文档全英的好几十页。没办法,中文资料几乎没有,只好硬着头皮读。然后建议我用Qt来写,方便跨平台。在linux下面先实现功能,再实现界面GUI。真不错的师兄,不愧是linux版版大,考虑问题就是有水平,人也很好,一直笑嘻嘻的,嘿嘿……

Read the rest of this entry »

Tags: , , , ,