Contiki学习笔记(重写版)
2.1 运行原理
嵌入式系统可以看作是一个运行着死循环主函数系统,Contiki 内核是基于事 件驱动的,系统运行可以视为不断处理事件的过程。Contiki 整个运行是通过事件 触发完成,一个事件绑定相应的进程。当事件被触发,系统把执行权交给事件所 绑定的进程。一个典型基于 Contiki 的系统运行示意图如下:
I
图表目录
图 2- 1 CONTIKI 运行原理示意图 ................................................................................... 4 图 2- 2 THREAD 与 PROTOTHREADS 栈对比示意图 ........................................................ 5 图 2- 3 CONTIKI 进程链表 PROCESS_LIST........................................................................ 7 图 2- 4 CONTIKI 进程状态转换图 ................................................................................... 8 图 2- 5 函数 PROCESS_START 流程图 ............................................................................ 10 图 2- 6 CALL_PROCESS 流程图........................................................................................11 图 2- 7 EXIT_PROCESS 流程图 ........................................................................................ 12 图 2- 8 CONTIKI 事件队列示意图 ................................................................................. 13 图 2- 9 PROCESS_POST 函数流程图 ............................................................................... 14 图 2- 10 DO_EVENT 函数流程图 .................................................................................... 15 图 2- 11 TIMER 链表 TIMER_LIST 示意图 ....................................................................... 16 图 2- 12 ETIMER_SET 流程图 ......................................................................................... 17 图 2- 13 ETIMER_PROCESS 的函数 THREAD 流程图....................................................... 18 图 2- 14 RIME 协议栈结构框图 .................................................................................... 19 图 2- 15 OPEN、COON、CALLBACKS 对应关系............................................................. 21 图 2- 16 RECV 函数流程图 ............................................................................................ 23
clock_init(); process_init(); process_start(&etimer_process, NULL); autostart_start(autostart_processes);
① 分析 Contiki 操作系统源码时,已将分析笔记分享在个人博客 (),本章大部分 是对这些内容的重新整理。
3
开始
时钟初始化 进程初始化
有高优先
级进程 是
否
启动系统进 程
执行该进程
处理事件
启动用户自 启动进程
结束
图 2- 1 Contiki 运行原理示意图
事实上,上述的框图几乎是主函数的流程图。通常情况下,应用程序作为一
个进程放在自启动的指针数组中,系统启动后,先进行一系列的硬件初始化(包括
串 口 、 时 钟 ), 接 着初 始 化 进 程, 启 动系统 进 程 ( 如 管理 etimer 的 系 统 进 程
etimer_process)和用户指定的自启动进程,然后进入处理事件的死循环(如上图右边
Contiki 学习笔记(重写版)
Jelline Blog: 新个人独立博客:
如果您引用本文的内容,记得添加引用: [1]苏铅坤.无线传感器网络文件系统与重编程技术研究[D].电子科技大学.2013.
框框所示,实际上是 process_run 函数的功能)。通过遍历执行完所有高优先级的进
程,而后转去处理事件队列的一个事件,处理该事件(通常对应于执行一个进程)
之后,需先满足高优先级进程才能转去处理下一个事件。将 process_run 代码展开
加到 main 函数,保留关键代码,如下: int main() {
2.1 运行原理................................................................................................................. 3 2.2 CONTIKI 内核 .......................................................................................................... 5
II
Contiki 学习笔记(重写版)①
Contiki 是由瑞典计算机科学研究所开发专用的网络节点操作系统,自 2003 年 发布 1.0 版本以来,得到飞速发展,成为一个完整的操作系统,包括文件系统 Coffee、 网络协议栈 uIP 和 Rime、网络仿真器 COOJA,并于 2012 年发布全新版本 2.6。 Contiki 由标准 C 语言开发,具有很强的移植性,已被移植到多种平台,包括 8051、 MSP430、AVR、ARM,并得到广泛应用。除此之外,Contiki 将 Protothreads 轻量 级线程模型和事件机制完美整合到一起,Proththreads 机制使得系统占用内存极小, 事件机制保证了系统低功耗,非常适合资源受限、功耗敏感的传感器网络。
2.2.1 Protothreads ...................................................................................................... 5 2.2.2 进程控制块 ..................................................................................................... 6 2.2.3 进程调度 ......................................................................................................... 8 2.2.4 事件调度 ....................................................................................................... 12 2.2.5 定时器 ........................................................................................................... 16 2.3 文件系统 COFFEE................................................................................................. 18 2.4 动态加载 .............................................................................................................. 18 2.5 RIME 协议栈.......................................................................................................... 19 2.5.1 协议栈结构 .................................................................................................... 19 2.5.2 建立连接 ....................................................................................................... 20 2.5.3 数据发送 ....................................................................................................... 22 2.5.4 数据接收 ....................................................................................................... 22 2.5.5 释放连接 ....................................................................................................... 23 2.6 本章小结 .............................................................................................................. 24
Contiki_学习PPT
– Process must NOT block.
• Protothreads provide sequential flow of control in Contiki processes
Event-driven vs MultiThread
• Event-driven requires less memory • Multithreading requires per-thread stacks
Contiki processes are protothreads
Put your logic here
Limitations of the protothread implementation • Automatic variables not stored across a blocking wait
Multithreading
The problem: code flow
Protothreads: A new programming abstraction • A design point between events and threads • Programming primitive: conditional blocking wait
Start user processes
Main scheduler loop
loop until 1 poll_requested==1 or 2 nevents>0
Method: POLL
Method : POST
Timer based programming: etimer
Every tick(125ms), etimer_process is called by a clock interrupt Etimer_process checks if any etimer is expired in the etimer list Etimer_process tells the main scheduler loop to call the process correspond to the expired etimer
Contiki实验2 - 问题timer
1.etimer结构(代码在附录中-文档末尾)选中etimer后按F12转到etimer结构体的定义中其中struct timer timer;是一个定时器,按F12转定义后可以看到timer仅包含起始时刻clock_time_t start;和间隔时间clock_time_t interval;,通过比较到到期时间和新的当前时间,从而判断该定时器是不是到期。
struct etimer *next;用于指向下一个etimer。
struct process *p;指向一个进程,当etimer到期时,会给相应的进程传递事件PROCESS_EVENT_TIMER,从而使该进程启动。
2.etimer相关的部分函数(位于core->sys->etimer.c文件中)2.1 void etimer_set(struct etimer *et,clock_time_t interval)(位于第180行)参数1 struct etimer *:需要设置的etimer指针参数2 clock_time_t interval: etimer的时间间隔主要功能:设置etimer中的timer,然后将etimer添加到timerlist链表中。
选中timer_set函数,按F12跳转到timer_set函数中主要功能:设置timer的时间间隔interval和开始时间start。
时间间隔为传入的参数,开始时间为当前时间。
2.2 static void add_timer(struct etimer *timer)(位于第155行)选中add_timer函数,按F12跳转到add_timer函数中首先etimer_request_poll用于提升etimer_process进程的优先级,以便于etimer 能尽快的得到响应。
然后判断etimer所绑定的进程是否被执行过(被执行过之后,etimer绑定的进程会置为PROCESS_NONE),如果没执行过,则遍历timerlist链表,如果需要设置的etimer在timerlist链表中,则直接修改etimer绑定的进程为正在执行的进程(PROCESS_CURRENT 宏返回系统当前正在执行的进程),然后调用update_time函数更新时间,如果etimer不在timerlist链表中,绑定正在执行的进程,将etimer插入在timerlist链表的头部,然后,调用update_time函数更新时间。
ArcCatalog读书笔记
第一章ArcCatalog简介欢迎使用ESRI ArcCatalog 软件,它将使地理数据访问和管理更为容易。
首先,将所操作的地理数据连接添加到Catalog中,可以连接本地磁盘上的文件夹、网上的共享文件夹和数据库,或地理信息系统(GIS)服务器。
建好Catalog后,就可以用不同视图查找所需要的数据和浏览查找的结果。
ArcCatalog对不同格式数据的处理方法是一样的。
它提供的一些工具可以帮助用户组织和维护数据。
对于一个制图者来讲,确保将正确的数据加入地图中一直都不容易。
但是,无论是分析管理个人数据,还是管理大型机构的数据,ArcCatalog 都可以使工作简化。
第二章快速入门教程ArcCatalog可用于浏览和管理数据。
连接数据后,即可使用Catalog浏览其内容。
当找到想要使用的数据后,可以将其添加到地图中。
通常获取到项目所需数据后,不能立即使用它,可能需要改变它的投影或格式,修改属性,或者将其他表中存储的属性与地理要素进行链接。
数据最终准备完毕后,需要把数据内容和所作修改存档。
这些数据管理的工作可以采用Catalog中提供的工具来完成。
第三章Catalog基础无论是查找指定地图,归档其内容,还是修改一个coverage,都可以在ArcCatalog 中完成。
在开始工作前,请阅读本章内容。
主要包括:ArcCatalog启动后可以看到什么,如何使用它浏览手头现有数据,解释如何使用在线帮助(提供了解ArcCatalog窗口中每个元素的信息)。
此外,帮助主题还提供逐步指导功能,为用户演示怎样完成任务。
第四章Catalog内容ArcCatalog集中了所有要用到数据的连接。
选中一个连接后,可以访问它链接的数据。
连接可以访问本地磁盘上的文件,网络上的数据库或一个ArcGIS服务器。
总的来说,这些连接创建了地理数据源的目录。
在目录中,单个的文件夹和Coverages都是数据项。
如果使用过ArcInfo Workstation,当提到一个coverage属性时,习惯使用术语item(数据项)。
ContikiMAC翻译
ContikiMAC周期性休眠RDC协议Adam Dunkels(瑞典)2011.12摘要低功耗设备必须尽可能的保持射频的关闭,以达到尽量的能耗,但也需经常的醒来以接收周围节点的通信数据。
这份报告描述了ContikiMAC周期性休眠机制,在Contiki2.5中的默认机制中使用了一个高效的唤醒机制,并使用一系列的时序管理尽可能使射频处于关闭状态。
使用ContikiMAC,节点可以在网络中通信时,保持基本上99%的时间中射频都处于关闭状态。
这份报告描述了ContikiMAC机制,测量单个ContikiMAC操作的能量消耗,以及评估快速休眠和时序锁定的优化效果。
1. 前沿低功耗无线设备必须维持严格的能耗以获得数年的生存时间。
在低功耗无线设备的所有部件中,无线收发器通常能耗消耗更高。
无线收发器在被动监听其他设备的信号中的功率与主动传输的功率一致,因而收发机必须完全的关闭以节省能量。
因为节点在收发机关闭状态不能接受任何数据,周期性的休眠管理机制必须被用于不时地打开收发机。
在多年发展中,提出了许多的周期休眠机制(例如,Dutta和Dunkels的更加彻底的周期休眠机制的审视);这篇文档描述了ContikiMAC的周期休眠机制,使用的是Contiki 2.5 中的默认机制。
ContikiMAC被设计来易于理解和实现。
ContikiMAC仅使用异步机制,没有同步信息,也没有额外的包头数据。
ContikiMAC数据包是普通的链路层信息。
ContikiMAC具有更为高效节能的唤醒机制。
通过一系列的精准的时间约束来实现。
另外,ContikiMAC使用了快速休眠的优化方法,以允许快速的检测到失败的唤醒,并且采用传输时序锁优化方法,允许传输数据时能耗的实时优化。
ContikiMAC中的机制是由现有的周期循环机制中启发而来的。
周期唤醒的想法在许多的协议中都使用过,如B-MAC,X-MAC和BoX-MAC。
时序锁优化已经先前由WiseMAC中所推荐使用,也已经被用于其他的一些协议。
(完整word版)传智播客C经典入门课堂笔记-苏坤
今天学习的第一句话:Console.WriteLine(“你想显示的内容。
”);第二句话:Console.ReadKey();当程序执行到Console.ReadKey();时,程序会停到这里,等待用户从键盘上键入一个键,用户键入这个键之后,程序才会继续执行。
在C#中,每一句话都必须以“分号”结束C#中的注释,什么是注释呢?对我程序进行的解释,注释是给人看的。
下面的一对指示可以折叠代码。
#region内容#endregionMSIL:微软中间语言Microsoft Inter mediate LanguageCLR:公共语言运行时Common Language RuntimeCLS公共语言规范Common Language SpecificationCTS:通用类型系统Common Type SystemJIT:即时编译器Just In Time第二天课程:复习--Console.WriteLine()可以用CW加Tab键。
这样就能直接打出Console.WriteLine();变量1:变量:变量代表着一块内存空间,我们可以通过变量名称向内存存\取数据。
有变量就不需要我们记忆复杂的内存地址。
向内存申请一块内存空间的语法:数据类型变量名;整数在我们C#中的数据类型叫intInt nuber;Double:小数Char:字符型只能存储一个字符,并且存储的这个字符要求用单引号引起来String 类型:字符串,就是把0个或1个或多个字符连接起来。
字符串要求用双引号引起来。
Decimal 类型:用来表示钱和货币,失精度不至于丢失。
注意:在C#开发环境中,直接写一个有小数点的数字,这个数字是double类型。
在一个小孩苏idan后面加个m\M,就告诉编译器这是个decimal类型应该写成:money = 100.34m;变量的命名规则:1.必须以“字母”_或@符号开头、2.后面可以跟任意“字母”,数字,下划线。
contiki_protothread
AUTOSTART_PROCESSES 宏实际上是定义一个指针数组,存放 Contiki 系统运行时需自动启动的进程。AUTOSTART_PROCESSES 在 contiki 中 的第一如程序九。
程序四中 PROCESS_THREAD(hello_world_process, ev, data); 是紧跟分号的,在 c 语言中这说明这程序五中这是对函数的声明,而 程序三中 PROCESS_THREAD(hello_world_process, ev, data)后面没 有分号,紧接的是 "{}" 这说明这个函数是执行体。
(3)PROCESS_BEGIN 宏和 PROCESS_END 宏 程序十二:
1 #define PROCESS_BEGIN() PT_BEGIN(process_pt))/*protothread 开始*/
2 #define PT_BEGIN(pt) { char PT_YIELD_FLAG = 1; LC_RESUME((pt)->lc)
7 Return i;/* 退出函数 */
8 case__LINE__:;/* 在退出之后的下次调用将直接从此出运行 */
9 /* 在此处继续执行你的代码。。。 */
10 }
11 }
12 }
还原后的这段代码充分利用 c 语言的特性用 switch 分支结构穿插 在循环体结构中,用 state 来保存程序退出点,使得程序可以在上次 断点出得以继续执行。
先介绍两个宏‘…’、‘__VA_ARGS__ ’。‘…’指可变参数,可 以是任意个数任意形式的参数;‘__VA_ARGS__ ’是一个可变参数的
contiki3.0之button_sensor全面解析,已经测试成功
contiki3.0之button_sensor全⾯解析,已经测试成功以InstantContiki3.0环境的cc2538dk为例进⾏解剥原理》》》》⾸先找到3.0\platform\cc2538dk⾥⾯有⼀个contiki-main.c⼀般不⽤更改,就是我们通常的main.c主函数,⼀切将从这⾥开始。
特别注意的是,3.0\cpu\cc2538这⾥⾯所有⽂件不⽤更改,因为都是作者按照芯⽚⼿册和OS制定好的。
在3.0\core\lib的sensors.c, 在3.0\core\dev的button-sensor.c不⽤更改, 是系统的⽂件改什么改。
哈哈,要更改的内容是,3.0\platform\cc2538dk⾥⾯的contiki-main.c必要时更改,我们重点看⼀下这些内容1/*---------------------------------------------------------------------------*/2/**3 * \brief Main routine for the cc2538dk platform4*/5int6 main(void)7 {8 nvic_init();9 ioc_init();10 sys_ctrl_init();11 clock_init();12 lpm_init();13 rtimer_init();14 gpio_init();1516 leds_init();17 fade(LEDS_YELLOW);1819 process_init();2021 watchdog_init();22 button_sensor_init();这个是平台的初始化部份,很重要!你看button_sensor_init()出现了。
在\3.0\platform\cc2538dk\dev⾥⾯有button-sensor.c,这是我们要更改的,和3.0\core\dev的button-sensor.c名字⼀样,这种搞法在IAR⾥⾯,肯定会报⽂件重名错误,看来linux很⾃由也很不严瑾。
Contiki入门手册
Contiki OS入门手册
第 1 页, 共 28 页
Contiki OS 入门手册
目录
1 源代码目录结构说明...............................................................................................................3 2 Hello-world实验教程 ..............................................................................................................7 3 Blink-hello实验教程..............................................................................................................11 4 Event-post实验教程 ..............................................................................................................16 5 Timers实验教程.....................................................................................................................21
Contiki操作系统是基于事件驱动(Event-driven)内核的操作系统,在此内核上,应用 程序可以在运行时动态加载,非常灵活。在事件驱动内核基础上,Contiki实现了一种轻量级 的名为protothread的线程模型,来实现线性的、类似于线程的编程风格。该模型类似于Linux 和windows中线程的概念,多个线程共享同一个任务栈,从而减少RAM占用。Contiki还提供 一种可选的任务抢占机制、基于事件和消息传递的进程间通信机制。Contiki中还包括一个可 选的GUI子系统,可以提供对本地串口终端、基于VNC的网络化虚拟显示或者Telnet的图形 化支持。
狂神课堂笔记
狂神课堂笔记⽬录打开CMD的⽅式1. 开始+系统+命令提⽰符2. Win键+R 输⼊cmd 打开控制台(推荐使⽤)3. 在任意⽂件夹下⾯,按住shift键+⿏标右键,选择在此处打开命令⾏窗⼝4. 资源管理器的地址栏前⾯加上cmd(空格)路径管理员⽅式运⾏:选择以管理员⽅式运⾏常⽤的Dos命令1 #盘符切换输⼊D:2 #查看当前⽬录下得所有⽂件输⼊dir3 #切换⽬录 cd changge directory4 #返回上⼀级 cd ..5 #清屏 cls (clear screen 英⽂清理屏幕)6 #退出终端 exit7 #查看电脑ip ipconfig8 #打开应⽤计算机 calc画图⼯具 mspaint记事本 notepad9 #ping命令ping 10#创建⽂件夹 md打开⽂件 cd创建⽂件 cd>a.txt删除⽂件 del a.txt移除⽬录 rdJAVA特性和优势简单性⾯向对象可移植性⾼性能分布式动态性多线程安全性健壮性JDK卸载1. 删除java的安装⽬录2. 删除环境变量⾥⾯的JAVA_HEOM3. 删除环境变量⾥⾯的path下关于java的⽬录4. 最后查看java_version安装JDK1. 百度搜索JDK8,找到下载地址2. 同意协议3. 下载电脑对应的版本4. 双击安装JDK5. 记住安装的路径6. 配置环境变量我的电脑---右键---属性环境变量---JAVA_HOME配置path变量7. 测试JDK是否安装成功打开cmdJAVA -versionNotepad++HelloWord1. 随便新建⼀个⽂件夹2. 新建⼀个java⽂件 - ⽂件后缀名为.java - 如helloword.java - 系统可能没有显⽰⽂件后缀,我们需要⼿动打开3. 编写代码public class Hello{public static void main(String[] rags){System.out.print("Hello,World");}}3. 编译javac java⽂件,会⽣成⼀个class⽂件4. 运⾏class⽂件,java class⽂件可能会遇到的情况1. 每个单词的⼤⼩不能出现问题,java是⼤⼩写敏感词2. 尽量使⽤英⽂3. ⽂件名和类名必须保持⼀致4. 符号使⽤了中⽂JAVA程序运⾏机制编译型解释型直接⽣成开头1. psvm2. sout注释单⾏注释://多⾏注释:/**/⽂档注释:/***内容*/标识符abstract assert boolean break bytecase catch char class constcontinue default do double elseenum extends final finally floatfor goto if implements importinstanceof int interface long nativenew package private protected publicreture strictfp short static superswitch synchronized this throw throwstransient try void volatile while标识符注意点1. 标识符⼤⼩写⼗分敏感2. 可以⽤中⽂,不建议使⽤数据类型强类型语⾔要求变量的使⽤要严格符合规定,所有变量都必须先定义后才能使⽤//⼋⼤基本数据类型//整数int num1=10; //最常⽤byte num2=20;short num3=30;long num4=30L; //long类型要在数字后⾯加个L,⽤于区分//⼩数:浮点数float num5=50.1F;//float类型要在数字后⾯加个F,⽤于区分double num6=3.1415926;//字符char name ='A';//字符串,String不是关键字,是类String namea ="秦疆";//布尔值:是⾮boolean flag = true;//boolean flag = false;数据扩展整数扩展public class Demo4 {public static void main(String[] args) {//整数扩展:进制⼆进制0b ⼋进制⼗进制0 ⼗六进制0xint i =10;int i2 =010;//⼗进制0int i3 =0x10;//⼗六进制0xSystem.out.println(i);System.out.println(i2);System.out.println(i3);}}浮点数扩展public class Demo05 {public static void main(String[] args) {//浮点数扩展银⾏业务怎么表⽰?钱//BigDicimal 数学⼯具类//float 特点:有限离散舍⼊误差⼤约接近但不等于//double//最好完全避免使⽤浮点数进⾏⽐较//最好完全避免使⽤浮点数进⾏⽐较//最好完全避免使⽤浮点数进⾏⽐较float f =0.1f;//0.1double d =1.0/10;//0.1System.out.println(f==d);System.out.println(f);System.out.println(d);float d1 =010*******f;float d2 =d1+1;System.out.println(d1==d2);//ture}}字符扩展public class Demo05 {public static void main(String[] args) {//字符扩展char c1='秦';char c2='疆';System.out.println(c1);System.out.println((int)c1);//强制转换System.out.println(c2);System.out.println((int)c2);//强制转换//所有的字符本质还是数字//编码 Unicode 表:A=65 a=97 2个字节 65536 Excel 2 16=65536 // U0000 UFFFFchar c3 ='\u0061';System.out.println(c3);}}转义字符public class Demo05 {public static void main(String[] args) {//转义字符// \t 制表符// \n 换⾏System.out.println("Hello\tWorld");//空格System.out.println("Hello\nWorld");//换⾏String sa = new String( "hello world");String sb = new String( "hello world");System.out.println(sa==sb);String sc = "hello world";String sd = "hello world";System.out.println(sc==sd);//对象从内存分析}}布尔值扩展public class Demo05 {public static void main(String[] args) {//布尔值扩展/* boolean flag=ture;if (flag=ture){}//新⼿程序员//相等if (flag){}//⽼⼿程序员*/}}类型转换由于java是强类型语⾔,所以要进⾏有些运算的时候,与要⽤到类型转换低---------------------------------------------------------------------------------------------⾼byte,short,char-------->int------->long-------->float-------->doublepublic class Demo05 {public static void main(String[] args) {int i =128;byte j =(byte)i;//=-128,内存溢出,⾼----低(强制转换)double x =i;//低----⾼(⾃动转换)//强制转换(类型)变量名⾼----低//⾃动转换低----⾼System.out.println(i);System.out.println(j);System.out.println(x);/** 1.不能对布尔值进⾏转换* 2.不能把对象类型转化为不相⼲的类型* 3.把⾼容量转化为低容量时⼀定要“强制转换”* 4.转换时可能出现内存溢出,或者精度问题!** */System.out.println("======================================================================="); System.out.println((int)24.5); //=24System.out.println((int)-45.95f); //=45System.out.println("======================================================================="); char c = 'a';int d = c+1;System.out.println(d);System.out.println((char)d);}}注意问题public class Demo05 {public static void main(String[] args) {System.out.println("======================================================================="); //操作⽐较⼤的数的时候,注意溢出问题//JDK的新特性,数字之间可以⽤下划线分割int money =10_0000_0000;int year = 20;int total = money*year;//-1474836480,计算的时候溢出了long tota2 = money*year;//默认是int,转换之前已经出现问题long tota3 = money*((long)year);//20000000000System.out.println(tota3);变量变量是什么:就是可以变化的量!java是⼀种强类型语⾔,每个变量都必须声明其类型java变量是程序中最基本的存储单位,其要素包括变量名,变量类型和作⽤域例: type varName [=value] [{,varName[=value]}] ;//数据类型变量名 =值,可以⽤逗号隔开来声明多个同类型变量。
JNDI学习笔记
JNDI学习笔记由于工作需要学习了一天的JNDI有一些收获,写下来与大家分享.高手可以帮忙纠正和指点,在此谢过!一:几个概念,Context,entry/object,filter.AttributeContext:上下文,我的理解是相当与文件系统的中的目录(JNDI的Naming Service是可以用操作系统的文件系统的,哈哈).entry/object:一个节点,相当与文件系统中的目录或文件.filter:查询/过滤条件是一个字符串表达式如:(&(objectClass=top)(cn=*))查询出objectClass属性为top,cn属性为所有情况的entry.Attribute:entry/object的属性可以理解成JAVA对象的属性,不同的是这个属性可以多次赋值.镖师甲回复于:2004-09-30 19:15:59(怕发丢了分着发)二:Naming Service的简单例子,JNDI的全称是名字与目录服务,LDAP服务器都可以做Naming Service和Directory Service.JNDI Toturial上为了方面用File System做为naming service.以下的一个例子是演示一个从File System Lookup.package study.jndi;import java.util.Hashtable;import javax.naming.Context;import javax.naming.InitialContext;import javax.naming.NamingException;public class Lookup{public static void main(String[] args){Hashtable env = new Hashtable();String name = "C:/aaa.txt";try{env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.fscontext.RefFSC ontextFactory"); //use the file system as service providerContext ctx = new InitialContext(env);Object obj = ctx.lookup(name);System.out.println("the name " + name + " is bound to object:" + obj);}catch(Exception ex){ex.printStackTrace();}}}为了运行的程序你要到/products/jndi/downloads/index.html下载JNDI的相关包,然后把两个jar:fscontext.jar和providerutil.jar加入到你的CLASSPATH 中.这样就可以运行了.你可以做进一步的操纵如bind,unbind等等.Context ctx = new InitialContext();是以文件系统为初始上下文,这样一来你可以把String name = "C:/aaa.txt";换成你系统中的任意目录和文件的路径名.env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.fscontext.RefFSContextFac tory");是指明Service provider是文件系统.镖师甲回复于:2004-09-30 19:51:18由于我的工作主要是对Directory Service进行操作,所以重点学习了,javax.naming.directory包中的类.以下的几个例子演示从LDAP上查询ENTRY并得到属性和属性值.假设我的LDAP是这样存放的: 根节点c=com 二级节点 ou=t 以及其它三级节点 ou = xc 以及其它四级节点 cn=bsj. LDAP服务器安装在我自己的机器上。
