2017年3月15日 星期三

OpenStack合力Kubernetes打造IoT平台,提供智能城市解决方案

本文详细介绍了OpenStack奥斯丁峰会上主题演讲所提及的开源IoT平台。首先我们会介绍关于IoT的方法和愿景,随后会提供简要的技术概述并展示两个使用案例。
物联网(IoT)是云计算领域的“下一件大事”。领先的行业供应商都提供了自己的IoT解决方案,并将其视作自己的业务战略。因此IoT这个词已经被滥用成为描述不同供应商专有解决方案的一个新流行词汇。“IoT”这个词几乎可以代表一切,甚至比“云计算服务”更加空泛。物联网主要围绕日益增加的计算机间通信,可通过用于收集数据传感器的网络和连接到云计算服务的执行程序处理各类信息。这个技术可以让我们生活中的一切,从街边路灯到港口都变得更加“智能”。
我们对IoT的看法与其他供应商有所差异。我们会通过相同的方法向客户提供私有云解决方案,并使用现有的开源项目对云服务的实现方式进行扩展,借此打造通用IoT平台,以应对不同用例的需求。为此我们定义了下列需求:
开源软件 整个平台必须基于现有的开源解决方案,并且绝对不能只由某一家供应商开发。我们希望使用现有的平台:OpenStack、Kubernetes、Docker、OpenContrail等。
不依赖具体硬件和供应商 软硬件方面不能存在供应商锁定的情况。IoT网关CPU必须支持x86/64或ARM架构。我们不想因为昂贵的专有装置而被迫只能使用某一供应商的产品。
**互操作性**IoT平台必须是通用的,可以适合不同用例。举例来说,如果某一IoT网关可用于统计街灯数量,那么也必须能通过相同的方式将其用于智能工厂或工业4.0应用程序中。
因此我们设计出涉及OpenStack、Kubernetes、OpenContrail和Docker开源项目的下列高层体系结构。
开源软件
整个平台必须基于现有的开源解决方案,并且绝对不能只由某一家供应商开发。我们希望使用现有的平台:OpenStack、Kubernetes、Docker、OpenContrail等。
不依赖具体硬件和供应商
软硬件方面不能存在供应商锁定的情况。IoT网关CPU必须支持x86/64或ARM架构。我们不想因为昂贵的专有装置而被迫只能使用某一供应商的产品。
互操作性
IoT平台必须是通用的,可以适合不同用例。举例来说,如果某一IoT网关可用于统计街灯数量,那么也必须能通过相同的方式将其用于智能工厂或工业4.0应用程序中。
下文技术概述一节将详细介绍其中的技术细节。首先一起来看看我们构建解决方案原型的两个用例。
智能城市原型
第一个用例是为捷克共和国一个名为皮斯克(Pisek)的小城市构建的智能城市项目。智能城市的理念和架构需要部署超过3000个端点,以及大约300个IoT网关,这些网关以高可用模式运行在Kubernetes驱动的容器中。该解决方案还包含开放数据门户,并通过数据API为第三方公司提供了下列信息:
  • 交通流量、路线、停车位
  • 监控和管理能源的使用以实现节能
  • 电子商务、营销、旅游信息
  • 环境分析
  • 生活方式、社交服务、社交网络
该解决方案使用基于RaspberryPi 2的IoT网关。来自网关的数据存储在Graphite中,通过自行开发的数据挖掘应用程序进行处理,将结果显示在基于Leonardo CMS构建的市民门户网站中。Leonardo CMS是一种Web服务,可以将复杂的可视化结果混合显示在一起呈现任何内容。这个开放数据门户可以通过可视化仪表盘或API提供数据访问。
下图展示了特定时间内,Kollarova和Zizkova两条街道十字路口的机动车和行人通行情况。
若要详细了解该项目,建议阅读奥斯丁SuperUser杂志《更进一步,让城市变得更智能》一文,或观看KubeCon 2016演讲。
OpenStack奥斯丁峰会上的智能会议系统
为了证明我们的IoT平台真正不依赖某种应用程序环境,在OpenStack峰会过程中,我们将智能城市项目中使用的IoT网关(RaspberryPi 2)带到了奥斯丁会议中心,通过基于IQRF的网状网络将其与传感器连接在一起,借此测量湿度、温度,以及二氧化碳浓度。这个演示证明了IoT网关可以对IQRF、蓝牙、GPIO,以及任何其他基于Linux平台的通信标准进行管理并收集数据。
我们在会议中心三层楼内部署了20个传感器和20个路由器,通过一个IoT网关接收来自整个IQRF网状网络的数据,并将其中继至一个专门的时序数据库,本例中使用的数据库是Graphite。数据收集器使用了Docker容器内运行,通过Kubernetes管理的MQQT-Java网桥。其中最有趣的地方是距离,运行Docker容器的Raspberry位于美国奥斯丁的会议中心内,而虚拟机运行在欧洲的数据中心。动态网络覆盖渠道由OpenContrail SDN提供。下文技术概述一节还将对该平台进行进一步介绍。
下图展示了传感器和路由器发现过程中找到的一个无线IQRF网状网络。区域0 - 1覆盖会议中心一楼,区域2 - 4覆盖四楼。
IQRF是一种工作在亚GHz ISM波段的无线网状网络技术,可提供简单易行的集成能力,良好的互操作性,最多支持240个跃点的健壮网状网络连接,工作距离可达数百米,能耗非常低。
下图展示了会议中心二楼不同房间的二氧化碳实时浓度。历史图表显示了自周一以来的数值。从中可以直观了解到主题演讲的开始时间和午饭时间。
奥斯丁这套平台的数据收集方面,我们使用了下列服务架构。
技术概述
本节进一步介绍了这个IoT平台的一些技术构思。这个IoT平台以“通用”为愿景,旨在以安全的方式收集、管理和处理来自数千个端点的数据,并以动态的方式集中管理所有数据。
因此整个体系结构可以分为下列两大主要部分:
数据中心
数据中心是整个IoT平台的中心管理点。其中包含OpenStack IaaS云,以及伴随云同时运行的虚拟机和SDN控制面板。这些计算机负责了时序存储、数据处理群集、数据API网关访问,以及可视化Web服务等任务。
网关
IoT网关可位于任何目标位置,例如街灯、工厂机械、家用电器中。SDN提供的传输层将远程IoT网关与云服务连接在一起。网关可支持多平台,甚至可能混合使用了x86/64和ARM设备。该技术可以通过一个网关为多个客户承载多种传感器平台,这一特性是通过微服务分隔(Docker容器)和Kubernetes对多租户的支持实现的。整个平台可以提供可伸缩的多租户环境,无论多远距离的应用程序和传感器都可位于同一个网络中。
下列架构图展示了数据中心层和网关端的相关组件。下文架构详情一节提供了进一步介绍。
架构详情
架构图展示了整个IoT平台在体系结构方面的逻辑视图。左侧是数据中心,右侧是上文提到的网关。
从下图可以看到,这里使用OpenStack作为承载所有控制服务的云,同时所有大数据处理和前端可视化任务也是在这里进行的。网关使用Kubernetes对服务进行微分隔,为了实现多租户功能并确保不同传感器的安全,这一步是必须的。同时该平台还使用OpenContrail将两端连接在一起,并为Kubernetes POD和OpenStack Project虚拟机提供网络分隔。
上文曾提到过,分隔是通过SDN覆盖实现的。这里的重点在于数据中心边缘路由器和IoT网关之间只存在IP连接。网关操作系统和数据中心边缘路由器之间的VPN连接可以看作该平台的最底层,该层之上是SDN,在这里可以通过OpenContrail实现虚拟机(OpenStack云)和容器(网关)之间的直接通信。这种方法使得用户可以自由选择不同类型的传感器和执行程序,为其设置权限,并用安全的方式将其与云中负责任务处理的应用程序连接在一起。
数据中心包含下列服务:
管理服务
硬件群集中运行的虚拟机承载了所有控制服务:OpenStack控制器、OpenContrail控制器(SDN)、Kubernetes主机、Salt主机。
OpenStack云
OpenStack项目为数据库(Graphite、Influxdb、openTSDB)、大数据处理(Hadoop),以及数据可视化(Grafana、LeonardoCMS)所涉及的不同虚拟机服务提供了分隔和划分。这个云运行在KVM hypervisor之上,通过OpenContrail的Neutron插件实现网络连接。
边缘路由器
OpenContrail会与数据中心边缘路由器创建iBGP对端,这样便可以将OpenStack虚拟机和Kubernetes POD的动态网络路由传播至IoT网关。该设备可以MPLSoverGRE或MPLSoverUDP方式创建标准的L3VPN。
远程网关包含下列组件:
Kubernetes Minion
Kubernetes minion负责与数据中心内的Kubernetes主机通信,并负责管理Kubeletand POD。Kubelet使用了Opencontrail插件,借此将Docker容器与vRouter代理连接在一起。
Kubernetes POD
Kubernetes POD是连接到vRouter的一个或多个Docker容器。POD可按照标签进行分隔,这样即可启动不同应用程序,从不同消息总线以IQRF、蓝牙,或GPIO方式读取数据。
Docker容器
Kubernetes POD中的Docker容器为整个平台提供了极大的收益,可在无需特别安装的情况下支持任何类型的操作系统。例如,IQRF使用了某一版本的简单Java应用程序,可通过容器在几分钟内交付,并且不会与网关本身的操作系统产生不匹配的情况。
应用程序视图
下列架构图详细介绍了应用程序视图。从图中可知,借助OpenContrail覆盖的帮助,OpenStack云内部的虚拟机可以通过L2或L3私有网络联系位于任何地理位置的Docker容器。因此应用程序开发者可以使用标准云平台中用过的同一套工具。他们可以通过HEAT部署虚拟机应用程序控制器,随后通过简单的Yaml文件在远程网关上的容器中部署Kubernetes服务。
以通过环境传感器收集数据的做法为例:传感器直接连接至容器,数据在Docker容器中处理后发送至Graphite时序数据库。因为我们希望以图形化方式实时呈现数据,因此使用了另一个虚拟机,通过Leonardo CMS借助Graphite API读取数据,并将其显示在网站上。据此我们可以通过同一个云平台,按照相同的原则创建不同项目,并使用多种输入和输出位置。
结论
我们希望对这个IoT平台的愿景和已经部署的原型进行一个简要的介绍。目前我们正在完成整个智慧城市解决方案的细节设计工作。
今年在奥斯丁举行的OpenStack峰会和伦敦举行的KubeCon上对该方案进行介绍后,我们收到了来自社区成员的大量反馈。在IoT平台的安全性、弹性,以及性能方面,我们的构想得到了大家的认可,很多技术合作伙伴希望通过合作对我们的IoT平台进行扩展,借此构建他们自己的解决方案。我们现在正在着手有关工业4.0的构想,打算通过开源项目创建第一个智能工厂。

sites links

http://www.sdn-iot2016.umkc.edu/#

courses links

http://www.cc.ntut.edu.tw/~phtseng/SDN/SDNintro.pdf

基於OpenFlow的數據中心網絡負載均衡算法

董宏成1,2,鄭飛毅1

(1.重慶郵電大學通信新技術應用研究中心,重慶400065;2.重慶信科設計有限公司,重慶400065)
摘 要:現代數據中心網絡(Date Center Network,DCN)經常會使用多路徑(MultiPath,MP)拓撲結構,這樣可以避免兩節點間某條鏈路失效而導致的網絡擁塞問題,而且增加了網絡的帶寬和容錯率。傳統的OSPF(Open Shortest Path First)路由算法會選擇單條最短路徑作為最終路徑,這樣可能會導致大部分數據流集中在單一路徑上而出現網絡擁塞,而其他可用路徑處於閒置狀態,不能充分地利用DCN中的鏈路資源,基於SDN(Software Defined Network)的集中化的調度方式能夠提高網絡利用效率。設計了一套基於OpenFlow協議的鏈路負載均衡模型,詳細闡述了它的總體框架和算法實現過程,並通過實驗仿真驗證了算法的可行性和有效性。
中圖分類號:TP393
文獻標識碼:A
DOI:10.16157/j.issn.0258-7998.2016.05.033
中文引用格式:董宏成,鄭飛毅. 基於OpenFlow的數據中心網絡負載均衡算法[J].電子技術應用,2016,42(5):120-123,127.
英文引用格式:Dong Hongcheng,Zheng Feiyi. A load balancing algorithm for date center network based on OpenFlow[J].Application of Electronic Technique,2016,42(5):120-123,127.
0 引言
近年來,數據中心呈現爆炸式的急速發展,大量公司開始建立自己的大型網際網路數據中心(Internet Data Center,IDC)。雲計算技術的出現對數據中心網絡提出了新的挑戰,比如網絡安全、虛擬機遷移、多租戶管理、負載均衡等。傳統的數據中心採用專用的負載均衡設備實現網絡資源的有效利用,具有設備成本高昂和可擴展性差等問題,而基於軟體定義網絡的集中化的調度方式能夠提高資源利用率,簡化網絡管理,降低運維成本。
ADVERTISEMENT
SDN[1]是一種將控制層和轉發層分離的新型網絡架構,交換機只負責數據流的轉發,降低了網絡交換機的負載,控制層的功能全部由運行於伺服器上的控制器實現。控制器需要下發流表到交換機才能支持轉發層設備的有效運行,而控制層與轉發層之間的通信需要遵守一定的規則,目前較普遍的是採用OpenFlow[2]協議來實現信息交互。本文目的是在SDN網絡架構下解決網絡流量高峰期鏈路的負載分布不均勻問題,設計了負載均衡機制的總體框架、實現流程圖以及具體實現。
1 數據中心網絡流量特徵
國內外學者對真實數據中心網絡流量特徵進行了深入的觀察研究。Mckeown研究表明數據中心網絡流量與傳統的區域網和廣域網流量有著極大的不同,內部節點間的數據流量在數據中心網絡所有流量中占主導地位[3]。Greenberg指出數據中心80%的數據流量為數據中心內部的流量,而且85%的數據流小於100 KB[4]。目前採用最多的是Fattree[5]網絡拓撲,它可以為兩兩節點之間的流量提供多條路徑,這樣從理論上能降低單一路徑的負載率過高的問題,而在實際應用中還是會出現某條路徑上流量擁塞嚴重而其他可用路徑卻處於閒置狀態的問題。
ADVERTISEMENT
數據中心網絡流量模型由大流和小流組成,每個數據流由許多數據包組成,這些數據包具有5個相同特徵(源IP位址、源埠號、目的IP位址、目的埠號、協議類型)。而大流是造成部分鏈路擁塞的主要原因,所以負載均衡機制主要針對大流,在調度過程中儘量忽視小流來降低調度開銷。數據流的大小由其所含字節數決定,同時數據流越大,持續的時間越長,小流持續時間很短。本文將字節數大於100 KB的流界定為大流。
2 負載均衡實現的總體框架
控制器的負載均衡功能模塊如圖1所示,主要包括拓撲發現模塊、大流監測模塊、流量收集模塊、路徑計算模塊、流表導入模塊。拓撲發現模塊幫助控制器掌握通過全局的拓撲信息,包括主機的位置信息、交換機之間的連接等。大流監測模塊在鏈路利用率最大路徑上找出並標記大流。流量收集模塊周期性地收集OpenFlow交換機網絡的流量信息,為兩個節點之間的多條路徑選擇提供參考流量監測模塊統計交換機接口的流量信息,用於分析計算各鏈路的鏈路利用率。路徑計算模塊為大流的重路由提供支持,是實現負載均衡功能的重要部件。流表導入模塊是通過控制器向OpenFlow交換機發送Packet_out消息實現的,動態地將大流的最終得出的重路由路徑添加到交換機流表,從而實現OpenFlow網絡的負載均衡功能。負載均衡算法的實現流程如圖2所示。
ADVERTISEMENT

3 各功能模塊的數學建模與實現
首先為負載均衡制定一個啟動閾值,這裡採用負載均衡參數:
其中loadi,j(t)代表在t時刻鏈路<i,j>上的已經被占用的帶寬[6],N是網絡中所有鏈路的數目。下面簡單描述各模塊的實現方式。
3.1 拓撲發現模塊
拓撲發現模塊的功能是收集網絡的拓撲信息,將其保存在拓撲圖表中,並對網絡的拓撲結構進行管理。控制器與交換機之間是在OpenFlow標準協議的基礎下進行通信的,但是控制器並不能通過Open。Flow協議獲得網絡的拓撲結構,是通過LLDP組件[7]發送LLDP(Link Layer Discovery Protocol)數據包到OpenFlow交換機,再收集並解析交換機反饋的LLDP數據包,從而實現網絡拓撲感知。
3.2 大流監測模塊
由於本文所提出的負載均衡機制是針對大流的,所以必須有一種方法將大流和小流區分開來。文獻[8]對3種主流的大流監測機制進行了分析比較,包括採樣監測、應用監測和統計監測。文獻[9]中提出探測大流最有效的方式是在終端主機進行,一方面占用的資源比例相對交換機要少,從而避免大流監測占用過多的交換機端資源;另一方面流的狀態也取決於終端應用程式生成數據包的快慢,而不是網絡的鏈路狀態,終端對應用程式發包速率的可知性更強。監測原理是通過觀測終端主機socket緩存區,當緩存區內具有相同特徵的數據包大小超過100 KB,它就會被標記為大流,本文便採用對主機端的統計監測方式來進行大流監測,主機端需要精確統計和維護數據流的速率和字節等信息,再將統計信息通過交換機發送到控制器,從而實現控制器的大流監測功能。
3.3 流量收集模塊
這個組件的目的是詢問每個OpenFlow交換機的流量信息,再將所有收到的反饋信息進行聯合併最終存儲到控制器的存儲單元。這些收集到的數據被路徑計算模塊用來計算不同鏈路上的負載,因為基於權重的多路徑路由的核心思想是將大流的數據包分配到負載較輕的鏈路上,因此需要確切知道路徑上所有可能的鏈路負載。這個單元模塊周期性地通過輪詢的方式收集每個OpenFlow交換機的流數量、流表以及埠數據,並作為一個快照對象進行存儲。每個快照對象都會通過一串數字標識,每個周期生成新的快照對象後數字標識會自動加1,存儲區只會保存最新的2個快照對象,其他的功能模塊都有獲得快照對象數據的權限。
3.4 路徑計算模塊
初始狀態採用Floyd[10]算法計算基於跳數的Top-K最短路徑,然後需要對每條路徑的狀態進行評估。本文主要對路徑的兩個方面指標進行評估,一個是路徑所包含鏈路的長度,這個體現在跳數(Hop Count);另外一個指標是路徑上的負載,這個體現在這條路徑所包含的交換機和鏈路上的流量。由於每條路徑上包含多個交換機以及多條鏈路,不能簡單地以總流量的平均數來表示這條路徑的負載,而應該根據特定的交換機和鏈路來代表該路徑的負載情況。交換機的負載通過它所統計的PC(Packet Count)和BC(Byte Count)來體現,鏈路的負載通過埠的轉發率(Forwarding Rate)來表示。這些數據可以通過控制器周期性地向OpenFlow交換機發送狀態請求消息得到。每條路徑的負載狀況可以表示為S=(H,P,B,F),其中H表示跳數;P=Max(P1,P2,…,PH),Pi表示該路徑的第i台交換機所轉發的封包數量,共包含H台交換機;B=Max(B1,B2,…,BH),Bi表示該路徑的第i台交換機所轉發的字節數量。F=Max(F1,F2,…,FH),Fi表示該鏈路經過的第i台交換機出埠的轉發率。由於參數之間的差異比較大,需要先進行如下變換[11]
每一條路徑可以用矩陣R=(rhrprbrf)表示,權重向量W=(0.35,0.20,0.20,0.25),各個參數值根據經驗自己定義,這裡路徑的長度取0.35顯示了其重要性。每個節點對之間的所有路徑可以通過一個矩陣表示為:

Qi表示路徑i最後的權值,根據權值可以確定數據流經i節點傳輸到j節點的最佳路徑。路徑計算模塊偽代碼如下:
Algorithm : Route Construction
(1)Connect the topology with the RYU controller
(2)Detect the topology and do the following activities:
(3)Calculate top K shortest paths between each pair of nodes using Top-K Shortest Path algorithm(TKSP is the extension of Open Shortest Path First).
(4)Evaluate the Top-K path with the proposed method.
(5)Sort the paths between each pair of nodes according to the evaluation and store the results to the controller.
(6)Reconstruct the path using step1-5 in case of a node/link failure.
3.5 流表導入模塊
中心控制器通過路徑計算模塊產生的結果生成轉發規則,然後封裝到Packet_out消息中導入到支持OpenFlow的交換機,交換機流表添加該轉發規則並根據更新的流表項來指導流量轉發。由於網絡流量和拓撲結構都是不可預測的,交換機流表會伴隨負載均衡機制實時、動態地更新,而且過期的流表項會根據交換機配置而刪除。
4 實驗結果分析
本文採用Mininet2.2.0[12]作為一個開發環境模擬數據中心網絡場景,搭建如圖3所示的網絡拓撲結構,在Ubuntu Kylin 14.04.3上運行RYU控制器,結合iperf工具來產生TCP(Transmission Control Protocol)數據流和UDP(User Datagram Protocol)數據流,並且能夠測量端到端的吞吐量,從而得出整個網絡的吞吐量。host1~4同時向host5~8發送數據流量,在RYU[12]控制器中結合拓撲發現模塊、流量監測模塊、路徑計算模塊和流表導入模塊來對負載均衡算法進行驗證。仿真實驗通過h1~h16傳輸時延、總吞吐量和總體鏈路利用率這3個指標來驗證本文所提出的負載均衡算法的有效性。總體鏈路利用率通過下式得到:
其中,MAXLOAD代表每條物理鏈路最大帶寬,仿真實驗的信息見表1。

選擇h1和h16為網絡時延測量的觀測對象,實驗結果如圖4所示,在實驗進行的前47 s數據包從h1~h16延時很低,而且本文所提出的LB(Load balance)算法和基於最短路徑算法的時延曲線表現出了極高的相似度。這是因為剛開始時鏈路負載較輕,兩種算法都是採用h1-S1-S9-h16來傳輸流量,而LB算法由於需要監測數據流量並且周期性地向控制器發送網絡狀態信息,這樣會產生部分開銷而導致延時略高於基於最短路徑算法;但是47 s之後LB算法下的時延明顯低於採用OSPF算法的時延,這是因為太多的流量集中在最短路徑h1-S1-S9-h16,而其他可用路徑處於空閒狀態,負載不均衡度大於判決門限,就會觸發負載均衡機制,原路徑上的流量會轉移到其他可用路徑,鏈路利用率也得到了明顯提升,如圖5所示。網絡整體吞吐量的性能比較如圖6所示,當負載低於550 Mb/s時,兩者的性能曲線非常相似,由於LB算法需要傳輸額外的鏈路狀態信息導致吞吐量會略高於550 Mb/s;當負載超過550 Mb/s,基於最短路徑算法網絡出現擁塞,其他可用鏈路得不到有效利用,吞吐量的增長明顯放緩。而LB算法下的網絡吞吐量在550~700 Mb/s區間能一直保持快速增長。因此本文提出的LB算法相比傳統的OSPF算法能夠在負載不均衡情況下改善網絡性能。

5 結束語
本文設計了負載均衡功能實現的總體框架,主要包括拓撲發現模塊、流量監測模塊、路徑計算模塊、流表導入模塊。設計了負載均衡功能的實現流程圖,對相關的數學模型進行了詳細的分析設計,確定了以大流為目標流的調度策略,並通過實驗驗證了該負載均衡算法相比傳統的OSPF算法能夠實現更低的網絡延時和更高的總體鏈路利用率和吞吐量。
該算法的不足之處是沒有考慮到大流出現重複調度的情況,如果某個大流被多次選為目標流調度,可能會使情況更糟糕,而且流的轉移開銷也會影響負載均衡的實現效率。降低大流在調度過程中的開銷具有重要的意義,上述兩點將是下一步需要重點關注的內容。
參考文獻
[1] 左青雲,陳鳴,趙廣松.基於Open Flow的SDN技術研究[J].軟體學報,2013,24(5):1078-1097.
[2] Open Networking Foundation.OpenFlow[EB/OL].(2016)[2016].https://www.opennetworking.org/en/sdn-resources/openflow.
[3] MCKEOWN N,ANDERSON T,BALAKRISHNAN H,et al.OpenFlow:Enabling innovation in campus networks[J].SIGCOMM Computer Communication Review,2008,38(2):69-74.
[4] GREENBERG A,HAMILTON J R,JAIN N,et al.VL2:A scalable and flexible data center network[C].Proceedings of the AC_MSIGCOMM 2009 Conference on Data Communication.Barcelona,Spain,2009:51-62.
[5] GREENBERG A,HAMILTON J,MALTZ D A,et al.The cost of a cloud:research problems in data center networks[C].In ACM SIGCOMM,2008:68-73.
[6] Long Hui.Research on the OpenFlow -based load-balancing routing in distributed networks[D].Shanghai:Shanghai Jiao Tong University,2013.
[7] 張遠.基於OpenFlow的負載均衡研究[D].北京:北京工業大學,2014.
[8] 李龍,付斌章.Nimble:一種適用於OpenFlow網絡的快速流調度策略[J].計算機學報,2015,38(5):1056-1068.
[9] CURTIS A R,KIM W.Mahout:low-overhead datacenter traffic management using end-host-based elephant detection[J].IEEE INFOCOM,2011,2(3):1629-1637.
[10] BACKHOUSE R C,EIJINDE J P H W,GASTEREN A.J.M.V.Calculating path algorithms[J].Science of Computer Programming,1994,22(1-2):3-19.
[11] Li Jun,Chang Xiangqing,Ren Yongmao,et al.An effective path load balancing mechanism based on SDN[C].IEEE 13th International Conference on Trust,Security and Privacy in Computing and Communications,2014.
[12] Mininet Team.Mininet:An instant virtual network on your laptop[EB/OL].(2016)[2016].http://www.mininet.org/.

Is Software Defined Networking (SDN) becoming vital to Internet-of-Things (IoT)?

http://www.sdn-iot2016.umkc.edu/Slides/ADe-SDN-IoT.pdf

Empowering the Internet of Things with Software Defined Networking


Empowering the Internet of Things with Software Defined Networking
http://iot6.eu/sites/default/files/imageblock/IoT6%20-%20SDN%20-%20IoT.pdf

2015年9月16日 星期三

openfire client 端開發範例.docx

openfire client 端開發範例.docx

一、圖說
image
說明:
1. 公司內部或第三方開發的伺服端服務(如ERP、財會、流程等),透過尋得相對應語言且支援XMPP的程式庫,便可將訊息發往 openfire server,讓終端使用者收到訊息;這類支援XMPP的程式庫有開源免費的,也有需要收錢的。例如:如果 ERP 系統是 java 語言開發,便可利用 openfire 官方提供的 smack library(免費),建立起與 openfire server 的通訊。假如公司內部的流程系統是使用 C# 開發,那就需要一個支援 XMPP 的 .NET 程式庫,如 Matrix(收費)。
2. 如果要開發自己的桌機版或行動版的即時通訊終端軟體(Instant messaging client 簡稱 IM client,例如 Skype client、MSN messager、Yahoo Messager、Pidgin等...都算是,只是支援的通訊協定不同。),同第1點說明,只要尋找相對應語言程式庫即可。當然要從頭開始,自行開發 XMPP 的通訊程式庫也無不可,假如時間很多的話。
3. 桌機版或行動版的 IM client 現成軟體不少,當中也有很多是免費的,例如 pidgin,openfire 官方社群也有提供免費的 IM client,名為spark。不過在尋找這類IM client時,要注意必須有支援 XMPP 或 jabber 字樣,方能與 openfire 溝通。
pidgin
image
spark
image
行動版不管 iOS 或 Android也有多個 IM App 可供選擇
Android參考(10 best free apps for xmpp client)
http://appcrawlr.com/android-apps/best-free-apps-xmpp-client
iOS 參考(Top10 Apps for Jabber Xmpp iPhone/iPad)
http://appcrawlr.com/ios-apps/best-apps-jabber-xmpp

二、java 使用 smack 程式庫為例(桌機或第三方整合適用)。
網址:
openfire 除了有伺服軟體外,還提供了 smack 這個程式庫,這是一個 java library,透過這個程式庫,可以省去與通訊伺服器間繁雜的 XMPP 協定處理。
通訊伺服器位址:192.168.1.112
通訊伺服器埠號:5222
通訊伺服器域名:fire1
傳送訊息帳號:test1
傳送訊息:考核開始通知
訊息接收者帳號:e00104
image
import org.jivesoftware.smack.*;
public class Main {
    public static void main(String[] args) {
        final ConnectionConfiguration config = new ConnectionConfiguration("192.168.1.112",Integer.parseInt("5222"));
        //允許自動連接
        config.setReconnectionAllowed(true);
        config.setSendPresence(true);
        AccountManager accountManager;
        Connection connection = new XMPPConnection(config);
        try {
            connection.connect();
            accountManager = connection.getAccountManager();
            connection.login("test1" , "test1");
            System.out.println(connection.getUser());
            connection.getChatManager().createChat("e00104@fire1",null).sendMessage("考核開始通知");
        }catch (XMPPException e){
            System.out.println("Connect error:" + e);
        }
    }
}

三、C# 使用 Matrix 程式庫為例(桌機或第三方整合適用)。
網址:http://www.ag-software.net/matrix-xmpp-sdk/
原理同 smack,只是支援語言不同,Matrix library 可以免費試用,使用時會出現延遲對話框,如果付費,就不會跳出延遲框。
Matrix 是 agsXMPP 版本的成功穩定版,agsXMPP 是免費的,官方建議商業正式環境中,應使用 Matrix 這個版本。
通訊伺服器位址:192.168.1.112
通訊伺服器埠號:5222
通訊伺服器域名:fire1
傳送訊息帳號:test1
image
image
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Matrix;
using Matrix.Xmpp;
using Matrix.Xmpp.Client;
namespace hlchat
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private void button1_Click(object sender, System.EventArgs e)
        {
            XmppClient xmppClient = new XmppClient { XmppDomain="fire1", Username="test1", Password="test1" };
            xmppClient.OnRosterEnd += delegate 
            { xmppClient.Send(new Matrix.Xmpp.Client.Message 
                { 
                    To=TargetUser.Text, 
                    Type=MessageType.chat, 
                    Body=MsgBody.Text 
                });
            };
            xmppClient.Open();
            textBox1.Text = "Send OK!!";
            //xmppClient.Close();
        }
    }
}

四、java 使用 asmack 程式庫為例(Android App 開發適用)。
網址:https://code.google.com/p/asmack/
asmack 算是 smack 的修正版,網路大部分討論都建議開發 Android 端使用 asmack 而非 smack。
通訊伺服器位址:192.168.1.31
通訊伺服器埠號:5222
通訊伺服器域名:fire1
傳送訊息帳號:test1
傳送訊息:hello asmak
訊息接收者帳號:t001
image
package net.snoone.schat;
import android.app.Activity;
import android.os.Bundle;
import android.os.StrictMode;
import org.jivesoftware.smack.*;
import org.jivesoftware.smack.packet.Message;
import org.jivesoftware.smackx.*;
import java.util.Collection;
public class MyActivity extends Activity
{
    /** Called when the activity is first created. */
    public static final String HOST = "192.168.1.31";
    public static final int PORT = 5222;
    public static final String SERVICE = "jabber";
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
        StrictMode.setThreadPolicy(policy);
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        createChat();
    }
    private void createChat(){
        ConnectionConfiguration connConfig = new ConnectionConfiguration(HOST, PORT, SERVICE);
        XMPPConnection connection = new XMPPConnection(connConfig);
        try {
            connection.connect();
            connection.login("test1", "test1");
            Message msg = new Message("t001@of1", Message.Type.chat);
            msg.setBody("hello asmak");
            connection.sendPacket(msg);
        }catch (XMPPException e){
            connection = null;
        }
    }
}