Sun SPOT无线通讯 University Outreach Programs in China 蒋清野(John) Sun 中国技术社区,高级经理 John.Jiang@Sun.Com http://www.qyjohn.net/ Qingye Jiang (John) Senior Manager Sun Developer Network, China 1
802.15.4的起源 在无线通讯领域,大部分的研究和进展都集中在提高通讯 速率上。 某些家庭自动化、安全、农业、工控等等领域对通讯速率 的要求不高,他们需要低功耗和低成本的无线通讯方案。 现有的方案由于复杂度、功耗和成本等等因素无法被应用 到如上所述之场合。 802.15.4 的目标是为相对便宜的固定、便携或者移动设备 提供一种低复杂度、低成本、低功耗、低数据率的中短程 无线通讯标准。
802.15.4的应用范围 家庭网络 汽车网络 工控网络 玩具网络 远程抄表
802.15.4的特征数据 通讯速率:250 Kbps, 40 Kbps, 20 Kbps 支持星形拓补网络和点对点拓补网络 能够支持低延迟设备 有完备的握手协议来保证数据传输的可靠性 低成本,低功耗 操作频带: 2.4 GHz ISM频段,16通道 915 MHz ISM频段,10通道 欧洲868 Mhz频段,1 通道
802.15.4的系统构架 应用程序 应用层 网络路由 地址翻译 数据分割 ZigBee 获得通道 冲突管理 错误纠正 NIC 地址 IEEE 802.15.4 MAC 数据打包 发送数据 接收数据 电源管理 IEEE 802.15.4 IEEE 802.15.4 868/915 MHz 2400 MHz PHY PHY
802.15.4的频段分布(PHY层)
802.15.4的数据包结构(PHY层) PHY 数据包字段定义 数据包头(32位),用于同步 数据包起始符号(8位) PHY包头(8位),表明PSDU的长度 PSDU (0~1016位),数据字段 数据包 起始符号 PHY 包头 PHY服务数据单元 (PSDU) 数据包头 6 字节 0-127 字节
802.15.4的两种节点(MAC层) 全功能节点(Full Function Device, FFD) 适用于任何拓补结构 可以担任网络协调者 可以与任何设备交换数据 精简功能节点(Reduced Function Device, RFD) 适用于星型拓补结构 不能担任网络协调者 只能够与网络协调者交换数据 实现非常简单
802.15.4的星型拓补结构(MAC层)
802.15.4的点对点拓补结构(MAC层)
802.15.4的复合拓补结构(MAC层)
802.15.4的数据包结构(MAC层) 4种MAC数据帧: 数据帧(Data Frame)Data Frame 指示帧(Beacon Frame) 应答帧(Acknowledgment Frame) 指令帧(MAC Command Frame)
ZigBee协议栈概览
常见ZigBee设备构架
互联网通讯协议 TCP/IP – 稳定的,带缓冲的数据链,保证数据的可靠、有序传输。(电话) UDP – 不稳定的,不带缓冲的数据链,不保证数据的可靠性和时序。(寄信) 端口号:0 - 65535
802.15.4通讯协议 Radiostream – 稳定的,带缓冲的数据链,保证数据的可靠、有序传输。(TCP/IP) Radiogram – 不稳定的,不带缓冲的数据链,不保证数据的可靠性和时序。(UDP) 端口号:0 - 255
IEEE扩展Mac地址 IEEE Extended Mac Address (IEEE扩展Mac地址) 基站:0014.4F01.0000.1301 移动:0014.4F01.0000.0FC9 移动:0014.4F01.0000.0FDD IEEE Extended Mac Address (IEEE扩展Mac地址) 由四组十六进制数字组成(nnnn.nnnn.nnnn.nnnn) 所有Sun SPOT的地址前面两组数字为0014.4F01 使用ant slots命令察看连接在计算机上的Sun SPOT的地址 http://en.wikipedia.org/wiki/MAC_address Q:什么是Mac地址?什么是IP地址? Q:为什么需要这些地址?
Sun SPOT无线通讯:系统保留端口 编号为0-31之间的端口为系统保留端口,请不要在您的应用程序当中使用这些端口。目前已经被系统使用的保留端口包括下面这些:
Sun SPOT无线通讯:准备工作 首先,需要知道自己的IEEE扩展Mac地址: IEEEAddress ourAddr = new IEEEAddress(Spot.getInstance().getRadioPolicyManager().getIEEEAddress()); System.out.println("Our radio address = " + ourAddr.asDottedHex()); 通过无线进行通讯涉及到I/O操作,需要捕获与I/O相关的例外! try { //在这里进行无线通讯 } catch (IOException ex) { System.out.println("Error in I/O: " + ex); }
Sun SPOT无线通讯:Radiostream RadiostreamConnection conn = (RadiostreamConnection) Connector.open("radiostream://<destinationAddr>:<portNo>"); 其中,destinationAddr是对方的IEEE扩展Mac地址,portNo则是通讯中使用的端口号。需要注意的是,通讯双方需要使用同样的端口号。 当radiostream连接被建立起来之后,可以使用DataInputStream和DataOutputStream来收发数据: DataInputStream dis = conn.openDataInputStream(); DataOutputStream dos = conn.openDataOutputStream(); 发送一条数据: dos.writeUTF("Sun SPOT Test Message."); dos.flush(); DataOutputStream.flush() 方法将发送缓冲区中的内容真正发送出去。如果没有执行DataOutputSteam.flush()方法,无线通讯模块会在发送缓冲区已经被用完的时候自动将等待发送的内容发送出去。
Sun SPOT无线通讯:Radiostream 接收一条数据并打印其内容: String input_message = dis.readUTF(); System.out.println(input_message); String input_content = DataInputStream.readUTF()方法阻塞当前的进程,等待对方发送的内容。当接收到一个数据包之后,这个数据包的内容被返回到字符串input_content里面。 关闭一个RadioStreamConnection对象: conn.close(); 注意: 如果通讯双方无法找到对方,则会抛出异常NoRouteException。在我们的应用程序中需要捕获和处理这个异常。
Sun SPOT无线通讯:Radiogram 创建一个RadiogramConnection链接: RadiogramConnection conn = (RadiogramConnection) Connector.open("radiogram://<serverAddr>:<portNo>"); 其中,serverAddr是服务器端的IEEE扩展Mac地址,portNo是通讯中使用的端口号。需要注意的是,通讯双方需要使用同样的端口号。 当通讯双方建立起连接之后,可以通过Datagram进行数据交换。 Datagram dg_send = conn.newDatagram(conn.getMaximumLength()); 向一个Datagram对象dg写入数据: dg_send.writeUTF("Hello"); 通过RadiogramConnection conn将一个Datagram对象发送出去: conn.send(dg_send);
Sun SPOT无线通讯:Radiogram 通过RadiogramConnection conn接收一个Datagram对象: Datagram dg_receive = conn.newDatagram(conn.getMaximumLength()); conn.receive(dg_receive); 从一个Datagram对象中读取数据: String input_content = dg_receive.readUTF(); 关闭一个RadiogramConnection对象: conn.close();
Sun SPOT无线通讯:Radiogram广播 radiogram还可以用于向所有的Sun SPOT进行广播。为了进行广播,您首先需要在广播服务器端创建一个特殊的DatagramConnection: DatagramConnection conn = (DatagramConnection) Connector.open("radiogram://broadcast:<portNo>"); Datagram dg_send = conn.newDatagram(conn.getMaximumLength()); dg_send.writeUTF("Sun SPOT Message"); conn.send(dg_send); 其中,portNo是需要使用的广播端口。 在接收端,则需要创建一个DatagramConnection,指定其监听相对应的端口。 RadiogramConnection conn = (RadiogramConnection) Connector.open("radiogram://:<portNo>"); Datagram dg_receive = conn.newDatagram(conn.getMaximumLength()); conn.receive(dg_receive); String input_message = dg_receive.readUTF(); 所有打开同样portNo接收数据的Sun SPOT均可以接收到从广播端发送的数据。
Sun SPOT无线通讯:Radiogram广播 当一只Sun SPOT打开某个端口进行数据广播时,它还可以打开同一个端口监听来自其他Sun SPOT的广播数据,但是无法接受到来自自己的广播数据。也就是说,假如有一组Sun SPOT需要相互交换信息,那么这些Sun SPOT可以约定使用同样的端口通过广播的方式进行通讯。
Sun SPOT无线通讯:编程练习 1 使用Radiostream方式,在两个Sun SPOT之前相互传输当前的温度和亮度数据。 2 使用Radiogram方式,在两个Sun SPOT之间相互传输当前的温度和亮度数据。 3 使用Radiogram广播方式,向所有Sun SPOT广播当前的温度和亮度数据。 4 在飞行器中通常需要监测其三轴的加速度、机舱温度和亮度等指标。譬如说,加速度超出预定的范围,则表示飞行器的运动状态可能出现了问题(例如失速)。机舱的温度过高,可能是由于某些部件过热引起。假设我们的Sun SPOT安装在某型号的小型飞行器上,与一组同型号的小型飞行器编队飞行,这些飞行器之间通过Sun SPOT提供的无线数据链进行通讯。在正常情况下,这些飞行器以每五秒一次的频率报告自己的身份以及OK信号。在加速度、温度或者是亮度超过某个范围的情况下,以每秒一次的频率向其他的飞行器发送SOS信号以及自身的加速度、温度和亮度数据。
Sun SPOT无线通讯 University Outreach Programs in China 蒋清野(John) Sun 中国技术社区,高级经理 John.Jiang@Sun.Com http://www.qyjohn.net/ Qingye Jiang (John) Senior Manager Sun Developer Network, China 27