首页 > 理工 > 计算机

基于1-Wire网络的iButton软件设计

【关键词:计算机网络】 
摘  要  本文在论述了iButton应用现状的基础上,重点对基于1-Wire网络的iButton软件系统应用进行了研究,提出了系统设计思想,并给出了其数据处理流程和DS1991读/写算法,最后以Delphi为前台界面开发工具,建立了一个基于iButton的应用实例—酒店智能管理系统。为iButton的研究和应用提供了一种方法和思路。

关键词    iButton,1-Wire,算法,设计;0  引言     计算机技术的蓬勃发展,使基于条形码、磁卡、IC卡等技术的数字识别系统逐渐取代了人工识别,并被广泛应用于金融、电信、商业等领域,深刻影响着人们的日常生活。但是由于条形码、磁卡、IC卡等构成的数字识别系统存在着携带不便、易受损坏、不能应用于恶劣环境等不足。美国达拉斯半导体公司(Dallas Semiconductor Corporation)推出的一种智能化信息载体iButton,较好地解决了数字识别系统存在的这些问题,为开发更加完善的新颖数字识别系统提供了技术支持和实现手段。    iButton(information Button)意为“信息钮扣”。它采用直径17mm、厚3~6mm的钮扣状不锈钢外壳封装。内部由I/O处理器和存储器两个基本部分组成,某些应用于特殊场合的iButton还内置有感温等元器件。iButton以1-Wire规范作为通信协议,仅用1根数据线实现与外界的信息交换。DS1991是 iButton的一种,它的内部有1152位的密码保护存储器区,512位的非密码保护存储器scratchpad。密码保护存储器被分为三个可独立操作的密钥子存储器(subkey),每区为384位,每个密钱子区都有自己的64位密码及64位的ID码,对密钥子区的读/写操作均需进行密码验证。三个区的数据可分别操作,互不干扰。非密码保护存储器区主要用于加密数据的拷贝,以保证数据的完整性。本文提出基于1-Wire网络的iButton软件系统的硬件组成、软件设计思想和具体的应用实例,为iButton的具体应用提供了一种思路和方法。1  系统设计1.1  单总线系统结构设计    1-Wire总线是一种简单的信号电路,它仅用一根数据线即可与外界进行信息交换。所有的1-Wire 总线器件都具有一个共同的特征;无论是芯片内还是iButton 内,在出厂时每个器件都有一个与其它任何器件互不重复的固定的序列号。也就是说,每一个器件都是唯一的。一旦器件的序列号已知,通过这个序列号,任意一个器件都可以从众多连到同一1-Wire总线的器件中被选出用于通信。    通信时,总线控制器先发出一个“复位”信号以使总线同步,然后选择受制器件进行随后的通信。这可以通过选择一个特定的受控器件(利用该设备的系列号进行选择)或者通过对半检索法找到总线上的下一个受控器件来实现,当然,也可以选择所有的受控器件。一旦一个特定的器件被选中,那么在总线控制器发出下一次“复位”信号之前,所有其它器件都被挂起而忽略随后的通信。    主机能向用于总线通信的所有器件发布指令,对它(或者它们)进行数据的读写。这是因为每类器件运行不同的函数,有不同的用途,而且一旦器件被选定,它所用的协议也就固定下来。即使每类器件有不同的协议和特征,它们也都有着同样的选择过程。1.2  软件开发工具    iButton-TMEX professional SDK v3.10 是Dallas公司提供的进行应用程序开发的软件包,通过调用其TMEX-API函数可方便地开发iButton的应用软件。该软件包适用于DOS、Win3.1、Win95/98、WinNT、WinCE等多种操作平台,支持高级语言如VB、VC、DELPHI和汇编语言如8051、808x等多种编程环境。    SDK的主要包含:编程所需的动态链接库(dll),TMEX-API函数的说明文档,Demo程序及其说明文档等。若在Win95/98操作系统下安装该软件包,会自动将IBFS32.DLL、IB97E32.DLL、IB97U32.DLL、IB10E32.DLL、DS1410D.SYS和UAAUTHD.UXD等文件写入Windows的System目录下,从而建立起调用TMEX-API函数进行应用程序开发的软件环境。    TMEX-API函数分为会话、文件操作、传输、网络和硬件等5个层次。会话层函数主要用于多任务环境下iButton与基于1-Wire协议的iButton网络MicroLAN的连接;文件操作层函数用于文件读/写以及目录增删操作;传输层函数用于读写数据包操作;网络层函数用于读取及验证iButton的ID;硬件层函数用于对指定端口等特定的硬件操作。1.3   数据处理过程:    DS1991在1-Wire总线上的数据访问命令流程如下所示:初始化→ROM功能命令→存储器或SHA功能命令→处理/数据     (1)  初始化    初次使用时,无法确定存储在从机设备里的密码,所以需要先对DS1991进行初始化。初始化时对选定的子密钥区利用Write Password命令直接写入新的识别码和密码(而不必通过暂存器),一旦新的识别码和密码存入从机设备里,再进行修改时,就要通过暂存器。     (2)  ROM功能命令    DS1991以1-Wire协议为基础用一根数据线来传输数据。总线上的主机必须首先发出四条ROM功能命令:1)Read ROM 读取(33 H),2)Match ROM 匹配(55 H),3)Search ROM搜索(F0 H),4)Skip ROM 跳过(CC H),这些命令可作用于DS1991的64位光刻注册码。一条ROM功能命令执行完后,可实现作用在安全存储器和暂存器上的存储功能,总线上的主机会发出6条存储器功能命令中的任意一条来检测DS1991。DS1991有6个存储器功能命令,分别是:写暂存器(96 H)、读暂存器(69 H)、复制暂存器(3C H)、写密码(5A H)、写密钥子区(99 H)、读密钥子区(66 H)。存储器功能命令由三段组成:一为功能代码,二为命令的起始地址和子密钥的地址代码,三为第二个字节的取反。

图1  DS1991读写操作流程    (3)  存储器或SHA功能命令    DS1991有6个特定的设备检测命令,包括3个中间结果暂存器命令:Write Scratchpad、Read Scratchpad和Copy Scratchpad;还有3个子密钥命令:Write Password、Write Subkey 和Read Subkey。当选中某个从机设备后,存储器功能命令就会写入DS1991中。这些命令由三段组成,每段长为一个字节;第一个字节为功能代码段,它定义了6个可执行的命令;第二个字节是地址段,其中的前六位定义了命令的起始地址值,后两位是子密钥的地址代码;命令的第三个字节是第二个字节的补码。    (4)  处理数据:根据不同的应用对读出或写入的数据做相应的处理。1.4  DS1991的读写算法    当检测到总线上挂接一个新的DS1991时,能够直接获得它的64位序列号,此序列号是进行DS1991操作的唯一依据,然后对它三个加密存储区进入读写操作,图1所示即为对信息钮扣DS1991读、写操作的算法流程。2  软件设计    作为一种新颖的智能化信息载体,iButton信息纽扣采用接触式存取方式的存储器(Touch Memory,简称TM卡),以1-Wire规范作为通信协议,其外壳为信号址,用1根数据线按特定的时序要求由数据线逐位与外界交换数据。    iBUTTON常见的应用有电子防盗门、单位考勤系统、酒店智能管理系统、计算机软件的硬件加密、电子防伪、暂住人口管理系统等。下面给出将微型计算机系统作为Master, 利用Dallas公司提供的触头、串(并)口适配器等现成的外围产品,加之iButton,用Delphi实现的酒店智能管理系统:    (1) 窗体创建时,进行初始化操作获取端口号、端口类型及版本号等信息,并调用ReadTmCardNo函数读取序列号并在窗体上显示,如读取失败则弹出对话框询问是否继续读取。    (2)密码验证正确后,调用ReadDS1991Subkey实现读加密区中的数据以实现查询功能,其运行界面如图2所示。调用函数WriteDS1991Subkey 将读到的信息写进数据库,以实现登记、删除等功能,其运行界面如图3所示。    当进行读操作时调用函数ReadDS1991Subkey,其代码如下:function ReadDS1991Subkey(var subkey_buff :Array of byte; keynum :smallint):boolean; var   tran_buf: Array [0..66] of byte;   tran_len,i,restvalue:smallint;    RetStr:array[0..200] of char;    k:smallint;    RetValue:SmallInt;    rom:array[0..7]of smallint;begin// access the current devicerestvalue := TMAccess(SHandle, @StateBuf);if (restvalue = 1) thenbeginresult:= true ;           // read secure subkey command */           tran_buf[0{tran_len++}] := $66;           // specify subkey number/starting addr */           tran_buf[1{tran_len++}] := ((keynum shl 6) or $10);           // confirmation of previous byte sent*/           tran_buf[2{tran_len++}] := not((keynum shl 6) or $10);           // read id field */           tran_len:=2;           for i := 0 to 7 do           begin             tran_len:=tran_len+1;             tran_buf[tran_len{++}]:=$ff;//FF表示对8个ID字节的读操作           end;           // send password */           for i := 0 to 7 do           begin               tran_len:=tran_len+1;               tran_buf[tran_len{++}] := subkey_buff[8 + i];           end;           // read secure. data */           for i := 0 to 47 do  //29           begin               tran_len:=tran_len+1;               tran_buf[tran_len{++}] := $ff;           end;           // transfer the block */           retvalue := TMBlockStream(SHandle, @tran_buf, tran_len);           if (retvalue = tran_len) then           begin                // copy the result to the read subkey */                for i := 0 to 63 do                begin                subkey_buff[i] := tran_buf[tran_len - 63 + i];//45                end;                result:=TRUE;           end;       end         else         begin         result:=FALSE;         end;end;    当进行写操作的时候调用函数WriteDS1991Subkey,其代码如下:function WriteDS1991Subkey(subkey_buff :Array of byte; keynum : smallint):boolean;var   tran_buf: Array [0..100] of byte;   tran_len,i,retvalue:smallint;   RetStr:array[0..200] of char;begin    { Read the versions of the TMEX drivers }   {Get_Version(@RetStr);   TMGetTypeVersion(PortType,@RetStr);}// access the current deviceretvalue := TMAccess(SHandle, @StateBuf);if (retvalue = 1) thenbegin           // write secure subkey command */           tran_buf[0{tran_len++}] := $99;           // specify subkey number/starting addr */           tran_buf[1{tran_len++}] := ((keynum shl 6) or $10);           // confirmation of previous byte sent*/           tran_buf[2{tran_len++}] := not((keynum shl 6) or $10);           // id field value for write*/           tran_len:=2;           for i := 0 to 7 do           begin               tran_len:=tran_len+1;               tran_buf[tran_len{++}] := ubkey_buff[i];           end;           //send password */           for i := 0 to 7 do           begin               tran_len:=tran_len+1;               tran_buf[tran_len{++}] := subkey_buff[8 + i];           end;           // secure. data for write*/           for i := 0 to length(subkey_buff )-1 do           begin               tran_len:=tran_len+1;               tran_buf[tran_len{++}] :=subkey_buff [16 + i];           end;           // transfer the block */           retvalue := TMBlockStream(SHandle, @tran_buf, tran_len+1);           if (retvalue = (tran_len+1)) then           begin                TMEndSession(SHandle);                result:=TRUE;           end;         endelse         begin         TMEndSession(SHandle);         result:=FALSE;          end;end;

图2

图3 3   结束语    由于iButton采用独特的机械外形设计,具有IC卡、磁卡等信息载体无法比拟的优势,且采用了坚固的MicroCan封装,所以具有防尘、防潮、抗震等特性,特别是在恶劣的环境下,存储于其中的数据信息具有相当高的安全可靠性,所以现在大量应用于野外数据存储;但又因为其体积小,便于携带,在日常生活中也大量使用基于iButton来实现信息管理,对于这类应用完全可以采用本文的设计思想来实现。本文为iButton在管理系统中的应用和研究提供了一种方法和思路,有一定的实用价值。参考文献    [1] 崔建华,郭瑞军.Delphi串口通信工程开发实例导航.北京:人民邮电出版社,2003。    [2]王永红,凌志浩.智能信息载体iButton及其应用.单片机与嵌入式系统应用,2001(4):8~11    [3]翁瑞琴,宋真君,王永红,凌志浩.LonWorks总线PC智能网卡的研制.华东理工大学学报,2060(5):564~567
更多 >>
热门分类
推荐文章