Debian 上装 TinyOS
装的是 1.x 的 TinyOS。就说几点要紧的
1.先装编译 AVR 所要的 tool chain
aptitude install gcc-avr binutils-avr avr-libc
可能还附带着装上画图的 graphviz。
2.从 sf 下 nesc
wget http://kent.dl.sourceforge.net/sourceforge/nescc/nesc-1.2.7.tar.gz ./configure --prefix=/opt/tos; make; make install
3.当然还有 sun-java5-jdk
aptitude install sun-java5-jdk
加上 SUN Java Communication API version 3.0
unzip comm3.0_u1_linux.zip cp commapi/lib/*.so $JAVA_HOME/jre/lib/i386/ cp commapi/jar/comm.jar $JAVA_HOME/jre/lib/ext/ cp commapi/docs/javax.comm.properties $JAVA_HOME/jre/lib/
4.最后从 CVS 抓 TinyOS
cvs -d:pserver:anonymous@tinyos.cvs.sourceforge.net:/cvsroot/tinyos login cvs -z9 -d:pserver:anonymous@tinyos.cvs.sourceforge.net:/cvsroot/tinyos co tinyos-1.x
4.1.确定 TOS 的安装目录之后,可以在 .bashrc 里加一个函数,以后想干活只要敲tos就可以了:
tos()
{
export TOSROOT=/home/save/dev/tinyos/tinyos-1.x
export TOSDIR=\"$TOSROOT/tos\"
export PATH=$PATH:/opt/tos/bin
export CLASSPATH=`$TOSROOT/tools/java/javapath`
cd $TOSROOT
}
4.2.现在 ncc 从 nesc 移到了 TinyOS 里,现在编译 ncc:
cd $TOSROOT/tools/src/ncc ./Bootstrap; ./configure --prefix=/opt/tos; make; make install
看一下是不是所有东西都各就各位了:
./tools/scripts/toscheck
可能 toscheck 认为有的版本不对,这会导致一些问题。在 nesc 生成的汇编程序里,会有许多变量名中间有$符号,gcc-avr 看到这个会不爽。make mica2的时候,会疯狂地报错,类似这样的:
/tmp/cch3uzvj.s:1743: Error: unknown opcode `timertask' /tmp/cch3uzvj.s:1743: Error: unknown opcode `timertask' /tmp/cch3uzvj.s:1744: Error: unrecognized symbol type /tmp/cch3uzvj.s:1744: Error: unknown opcode `packetsent' /tmp/cch3uzvj.s:1745: Error: unknown opcode `cc1000radi' /tmp/cch3uzvj.s:1753: Error: unknown opcode `txbufptr'
这位朋友把这看作不听话的后果,其实在$TOSROOT/apps/Makeruls里改改就行:
-OPTFLAGS := -Os +OPTFLAGS := -Os -Wa,--allow-dollars
让 gcc-avr 看到刀乐不要慌。
4.3.编译 uisp
用 Debian 自带的 uisp 烧写程序时会报错,说:
/usr/bin/uisp -dprog=mib510 -dserial=/dev/ttyUSB0 -dpart=ATmega128 --wr_fuse_e=ff --erase --upload if=build/mica2/main.srec Direct Parallel Access not defined.
得使 TinyOS 自己的。
cd $TOSROOT/tools/src/uisp ./set-dates ./configure --prefix=/opt/tos && make install
4.4.编译 libgetenv
有的 TinyOS 的 Java 程序会用到 JNI 的 libgetenv。因此需要……编译:
cd $TOSROOT/tools/java/jni make
在 make 之前,还需要修改一个脚本$TOSROOT/tools/scripts/locate-jre。把从37行到47行的程序都注释掉,紧接着加上:
j=\"$JAVA_HOME\"/bin/javac
当然,前提是你设置好了$JAVA_HOME的环境变量。在修改后的第70行,改之:
-dir=\"$jhome/jre/bin +dir=\"$jhome/jre/lib/i386
这些问题是没有使用 IBM JDK,以及 Debian 没有安装 rpm db 造成的。
5.现在设置一下编程板使用的口,以及 mica2 使用的频段和功率等
写一个文件 $TOSROOT/apps/Makelocal,
DEFAULT_PROGRAM=mib510 # 编程板用的型号 MIB510=/dev/ttyUSB0 # USB to serial 在 GNU/Linux 里就是这样的 DEFAULT_LOCAL_GROUP=0x88 # group id CFLAGS = -DCC1K_DEFAULT_FREQ=CC1K_433_002_MHZ # 无线通信使用的频段 CFLAGS += -DRADIO_XMIT_POWER=0xFF # 用最大的功率
6.看看硬件是否正常
cd $TOSROOT/apps/MicaHWVerify make mica2
如果一切正常的话,说明 TinyOS 差不多装好了。之所以说“差不多”,是因为 TinyOS 还附带了相当多的工具,和 Java 库,这些东西我们都还没有编译过呢。接下来,把编译好的程序烧到板子上:
make reinstall mica2
接下来,跟着Tutorial检查 通信等功能。 到现在,就差不多完成了 TinyOS 在 Debian GNU/Linux 平台上的安装。另外,如果要用 deluge 的话,需要改一下 deluge 的 Makefile:
sed -i -e \"s/DELUGE_PLATFORM=telosb/DELUGE_PLATFORM=mica2/\" \
-e \"s/CC2420Radio/CC1000Radio/\" $TOSROOT/tools/java/net/tinyos/deluge/Makefile
6.最后有一点,是使用 USB to serial 转接线造成的。
6.1.让 Java 程序认识/dev/ttyUSB0
要修改$JAVA_HOME/jre/lib/javax.comm.properties文件,加一行:
serpath2 = /dev/ttyUSB0
6.2.让 Java 程序设置波特率时不会退出
这只是一个 workaround,就是在 $TOSROOT/tools/java目录下 grep 所有的 java 文件,找出setSerialPortParams的地方,改成这样的:
try {
serialPort.setSerialPortParams(sf.BAUD_RATE, SerialPort.DATABITS_8,
SerialPort.STOPBITS_1,
SerialPort.PARITY_NONE);
} catch (Exception e) {}
serialPort.setSerialPortParams (sf.BAUD_RATE,
SerialPort.DATABITS_8,
SerialPort.STOPBITS_1,
SerialPort.PARITY_NONE);
就是让它执行两次,第一次一定会出错:
Exception in thread \"AWT-EventQueue-0\" java.io.IOException: Not all params are supported by kernel
at com.sun.comm.LinuxSerial.nativeSetSerialPortParams(Native Method)
at com.sun.comm.LinuxSerial.setSerialPortParams(LinuxSerial.java:346)
at SerialConnection.setConnectionParameters(Unknown Source)
at SerialConnection.openConnection(Unknown Source)
at SerialDemo.actionPerformed(Unknown Source)
at java.awt.Button.processActionEvent(Button.java:388)
at java.awt.Button.processEvent(Button.java:356)
at java.awt.Component.dispatchEventImpl(Component.java:3955)
at java.awt.Component.dispatchEvent(Component.java:3803)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:463)
at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:242)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:163)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:157)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:149)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:110)
但是这一定不是内核的问题,因为C程序对串口的设置波特率操作是可以的。在这里也有人碰到相同的问题。我在这里用的是第二种办法。

测试多跳,用 contrib/xbow/apps/Surge_Reliable.
MOTECOM=serial@/dev/ttyUSB0:57600 java net.tinyos.surge.MainClass 0x88
0x88 是 group id
Comment by Administrator — July 7, 2006 @ 1:00 pm
兄弟,给我发个java communication API for linux行吗?
现在sun的网站上下载不了
PS: 我想在ubuntu上装个tinyos
Comment by 同行 — March 8, 2007 @ 7:42 am
我现在已经不搞 wsn 了,comm3.0 的安装文件手里也没有。不过你可以拜一下 Google 大神,很容易就能找到可用的链接。祝你顺利。
http://www.google.com/search?q=comm3.0_u1_linux.zip
Comment by Administrator — March 8, 2007 @ 2:12 pm