TinyOS移植技术分析及在CC2430平台的应用

发布者:沭阳小黄同志最新更新时间:2012-10-25 来源: 现代电子技术 关键字:无线传感器网络  TinyOS  移植  CC2430 手机看文章 扫描二维码
随时随地手机看文章

    无线传感器网络(Wireless Sensor Network,WSN)由部署在监测区域内大量廉价微型传感器节点组成,通过无线通信方式形成的一个网络系统,其目的是协作的感知、采集和处理网络覆盖区域中感知对象的信息,并发送给观察者,被誉为21世纪最具影响技术之一。传感器节点通常是一个微型的资源受限的嵌入式系统,因此要求一个小型高效的操作系统管理组织硬件并完成软件功能。
    由于无线传感器网络节点的资源十分有限,传统的嵌入式操作系统难以正常有效地运行和工作,特别对能量和内存的需求矛盾比较突出。因此,需要一种全新的嵌入式操作系统来满足无线传感器节点的基本需求。近年来,科研机构不断开发出具有多种功能的WSN操作系统。大多数操作系统都使用事件驱动的编程模型,典型的有TinyOS、Contiki、EYESOS、SOS等。
    TinyOS操作系统是美国加州大学伯克利分校的研究人员针对无线传感器网络设计的开源嵌入式操作系统,是目前无线传感器网络采用的主流操作系统。TinyOS最初使用汇编和C语言编写,但经研究人员进一步的研究及使用后发现,C语言并不能有效和方便地支持无线传感器网络应用程序的开发。因而在经过研究和设计,并在对C语言进行了一定扩展的基础上,提出了支持组件化编程的nesC语言,该语言可以把组件化、模块化思想和基于事件驱动的执行模型结合起来,具有一些C语言无法比拟的优点。nesC语言提出后,TinyOS操作系统和基于TinyOS操作系统的应用程序全部使用nesC语言编写。

1 TinyOS原理分析
1.1 简介
    TinyOS是美国加州大学伯克利分校针对无线传感器网络开发的嵌入式操作系统,核心程序很小,对硬件要求很低,它的事件驱动机制、主动消息机制、组件化结构等特点使其在研究中得到广泛应用。目前,TinyOS支持的平台主要集中在Atmel公司的AVR系列和TI公司的MsP430系列单片机。
1.2 TinyOS的体系结构
    TinyOS体现结构如图1所示,其核心部分为TinyOS的硬件抽象3层结构。TinyOS的硬件抽象层使系统的软件和硬件完全独立,从而使系统的设备驱动程序与硬件无关,大大提高了系统的可移植性。TinyOS具有3层硬件抽象结构,并明确规定了每一层的功能,每一层都依赖于下一层提供的接口,这使得TinyOS的移植比较方便。


    最底层是硬件描述层(Hardware Presentation Layer,HPL),该层提供硬件层和软件层的直接接口,通过调用函数的方法来屏蔽复杂的硬件层,不仅实现了硬件层和软件层的内部通信,而且为系统其他部分提供了使用的接口。
    中间层是硬件适用层(Hardware AdaptationLayer,HAL),位于HPL上层,该层对硬件层的定时器、模数转换器、存储器等模块原型进行较高层的抽象,可以更直接更方便地为上层软件层提供可定制的操作接口。
    最顶层是硬件独立层(Hardware Independent Layer,HIL),位于HAL上层,该层提供抽象的独立硬件层接口,通过隐藏硬件层来简化上层应用软件的编写,其功能类似于Windows操作系统下的API。
    TinyOS的3层硬件抽象结构有很大的灵活性,具体的应用程序可以将HAL和HIL组件结合使用,以提高代码执行效率和系统的可移植性。[page]

1.3 TinyOS的运行机制
   
在TinyOS的总体框架中,物理层硬件层为框架的最底层,在该层中,传感器、射频收发器以及时钟等硬件均能触发事件(event)发生,交由上层组件处理;软件层中相对下层的组件也能出发事件并交由上层处理,而上层会发出命令(command)交下层处理。为协调各组件间任务的有序处理,需要操作系统采取一定的调度模式。
    TinyOS采用的是事件驱动的两级调度:任务(task)和硬件事件处理句柄(Hardware Event Handlers)。TinyOS使用两种机制支持任务,task和post。task声明必须为无参数的函数声明,执行中的任务都具有原子操作性,任务完成前彼此之间不能被抢占。硬件事件处理句柄被执行去响应硬件中断,可以抢占任务的运行和其他硬件事件处理句柄。TinyOS的任务调度队列只采用最简单的FIFO算法,内核使用一个循环队列来管理任务列表,默认任务列表大小为8。这个任务队列实际上是一个函数指针的数组,提交一个任务即是向队列里插入一个函数指针。任务提交(post)到FIFO队列中等待,当任务队列头索引号等于尾索引号时,表明任务队列为空,系统进入休眠状态并等待,直到新的事件发生。如果新事件向队列中提交了任务,则处理器返回执行状态,TinyOS规定当且仅当任务已经推入队列且没有被执行时post表达式才返回fail,否则将继续休眠。当被事件触发后,TinyOS将中发出信号的事件关联的所有任务将被迅速处理,当这个时间和所有任务被处理完成后,未被使用的CPU将再次被置于睡眠状态而不是积极寻找下一个活跃事件,从而大幅降低了功耗。

2 TinyOS的编译过程分析
    TinyOS的编译系统采用GNU Make,首先将TinyOS应用程序预编译,形成一个“*.C”文件,然后将这个文件传递给与硬件平台相对应的编译器。TinyOS的编译系统放于support/make文件夹中,包含各个平台的配置文件“*.target”和在这个平台上建立应用程序的“*.rul es”文件。所以TinyOS的编译系统可以分为两个部分:使用nesC编译的公用部分和针对具体平台的部分。目前TinyOS支持AVR的Mica系列节点,还有基于MSP430芯片的Telos系列及基于PXA27芯片的Imote,而对于CC2430目前还在开发中。假设目标平台是MICA,其编译过程如图2所示。


    具体进行编译操作时,编译文件根据“TOSMAKE_PATH”变量中所列的路径搜索“*.target”文件。“*.target”文件通常设置一些平台相关变量和提供编译平台的名称,并通过调用“TOSMake_include_platform”指向具体的“*.rules”文件。“*.rules”文件由平台所配备的微处理器决定,因此通常几个平台共用一个“*.rules”文件。如果以命令行的形式给定一个虚拟平台,编译系统会自动寻找“*.ex tra”文件。

3 TinyOS操作系统在CC2430上的移植
3.1 CC2430的特点
   
CC2430单片机是TI公司生产的一款专用于IEEE 802.15.4和ZigBee协议通信的片上系统解决方案。它延用了以往CC2420芯片的架构,在单个芯片上整合了ZigBee射频前端、内存和微控制器。它使用1个8位MCU(8051),具有128 kB可编程闪存和8 kB的RAM,还包含模拟数字转换器(ADC)、几个定时器(Timer)、AES128协同处理器、看门狗定时器(Watchdog Timer)、32 kHz晶振的休眠模式定时器、通电复位电路(Pow er on Reset)、掉电检测电路(Brownout Detection),以及21个可编程I/O引脚。CC2430芯片采0.18 μmCMOS工艺生产;在接收和发射模式下,电流损耗分别低于27 mA或25 mA。CC2430非常适合那些要求能耗非常低的应用,因为它具有休眠模式以及转换到主动模式的超短时间的特性。而无线传感器网络研究的一个核心问题就是节能,因为传感器节点经常需要布置在环境恶劣的无人区,所以能耗问题就成为一个关键问题。由于CC2430的低能耗特性,使其经常作为传感器节点的硬件平台。
3.2 移植过程分析
    TinyOS核心代码经nesC预编译后形成的C文件可以被GCC理解编译。而GCC适用的平台包括telos系列,mica系列和intelmote2系列。但是一些平台如Motorola HCS08,Intel MCS51则不适用于GCC编译。所以将TinyOS移植到CC2430上的关键问题是,如何使GCC支持MCS-51系列的交叉编译及支持CC2430硬件组件的编写。
    在Windows和Linux两大主要平台上有许多8051编译器,其中使用最广泛并且经常进行更新的有2种:KEIL和Small Device C Complier(SDCC)。由于SDCC是一个新兴的开源项目,因此在移植过程中经常会出现许多问题,使一些模块无法正常工作。而且在调试中,SDCC只是简单地驻留在0地址,当单步执行代码时也没有任何调试信息。相比于SDCC,KEIL提供了一套良好的开发调试环境,因此,最终选用KEIL开发工具进行TinyOS的移植工作。
    具体流程如下:
    (1)根据TinyOS上层组件接口的要求,用nesC语言编写硬件表达层和硬件抽象层文件。
    (2)使用TinyOS的NCC编译器将编写的应用程序编译成app.preMangle.c文件。
    (3)将app.preMangle.c文件通过perl语言编写的脚本将其原语法转换为CC2430开发环境Keil支持的语法,生成app.c。
    (4)利用KEIL开发工具将app.c编译、连接,生成app.hex,再通过SmartRF04 Flash Programmer下载到目标板。
3.3 TinyOS在CC2430上的移植过程
3.3.1 组件编写
   
由于TinyOS的组件模式是基于不同抽象层组件的系统,当移植到新的平台时,可以通过添加新的底层硬件的抽象并使用已有的上层组件。为实现CC2430的基本功能,需要对各功能模块进行移植,文中移植的功能包括Timer定时器,UART通信,AD采样,射频通信等。具体模块移植方法如下:
    (1)通用I/O口。首先要对CC2430的各个接口进行定义,CC2430共有21个可编程的I/O接口,通过设置一组寄存器来控制来控制这些接口作为通用I/O口或者是用作外部电路。在HplCC2430GeneralIOC文件及相关头文件中对各个引脚进行定义。由于需要用到CC2430的UART功能,ADC功能,射频功能以及Timer定时器功能,所以需要对相应的寄存器定义。
    (2)UART通信。由于需要向上位机发送数据,所以需要使用CC2430的UART通信功能。CC2430有两个UART接口,分别为UART0和UART1。分别对应CC2430两个I/O接口。选用的UART1,RX和TX对应P0_4接口和P0_5接口,通过SerialByteComm接口实现该功能。在HalCC2430SimpleUartP文件中实现SerialByteComm接口,该接口有两个命令:get和put,分别用来对U1BUF寄存器进行读写。在HplCC2430SimpleUartP文件中对CC24 30芯片串口通信所需要的配置的寄存器各位的值以及波特率等硬件信息进行设置。
    在PlatformSerialC文件中对这些接口进行一个封装,并对SerialByteComm接口的put操作作一个判断,如果UART1的8位寄存器U1CSR的最低位为0,说明串口处于空闲状态,这是向串口发送数据,否则串口处于繁忙状态,不进行任何操作。
    通过这3层组件对SerialByteComm接口的抽象,实现向串口发送数据的功能。
    (3)数模转换。通过传感器感器采集到的模拟信号,需要通过AD转换为数字信号后才能进行下一步的处理。CC2430的ADC有最高14 bit的转换精度,可以采用内部电压或者外部电压。ADCL和ADCH两个8位寄存器存放采样到的数据,其中ADCL的有效位是2到7位,所以有效数据是14 bit。通过对READ接口的抽象实现该组件。在adc.h头文件中配置CC2430的寄存器ADCCON1、ADCCON2、ADCCON3,可以设置转换精度以及采样到的数据传输到芯片的管脚地址。
    可以看到这里定义一组宏,对应了寄存器需要的值。这里使用CC2430芯片的单次采样,由于节点使用了外部传感器这里将ADC的参考电压设为外部电压,精度设为14 bit,将P0_4引脚的电压值数模转换后传入芯片处理器。
    (4)定时器。CC2430有一个16位定时器Timer1和两个8位定时器Timer3和Timer4,以及一个MAC定时器Timer2。这里完成了Timer1的移植。在HplCC2430Timer1P文件中定制相关配置,通过HplCC2430Timer16接口实现基本的计时功能。
    (5)射频模块。传感器节点采集到数据后需要通过无线射频的方式发送出去,这就需要使用CC2430的射频功能。TinyOS通过SimpleMac接口实现该功能,SimpleMac接口可以实现简单的数据收发功能。SimpleMac接口非常适合802.15.4协议,缺点是不支持数据重传和路由功能。在文件HPLCC2430RadioP文件及相关中对CC2430的的寄存器进行读写,HALCC2430RadioP组建对它进行进一步的抽象。
3.3.2 编译过程修改
   
为使TinyOS的编译系统能够找到目标平台CC2430,我们需要修改它的编译环境。基于TinyOS开源代码的约定,除核心程序外的其余项目开发放在contrib文件中。因此将代码放于cygwin/opt/tinyos-2.x-contrib/ncepu中。这里需要在此文件夹中添加CC2430的编译路径以及具体的编译方法。

[page]

    (1)在ncepu文件夹下增加环境定制文件“env”,定制编译路径,使编译系统能够寻找到编译平台。修改后的编译工具链如图3所示。程序的编译结果如图4所示。


    (2)在ncepu/support/make文件下增加“cc2430em.target”文件。
    将编译好的app.hex下载到CC2430上,程序即可运行。

4 基于CC2430的无线传感器网络
   
为检验TinyOS在CCC2430上的运行效果,设计了一个简单无线传感器数据采集网络。传感器节点的检测功能较为简单,仅完成环境的亮度测量。
4.1 无线传感器节点
   
节点的硬件框图如图5所示。节点上的亮度传感器为光敏电阻,环境亮度通过该器件以及信号调理电路转换为电压信号,该信号被传输到CC2430的A/D转换器输入端,经A/D转换变为数字信号,该数字信号即为采集的亮度数据。


    传感器节点的软件流程如图6所示。其大体工作过程为:接通电源后,节点自动寻找通信范围的协调器,如果找到就建立网络连接,当按钮按下时触发ADC采样,传感器节点开始采集数据并向协调器发送数据。当节点接受到关闭信号时,进入休眠状态并停止向协调器发送数据。

[page]

4.2 无线传感器网络中协调器的设计
   
协调器负责无线传感器网络的组网、路由以及数据收集等功能。同时,协调器也是网路与PC机之间连接的一个桥梁,通过协调器可以监控节点探测到的数据并可以对传感器节点进行控制。
    协调器设备打开后,会自动接收通信范围内的节点信号,这个信号包括节点采集到的数据以及节点本身的地址。当协调器接收到信号时,对该信号进行判断,如果该信号已经存在于网络列表,则直接接收节点的数据。如果这个信号不存在于网络列表当中,则将该节点加入网络列表。然后将网络列表中的节点发送来的数据都通过串口传输至PC机。当协调器接收到PC发送的指令后,根据指令内容将指令信号发送给相应的传感器节点。由此,通过协调器可以实现PC机对传感器节点的监控和操作。软件的设计流程如图7所示。


    各节点发送到协调器的测量数据为一个16位的正整数值,协调器每接收到一个测量数据,即通过RS232接口电路将该数据传输至PC机,协调器的硬件框图如图8所示。
4.3 节点与协调器之间的通信协议
   
节点使用无线射频技术(RFID)与协调器进行通信。随着技术的发展,RFID技术已经成为人们日常生活中一个重要工具。但RFID技术也存在一些技术问题需要解决,其中标签防碰撞问题(Anti—collision)是RFID技术的关键问题之一。当多个节点同时向协调器发送信号时,要防止信号的碰撞。为解决这一问题,有空分多址、频分多址、码分多址和时分多址4种方法。文中选用基于CSMA/CA协议的无线射频防碰撞算法。
    CSMA算法是传统TDMA(Time Division Multiple Access,动态时分多址)的调度分配算法ALOHA的改进。传统的ALOHA算法在标签视图发送数据是,并不考虑信道当前的忙闲状态,完全随机接入。可以看到。这种算法有很大的盲目性,当存在大量节点或信息量过大时,会使信道重叠现象加剧,数据碰撞频繁出现,传输性能严重下降。为解决这一问题,提出了在发送数据前,对信道进行侦听,这就是广泛使用的CSMA算法。CSMA算法的基本思路是:
    (1)标签产生新的数据,等待发送。
    (2)侦听信道是否空闲,若空闲则发送数据,发送完成后返回第一步;若信道正忙则产生一个随机数,进入延时操作。假定随机数的取值范围为min~max之间,初始化时,值为min,每次重传,随机数逐渐增大,当达到max值时保持不变。没成功传输之后,回复到初始值min。
    (3)延时操作结束后,返回步骤(2)。
    由于无线网络的特殊性,很难确实地侦听是否有碰撞发生,所以采用带冲突避免的载波侦听多路访问即CSMA/CA算法。标签发送数据前,先发送一段请求发送帧RTS(Request to Send)给目标端,等待目标端回应的清除发送帧CTS(Clear to Send)后,才开始传送。通过RTS与CTS的握手(handshake)避免发送数据时发生碰撞。
4.4 实验与结果分析
   
协调器与节点上电后,即可实现自动组网。组网成功后,节点可将采样到的数据发送给协调器,协调器接收信号,一方面会触发自身的LED灯闪烁,同时通过RS232接口电路将采集到的数据通过串口发送给PC机。实验结果如图9所示。


    每个节点与协调器上均设置有控制按钮,用于通信的验证与控制。在节点上,每按一次按钮采集一个数据,同时将该数据发送到协调器。这些过程,通过实验得到了有效的验证。在PC机上,通过串口助手软件来观察接收的数据。其中,通信的波特率设置为9600bit·s-1,PC机屏幕上显示信息如图10所示。其中Device表示节点ID,最后的数值是经过处理的节点的探测值。这里使用两个节点均置于室内环境,其中一个用不透光的黑胶带遮盖住传感器的光敏元件。可以看到,协调器共接收到了两个节点的信号,两个信号的值均比较平稳,其中一个节点的采样值明显大于另一个,与实际情况相符。实验证明系统各项功能运行良好,网络通信稳定。



5 结束语
   
在对TinyOS操作系统详细分析的基础上,提出了TinyOS的移植方法以及具体实现过程,并将其移植于CC2430硬件平台。其中移植的功能模块包括UART通信、定时器和RF无线射频通信等。实验结果表明,移植后的TinyOS可以健壮地运行于CC2430平台,并能可靠地实现传感器之间的无线组网。该系统可作为一个原型,经进一步性能完善或部分功能扩充即可实现实际应用。

关键字:无线传感器网络  TinyOS  移植  CC2430 引用地址:TinyOS移植技术分析及在CC2430平台的应用

上一篇:VxWorks操作系统下实现ComPactPCI总线驱动
下一篇:为嵌入式列车控制系统选择操作系统

推荐阅读最新更新时间:2024-05-02 22:23

TMS320F28x上RTOS移植关键技术研究
  TMS320F28x上RTOS移植关键技术研究    摘要 详细分析TT公司TMS320F28x系列DSP的启动过程;说明BootROM中程序的运行过程,介绍C编译器和DSP/BIOS的工作细节;探讨DSP的中断处理及从RAM中执行代码等问题。最后分析如何在TMS320F28x系列DSP上移植实时操作系统。    关键词 数字信号处理器 TMS320F28x BootRoM 实时操作系统   TMS320F28x(简称“F28x”)数字信号处理器是TI公司推出的32位定点DSP控制器,其频率高达150 MHz,大大提高了控制系统的精度和芯片的处理能力。在F28x系列DSP上移植实时操作系统,需要对编泽器、系统启动过程、中
[嵌入式]
TQ2440 学习笔记—— 27、移植U-Boot【Bootloader 作用、工作流程】
一、Bootloader 简介 1、系统上电之后,需要一段程序来进行初始化:关闭WATCHDOG、改变系统时钟、初始化存储控制寄存器、将更多的代码复制到内存中等。如果它能将操作系统内核复制到内存中运行,无论从本地(比如Flash)还是从远端(比如通过网络),就称这段程序为Bootloader 。 简单的说,Bootloader 就是这么一段小程序,它在系统上电时开始执行,初始化硬件设备、准备好软件环境,最后调用操作系统内核。 2、Bootloader 的启动方式 CPU 上电后,会从某个地址开始执行。比如MIPS 结构的CPU 会从0xBFC00000取第一条指令,而ARM 结构的CPU则从地址 0x0000000
[单片机]
TQ2440 学习笔记—— 27、<font color='red'>移植</font>U-Boot【Bootloader 作用、工作流程】
DM9000的驱动在TQ2440+linux2.6.32下的移植
这里我们主要阐述DM9000的驱动在TQ2440+linux2.6.32下的移植,分俩部分,一是驱动移植,一是测试程序 硬件平台:TQ2440,DM9000EP 内核 : linux2.6.32 编译工具: codesource出品 arm-linux-none-gnueabi-4.3.3 文件系统: busybox1.1.11+yaffs 在此推荐一个文档: http://singleboy.blog.163.com/blog/static/5490019420115141426387/ mini2440的,在移植过程中参考了此文,鸣谢 一、DM9000驱动移植 主要修改俩个文件,一是mach-smdk2440.c,一
[单片机]
DM9000的驱动在TQ2440+linux2.6.32下的<font color='red'>移植</font>
μC/OS-II在总线式数据采集系统中的应用
    μC/OS-II是一个源代码开放的实时操作系统,可移植、可固化(嵌入到产品中成为产品的一部分)、可裁减,属于占先式实时内核。执行时间可确定(即函数调用与服务的时间是可知的,不依赖于应用程序的多少),支持现有大多数型号的8位、16位、32位MCU/MPU,已被广泛应用于交换机、路由器、过程控制、汽车业、办公自动化、计算机外设以及民用消费类产品等,具有稳定的可靠性。把μC/OS-II应用在总线式数据采集系统中,可使该系统比以往的前后台系统能够更加稳定地工作,而且在一定程度上满足了监控测量实时性的需求。 1 总线式数据采集系统的组成与功能     随着社会信息化程度的提高,人们对重要工业及生活设施智能化监控的要求也越来
[嵌入式]
SD卡驱动程序移植
1.内核MMC/SD驱动程序框架 内核drivers/mmc目录下有3个子目录:card/、core/和host/,这刚好表示了MMC/SD驱动程序的3个层次,如下: 1)区块层 向文件系统层、用户空间提供文件操作的接口,主要文件是card/目录下的block.c,queue.c向它提供了几个函数来操作队列。 区块层调用core/目录下的core.c、sysfs.c提供的接口来识别存储卡的分区、读写存储卡等功能。 2)核心层 核心层代码在core/目录下,它封装了MMC/SD命令,实现MMC/SD协议,它调用主机控制器层的接口完成存储卡的识别、设置、读写等。 可知,
[单片机]
SD卡驱动程序<font color='red'>移植</font>
移植u-boot-1.1.6之mtdparts分区
和u-boot高版本不同,mtdparts命令没有cmd_mtdparts这么一个单独的文件来实现。 不过,搜索uboot可以在cmd_jffs2.c里面看到如下代码: 1 U_BOOT_CMD( 2 mtdparts, 6, 0, do_jffs2_mtdparts, 3 mtdparts- define flash/nand partitionsn , 4 n 5 - list partition tablen 6 mtdparts delalln 7 - delete all partitionsn 8 mtdparts del part-idn 9
[单片机]
linux 2.6.22.6 移植
板子是国嵌的 GQ2440 主要移植步骤参考 韦东山老师的《嵌入式linux应用开发完全手册》 1、下载内核,打补丁 2、是用config_ok 配置内核 3、在 include/asm-arm/mach-types.h 中修改 MACH_TYPE_S3C2440 的值为 1999 因为MACH_TYPE_S3C2440 对应的机器结构在 arch/arm/mach-s3c2440/mach-smdk2440.c 中定义 所以 要把这个文件编译进内核,所以配置中有:System Type - s3c2440 Machines - SMDK2440 4、在arch/arm/mach-s3c2440/mach-smdk2440.c
[单片机]
05-S3C2440学习之内核(移植)linux3.4.2移植(2)之yffs2文件系统移植+内核裁剪+内核制作补丁
一、移植YFFS2文件系统 yffs文件系统更加支持nand设备 上节移植了jffs2文件系统(点击查看)到移植的内核中,这节我们将yffs2文件系统移植到刚移植好的内核中。 (1)获取源码并解压 git clone git://www.aleph1.co.uk/yaffs2 tar xjf yaffs2.tar.bz2 (2)给内核打上yffs2补丁 ./patch-ker.sh c m /home/book/linux-3.4.2 ++ (3) 配置内核支持YAFFS 1. ls fs/yaffs2 (4)编译、生成uImage 出错,制作yffs2 source工程.
[单片机]
05-S3C2440学习之内核(<font color='red'>移植</font>)linux3.4.2<font color='red'>移植</font>(2)之yffs2文件系统<font color='red'>移植</font>+内核裁剪+内核制作补丁
小广播
最新嵌入式文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved