扩展一物联网相关

1.涛思数据库(TDengine)

July 16, 2019 · 1 min · jiezi

阿里云Link-TEE获得全球首款GlobalPlatform-TEE全配置安全认证

2019年7月12日,阿里云Link TEE正式获得由国际标准组织GlobalPlatform(以下简称GP)颁发的TEE安全评估认证证书,也成为全球首款获得GP TEE全配置(支持TEE Time and Rollback PP-Module和TEE Debug PP-Module)安全认证的产品。 GP是跨行业的国际标准组织,也是全球基于安全芯片的安全基础设施统一的标准的制定者,制定了可信执行环境的标准,是TEE(Trusted Execution Environment)产品全球最权威的专业安全性评估机构。目前,GP TEE安全性认证已是公认的TEE方案在行业纵深方向发展的必由之路。阿里云Link TEE本次斩获的 “全球首款”是国内TEE安全方案在国际上的一个具有里程碑意义的事件。 此次GP TEE安全认证,由国内知名第三方安全实验室DPLS Lab提供专业测评,基于Link TEE v1.1.3软件产品,使用NXP的i.MX6QP SoC作为硬件载体,支持可信应用程序的硬件隔离,提供数据和密钥安全增强保护,可以为客户提供符合GP TEE Protection Profile全配置的商业TEE安全解决方案。 阿里云智能IoT资深安全专家董侃非常看好TEE在物联网领域的应用场景,“阿里云Link TEE是物联网设备的可信计算框架,是专为物联网设计的安全方案,可以提供不同安全等级的可信保护。阿里云Link TEE基于ARM Trustzone或C-SKY的安全扩展技术提供硬件级别的可信根,也提供软件级别的保护方案,具有代码小、运行速度快、安全等级高等优点。该产品在智能汽车、路测单元、智能售卖机、智能音响、摄像头、无人机、智能机器人、区块链可信应用和eSIM领域有广阔的应用场景和市场需求。” “市场一直在等待能增强用户信心的安全标准,”恩智浦高级副总裁Geoff.Lees 说,“阿里云Link TEE提供了这一安全保障,并开启了更快部署安全的工业和物联网解决方案的大门。我们正积极与阿里云合作,提供我们特有的价值与能力,共同制定统一的认证标准,提高安全和隐私的门槛。” DPLS Lab的实验室副主任安焘表示,“作为GlobalPlatform国内首家认可并授权的具备TEE全面评估能力的的安全实验室,有幸能担当此次阿里云Link TEE安全评估实验室,与阿里云物联网安全团队精诚合作对该产品功能符合性与安全抗攻击能力进行全面评估,并经过不懈努力最终达到GP严苛安全标准,完成了此次全球首款全配置TEE安全认证,同时该产品也是GP全球范围内认可的第三款TEE产品。” 本文作者:云媗阅读原文 本文为云栖社区原创内容,未经允许不得转载。

July 16, 2019 · 1 min · jiezi

eclipse-mqttclient-性能MQTT32202-正在发布过多的消息

mqttclient性能&MQTT(32202): 正在发布过多的消息org.eclipse.paho.client.mqttv32.2 GHz Intel Core i7 mac系统 publish性能,注意请使用单线程的 mqttclinet 1万条 341毫秒4万条 1163毫秒5万 1450毫秒10万条 2700毫秒 多线程的 mqttclinet MQTT(32202): 正在发布过多的消息 问题 异常信息[15:07:21]: publish failed, message: aaaa正在进行过多的发布 (32202) at org.eclipse.paho.client.mqttv3.internal.ClientState.send(ClientState.java:496) at org.eclipse.paho.client.mqttv3.internal.ClientComms.internalSend(ClientComms.java:132) at org.eclipse.paho.client.mqttv3.internal.ClientComms.sendNoWait(ClientComms.java:156) at org.eclipse.paho.client.mqttv3.MqttAsyncClient.publish(MqttAsyncClient.java:1027) at org.eclipse.paho.client.mqttv3.MqttClient.publish(MqttClient.java:399) at io.communet.ichater.emq.util.MqttUtil.publishMsg(MqttUtil.java:171) at io.communet.ichater.emq.util.MqttUtil.publishMsg(MqttUtil.java:161) at io.communet.ichater.emq.sub.MqttSendMsgEventSubscribe.onEvent(MqttSendMsgEventSubscribe.java:28) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at org.greenrobot.eventbus.EventBus.invokeSubscriber(EventBus.java:507) at org.greenrobot.eventbus.EventBus.invokeSubscriber(EventBus.java:501) at org.greenrobot.eventbus.AsyncPoster.run(AsyncPoster.java:46) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) at java.lang.Thread.run(Thread.java:818) 解决办法消息发送发送限流用单独的一个线程来完成 MQ 消息的推送 (不用这个MqttAsyncClient ,使用MqttClient 就没有事)options.setMaxInflight(1000) 增加 actualInFlight 的值; 反思笔者出现这个错误是因为使用 EventBus, 之前使用单独线程的 Handler 是没有问题的, 调查发现, 使用 EventBus 是新建线程运行的, 而 Handler 是单独一个线程.所以当发送大量消息的时候, EventBus 几乎是同一个点发出去, 就会造成这个错误 ...

July 15, 2019 · 2 min · jiezi

干货看云原生时代阿里云的四个最

云原生已经成为 IT 领域最热的词之一。到底有多火,大家感受一下:2015 年在旧金山召开的首届 KubeCon 只有 200 余参会者,而今年第二次在中国举办的KubeCon迎来了3000+现场观众,遍布全球的线上关注开者则更是不计其数。Gartner最近发布报告表示云原生时代已来,在未来三年中将有75%的全球化企业将在生产中使用容器化的应用。 作为云原生技术与应用的领先企业,阿里云在今年的 KubeCon + CloudNativeCon 大会上为全球企业和开发者分享了26场行业趋势和技术演讲。 阿里云智能容器平台负责人丁宇指出: 云原生正在重塑整个软件生命周期,容器、Kuberentes、云原生成为云时代的三个重要标准。阿里云将继续加大云原生技术栈产品体系的研发,并持续回馈开源社区,与生态合作伙伴一起,共同推动云原生标准制定以及应用的落地。 9年技术沉淀,阿里云云原生的四个“最”阿里巴巴是国内最早布局云原生技术的公司之一,丁宇在 26 日的主题演讲中表示:“早在 2011年,阿里巴巴就率先开始了容器化进程,开启了中国公司将云原生技术体系在电商、金融、制造等领域中大规模应用的先河。” 历经9年技术沉淀,阿里云成为国内唯一进入 Gartner《公有云容器服务竞争格局》报告的企业。今年 3 月,阿里云智能总裁张建锋表示,未来 1-2 年内,阿里巴巴要实现 100% 的业务跑在公共云之上,并且继续大力投入云原生技术的研发。 最丰富的云原生产品家族经过 9 年的内部技术实践,阿里云已拥有国内最丰富的云原生产品家族,覆盖八大类别 20 余款产品,涵盖底层基础设施、数据智能、分布式应用等,可以满足不同行业场景的需求。 目前阿里巴巴集团内部电商、城市大脑等核心业务已经大规模使用云原生技术,去年双 11,阿里云完成了 10 分钟 1000 台以上服务器的快速部署,容器部署规模达到百万级,两年内实现全部上云,是全球最大规模的云原生应用实践。 最全面的云原生开源贡献 阿里云一直致力于回馈社区、积极拥抱开源,是国内在云原生领域的开源贡献最全面的科技公司,涵盖编排调度、作业管理、无服务器框架等: ●主导维护 etcd、containerd、dragonfly 等多个 CNCF 明星项目的发展,已有超过 10 个项目进入 CNCFlandscape; ●项目建设层面:积极建设 Kubernetes 项目,贡献量位居全球前 10; ●开源生态支持:加入 CNCF、OCI、CDF 等基金会,成为多个基金会的顶级会员,共建开源生态。 今年 1 月,阿里云资深技术专家李响成为首个入选全球顶级开源社区 CNCF 技术监督委员会的中国工程师,致力于推动云原生技术的落地。 最大的容器集群和客户群体除了支持集团内部应用规模化运维,阿里云云原生技术还向全社会输出。阿里云 ACK(容器服务)遍布全球 18 个 region,拥有国内最大公共云容器集群以及客户群体。 ...

June 28, 2019 · 1 min · jiezi

Linus-本尊来了为什么-KubeCon-越来越火

阿里妹导读: 从200人的小会议到3500 多位云原生和开源领域工程师齐聚一堂的大会,KubeCon 只用了四年,昨天,在KubeCon China 2019 上阿里巴巴宣布开源 OpenKruise,今天,Linus 本尊竟然现身会场!现在,我们继续连线会场,探索阿里云为开发者带来的多份重磅献礼。 2015年11月,第一届 KubeCon 在美国旧金山开始的时候,还只是个200人的小会议,2019年的7月,KubeCon 第二次在中国举办,就有 3500 多位云原生和开源领域工程师齐聚一堂。 连 Linux 及 Git 创始人 Linus Torvalds 本人都来到 KubeCon China 上海现场。Linux 基金会执行董事 Jim Zemlin 说道:“我见证了开源圈子的两大事件:一个是 Linux 的成功,一个就是 Kubernetes 和云原生的大爆发。开源是历史上最成功的全球创新推动者之一,Linux 已经成长为世界上最重要的软件平台,而云原生正以势如破竹之态爆发。” 中国在整个云原生运动中贡献巨大,中国的 K8s contributors 已经在全球所有贡献者中排名第二,超过 10% 的 CNCF 会员来自中国,26%的 Kubernetes 的认证供应商来自中国。 阿里云作为最早成为 CNCF member 的中国公司之一,一直在云原生技术领域不停地实践和探索。在阿里云已经是铂金会员的基础上,蚂蚁金服也最新加入 CNCF 成为黄金会员。 本次 KubeCon China,阿里云又发布了什么黑科技呢?一起来感受下。 拥抱社区,服务最广泛开发者:云原生应用管理与交付体系发布 整个云原生应用管理与交付体系包含五大项目,本次 KubeCon 两大项目率先亮相:国内首个开放云原生应用中心—— Cloud Native App Hub 和云原生应用自动化引擎—— OpenKruise。 ...

June 27, 2019 · 2 min · jiezi

IoT-SaaS加速器助力阿尔茨海默病人护理

场景介绍阿尔茨海默病,是导致中老年人认知功能障碍的最常见疾病之一,是发生在老年期及老年前期的一种原发性退行性脑病。据估计,全世界痴呆症患者数量为4700万,到2030年将达到7500万人。痴呆症患者数量到2050年预计将是现在的近三倍。疾病的高昂费用给卫生系统应对未来预计不断增加的病例构成挑战。据估计,目前每年的支出为8180亿美元,而支出的增长速度预计会比疾病流行率上升还要快。照料痴呆症患者给照护者带来巨大压力,包括身体上、情感上和经济上的压力。(by世界卫生组织) 用技术解决阿尔茨海默病护理的问题,让老人和其护理者有更好的生活质量,是我们可以解决的方法。基于物联网技术,已经有一些设备实现了阿尔茨海默病老人走失定位。但是我们要做更高一层,除了单独分发的硬件之外,我们要使用开发工具IoT Studio帮助医疗机构做一个硬件SaaS管理系统,让他们可以随时监控旗下所有阿尔兹海默护理设备的数据以及定位,对老人的情况实现实时监控。同时也有能力对掌控的设备进行增删改查,方便他们自己管理设备。通过IoT Studio赋能开发者,让他们帮助包括医疗在内的各个行业用上物联网技术,惠及百姓。 我们首先构建一个可以拍照,检测心跳的手环设备,然后基于这个设备帮助护理机构开发一个集合管理监控告警的SaaS系统。设备由一个可以检测心跳的光学模块,一个可以检测老人所在地场景的摄像头,一个GPS定位模块,一个物联网通讯模块(一般为GPRS),MCU和电源组成。云端由物联网平台为基础建立设备与云端通讯,配合RDS存储心跳&GPS数据,OSS存储图片数据,最后用IoT Studio的服务开发与Web可视化开发功能完成功能页面搭建。整个云端开发过程只需要2小时以内即可。 最终效果如图。 硬件部分在demo阶段,我们采用树莓派3B+摄像头+心跳模块+GPS+电池的方法,验证不同数据的上报方法以及数据存储链路。考虑简单化,联网暂时采用WIFI方法。如果觉得使用电路比较麻烦,也可以使用服务开发+虚拟设备上报的方式,具体查看这篇文档。 虽然带手环的老人不一样,但是每个手环上报的属性类别是一样的,我们可以类似编程开发里把它们归结为同一个类(class)。我们首先需要在物联网平台上为我们的demo手环建立一个设备类(即产品),这样我们才能在以后不断的往这个产品下实例化新的设备。进入阿里云物联网平台,在产品页面新建一个产品,选择自定义品类即可,命名为“阿尔茨海默氏症老人监控手环”。 进入产品的功能定义页,定义5个自定义功能——剩余电量,地理位置,心跳,图片地址(存放摄像机上传图片的URL)。 地理位置只需要在“添加功能”里用标准的功能即可,如图,其他全部配置项默认即可。 心跳为一个整型数据,剩余电量为浮点型数据,图片地址为字符型数据,如图。 在设备面板点击“添加设备”,选择刚才创建的手环产品,然后输入随意的设备名称即可。 IoT Studio为交付型业务做了项目维度的隔离,因此需要将用到的设备导入到对应的项目中。首先打开物联网平台的“开发服务”选项进入IoT Studio。点击某个项目名称的“查看”进入项目详情页。然后点击右上角的“导入产品”。选择刚才的手环产品,然后导入,可以在设备管理页看到产品以及下属的设备已经导入项目里。 这样就完成了产品的定义,实例化与项目维度的隔离了。 上云部分树莓派采用python编程,因此我们需要参考物联网平台的python SDK,同时开发者社区也有很多相关文章。在这里我们直接跳过。由于物联网平台的属性不支持直接存储图片,因此我们暂时使用oss进行存储。你也可以选择使用HTTP/2通道(已支持python SDK)将图片上传至物联网平台每个设备单独的存储空间,不过从该存储空间调用图片的URL需要动态生成,可以参考这篇文档。 OSS存储空间准备阿里云对象存储服务(Object Storage Service,简称 OSS),是阿里云提供的海量、安全、低成本、高可靠的云存储服务。您可以通过调用 API,在任何应用、任何时间、任何地点上传和下载数据,也可以通过 Web 控制台对数据进行简单的管理。OSS 适合存放任意类型的文件,适合各种网站、开发企业及开发者使用。 首先点击“立即开通”进入开通页面并点击同意协议。 然后进入控制台,新建一个Bucket,一个Bucket相当于一个文件夹,可以通过API路径访问里面的文件。在这里我们选择公共读写。 然后可以看到OSS控制台新建了一个bucket,里面是空的,我们可以尝试上传一些图片。 然后点击文件右方的操作项里的“复制文件URL”,把复制的URL粘贴到浏览器,看看能否预览。 可以看到通过URL访问我们就能看到图片了,这样OSS的配置就完成了。 考虑到Bucket的公共读写特性,安全性会有一定的问题,可以考虑将bucket私有化,然后图片上传的时候设置图片为公共读写,并采用时间戳加盐等方式将图片文件名随机化的方式解决。当然安全性上HTTP/2通道为更优方案。 树莓派代码树莓派的配置与连接在此不再赘述,可以在树莓派新建py文件,直接将此份代码复制过去,并且设置为开机执行,也可以参考这篇文档。代码如下(基于python 3.6),需要根据备注填入自己的账号信息,产品信息等: ##注意,本demo代码忽略了电池电量检测模块import aliyunsdkiotclient.AliyunIotMqttClient as iot ##导入阿里云的设备MQTT库,如果import失败需要先pip3 install 一下import jsonimport multiprocessingimport timeimport randomimport oss2 ##导入阿里云的OSS库,如果import失败需要先pip3 install oss2from picamera import PiCamera ##树莓派的摄像头,系统自带import RPi.GPIO as GPIO ##GPIO口,接红外PIR用import serialimport pynmea2from pulsesensor import Pulsesensor ##导入树莓派的pulsesensor库,https://github.com/tutRPi/Raspberry-Pi-Heartbeat-Pulse-Sensor/blob/master/example.pyauth = oss2.Auth('**AccessId*****','**AccessSecret*****') ##OSS的授权需要阿里云账号AccessId和AccessSecret,具体查看https://usercenter.console.aliyun.com/#/manage/akbucket = oss2.Bucket(auth,'http://oss-cn-beijing.aliyuncs.com','***你的bucket名称***') ##需要根据服务器区域修改节点路径,见文档global picURLtoIoTcamera = PiCamera()camera.resolution = (800,600) ##拍照分辨率,越高越容易分析,但是上次越慢GlobalBpm = 0 ##记录心跳数据Latitude = 0 ##记录GPS数据Longtitude = 0##初始化树莓派def init(): GPIO.setwarnings(False) GPIO.setmode(GPIO.BOARD) GPIO.setup(3, GPIO.IN) passdef take_photo(): ticks = int(time.time()) fileName = 'test%s.jpg' % ticks ##在文件名加入了时间戳作为简易加密手段 filePath = '/home/pi/Pictures/%s' % fileName camera.capture(filePath) bucket.put_object_from_file('bucket_file_name/%s', fileName) ##在这里改bucket名字 global picURLtoIoT picURLtoIoT = 'http://***你的bucket名称**.oss-cn-beijing.aliyuncs.com/bucket_file_name/%s' % fileName ##在这里改bucket名字和bucket内文件夹的名字 print(str(picURLtoIoT))def detect_Heartbeat(): p = Pulsesensor() p.startAsyncBPM() try: while True: bpm = p.BPM if bpm > 0: print("BPM: %d" % bpm) GlobalBpm = bpm; else: print("No Heartbeat found") time.sleep(1) except: p.stopAsyncBPM()def get_GPS(): ser = serial.Serial("/dev/ttyAMA0",9600) while True: line = ser.readline() if line.startswith('$GNRMC'): rmc = pynmea2.parse(line) print "Latitude: ", float(rmc.lat)/100 print "Longitude: ", float(rmc.lon)/100 Latitude = float(rmc.lat)/100 Longtitude = float(rmc.lon)/100 break options = { 'productKey':'**你的ProductKey**', 'deviceName':'**你的deviceName**', 'deviceSecret':'**你的deviceSecret**', 'port':1883, 'host':'iot-as-mqtt.cn-shanghai.aliyuncs.com' ##注意阿里云IoT国内都是华东2,不一定跟OSS的节点一致}host = options['productKey'] + '.' + options['host']def on_message(client, userdata, msg): topic = '/' + productKey + '/' + deviceName + '/update' print(msg.payload)def on_connect(client, userdata, flags_dict, rc): print("Connected with result code " + str(rc))def on_disconnect(client, userdata, flags_dict, rc): print("Disconnected.")##设备上报的定义def upload_device(client): topic = '/sys/'+options['productKey']+'/'+options['deviceName']+'/thing/event/property/post' while True: payload_json = { 'id': int(time.time()), 'params': { 'BPM': GlobalBpm, 'picURL': picURLtoIoT, 'Geo': { 'CoordinateSystem":1, 'Latitude':Latitdue, 'Longitude':Longtitude, 'Altitude':0 }, }, 'method': "thing.event.property.post" } print('send data to iot server: ' + str(payload_json)) client.publish(topic, payload=str(payload_json))if __name__ == '__main__': client = iot.getAliyunIotMqttClient(options['productKey'], options['deviceName'], options['deviceSecret'], secure_mode=3) client.on_connect = on_connect client.connect(host=host, port=options['port'], keepalive=60) p = multiprocessing.Process(target=upload_device, args=(client,)) p.start() get_GPS() detect_Heartbeat() take_photo() GPIO.cleanup() client.loop_forever()结束,把这个python文件设置为开机运行即可。 ...

June 24, 2019 · 3 min · jiezi

消息点击率翻倍的背后闲鱼无侵入可扩展IFTTT系统

一、面临问题在闲鱼生态里,用户之间会有很多种关系。其中大部分关系是由买家触发,联系到卖家,比如买家通过搜索、收藏、聊天等动作与卖家产生联系;另外一部分是平台与用户之间的关系。对这些关系分析之后我们发现这些关系中存在两个问题: 用户产生关系的层次不够丰富;现有系统只维护了一部分用户关系,包括收藏、点赞等,用户关系的层次还不够丰富。用户之间关系是单向且不够实时;在现有的玩法中,买家可以通过多种行为与卖家产生联系,但卖家不能主动与买家发生关系和互动;而且平台计算的关系都是离线的,对用户的吸引力不足。上面提到的场景经过抽象归纳之后都是同一个范式:当某个条件被满足之后,就会触发相对应的动作。这个范式是IFTTT的基本理念,而闲鱼IFTTT就是对这些问题的解决方案。 二、IFTTT概念IFTTT是一个被称为 “网络自动化神器” 的创新型互联网服务理念,它很实用而且概念很简单。IFTTT全称是 If this then that,意思是如果满足“this”条件,则触发执行“that”动作。IFTTT由三部分构成,分别为Trigger、Action和Recipe。 可以看出IFTTT本身概念并不复杂,它的真正魔力在于“由简单组成的复杂”,也就是由众多简单的IFTTT流程相互衔接成跨越整个互联网、跨越多平台、跨越多设备的状态机。 2.1、闲鱼IFTTT闲鱼IFTTT是基于闲鱼的业务场景与IFTTT理念结合后产生的,提供IFTTT标准协议封装,对业务无侵入可扩展的服务编排系统。 闲鱼IFTTT的两个特性对应上述两个问题,分别是: 多维用户关系感知多维指的是覆盖面,闲鱼IFTTT通过更多维度的挖掘,抽象并维护了更丰富的用户关系。基于用户关系数据,我们可以产出用户画像,并通过更有效的方式触达用户。 实时用户双向互动闲鱼IFTTT底层具有对用户关系大数据的高效存储和处理能力,以支持上层业务中用户关系实时处理;闲鱼IFTTT不仅支持买家到卖家关系,而且通过设计天生支持卖家到买家关系。 闲鱼IFTTT把之前平台与用户的互动、买家到卖家的联系,切换称闲鱼用户之间天然的关系互动,对用户骚扰更少且激活拉回的效果更好,我们基于这个场景设计闲鱼IFTTT的技术方案。 三、技术方案 首先按照IFTTT规范对业务进行建模,分为Channel、Trigger和Action层,其中Channel层是数据底层,将Trigger和Action关联后组成标准Recipe。 ChannelChannel层在闲鱼IFTTT的作用是保存和管理用户关系数据,Channel层定义了用户关系的元数据结构,包括关系类型、源账户和目标账户。Channel层是闲鱼IFTTT的基石,Trigger和Action均基于用户关系数据进一步抽象业务逻辑。TriggerTrigger是业务上自定义的触发事件,与业务息息相关,可能是关注的人上新、浏览宝贝降价或者是参加的百币夺宝活动开奖等。当Trigger触发后,闲鱼IFTTT会根据Trigger类型和配置的关系类型计算用户名单,并调用Action层进行处理。ActionAction层处理对象是Trigger触发后计算的用户名单,可以给名单里的用户发Push,发权益或者其他定制逻辑。Action本身是标准化、可插拔的组件,业务上可以利用Action组件对用户名单做AB测试,快速实验不同Action策略。接下来我们说一下闲鱼IFTTT详细技术方案,方案如下: 整体技术方案按照业务建模的结构图细化,补充依赖的技术组件。整体流程不再细述,针对流程中重点模块详细说明。 3.1、场景快速接入设计场景快速接入的目的是让业务对接入闲鱼IFTTT无感知,因为在最开始的设计中,场景接入是准备通过在业务逻辑里增加AOP切面,将业务数据和场景上报。但因为这种方式对业务本身有一定侵入,增加业务执行的RT而且不够灵活,最终被否决。 而现在的场景快速接入方案解决了这些问题,通过SLS接入所有应用的海量网络请求日志,记录请求的URL、参数和响应;将SLS作为Blink流计算任务的数据源;根据diamond动态下发的规则实时筛选网络请求URL和参数,把数据按照指定格式组装后上报给Channel层。 场景快速接入方案将业务逻辑与场景接入解耦,支持快速接入,灵活变更且延迟低,是针对大数据场景接入的高性能解决方案。 3.2、计算用户名单计算用户名单模块采用责任链模式设计,因为在不同Trigger场景中,业务对用户名单的计算和筛选逻辑都是不同的。通过责任链模式,将主流程与业务筛选逻辑解耦,并支持各业务灵活定制筛选逻辑,互不干扰。 3.3、PushActionAction层是闲鱼IFTTT中最重要的一环,会直接触达到用户,Action的逻辑会直接影响用户对平台的直观感受和活跃率。消息Push是Action中最常见的逻辑,更要防止用户被骚扰,PushAction逻辑如下: 敏感人群过滤;疲劳度校验;对发送人群进行AB实验;组装消息;将Action各节点日志同步到SLS,方便检索和排查问题;统计消息发送数据及点击数据,为业务后续决策提供依据;3.3.1、疲劳度疲劳度是防止用户被骚扰的关键,我们针对疲劳度进行了分层设计,分为三层,第一层为用户级别疲劳度,控制一个用户在一个周期内收到消息数量;第二层是业务维度,控制用户在一个周期内收到某个业务的消息数量;第三层是目标级别,控制用户在一个周期内收到同一个发送者消息数量。 在业务维度层面,支持灵活控制多个业务联合疲劳度,保证用户不会被消息过度骚扰。 3.4、用户关系存储用户关系数据是闲鱼IFTTT的基石,它的特点是存储量级大,达到TB级别;而且对存储和查询的性能要求高,TPS和QPS的峰值都在一万以上。经过调研,我们发现集团内部开发的Lindorm可以满足需求。 Lindorm是阿里内部基于Hbase自研的高性能KV存储数据库,对Hbase的性能和稳定性均有一定优化。闲鱼IFTTT采用Lindorm作为用户关系数据存储,经性能测试验证数据读取QPS达到7万,数据存储TPS在10万以上。Lindorm本身性能优异,为闲鱼IFTTT高性能奠定基础。 四、效果验证闲鱼IFTTT自上线以来,已支持关注上新、浏览宝贝降价和租房小区上新等多个业务场景,提供买卖双方实时双向互动能力,平均每天处理关系数据数亿条,处理Trigger量达到上千万,处理Action量达到亿级别,消息点击率较离线push提高1倍以上。 闲鱼IFTTT目前支持的是用户互动场景,后续我们将结合闲鱼自身业务特点,对IFTTT进行更高维度抽象,封装标准Recipe接口,将闲鱼IFTTT打造成提供流程编排、管理能力的服务平台。 在我看来,IFTTT从2010年推出以来,在国外有很大的热度,在互联网和物联网领域都有专门的公司和团队在研发,IFTTT的概念虽然简单,却通过标准化协议满足用户的强需求-让各种互联网产品为用户服务。这其实也给我们互联网从业者一些思考:在新机遇面前,究竟是快速投入比较重要还是抽象标准协议解决一类问题更加有效? 五、名词注解SLS:https://cn.aliyun.com/product/slsDiamond:阿里内部研发的持久配置管理中间件;Blink:https://data.aliyun.com/product/sc?spm=5176.10695662.1131226.1.bf495006EWuVABMetaQ:阿里内部研发的分布式、队列模型的消息中间件;Lindorm:阿里内部基于HBase研发的新一代分布式NoSQL数据库,阿里云类似产品:https://www.aliyun.com/product/ots?spm=a2c4g.11174283.cwnn_jpze.59.2f5a15c3NH30me;Tair:阿里内部研发的高性能、分布式、可扩展、高可靠的Key-Value结构存储系统; 本文作者:闲鱼技术-剑辛阅读原文 本文为云栖社区原创内容,未经允许不得转载。

June 17, 2019 · 1 min · jiezi

阿里云生活物联网平台30发布助力智能家电中国造全球卖

视频地址:https://yunqivedio.alicdn.com... 查看产品:生活物联网平台点击了解:“阿里云新品发布会频道”立即订阅:阿里云新品发布会·周刊 在物联网行业蓬勃发展的大潮中,阿里云IoT致力于将物理世界数字化,构建了云端一体化的平台,为智能生活、智能工业、智慧城市等各行业提供助力。阿里云发布生活物联网平台(飞燕平台)3.0,为行业合作伙伴提供安全、稳定、高扩展、低成本的智能生活解决方案,同时还将通过阿里云的全球化部署助力中国企业出海,共同打造物联网的生态。 只需五步,实现产品的智能化升级“创建产品-功能产品-在线调试-配置界面-发布量产”,通过这四步,传统硬件厂商可以快速定义产品功能和属性、选择认证模组、在线调试端到云链路、配置所见即所得的人机界面,从而大大节省设备上云的工作量。 低成本,快捷配置免开发传统的智能硬件开发包括设备端、服务端和客户端开发,至少需要20个以上的基本工作环节,还需要面对高并发稳定性、安全保障、运维服务等方面的问题。现在,智能硬件厂商可以快捷配置和服务选择,低成本的完成从硬件到用户交互的产品交付,并且拥有专属的运营管理中心,从而只需要专注于硬件产品本身的设计和开发。 高扩展,支持深度定制生活物联网平台还提供高扩展能力,包括客户端SDK和云端API,让具备开发能力和个性化需求高的厂商开发自主品牌APP,也可以通过云对云的方式将自有业务系统和平台打通,深度定制自有业务体系。 全球部署,助力中国企业出海通过阿里云的全球化部署,生活物联网平台也在全球多个节点实现完整的全链路服务能力、统一的设备激活和漫游能力、多语言能力,助力中国企业的产品走向海外,服务国际用户。 查看产品:生活物联网平台点击了解:“阿里云新品发布会频道”立即订阅:阿里云新品发布会·周刊 本文作者:云攻略小攻原文链接 本文为云栖社区原创内容,未经允许不得转载。

June 10, 2019 · 1 min · jiezi

阿里云PolarDB发布重大更新-支持Oracle等数据库一键迁移上云

5月21日,阿里云PolarDB发布重大更新,提供传统数据库一键迁移上云能力,可以帮助企业将线下的MySQL、PostgreSQL和Oracle等数据库轻松上云,最快数小时内迁移完成。据估算,云上成本不到传统数据库的1/6。目前,已有约40万个数据库迁移到阿里云上。 阿里云方面表示,该产品实现了两大技术突破:通过自研超低延迟文件系统PolarFS大幅降低数据跨网络的延迟,并且开发了一种全新的共识协议ParallelRaft,提升系统吞吐量。在此之前,PolarFS的研究成果已发表在数据库顶级会议 VLDB 2018 《PolarFS: An Ultra-low Latency and Failure Resilient Distributed File System for Shared Storage Cloud Database》。 企业在使用传统商业数据库时,经常会面临授权费用贵、硬件成本高、架构与运维复杂、迁移难度大等问题,此次云原生数据库PolarDB的重大更新针对此类痛点,实现一键快速迁移,并提供云上的完整生态服务。 此外,产品还具备三大亮点,满足企业在数字时代海量的数据存储需求:1、单实例规格最大达88核710GB;2、业内最快单节点读写速度100万QPS;3、实现三份数据存储实时同步0延迟。除性能领先外,云上数据库成本也低于传统数据库,不到后者的1/6。 PolarDB是阿里云在2018年正式商业化的云原生数据库,采用存储计算分离、软硬一体化设计,具备快速弹性能力、超大规格、超高可靠性以及两倍于AWS Aurora的性能。目前已是阿里云上增长最快的数据库产品。 随着移动互联网、物联网的发展,数据量剧增。企业上云也成大势所趋,企业上云意愿达84%,云也对数据库提出了更高的扩展性和可用性要求。 因昂贵、扩展性差、技术复杂、迭代慢,传统商业数据库饱受诟病。与传统数据库相反,云原生数据库天然拥有云计算的弹性能力,兼具开源数据库的易用、开放特点,及传统数据库的管理和处理性能优势,是云时代下企业数据库的最佳选择。 在全球范围内,一场替换传统数据库的行动正在进行。早在2013年,阿里巴巴就将最后一台Oracle数据库从其淘宝核心系统中下线。亚马逊也公开表示,将在2020年彻底放弃Oracle数据库。 阿里云智能数据库事业部负责人李飞飞表示,云原生数据库在成本、灵活度、安全、技术进化层面都优于传统数据库,传统数据库会像马车一样被淘汰。 阿里云拥有国内最丰富的云数据库产品,目前已有约40万个数据库迁移到阿里云上,涵盖金融、电信、制造、物流等领域的龙头企业。在Gartner发布的2018年数据库魔力象限中,阿里云是国内首个进入挑战者象限的中国公司。 阿里云数据库的技术研究也在国际上崭露头角。PolarDB相关论文入选今年的国际顶级数据库会议SIGMOD,这是阿里云数据库连续第二年入选该学术会议。 本文作者:阿里云头条阅读原文 本文为云栖社区原创内容,未经允许不得转载。

May 21, 2019 · 1 min · jiezi

30个Python物联网小实验3使用按钮开灯关灯

使用按钮开灯关灯接线图非常简单,LED接GPIO17号口,按钮接GPIO2号口,负极接GND地线。 代码也非常简单:from gpiozero import LED, Buttonfrom signal import pauseled = LED(17)button = Button(2)button.when_pressed = led.onbutton.when_released = led.offpause()执行代码,按下按钮,发光二极管就会亮,松开就会灭。使用按钮开灯关灯(二)还有一种source的写法,直接把按钮的状态提供给发光二极管,达到同样的效果。from gpiozero import LED, Buttonfrom signal import pauseled = LED(17)button = Button(2)led.source = buttonpause()按钮按下和松开先上效果 接线非常简单,按钮一端连接GPIO2号针脚,一端连接GND地线。代码灰常简单:from gpiozero import Buttonbutton = Button(2)while True: if button.is_pressed: print("Button is pressed") else: print("Button is not pressed")等待按钮按下才执行直接上代码吧:from gpiozero import Buttonbutton = Button(2)button.wait_for_press()print("Button was pressed")程序执行到button.wait_for_press()这一句之后,会先停下,等待按钮按下之后,才会继续执行。按下执行特定函数直接上代码:from gpiozero import Buttonfrom signal import pausedef say_hello(): print("Hello!")button = Button(2)button.when_pressed = say_hellopause()按下按钮,执行say_hello()这个函数。松开执行特定函数上效果图: ...

May 21, 2019 · 1 min · jiezi

Digital-TwinIoT的下一个浪潮

选自Medium作者:Tomasz Kielar 京东云开发者社区编译 当前的商业格局受到了众多新技术的影响,有时确实让人很难能跟上技术迭新的速度。虽然很多人都熟悉工业4.0和物联网(IoT)这两个词,这里面包含了太多的技术内容以及商业应用上的含义,而Digital Twin则是另一个正在稳步升起的下一波接力词汇。 事实上,很多人都认为Digital Twin是物联网的自然演进。毕竟,如果所有内容都已经以某种数字形式或其他形式被连接起来,为什么不让它“顺理成章”地进入下一个进程呢? 从本质上讲,这是Digital Twin架构和技术背后的主要驱动力——在数字环境中完全复制物理世界,为公司提供新的自由、机会和优势。 什么是Digital Twin?Digital Twin概念由密歇根大学的Michael Grieves首次提出,自2001年以来一直存在,但近年来,现代技术的不断快速迭代,才为其实现与普及提供了可能性。 简而言之,Digital Twin指的是物理产品或资产的虚拟副本。此副本实时更新(或尽可能定期更新),以尽可能地匹配其真实世界。 然后,该模型可用于各种目的,从测试新策略到分析以前的结果,都是可以实现的。 那么,这个模型是如何工作的呢?通常,传感器和其他组件用于收集有关资产的准确数据。然后处理该数据并用于创建副本。毋庸置疑,更先进的传感器,无论是更精确的设备还是更密集,更紧凑的阵列,都将有助于创建更加详细的数字模型。 Digital Twin建模的好处是什么?对物理产品和资产进行试验可能是一个临时且昂贵的过程。但是,可以快速编辑数字副本以测试新的解决方案并运行Demo。如果实验不符合要求,则不会浪费任何物理资源。 Digital Twin的另一个好处是,允许专家们可以在不与物理设备接触的情况下进行项目的开发与处理 NASA就是一个很好的例子,NASA长期以来一直是这项技术的先驱——即使在虚拟模拟之前,工程师也会创建1:1比例的发射设备复制模型。Digital Twin允许工程师处理已经在太空中并且完全无法访问的设备,而没有物理复制带来的麻烦和困难。在管理员对物理实体进行更改之前,可以运用这一模型进行详细计划更新和更改,并在现场进行测试。 美国宇航局国家先进制造中心制造专家兼经理 John Vickers表示:“Digital Twin的最终愿景是在虚拟环境中创建、测试和构建我们的设备。只有当我们把它带到我们要求的地方时,我们才能实际制造它。然后,我们希望物理构建通过传感器与Digital Twin连接,以便Digital Twin包含我们通过检查物理构建可以获得的所有信息。” 同样,对于希望或需要对现有产品或设备进行更改的公司,Digital Twin可帮助将停机时间降至最低。例如,在一条生产线中,无效的链接可能会限制整个链条的最佳效率,但是根本无法将其完全删除以进行审核/评估,因为这会关闭它所属的整个流程。但是,虚拟副本可以在不产生这些成本的情况下进行测试和改进。 Digital Twin和物联网那么为什么我们认为Digital Twin是“物联网的下一个浪潮”呢?这是因为前者在传感器和输入数据上已取得了不错的发展,而后者正在越来越多地将这些已有的成果更好地为我们所用。 通过更多互连的设备和应用程序,我们可以更轻松地链接数据并更好地了解更为详细的情况。因此,Digital Twin是一种收集和组合这些数据的高级方法。 事实上,这是一场已经在进行中的革命。据Gartner称,预计到明年(2020年),75%与物联网整合的企业将使用 - 或计划开始使用 - 某种形式的Digital Twin技术。据估计,13%的公司已经在使用此类解决方案,另有62%的公司已经采用某种形式的Digital Twin。 数字双用例和行业对于许多Digital Twin应用程序而言,它们使用的最佳场景与其他技术一起配合,例如人工智能或机器学习。其他的同样也可以使用Digital Twin解决方案,作为工业4.0或物联网的一部分。 值得注意的是,它不是一种全新的替代解决方案。Digital Twin是用于改进现有流程的,它为人们提供了一种“虚拟游乐场”,我们可以在模拟环境中尝试各种方法,而不会影响真实产品。 Digital Twin技术用于各种用途,大多数企业都可以从中获益。但是,Digital Twin确实对于部分行业有着更为深远的意义,这一点值得我们在此讨论。 制造与工程毫无疑问,创建虚拟副本对制造业和工程行业有着非常重要的意义。Digital Twin在制造业中的作用几乎不需要介绍。它使公司能够快速有效地测试新设计,无论是小型产品还是大型复杂设备。在虚拟环境中测试新的供应链很容易,而测试物理实体则涉及关闭生产,从而导致企业的损失——只有在必要时以及确定最佳策略时才会这么做。 当然,这种技术可以做得更多。一个有趣的例子是GE的数字风电场。通过使用其风电场的数字再现,运营商可以制定优化后的维护策略,并将天气和其他因素也都考虑在了优化方案中。由于维护的优化升级,让维护人员对各种条件下的设备状态有了更好评估,设备与判断的可靠性也随之增加,有效提高了风电场产生的能量输出。 由于这一切都是以数字方式完成的,所以工程师可以自由地进行实验和研究,相反如果直接对实际涡轮机进行物理测试,可能是需要付出较为昂贵的代价。而前者的存在,就是确保后者仅在解决方案经过全面测试和评估后才再去实施。 这些好处也适用于生产过程。工厂可以使用虚拟复制品来测试更简化的解决方案,发现其当前生产能力的极限,以及测试新解决方案的压力。 汽车我们之前提到Digital Twin可以使用传感器记录任何项目的持续状态。这种Digital Twin分析具有很大的潜力——尤其是在汽车领域。随着汽车与物联网和数字技术的集成越来越多,复制每个细节的能力变得越来越容易。 例如,在任何事件发生后,Digital Twin可以使用传感器记录创建所发生事件的实时复制。这样,工程师可以直接分析每个确切的问题对车辆的影响,而不仅仅是分析后记录的数据。 然而,Digital Twin在汽车领域的优势要远远超过这个。工程师可以在数字化的情境中测试车辆的安全功能,降低不不必要的因安全而需要召回新车辆的风险。 这对于汽车零件制造商们也很重要,因为汽车行业的零部件来自众多不同的公司。Digital Twin允许供应商或生产商的产品在真正被安装到汽车上之前获得更多数据,测试新解决方案并改进他们的产品。 ...

May 18, 2019 · 1 min · jiezi

基于-HTML5-WebGL-的挖掘机-3D-可视化应用

前言在工业互联网以及物联网的影响下,人们对于机械的管理,机械的可视化,机械的操作可视化提出了更高的要求。如何在一个系统中完整的显示机械的运行情况,机械的运行轨迹,或者机械的机械动作显得尤为的重要,因为这会帮助一个不了解这个机械的小白可以直观的了解机械的运行情况,以及机械的所有可能发生的动作,对于三一或者其它国内国外重工机械的公司能够有一个更好的展示或者推广。挖掘机,又称挖掘机械(excavating machinery),从近几年工程机械的发展来看,挖掘机的发展相对较快,挖掘机已经成为工程建设中最主要的工程机械之一。所以该系统实现了对挖掘机的 3D 可视化,在传统行业一般都是基于 Web SCADA 的前端技术来实现 2D 可视化监控,而且都是 2D 面板部分数据的监控,从后台获取数据前台显示数据,但是对于挖掘机本身来说,挖掘机的模型,挖掘机的动作,挖掘机的运行可视化却是更让人眼前一亮的,所以该系统对于挖机的 3D 模型做出了动作的可视化,大体包括以下几个方面: 前进后退 -- 用户可以通过键盘 wasd 实现前后左右,或者点击 2D 界面 WASD 来实现挖机的前进后退。机身旋转 -- 用户可以通过键盘左右键实现机身的旋转,或者点击 2D 界面 < > 来实现挖机机身的旋转。大臂旋转 -- 用户可点击 2D 界面第一个滑块部分实现大臂的旋转。小臂旋转 -- 用户可点击 2D 界面第二个滑块部分实现小臂的旋转。挖斗挖掘 -- 用户可点击 2D 界面第三个滑块部分实现挖斗部分的旋转挖掘。挖机动画 -- 用户可点击 2D 界面铲子图标,点击之后系统会把挖机本身几个动画做一个串联展示。本篇文章通过对挖掘机可视化场景的搭建,挖机机械动作代码的实现进行阐述,帮助我们了解如何使用 HT 实现一个挖掘机的可视化。 预览地址:基于 HTML5 WebGL 的挖掘机 3D 可视化应用 http://www.hightopo.com/demo/... 界面效果预览挖机机械运动效果 通过上面 gif 图片可以看出挖掘机的几个主要动作。 挖机挖斗运动效果 滑动页面的第三个滑杆控制挖斗的旋转挖掘。 挖机机身运动 通过上面 gif 图片可以看出挖掘机的前进后退以及机身旋转几个运动。 场景搭建该 3D 场景中所有形状都是用 HT 内部的墙面工具进行构建,通过设置墙面透明属性 shape3d.transparent 为 true 以及对构建出的墙面进行贴图来构造出场景中的类似建筑的显示效果,具体的样式可以参考 HT 的 风格手册,场景效果: ...

May 13, 2019 · 3 min · jiezi

30个物联网传感器小实验2LED灯条灯板

30个物联网传感器小实验2:LED灯条、灯板以下所有实验均要求树莓派刷入完整版Raspbian操作系统,也就是官网上Raspbian Stretch with desktop and recommended software的版本。交通信号灯(一)接线图如下: 新建TrafficLight.py文件,代码如下:from gpiozero import TrafficLightsfrom time import sleeplights = TrafficLights(2, 3, 4)lights.green.on()while True: sleep(3) lights.green.off() lights.amber.on() sleep(1) lights.amber.off() lights.red.on() sleep(3) lights.amber.on() sleep(1) lights.green.on() lights.amber.off() lights.red.off()运行python3 TrafficLight.py,即可看到具有交通信号灯逻辑的红黄绿亮灯顺序。 交通信号灯(二)对于TrafficLight.py文件,还有一种写法如下: from gpiozero import TrafficLightsfrom time import sleepfrom signal import pauselights = TrafficLights(2, 3, 4)def traffic_light_sequence(): while True: yield (0, 0, 1) # green sleep(3) yield (0, 1, 0) # amber sleep(1) yield (1, 0, 0) # red sleep(3) yield (1, 1, 0) # red+amber sleep(1)lights.source = traffic_light_sequence()pause()交通信号灯(三)最后,说白了虽然上面使用的是TrafficLight对象,当然使用LED对象也是一样可以完成这个任务的。 ...

May 11, 2019 · 2 min · jiezi

当智能家居走进特殊人群阿里程序员与他的梦想改造

如果你看过《梦想改造家》,那你一定会对那位被称为“神之手”的日本设计师本间贵史记忆犹新。特别是2年前,他为一个僵硬病症家庭改造46m²老屋的故事,更是感动了无数网友。 为了能真正帮助这个不幸的家庭,让日渐年迈的妈妈既能外出工作谋生,又能放心家里即将失去自理能力的儿子,本间贵史不仅亲自到这个家里照顾病人小李,细心记录他的日常习惯和不便,还跑到医院去了解这种疾病的症状与变化。 最终,他考虑到病人不同患病阶段的需求,设计出相应的房屋功能,为这对相依为命的母子带去了一个“奇迹”。 从这期节目中,我们可以看到,本间贵史的执着与匠心不仅让小李的生活更加便捷舒适,也为他和母亲增添了生活的希望与勇气。这种意义是远非精美的装修、单纯的金钱所能比拟的,可以说本间贵史是一位当之无愧的“梦想改造家”。 而在荧屏之外,同样有一群人,他们也在为了让人们生活得更加幸福,让这个世界更加美好而努力进行着自己的独特“设计”。 来自阿里云的代立晨便是其中的一位“梦想改造家”。 (一)初识代立晨,人们往往会对他的职业名称颇感兴趣——解决方案架构师。 而用他自己的话来介绍就是:“我现在在做物联网的解决方案实验室,这个实验室就是给(物联网)行业里面输出各种各样的创新的方案。” 由于工作的性质,代立晨需要及时去了解生活中潜在的问题或特殊人群的需求,以期用互联网思维和技术提供最佳的创新方案。 正因为如此,早在2011年就加入了W3C的信息无障碍工作组(国际Web无障碍领域的领先标准化组织)的他一直在关注信息无障碍领域的进展。 “这个工作组实际上主要是在为盲人群体做无障碍服务,比如让盲人也可以去使用网页等。”所以在日常的生活与工作中,代立晨也格外关注盲人群体,总希望为他们的生活无障碍贡献一份力。 而在2018年初,一次和朋友的偶然谈话给了他极大的启发。以“物联网能不能给视觉障碍群体做一些事情?”这个问题为开端,他和朋友两人经过激烈的思想碰撞和讨论,终于找到了能为盲人提供的可行性创新方案——“智能家居”系统研发。 如今市场上的智能家居,绝大多数只停留在通过手机和智能音箱控制智能设备的阶段,而远没有实现真正意义上的高度自动化。 对代立晨来说,这是一个不容忽视的问题,因为高度自动化对普通人来说可能只是一个体验上的优化,但对与盲人来说将会是水和空气,能够大大减少他们的生活负担。所以他和朋友当即决定要为盲人设计、优化一个真正能够帮助他们的智能家居系统。 项目发起后,一个有着开发工程师和视觉设计师的小团队很快就组建了起来。而这个五人小组成立后的第一件事,便是将代立晨的家作为“试验田”,进行自动化的改造。在此过程中,他们一边克服技术问题,一边将体验一步步推向极致。 将一个个感应器布置在家中的各个角落,形成一个完善立体的智能网络系统。 与此同时,团队也与中央电视台的《秘密大改造》栏目取得了联系,准备将这套智能家居系统搬上荧幕让更多人了解。 而团队的荧幕首秀,则是要为一位来自四川的视障人士大川的家进行改造。 (二)“我们是视障,不是智障。” “我们是视障,不是智障。”每次回想起大川这句无可奈何的解释,代立晨仍旧感触良多。 受先天基因的影响,大川在30多岁时突然被夺去了视力,视力微弱的他甚至连上厕所、开关灯、空调设置温度等看似简单的动作都举步维艰,因而也受到了许多人的误解。 代立晨则希望改变人们的这种错误看法:“社会上有不少人会去关注、关心视障人士,但他们却总会把视障人士视为生活不能自理的人。大川认为不是这样,我也认为不应该是这样的……视障人士只是有自己生活方式,视觉障碍让他们没办法跟普通人的生活一样,但是他们绝不是生活不能自理。” 因此,在对大川家的改造的过程中,代立晨始终站在视障人士的角度进行思考,给予大川最大的尊重和理解,希望为他创造出一个能认识、陪伴、照顾他的家。 “为盲人做自动化就是让他不用去找遥控器,不用去开灯,减少他在家里的走动。” 代立晨和团队成员们为此付出了很多努力,最终也带来了非一般的成效: 无需开灯,只要在房间内行走,沿墙边分布的灯带就会自动亮起来引导主人。 智能窗帘会在室外温度达到设置的阈值时自动合上,而到了太阳即将下山时又会自动拉开。 经过改造的语音空调可以摆脱使用者被遥控器的束缚,只需一声语音指令就能自动调到想要的温度。 而比起各种指令的方便下达与执行,这套智能家居系统的优势更在于它的真正自动化运行。它能记录主人喜欢的亮度、温度以及家电的开关习惯,既能接收指令,又能自动运行。 相比于很多不会“自主思考”的智能家居,代立晨和他的团队与其说是在改造房子,不如说是给系统中的家电装上了“大脑”。 面对这套为自己量身定做的智能家居系统,大川在收房时露出了惊喜与认可的表情。这一刻,整个团队沉浸在喜悦之中。 然而这并不是智能家居项目的终点,代立晨和团队中的其他“梦想改造家”们已经注意到了另一个需求人群——老年人。 (三)“我们认为现在生活节奏越来越快,客观上子女很难亲自照顾老人,所以我们想设计一个能帮助看护人减轻负担的系统。” 在代立晨看来,想要减轻老人看护人的负担,就必须通过两个途径:系统提醒与系统评分。 一是在老人出现异常的时候进行系统提醒。 例如等老人过了时间还没有吃药(配备的智能药箱可以记录是否被打开)、出门超过一定时间后还没有回来等异常情况发生时,智能家居系统就会给看护人发送一个手机APP的推送,提醒看护人及时联系老人。 二是每天对老人全天的行为进行评分。 如果说老人经常晚睡早起、或者吃药时间总是提前或靠后等,系统都会对这些非危险性行为进行监测评估。 而看护人只要花些许时间看一下评分报告,再大致浏览一下所有监控点,就能知道老人的大体生活情况了。 “我觉得让看护人主动打电话提醒老人吃药的方式,会比在客厅放置一个音箱提醒吃药要好得多”,智能家居并非冰冷的机械指令,他更希望通过互联网的即时技术来为家人之间重构沟通的桥梁。 与此同时,家住武汉的独居老人崔兴礼和曹雪梅夫妇走进入团队的视野。 原来,老人崔兴礼在6年前被诊断出了阿尔兹海默症,疾病让这位曾建造过南京长江大桥的优秀工程师失去了智力和记忆。如今的他已经连自己的名字都不记得并且经常走失,而由于工作的原因,子女们也不能常伴父母左右,只有妻子曹雪梅每天寸步不离地照顾崔兴礼。 而对这一切看在眼里,忧在心里的孙女贝贝向乐于助人的阿里云工程师们求助,希望科技能够帮助自己的爷爷奶奶安享晚年。 崔兴礼和曹雪梅夫妇走进浙江卫视《智造将来》节目,讲述智能家居如何改变了他们的生活。 这次,团队又为老人定制了一整套独一无二的远程看护方案,通过智能家居系统与手机APP的配合,所有家人都可以时刻观测到老人在家里的所有行为,而崔兴礼所佩戴的智能手环会监测他的身体指数和定位,防止老人再走丢。 这一切地出发点都是为了给予老人更好的生活保障,以及增加家人间的互相关怀与联系。团队又一次用科技改变了生活,也用实事证明:科技不仅无处不在,而且温暖人心。 (四)智能家居项目发起于2018年3月21日,正是春回大地万物复苏的春分之时,如今已经一岁的她也像春姑娘一般温暖了许多需要帮助的家庭。 “我们始终希望能利用互联网技术去帮助更多的特殊人群,为他们设计一些市面上没有却能方便他们日常生活的产品,真正帮助他们有尊严地生活。目前我们也正在跟深圳信息无障碍协会一起做些新的研究,未来期待有更多人能参与进来,和我们一起来完成这件事情。”当被问到如何看待项目的现在与未来时,代立晨如此坚定而期待地答道。 给这个社会带来一种全新的方案,真正帮助到那些特殊群体,始终是他和整个团队不懈努力的方向和目标。 更令人欣慰的是,在“智能家居”项目越来越受到人们的关注与欢迎的同时,阿里巴巴其他公益项目或活动都呈现出欣欣向荣的发展态势。更多需要关注和关怀的特殊人群都可以在针对自己的公益项目中寻求帮助。 “钉钉信息无障碍”让视障群体可以像正常人一样公平平等地进入职场,与“智能家居”项目遥相呼应,为视障群体开拓更大的社会活动空间。 “养虾米”致力于帮助贫困家庭的听障儿童进行人工耳蜗植入手术,给听障儿童一个有声世界。 ...

May 10, 2019 · 1 min · jiezi

Java-Socket编程之UDP编程

更多资料请看:https://www.yuque.com/shizhiy... Java Socket编程之UDP编程UDP协议(用户数据报协议)是无连接的、不可靠的、无序的,速度快      进行数据传输时,首先将要传输的数据定义成数据报(Datagram),大小限制在64k,在数据报中指明数据索要达到的Socket(主机地址和端口号),然后再将数据报发送出去;**      DatagramPacket类:表示数据报包      DatagramSocket类:进行端到端通信的类 服务器端实现步骤创建DatagramSocket,指定端口号创建DatagramPacket接受客户端发送的数据信息读取数据//服务器端,实现基于UDP的用户登录//1、创建服务器端DatagramSocket,指定端口DatagramSocket socket =new datagramSocket(10010);//2、创建数据报,用于接受客户端发送的数据byte[] data =newbyte[1024];//DatagramPacket packet =newDatagramPacket(data,data.length);//3、接受客户端发送的数据socket.receive(packet);//此方法在接受数据报之前会一致阻塞//4、读取数据String info =newString(data,o,data.length);System.out.println("我是服务器,客户端告诉我"+info);//=========================================================//向客户端响应数据//1、定义客户端的地址、端口号、数据InetAddress address = packet.getAddress();int port = packet.getPort();byte[] data2 = "欢迎您!".geyBytes();//2、创建数据报,包含响应的数据信息DatagramPacket packet2 = new DatagramPacket(data2,data2.length,address,port);//3、响应客户端socket.send(packet2);//4、关闭资源socket.close(); 客户端实现步骤定义发送信息创建DatagramPacket,包含将要发送的信息创建DatagramSocket发送数据//客户端//1、定义服务器的地址、端口号、数据InetAddress address =InetAddress.getByName("localhost");int port =10010;byte[] data ="用户名:admin;密码:123".getBytes();//2、创建数据报,包含发送的数据信息DatagramPacket packet = newDatagramPacket(data,data,length,address,port);//3、创建DatagramSocket对象DatagramSocket socket =newDatagramSocket();//4、向服务器发送数据socket.send(packet);//接受服务器端响应数据//======================================//1、创建数据报,用于接受服务器端响应数据byte[] data2 = new byte[1024];DatagramPacket packet2 = new DatagramPacket(data2,data2.length);//2、接受服务器响应的数据socket.receive(packet2);String raply = new String(data2,0,packet2.getLenth());System.out.println("我是客户端,服务器说:"+reply);//4、关闭资源socket.close();

May 3, 2019 · 1 min · jiezi

Java-Socket编程之TCP编程

Java Socket编程之TCP编程全套的:https://www.yuque.com/shizhiy...基础:https://blog.51cto.com/wangdy/1588379Java Socket编程基础及深入讲解:https://www.cnblogs.com/yiwangzhibujian/p/7107785.html TCP协议是面向连接的、可靠的、有序的、以字节流的方式发送数据,通过三次握手方式建立连接,形成传输数据的通道,在连接中进行大量数据的传输,效率会稍低Java中基于TCP协议实现网络通信的类 客户端的Socket类服务器端的ServerSocket类 Socket通信的步骤                ① 创建ServerSocket和Socket                ② 打开连接到Socket的输入/输出流                ③ 按照协议对Socket进行读/写操作                ④ 关闭输入输出流、关闭Socket 服务器端:               ① 创建ServerSocket对象,绑定监听端口                ② 通过accept()方法监听客户端请求                ③ 连接建立后,通过输入流读取客户端发送的请求信息                ④ 通过输出流向客户端发送乡音信息                ⑤ 关闭相关资源** ...

May 3, 2019 · 2 min · jiezi

Java-Socket编程之常识网络基础知识

更多物联网高并发编程知识请移步:https://www.yuque.com/shizhiy... Java Socket编程之常识网络基础知识网络基础知识(参考计算机网络)  《TCP/IP协议栈及OSI参考模型详解》           两台计算机间进行通讯需要以下三个条件           IP地址、协议、端口号 TCP/IP协议目前世界上应用最为广泛的协议,是以TCP和IP为基础的不同层次上多个协议的集合,也成TCP/IP协议族、或TCP/IP协议栈 TCP:Transmission Control Protocol 传输控制协议IP:Internet Protocol 互联网协议 TCP/IP五层模型应用层:HTTP、FTP、SMTP、Telnet等传输层:TCP/IP网络层:数据链路层:物理层:网线、双绞线、网卡等 IP地址为实现网络中不同计算机之间的通信,每台计算机都必须有一个唯一的标识---IP地址。 32位二进制 端口区分一台主机的多个不同应用程序,端口号范围为0-65535,其中0-1023位为系统保留。     如:HTTP:80  FTP:21 Telnet:23IP地址+端口号组成了所谓的Socket,Socket是网络上运行的程序之间双向通信链路的终结点,是TCP和UDP的基础 Socket套接字网络上具有唯一标识的IP地址和端口组合在一起才能构成唯一能识别的标识符套接字。Socket原理机制: 通信的两端都有Socket网络通信其实就是Socket间的通信数据在两个Socket间通过IO传输       Java中的网络支持针对网络通信的不同层次,Java提供了不同的API,其提供的网络功能有四大类: InetAddress:用于标识网络上的硬件资源,主要是IP地址URL:统一资源定位符,通过URL可以直接读取或写入网络上的数据Sockets:使用TCP协议实现的网络通信Socket相关的类Datagram:使用UDP协议,将数据保存在用户数据报中,通过网络进行通信。  InetAddressInetAddress类用于标识网络上的硬件资源,标识互联网协议(IP)地址。  //获取本机的InetAddress实例InetAddress address =InetAddress.getLocalHost();address.getHostName();//获取计算机名address.getHostAddress();//获取IP地址byte[] bytes = address.getAddress();//获取字节数组形式的IP地址,以点分隔的四部分//获取其他主机的InetAddress实例InetAddress address2 =InetAddress.getByName("其他主机名");InetAddress address3 =InetAddress.getByName("IP地址"); URL类URL(Uniform Resource Locator)统一资源定位符,表示Internet上某一资源的地址,协议名:资源名称  //创建一个URL的实例URL baidu =new URL("http://www.baidu.com");URL url =new URL(baidu,"/index.html?username=tom#test");//?表示参数,#表示锚点url.getProtocol();//获取协议url.getHost();//获取主机url.getPort();//如果没有指定端口号,根据协议不同使用默认端口。此时getPort()方法的返回值为 -1url.getPath();//获取文件路径url.getFile();//文件名,包括文件路径+参数url.getRef();//相对路径,就是锚点,即#号后面的内容url.getQuery();//查询字符串,即参数 使用URL读取网页内容通过URL对象的openStream()方法可以得到指定资源的输入流,通过流能够读取或访问网页上的资源 //使用URL读取网页内容//创建一个URL实例URL url = new URL("http://www.baidu.com");InputStream is = url.openStream();//通过openStream方法获取资源的字节输入流InputStreamReader isr = newInputStreamReader(is, "UTF-8");//将字节输入流转换为字符输入流,如果不指定编码,中文可能会出现乱码BufferedReader br = newBufferedReader(isr);//为字符输入流添加缓冲,提高读取效率String data = br.readLine();//读取数据while (data != null) { System.out.println(data);//输出数据 data = br.readerLine();}br.close();isr.colose();is.close();      ...

May 3, 2019 · 1 min · jiezi

Java获取当前进程ID以及所有Java进程的进程ID

Java获取当前进程ID以及所有Java进程的进程ID 首先是获取当前Java运行的Java进程ID,这个是网上常见的,也就是Java程序自身将进程ID打印出来:package com.test;import java.lang.management.ManagementFactory;import java.lang.management.RuntimeMXBean;public class Target { public static void main(String[] args) throws InterruptedException { System.out.println(getProcessID()); while(true) { Thread.sleep(10000); } } public static final int getProcessID() { RuntimeMXBean runtimeMXBean = ManagementFactory.getRuntimeMXBean(); System.out.println(runtimeMXBean.getName()); return Integer.valueOf(runtimeMXBean.getName().split("@")[0]) .intValue(); } }ManagementFactory是一个在运行时管理和监控Java VM的工厂类,它能提供很多管理VM的静态接口,比如RuntimeMXBean;RuntimeMXBean是Java虚拟机的运行时管理接口. 获取所有正在运行着的Java进程package com.test;import java.util.HashSet;import java.util.Set;import sun.jvmstat.monitor.MonitoredHost;import sun.jvmstat.monitor.MonitoredVm;import sun.jvmstat.monitor.MonitoredVmUtil;import sun.jvmstat.monitor.VmIdentifier;public class ProcessID { public static void main(String[] args) throws Exception { // 获取监控主机 MonitoredHost local = MonitoredHost.getMonitoredHost("localhost"); // 取得所有在活动的虚拟机集合 Set<?> vmlist = new HashSet<Object>(local.activeVms()); // 遍历集合,输出PID和进程名 for(Object process : vmlist) { MonitoredVm vm = local.getMonitoredVm(new VmIdentifier("//" + process)); // 获取类名 String processname = MonitoredVmUtil.mainClass(vm, true); System.out.println(process + " ------> " + processname); } }}MonitoredHost等类位于${JAVA_HOME}/lib/tools.jar_运行结果: ...

May 3, 2019 · 2 min · jiezi

稳坐视频云行业第一,阿里云将用边缘计算开辟新赛道

“CDN竞争的上半场已结束,中国视频云市场格局已定,边缘计算将成为下半场发展的新赛道。” 4月10日,阿里云视频云总经理、边缘计算负责人朱照远在第七届“亚太内容分发大会”暨CDN峰会表示。朱照远认为,阿里云依靠齐全的产品矩阵、最优秀的技术和人才、成本和效率、服务创新,以及在视频领域的场景实践等综合优势,已经赢得了中国视频云行业竞赛的上半场胜利。据市场咨询机构计世资讯(CCWResearch)数据显示,当前中国视频云服务市场格局已逐步进入整合阶段,技术能力与资源能力使得该市场的壁垒正在形成,头部厂商所占份额越来越大。其中,阿里云视频云以市场份额42.5%成为第一大厂商,所占份额几乎为二至五名总和。而随着大数据、人工智能、物联网、5G等技术的快速发展,百亿联网设备、海量数据、超低延时等需求都对现有的云计算模式提出了挑战,边缘计算应运而生。“云计算领域累积的领先优势为我们开展边缘计算提供了足够的技术储备、丰富的实践场景以及服务经验,边缘计算的竞争是拼基础设施的成熟度、稳定性和开放性。”朱照远说。阿里云边缘计算第一层是将分布全球的边缘IDC变化为云基础设施,这个能力可以从云覆盖到用户100公里附近的位置;第二层是MEC,深入到5G通信网络;第三层是客户侧的边缘计算,通常是放在园区、政企、家庭等客户侧网络。阿里云边缘计算正在层层前移,深入每一个计算场景,直至用户的最近一公里。2016年,阿里云开始布局边缘计算;2018年3月,阿里云正式宣布战略投入边缘计算技术领域,将云计算、大数据、人工智能的优势拓展到更靠近端的边缘计算上,打造云、边、端一体化的协同计算体系。在过去一年多的时间里,阿里云先后发布了IoT边缘计算产品Link IoT Edge和边缘节点服务ENS。工业互联网的数字化智能改造、物流行业的智能园区升级、未来酒店的低成本云边一体化实施, 7000万在线的大型游戏赛事直播的完美支持,阿里云的边缘计算已在多个场景得到实施和验证,并产生了相应成效。“未来,阿里云在边缘计算领域的投入还会加大,会以融合、标准、开发、被集成的理念,持续开拓面向未来的边缘服务,期待更多行业合作伙伴、客户与阿里云同行。”朱照远说。本文作者:隽阜阅读原文本文为云栖社区原创内容,未经允许不得转载。

April 11, 2019 · 1 min · jiezi

一个简单混合协议通讯列子,物联网和互联网通讯。

这个列子主要讨论Tcp,WebSocket和http之间的通讯。长连接和长连接通讯,长连接和短连接通讯。其他协议同理可得Tcp: 代表硬件设备WebSocket: 代表客户端 http: 代表网页 本列子是基于one框架 (https://github.com/lizhichao/one) 开发.配置协议 监听端口由于swoole的模型 WebSocket server 包含 http server , http server 包含 tcp server 。所以我们配置主服务为 WebSocket server ,添加两个http 和 tcp 监听。配置文件如下:return [ ‘server’ => [ ‘server_type’ => \One\Swoole\OneServer::SWOOLE_WEBSOCKET_SERVER, ‘port’ => 8082, ‘action’ => \App\Test\MixPro\Ws::class, ‘mode’ => SWOOLE_PROCESS, ‘sock_type’ => SWOOLE_SOCK_TCP, ‘ip’ => ‘0.0.0.0’, ‘set’ => [ ‘worker_num’ => 5 ] ], ‘add_listener’ => [ // http 监听 [ ‘port’ => 8081, ‘action’ => \App\Server\AppHttpPort::class, ’type’ => SWOOLE_SOCK_TCP, ‘ip’ => ‘0.0.0.0’, ‘set’ => [ ‘open_http_protocol’ => true, ‘open_websocket_protocol’ => false ] ], // tcp 监听 [ ‘port’ => 8083, ‘pack_protocol’ => \One\Protocol\Text::class, // tcp 打包,解包协议,方便在终端调试 我们使用 text 协议. 换行符 表示一个包的结束 ‘action’ => \App\Test\MixPro\TcpPort::class, ’type’ => SWOOLE_SOCK_TCP, ‘ip’ => ‘0.0.0.0’, ‘set’ => [ ‘open_http_protocol’ => false, ‘open_websocket_protocol’ => false ] ] ]];接下来去 \App\Test\MixPro\Ws 和 \App\Test\MixPro\TcpPort 实现各种事件处理。\App\Server\AppHttpPort 是框架内置的,通过路由处理http请求的,配置路由即可。配置路由// 首页Router::get(’/mix’, [ ‘use’ => HttpController::class . ‘@index’, ‘middle’ => [\App\Test\MixPro\TestMiddle::class . ‘@isLogin’] // 中间件 如果用户登录了 直接跳转到相应的页面]);Router::group([ ‘middle’ => [\App\Test\MixPro\TestMiddle::class . ‘@checkSession’] // 中间件 让用户登录后 才能进入聊天页面 http websocket 都能获取到这个 session ], function () { // websocket 页面 Router::get(’/mix/ws’, HttpController::class . ‘@ws’); // http 页面 Router::get(’/mix/http’, HttpController::class . ‘@http’); // http 轮训消息接口 Router::post(’/mix/http/loop’, HttpController::class . ‘@httpLoop’); // http 发送消息接口 Router::post(’/mix/http/send’, HttpController::class . ‘@httpSend’);});配置的都是 http 协议路由。 websocket和tpc我们直接在回调action处理。如果你的项目复杂也可以配置相应的路由。one框架的路由支持任何协议,使用方法也是统一的。处理tcp协议其中__construct,onConnect,onClose 不是必须的。 如果你想在服务器运行开始时最一些事情就写到 __construct里面。 onConnect 当有客户端连接时触发,每个客户端触发一次 onClose 当有客户端连接断开时触发,每个客户端触发一次class TcpPort extends Tcp{ use Funs; private $users = []; /** * @var Ws / protected $server; /* * @var Client / protected $global_data; public function __construct($server, $conf) { parent::__construct($server, $conf); $this->global_data = $this->server->global_data; } // 终端连接上服务器时 public function onConnect(\swoole_server $server, $fd, $reactor_id) { $name = uuid(); $this->users[$fd] = $name; $this->sendTo(‘all’, json_encode([‘v’ => 1, ’n’ => $name])); $this->sendToTcp($fd, json_encode([‘v’ => 4, ’n’ => $this->getAllName()])); $this->global_data->bindId($fd, $name); $this->send($fd, “你的名字是:” . $name); } // 消息处理 像某个name 发送消息 public function onReceive(\swoole_server $server, $fd, $reactor_id, $data) { $arr = explode(’ ‘, $data); if (count($arr) !== 3 || $arr[0] !== ‘send’) { $this->send($fd, “格式不正确”); return false; } $n = $arr[1]; $d = $arr[2]; $this->sendTo($n, json_encode([‘v’ => 3, ’n’ => $d])); } // 下线 通知所有其他终端,解除与fd的关系绑定。 public function onClose(\swoole_server $server, $fd, $reactor_id) { echo “tcp close {$fd} \n”; $this->global_data->unBindFd($fd); $this->sendTo(‘all’, json_encode([‘v’ => 2, ’n’ => $this->users[$fd]])); unset($this->users[$fd]); }}定义了一个公共的traitFuns主要实现两个方法,获取所有的终端(tcp,ws,http),和向某个用户发送消息 。在ws、http都会用到这个 在构造函数我们初始化了一个 global_data 用来保存,名称和fd的关系。你也可以使用方式储存。因为fd没次连接都不同。global_data是one框架内置的。 终端连接上服务器时触发事件 onConnect ,我们给这个终端取个名字,并把关系保存在 global_data。 通知所有终端有个新终端加入,并告诉刚加入的终端当前有哪些终端在线。处理 websocket 协议其中__construct,onHandShake,onOpen,onClose 不是必须的。onHandShake,onOpen 是配合使用的,如果onOpen返回false服务器会拒绝连接。在 onOpen,onMessage,onClose可以拿到当前用户的session信息和http是相通的。class Ws extends WsServer{ use Funs; private $users = []; /* * @var Client / public $global_data = null; public function __construct(\swoole_server $server, array $conf) { parent::__construct($server, $conf); $this->global_data = new Client(); } // 初始化session public function onHandShake(\swoole_http_request $request, \swoole_http_response $response) { return parent::onHandShake($request, $response); } // ws 发送消息 public function onMessage(\swoole_websocket_server $server, \swoole_websocket_frame $frame) { $data = $frame->data; $arr = json_decode($data, true); $n = $arr[’n’]; $d = $arr[’d’]; $this->sendTo($n, json_encode([‘v’ => 3, ’n’ => $d])); } // 判断用户是否登录 如果没有登录拒绝连接 public function onOpen(\swoole_websocket_server $server, \swoole_http_request $request) { $name = $this->session[$request->fd]->get(’name’); if ($name) { $this->users[$request->fd] = $name; $this->sendTo(‘all’, json_encode([‘v’ => 1, ’n’ => $name])); $this->global_data->bindId($request->fd, $name); return true; } else { return false; } } // ws 断开清除信息 public function onClose(\swoole_server $server, $fd, $reactor_id) { echo “ws close {$fd} \n”; $this->global_data->unBindFd($fd); $this->sendTo(‘all’, json_encode([‘v’ => 2, ’n’ => $this->users[$fd]])); unset($this->users[$fd]); }}处理 http 协议主要是 httpLoop 方法,轮训获取消息。因为http是短连接,发给http的信息我们是先存放在$global_data,然后直接这里读取。防止连接间隙丢信息。class HttpController extends Controller{ use Funs; /* * @var Ws / protected $server; /* * @var Client / protected $global_data; public function __construct($request, $response, $server = null) { parent::__construct($request, $response, $server); $this->global_data = $this->server->global_data; } /* * 首页 / public function index() { $code = sha1(uuid()); $this->session()->set(‘code’, $code); return $this->display(‘index’, [‘code’ => $code]); } /* * ws页面 / public function ws() { $name = $this->session()->get(’name’); if (!$name) { $name = uuid(); $this->session()->set(’name’, $name); } return $this->display(‘ws’,[‘users’ => $this->getAllName(),’name’ => $name]); } /* * http 页面 / public function http() { $name = $this->session()->get(’name’); if (!$name) { $name = uuid(); $this->session()->set(’name’, $name); } $this->global_data->set(“http.{$name}”, 1, time() + 60); $this->sendTo(‘all’, json_encode([‘v’ => 1, ’n’ => $name])); return $this->display(‘http’, [’list’ => $this->getAllName(), ’name’ => $name]); } /* * http轮训 / public function httpLoop() { $name = $this->session()->get(’name’); $this->global_data->set(“http.{$name}”, 1, time() + 60); $i = 0; do { $data = $this->global_data->getAndDel(“data.{$name}”); $i++; \co::sleep(0.1); } while ($data === null && $i < 300); if ($data) { foreach ($data as &$v) { $v = json_decode($v, true); } } else { $data = []; } return $this->json($data); } /* * http发送消息 */ public function httpSend() { $n = $this->request->post(’n’); $d = $this->request->post(’d’); if ($n && $d) { $this->sendTo($n, json_encode([‘v’ => 3, ’n’ => $d])); return ‘1’; } return ‘0’; } public function __destruct() { } public function __call($name, $arguments) { return $this->server->$name(…$arguments); }}到此基本就完成了。你可以去看完整的代码 : 点这里 其他的一些列子 : https://github.com/lizhichao/… ...

April 10, 2019 · 4 min · jiezi

AI如何改变智能城市物联网?

AI如何改变智能城市物联网?来源 | 愿码(ChainDesk.CN)内容编辑愿码Slogan | 连接每个程序员的故事网站 | http://chaindesk.cn愿码愿景 | 打造全学科IT系统免费课程,助力小白用户、初级工程师0成本免费系统学习、低成本进阶,帮助BAT一线资深工程师成长并利用自身优势创造睡后收入。官方公众号 | 愿码 | 愿码服务号 | 区块链部落免费加入愿码全思维工程师社群 | 任一公众号回复“愿码”两个字获取入群二维码本文阅读时长:10min根据techopedia的说法, 智能城市是一个利用信息和通信技术提高城市服务(如能源和交通)质量和性能,从而降低资源消耗、浪费和总体成本的城市。Deakin和 AI Waer列出了有助于定义智慧城市的四个因素:在城市基础设施中使用各种电子和数字技术利用信息和通信技术(ICT)改变生活和工作环境将ICT嵌入政府系统实施将人员和ICT结合在一起的实践和政策,以促进创新并增强他们提供的知识因此,一个智能城市将是一个不仅拥有信息通信技术而且还以对居民产生积极影响的方式使用技术的城市。人工智能(AI)与物联网一起,有可能解决城市人口过多带来的主要挑战,他们可以帮助解决交通管理,医疗保健,能源危机和许多其他问题。物联网数据和人工智能技术可以改善居住在智慧城市的公民和企业的生活。智能城市及其AI-powered-IoT(人工智能物联网)用例智能城市拥有大量用于人工智能的物联网技术的用例,从保持更健康的环境到增强公共交通和安全。在下图中,您可以看到智能城市的一些用例:智能交通管理人工智能和物联网可以实施智能交通解决方案,以确保智能城市的居民尽可能安全,高效地从城市的一个点到另一个点。洛杉矶是世界上最拥挤的城市之一,已经实施了智能交通解决方案来控制交通流量。它安装了路面传感器和闭路电视摄像机,可将有关交通流量的实时更新发送到中央交通管理系统。分析来自传感器和摄像机的数据馈送,并通知用户拥塞和交通信号故障。2018年7月,该市在每个交叉口进一步安装了先进的交通控制器(ATC)柜。启用车辆到基础设施(V2I通信和5G连接,这使他们能够与具有红绿灯信息功能的汽车进行通信,例如奥迪A4或Q7。嵌入传感器的自动车辆的发布可以提供车辆的位置和速度,他们可以直接与智能交通信号灯通信,防止拥堵。此外,使用历史数据,可预测未来流量并用于防止任何可能的拥塞。智能停车生活在城市中的任何人都能感受到寻找停车位的困难,特别是在假日期间。智能停车可以缓解这个问题。通过将路面传感器嵌入停车位的地面,智能停车解决方案可以确定停车位是空闲还是占用,并创建实时停车地图。Adelaide市于2018年2月安装了智能停车系统,他们还推出了移动应用程序:Park Adelaide,它将为用户提供准确和实时的停车信息。该应用程序可以为用户提供远程定位,支付甚至延长停车会话的能力。智能停车系统旨在改善交通流量,减少交通拥堵并减少碳排放。在三藩市交通局(SAFTA)实施SFpark智能泊车系统。他们使用无线传感器来检测计量空间中的实时停车位占用情况。SFpark于2013年推出,平日温室气体排放量减少了25%,交通量下降,司机的搜索时间减少了50%。在伦敦,威斯敏斯特Westminster市还在2014年与Machina Research合作建立了智能停车系统。 早些时候,司机不得不平均等待12分钟,导致拥堵和污染,但自智能停车系统安装以来,没有必要等待,司机可以使用手机找到可用的停车位。其他用例包括智能废物管理,智能警务,智能照明和智能治理。人工智能可以为智能城市中的物联网适应做些什么?建立一个智能城市不是一天的业务,也不是一个人或组织的工作。它需要许多战略合作伙伴,领导者甚至公民的合作。智能社区可以做些什么呢?为我们提供职业或创业机会的领域是什么?任何物联网平台都必须满足以下要求:用于收集数据的智能物品网络(传感器,相机,执行器等)现场(云)网关,可以从低功耗物联网设备收集数据,存储并将其安全地转发到云端流式数据处理器,用于聚合大量数据流并将其分发到数据湖和控制应用程序用于存储所有原始数据的数据湖,甚至是那些看似没有价值的数据可以清理和构建收集数据的数据仓库用于分析和可视化传感器收集的数据的工具基于长期数据分析自动化城市服务的AI算法和技术, 并找到提高控制应用程序性能的方法控制向IoT执行器发送命令的应用程序用于连接智能物品和公民的用户应用程序除此之外,还会出现有关安全和隐私的问题,服务提供商必须确保这些智能服务不会对公民的健康构成任何威胁。服务本身应易于使用,以便公民可以采用。如你所见,这提供了一系列工作机会,特别是AI工程师。需要处理物联网生成的数据,并且要真正从中受益,我们需要超越监控和基本分析。将需要AI工具来识别传感器数据中的模式和隐藏的相关性。使用ML/AI工具分析历史传感器数据有助于识别趋势并基于它们创建预测模型。然后,这些模型可以由向IoT设备的执行器发送命令的控制应用程序使用。构建智能城市的过程将是一个迭代过程,每次迭代都会增加更多的处理和分析。现在让我们来看一下AI供电的物联网解决方案的例子。使用旧金山犯罪数据检测犯罪旧金山市也有一个开放数据门户网站,提供来自不同部门的数据。在本节中,我们采用数据集提供来自旧金山所有社区的犯罪报告约12年(从2003年1月至2015年5月),并训练模型以预测发生的犯罪类别。有39个谨慎的犯罪类别,因此它是一个多类别的分类问题。我们将使用Apache的PySpark并使用其易于使用的文本处理功能来处理此数据集。所以第一步是创建一个 Spark会话:第一步是导入必要的模块并创建 Spark会话:from pyspark.ml.classification import LogisticRegression as LRfrom pyspark.ml.feature import RegexTokenizer as RTfrom pyspark.ml.feature import StopWordsRemover as SWRfrom pyspark.ml.feature import CountVectorizerfrom pyspark.ml.feature import OneHotEncoder, StringIndexer, VectorAssemblerfrom pyspark.ml import Pipelinefrom pyspark.sql.functions import colfrom pyspark.sql import SparkSessionspark = SparkSession.builder .appName(“Crime Category Prediction”) .config(“spark.executor.memory”, “70g”) .config(“spark.driver.memory”, “50g”) .config(“spark.memory.offHeap.enabled”,True) .config(“spark.memory.offHeap.size”,“16g”) .getOrCreate()我们加载csv文件中可用的数据集:data = spark.read.format(“csv”). \ options(header=“true”, inferschema=“true”). \ load(“sf_crime_dataset.csv”)data.columns数据包含九列:[Dates,Category,Descript,DayOfWeek,PdDistrict,Resolution,Address, X,Y]我们只需要Category和Descript字段来训练和测试数据集:drop_data = [‘Dates’, ‘DayOfWeek’, ‘PdDistrict’, ‘Resolution’, ‘Address’, ‘X’, ‘Y’]data = data.select([column for column in data.columns if column not in drop_data])data.show(5)现在我们拥有的数据集有文本数据,因此我们需要执行文本处理。三个重要的文本处理步骤是:标记数据,删除停用词并将单词向量化为向量。我们将使用RegexTokenizer将使用正则表达式将句子标记为单词列表,因为标点符号或特殊字符不会添加任何含义,我们只保留包含字母数字内容的单词。有一些词语the会在文本中非常常见,但不会为语境添加任何含义。使用内置类删除这些单词(也称为停用单词)StopWordsRemover。使用标准停用词[“http”,“https”,“amp”,“rt”,“t”,“c”,“the”]。最后使用了 CountVectorizer,将单词转换为数字向量(要素)。这些数字特征将用作训练模型的输入。数据的输出是Category列,但它也是36个不同类别的文本,因此,我们需要将其转换为一个热编码向量:PySpark StringIndexer可以很容易地使用它。将所有这些转换添加到我们的数据中Pipeline:# regular expression tokenizerre_Tokenizer = RT(inputCol=“Descript”, outputCol=“words”, pattern="\W")# stop wordsstop_words = [“http”,“https”,“amp”,“rt”,“t”,“c”,“the”] stop_words_remover = SWR(inputCol=“words”, outputCol=“filtered”).setStopWords(stop_words)# bag of words countcount_vectors = CountVectorizer(inputCol=“filtered”,outputCol=“features”, vocabSize=10000, minDF=5)#One hot encoding the labellabel_string_Idx = StringIndexer(inputCol = “Category”, outputCol = “label”)# Create the pipelinepipeline = Pipeline(stages=[re_Tokenizer, stop_words_remover,count_vectors, label_string_Idx])# Fit the pipeline to data.pipeline_fit = pipeline.fit(data)dataset = pipeline_fit.transform(data)dataset.show(5)现在,数据准备就绪,我们将其分为训练和测试数据集:# Split the data randomly into training and test data sets.(trainingData, testData) = dataset.randomSplit([0.7, 0.3], seed = 100)print(“Training Dataset Size: " + str(trainingData.count()))print(“Test Dataset Size: " + str(testData.count()))让我们为它拟合一个简单的逻辑回归模型。在测试数据集上,它提供97%的准确性。# Build the modellogistic_regrssor = LR(maxIter=20, regParam=0.3, elasticNetParam=0)# Train model with Training Datamodel = logistic_regrssor.fit(trainingData)# Make predictions on Test Datapredictions = model.transform(testData)# evaluate the model on test data setevaluator = MulticlassClassificationEvaluator(predictionCol=“prediction”)evaluator.evaluate(predictions)人工智能正在改变城市运营,交付和维护公共设施的方式,从照明和交通到连接和医疗服务。但是,选择不能有效协同工作或与其他城市服务相结合的技术可能会妨碍采用。要让城市真正受益于智能城市提供的潜力,需要改变思维方式。当局应该更长时间地规划并跨越多个部门。巴塞罗那市是一个典型的例子,物联网系统的实施创造了约47,000个就业机会,节省了4250万欧元的水费,并通过智能停车每年额外增加了3650万欧元。我们可以很容易地看到,城市可以从利用人工智能的物联网解决方案的技术进步中获益匪浅。基于人工智能的物联网解决方案可以帮助连接城市,管理多个基础设施和公共服务。在本文中,我们研究了从智能照明和道路交通到连接公共交通和废物管理的智能城市的用例。同时学会了使用有助于对旧金山12年期间犯罪报告中的数据进行分类的工具。如果你还想学习到更多的干货及实战案例,记得关注“愿码”公众号! ...

April 4, 2019 · 1 min · jiezi

DevOps是如何出现的?前因后果

DevOps是如何出现的?前因后果更多物联网高并发编程知识请移步:https://www.yuque.com/shizhiy…软件开发的演变多年来,DevOps从现有的软件开发策略/方法发展而来,以响应业务需求。让我们简要地看一下这些模型是如何演变的,以及它们最适合的场景。缓慢而繁琐的瀑布模型演变成敏捷,开发团队在短时间内完成软件开发,持续时间甚至不超过两周。如此短的发布周期帮助开发团队处理客户反馈,并将其与bug修复一起合并到下一个版本中。 虽然这种敏捷的SCRUM方法为开发带来了敏捷性,但它在运维方面却失去了敏捷实践的速度。开发人员和运维工程师之间缺乏协作仍然会减慢开发过程和发布。DevOps方法就是基于对更好的协作和更快的交付的需求而产生的。DevOps允许用较少复杂问题的持续软件交付来修复和更快地解决问题。讲故事为了能够更好的理解什么是DevOps,我们很有必要对当时还只有程序员(此前还没有派生出开发者,前台工程师,后台工程师之类)这个称号存在的历史进行一下回顾。如编程之道中所言:老一辈的程序员是神秘且深奥的。我们没法揣摩他们的想法,我们所能做的只是描述一下他们的表象。清醒的像一只游过水面的狐狸警惕的像一位战场上的将军友善的像一位招待客人的女主人单纯的像一块未经雕琢的木头深邃的像一潭幽深洞穴中漆黑的池水i am you father程序员开发了机器语言,机器语言又产生了汇编语言,汇编语言产生了编译器,如今的语言已经多不胜数。每一种语言都有其各自的谦卑用途。每一种语言都表达出软件的阴和阳。每一种语言都在此道之中有其一席之地。遥想当年,软件程序员的大部分办公司那时还被称作实验室,程序员那时还叫做科学家。为了开发出一套优秀的软件,程序员们必须深入了解他们需要的应用相关的所有问题。他们必须清楚知道这个软件应用在什么场合,这个软件是必须在什么系统上运行。本质上说,程序员对所要开发的软件的所有环节都有透彻的了解,从规格说明书编写、到软件开发、到测试、到部署、再到技术支持。过了不久,人类(客户)贪婪的特性就开始表现出来,他们开始不断的进行更多的索求。更快的速度,更多的功能,更多的用户,更多的所有所有。作为一类谦虚、谦卑、且平静的生物,我们的老一辈程序员们将很难在这种爆发性的过度的需求索取中幸存。最好的取胜办法就是往不同的方向进化成不同的新物种。很快,程序员这个称号就开始绝迹于江湖,而那些叫做开发者、软件工程师、网络管理员、数据库开发者、网页开发者、系统架构师、测试工程师等等更多的新物种就开始诞生。快速进化和快速适应外界的挑战成为了他们的DNA的一部分。这些新的种族可以在几个星期内就完成进化。网页开发者很快就能进化成后台开发者,前台开发者,PHP开发者,Ruby开发者,Angular开发者…多得让人侧目。很快他们就都忘却了他们都是起源于程序员这个共同的祖先的事实,忘却了曾经有过这么一个单纯且平静的,想要让这个世界变得更好的科学家。然后他们开始不断的剑拔弩张,都声称自己才是“程序员”的纯血统继承人。随着时间的转移,各门各派开始独占山头,很少进行交流互动,只有在迫不得已的时刻才会进行沟通。他们开始不再为同源的遥远的同宗兄弟们的成功而欢呼雀跃,甚至再也不会时把的遥寄张明信片进行嘘寒问暖。但是在深夜仰望星空的时候,他们还是会发现他们的心底深处的程序员基因还是会不停的闪烁着,期盼着这闪烁的火花能照亮整个银河系并带来和平。瀑布开放流程在这场自私且以自我为中心的欲征服世界的赛跑旅程里,程序员的子孙们早把他们真正的工作目标置之脑后-为客户解决问题。面对一拖再拖的项目交付日期,昂贵的开发代价,甚至最终失败的项目,客户们开始对这种情况深恶痛绝。偶尔,也会有一个闪亮的明星站出来,灵机一动的提供一种办法来尝试结束这种混乱并带来和平。所以瀑布开发流程就应运而生了。这是一个非常了不起的创意,因为它利用了不同团队的开发者们只在必须的时候才进行沟通的这个事实。当一个团队完成了他们的工作的时候,它就会和下游的团队进行交流并把任务进行往下传,如此一级接一级的传递下去,永不回首敏捷开发这种方式在一段时间内发挥了效用,但很快,一如既往,贪婪的人们(客户)又开始提出更多的诉求。他们希望能够更多地参加到整个软件的开发流程中来,不时的提出他们的建议,甚至在很晚的时候还提出改需求这种丧心病狂的事情来。结果就是如大家有目共睹的事实一样,软件项目非常容易失败这个说法已经作为一个行业标准被人们所接受。数据表明超过50%的项目最终都是以失败告终的。更可悲的是,在当时看来,人们对这种情况是束手无策。值得庆幸的是,每一个时代总会有那么几个思想开放的英雄如漆黑中的萤火虫般冒出来。他们知道这些不同团队的开发者们必须要找到一个可以协同工作、进行交流、并且能够弹性的向客户保证对方将会拿到最优的解决方案的方式。这种尝试最早可以追溯到1957年,伟大的约翰·冯·诺依曼和同行们的努力。但是我们最终却是等到2001年才收获到革命的果实,当时行业的十多个精英创造出了如今闻名世界的“敏捷宣言”。敏捷宣言基于以下十二条原则:我们的首要任务是通过尽早地、持续地交付可评价的软件来使客户满意。乐于接受需求变更,即使是在开发后期也应如此。敏捷过程能够驾驭变化,从而为客户赢得竞争优势。频繁交付可使用的软件,交付间隔越短越好,可以从几个星期到几个月。在整个项目开发期间,业务人员和开发人员必须朝夕工作在一起。围绕那些有推动力的人们来构建项目。给予他们所需的环境和支持,并且信任他们能够把工作完成好。与开发团队以及在开发团队内部最快速、有效的传递信息的方法就是,面对面的交谈。可使用的软件是进度的主要衡量指标。敏捷过程提倡可持续发展。出资人、开发人员以及使用者应该总是共同维持稳定的开发速度。为了增强敏捷能力,应持续关注技术上的杰出成果和良好的设计。简洁——最大化不必要工作量的艺术——是至关重要的。最好的架构、需求和设计都源自自我组织的团队。团队应该定期反思如何能变得更有战斗力,然后相应地转变并调整其行为。敏捷宣言是为银河系带来和平以及维护各自的平衡所迈出的很重要的第一步。在很长的时间里,相比此前基于流程和机械化的方式,这是第一次基于文化和“人性”来将不同的关键项目关系人连接在一起的方式。人们开始互相交流,进行基本的碰头会议,并开始不断的交流意见和看法。他们开始意识到他们是有着很多比想象中还多的共同点的,客户也开始成为他们之中的一员,而不再是像以往一样只是往项目砸钱然后开始求神拜佛祈求一切顺利如愿。精益软件开发尽管前面还是有不少的障碍需要克服,但是未来已经光明了许多。敏捷意味着开放和拥抱(需求)改变。但是,如果改变过多的话,人们就很难专注到最终的目标和交付上来。此时精益软件开发就开始破土而出了。因为对精益软件开发的着迷以及为了达成放逐和驱赶风险的目的,一些程序员的子孙们就开始探首窗外,开始向软件之外的行业进行取经。他们从一家主要的汽车生产商身上找到了救赎。丰田生产系统在精益上面的成就是不可思议的,同时它们的精益生产的经验也是很容易应用到软件开发上来的。精益有以下7个原则:杜绝浪费内建质量创建知识(放大学习)延迟决策(尽量延迟决定)快速交付尊重人员(团队授权)全局优化将这些放到敏捷上去的话,精益原则就能让人们在从精神上关注做正确的事情,同时还能够让整个开发流程拥有足够的弹性。DevOps一旦敏捷和精益软件开发被软件开发团队采纳,那么下一步就是把这一套原则应用到IT团队上来。把IT也纳入到整体战略上,然后我们就来到了DevOps跟前了!进入DevOps – 高速公路的三条车道老一派的软件开发团队成员会包含业务分析员,系统架构师,前端开发者,后端开发者,测试员,等等。优化如敏捷和精益原则等的软件开发流程的关注点就在这些地方。比如,软件一旦达到”可以生产“的程度,就会发到系统工程师、发布工程师、DBA、网络工程师,安全专家这些“运维人员”的手上。这里该如何将横在Dev(开发)和Ops(运维)之间的鸿沟给填平,这就是DevOps的主要关注点了。DevOps是在整个IT价值流中实施精益原则的结果。IT价值流将开发延伸至生产,将由程序员这个遥远的祖宗所繁衍的所有子孙给联合在一起。这是来自Gene Kim的对DevOps的最好的解析。你不应该重新招聘DevOps工程师,且DevOps也不应该是一个IT的新部门。DevOps是一种文化,一种理念,且是和IT糅合成一整体的。世间没有任何工具可以把你的IT变成一个DevOps组织,也没有任何自动化方式可以指引你该如何为你的客户提供最大化的效益。DevOps通常作为下面这三个方式而为人所熟知,而在我眼里我是把它们看成是一条高速公路上的三条车道。你从第一条车道开始,然后加速进入到第二条车道,最终在第三车道上高速行驶。车道1 – 系统级别的整体效率考量是最主要的关注点,这超过对系统中任何一个单独个体元素的考虑车道2 – 确保能提供持续不断的反馈循环,且这些反馈不被忽视。车道3 – 持续的学习和吸取经验,不停的进步,快速的失败。车道1 – 获取速度要采纳DevOps的原则,理解整个运作系统的重要性并对工作事项进行合适的优先级排序是组织首先要学的事情。在整个价值流中不能允许任何人产生瓶颈并降低整个工作流程。确保工作流程的不可中断是身处流程中的所有成员的终极目标。无论一个成员或者团队的角色是什么,他们都必须力图对整个系统进行深入的理解。这种思维方式对质量会有着直接的影响,因为缺陷永远不会被下放到“下游“中,这样做的话将会导致瓶颈的产生。确保整个工作流程不会被瓶颈堵塞住还不够。一个高产的组织应该时常考虑该如何提升整个工作流程。有很多方法论可以做到这一点,你不妨去看下“约束理论”,“六西格玛”,精益,或者丰田生产系统。DevOps原则不关心你身处哪个团队,你是否是系统架构师,DBA,QA,或者是网络管理员。相同的规则覆盖所有的成员,每个成员都应该遵循两个简单的原则:保持系统运作流程不可中断随时提升和优化工作流程车道2 – 换挡加速不可中断的系统流程是定向的,且预期是从开发流向运维。在一个理想的世界中,这就意味着快速的开发出高质量的软件,部署,并为客户提供价值。但是,DevOps并非乌托邦式的理想国。如果单向的交付方式是可行的话,我们的瀑布模式早就能胜任了。评估可交付产品和整个流程中的交流对确保质量是至关重要的。这里首个必须实现的”面向上游”的交流通道是从Ops到Dev。我们独自意淫是件非常容易的事情,但是获取别人的反馈和提供反馈给别人才是探究事实真相的正确方法。下游的每一步(反馈)都必须紧跟着有一个上游的确定。你如何建立反馈循环机制并不重要。你可以邀请开发人员加入技术支持团队的会议,或者将网络管理员放到Sprint计划会议中去。一旦你的反馈机制就绪,反馈能够被接收并被处理,你就已经可以说是走到了DevOps高速车道上来了。车道3 – 飞速前进DevOps这条快速车道并不适合意志脆弱的人。为了进入这条车道,你的组织必须要足够的成熟。这里充满了冒险和对失败教训的学习,不断的尝试,并认同屡败屡战和不断的实践是走向成功这条康庄大道的前提条件。在这里你应该会经常听到”套路“这个词,这是有原因的。不断的训练和重复所以能培养出大师,是因为其让复杂的动作常规化。但是在你要将这些复杂的动作连接起来之前,你很有必要先去掌握好每一个单独步骤。“适合大师的动作并不适合新手,脱胎换骨之前你必须先要明白道的真谛。“DevOps的第三个方式/快速车道包括每天分配时间来持续的进行试验,时常的奖励敢于冒险的团队,并将缺陷特意引入到运作系统上来以增加系统的抗击打能力。为了确保你的组织能够消化好这些方法,你必须在每个团队之间建立好频繁的反馈循环,同时需要确保所有的瓶颈都能够及时的被清理掉,并确保整个系统的运作流程是不可中断的。实施好这些措施可以让你的组织时刻保持警惕,并能够快速且高效的应对挑战。DevOps清单下面是一张你可以用来检验你的组织对DevOps的应用情况的清单。开发团队和运维团队之间没有障碍。两者皆是DevOps统一流程的一部分。从一个团队流到另一个团队的工作都能够得到高质量的验证工作没有堆积,所有的瓶颈都已经被处理好。开发团队没有占用运维团队的时间,因为部署和维护都是处于同一个时间盒里面的。开发团队不会在周五下午5点后把代码交付进行部署,剩下运维团队周末加班加点来给他们擦屁股开发环境标准化,运维人员可以很容易將之扩展并进行部署开发团队可以找到合适的方式交付新版本,且运维团队可以轻易的进行部署。每个团队之间的通信线路都很明确所有的团队成员都有时间去为改善系统进行试验和实践常规性的引入(或者模拟)缺陷到系统中来并得到处理。每次学习到的经验都应该文档化下来并分享给相关人员。事故处理成为日常工作的一部分,且处理方式是已知的总结使用现代化的DevOps工具,如Chef、Docker、Ansible、Packer、Troposphere、Consul、Jenkins、SonarQube、AWS等,并不代表你就在正确的应用DevOps的原则。DevOps是一种思维方式。我们所有人都是该系统流程的一部分,我们一起分享共同的时光和交付价值。每个参加到这个软件交付流程上来的成员都能够加速或减缓整个系统的运作速度。系统出现的一个缺陷,以及错误配置的团队之间的“防火墙”,都可能会使得整个系统瘫痪,所有的人都是DevOps的一部分,一旦你的组织明白了这一点,能够帮你管理好这些的工具和技术栈就自然而然的会出现在你眼前了。

March 31, 2019 · 1 min · jiezi

边缘计算时代来了,你准备好了吗?

摘要: 边缘计算能否加速物联网时代到来?边缘计算已成为物联网(IoT)的重要趋势,高德纳咨询公司将边缘计算确定为2019年的最佳技术趋势之一。提供物联网解决方案的公司看到了在更接近产生数据的地方处理数据带来的价值。最近Forrester调查发现,在未来的3年时间里,53%的受访者希望在边缘分析复杂数据集,这也证实了这一趋势。因此一些人甚至做出了“边缘计算将吃掉云计算”的猜测。边缘计算正在引起多方关注,因为它确实可以解决工业物联网案例的一些关键问题。比如说边缘计算允许在更靠近传感器的地方分析和过滤数据,只有少数数据被发送到云端,这一举措可以大幅降低网络带宽成本和云数据存储成本。另外,许多工业物联网使用案例中需要亚秒级(即1GHz/1.2秒)响应时间才能实现安全且精确的操作。例如,如果人类太靠近工业设备,则设备需要立即停止工作。在这种情况下,设备停止工作的决定不能等待物联网云平台的信号反馈。如果将信号处理放到边缘,那么整个反映过程可能会实现亚秒级响应时间。另一种用例是自动驾驶汽车,它也需要亚秒级响应时间。工业物联网案例中的安全和隐私要求也推动了对边缘计算的需求。工厂和关键基础设施正在使用边缘设备来保护关键工业流程和设备免受其他网络连接的影响。同样,这些机器生成的数据通常也会被视为机密,通过边缘计将敏感信息保存在工厂内部。最后,边缘计算还允许自主操作。如果存在网络连接问题,许多工业操作就出现失控的情况。一旦应用边缘计算,无论网络可用性如何,都可以保障设备和工厂继续运行。“抢滩登陆”边缘计算边缘计算引起了技术供应商的关注,一些小型初创公司正在创建专门的边缘计算堆栈。物联网平台供应商拥有连接到物联网硬件的边缘解决方案,甚至开源基金会也看到了边缘计算的潜在巨大机会。不同供应商和开源社区之间的较量仍在动态发展中。一些供应商正在寻求完整的云解决方案,有些供应商已经相互建立起了合作伙伴关系,另一些则与开源社区合作。该领域暂时没有明确的领跑者,但似乎有些人已经取得了比其他人更多的成功。物联网云提供商物联网云提供商边缘计算解决方案致力于为客户提供集成的整体解决方案,包括从边缘平台到云平台整体的设备。它们使客户更容易构建,部署和管理与其云平台连接的物联网设备。对于希望快速推出新连接产品的客户来说,这是一个引人注目的举措。但是,这种集成解决方案的风险在于它会被长期供应商绑定。亚马逊和微软是物联网云提供商的重量级玩家,两者都有与其各自的物联网云平台连接的边缘计算解决方案。Amazon Web Services提供AWS IoT Greengrass,允许连接的设备运行AWS Lambda功能,AWS服务可以运行机器学习,数据同步以及与AWS IoT Core的连接。同样,Microsoft IoT Edge允许连接的设备运行MS Azure服务,微软已经使IoT Edge成为GitHub上的一个开源项目。这似乎可以更容易地将IoT边缘设备移植到其他硬件平台,但它似乎又与Azure IoT Hub云平台紧密相关。谷歌已经发布了Cloud IoT Edge,它似乎专注于提供边缘的AI功能,但Cloud IoT Edge仍处于alpha状态。谷歌还宣布与著名的边缘计算供应商Foghorn建立合作伙伴关系。物联网平台许多物联网平台供应商也在创建自己边缘计算产品。Litmus Automation,Clearblade,Bosch IoT Suite,Software AG Cumulocity等公司提供与其物联网平台相连的边缘计算解决方案。这些公司的重点是能够实现在边缘硬件上运行数据分析和机器学习模型。其中一些供应商还与物联网硬件供应商建立了合作伙伴关系。例如,Software AG与戴尔和Eurotech合作,在戴尔和Eurotech硬件上提供其边缘软件解决方案。针对该优势的集成硬件和软件解决方案将使这些公司更容易向客户推广联合解决方案。边缘计算供应商有许多风险投资支持的初创公司专注于提供边缘计算解决方案。Foghorn和Swim等公司专注于提供机器学习和分析,Zededa和Edgeworx等其他公司正在将边缘设备引入虚拟化技术和容器技术。所有这些公司都在与主要的物联网平台和物联网云提供商建立合作伙伴关系,将他们的边缘计算解决方案连接到不同的物联网平台。物联网硬件供应商物联网网关供应商正在投资在其硬件上运行的软件堆栈。这些软件堆栈正变得越来越复杂,以满足边缘计算用例的需求。有趣的是,许多硬件供应商正在构建基于开源项目的软件解决方案。戴尔和Rigado拥有运行Ubuntu Core的物联网网关,允许远程管理和部署在其网关设备上运行的软件,戴尔还是边缘计算EdgeX开源项目的领导者。Eurotech提供基于Eclipse Kura的Everywhere Software Framework,用于构建边缘计算应用程序。台湾大型网关制造商ADLINK开发了Vortex Edge和Vortex DDS,以便更轻松地在其网关上部署软件,其中Vortex DDS是基于Eclipse Cyclone DDS的项目。开源社区开源基金会也正在积极参与边缘计算这场革命。由于开源基金会的中立性,所以它可以为公司和个人提供更好的交流平台,促进多发协作,一起研究创新边缘计算技术。对于担心被供应商控制的公司,特别是AWS和Microsoft这种纯商业行为,新兴的边缘计算开源社区提供了一个有趣的替代方案。在大多数情况下,物联网云提供商,物联网平台供应商和Edge初创公司都没有参与构建边缘技术的协作开源社区。仅仅有很少数一部分人创建了自己的开源项目,大多数人还是继续专注于提供特定于供应商的商业解决方案。商业解决方案通常是基于开源技术构建的,但公司并未积极参与。然而,这些供应商的这些行为并没有削弱开源基金会启动边缘计算协作开源项目的势头。Linux基金会最近宣布组建LF Edge社区。LF Edge包括5个不同的开源项目,包括EdgeX和Zededa的虚拟化项目Project EVE。社区已经有60家成员公司,其中包括Arm、AT&T、戴尔、爱立信、IBM、英特尔、三星等,他们同意就构建边缘计算的通用框架进行合作。Eclipse Foundation是物联网领域最成熟的开源社区之一。Eclipse IoT创建于6年前,拥有30多个开源项目,其中也包括许多用于边缘计算的项目。Eclipse Kura是Eclipse的边缘计算项目,其中也包含了Eclipse ioFog和Eclipse fogO5,它们创造了新的边缘计算技术。Eclipse还承载了边缘计算所需的流行行业标准的实现,例如MQTT,OPC-UA,DDS,CoAP和LWM2M。OpenStack Foundation也逐渐扩展到了边缘计算领域。2018年10月,StarlingX项目是基于Wind River的代码贡献启动,它由不同开源项目集成而成的项目,其中集成了包括CentOS,OvS-DPDK,Ceph,Kubernetes和OpenStack等,目的是在边缘设备上运行云服务。总结边缘计算将成为任何物联网解决方案中必不可少的组成部分。客户受益于边缘计算解决方案的创新和多样性。在单一供应商提供完整优势与云基础架构的易用性与将解决方案集成在一起的成本以及长期避免供应商锁定之间存在权衡。随着时间的推移,客户通常需要针对分布式技术(如边缘计算)的异构计算解决方案。如果历史重演,那么这一次业界将通过定义边缘计算与云通信的通用标准和协议来解决这个问题。与Web技术一样,这些标准和协议可能由不依赖于任何供应商的开源和标准社区实施。本文作者:【方向】阅读原文本文为云栖社区原创内容,未经允许不得转载。

March 28, 2019 · 1 min · jiezi

物联网高并发编程之P2P技术NAT快速理解

物联网高并发编程之P2P技术NAT快速理解更多物联网高并发编程知识请移步:https://www.yuque.com/shizhiy…前言P2P技术在现实的应用场景中,主要用于诸如IM(尤其移动端IM)、在线直播、在线教育等(这些应用里的实时音视频功能通常都会涉及到P2P),了解P2P的原理对于开发相关的应用来说还是很有必要的。基础知识简单介绍一下 详细了解请翻阅他的上下篇文章什么是NAT?NAT(Network Address Translation,网络地址转换),也叫做网络掩蔽或者IP掩蔽。NAT是一种网络地址翻译技术,主要是将内部的私有IP地址(private IP)转换成可以在公网使用的公网IP(public IP)。为什么会有NAT?时光回到上个世纪80年代,当时的人们在设计网络地址的时候,觉得再怎么样也不会有超过32bits位长即2的32次幂台终端设备连入互联网,再加上增加ip的长度(即使是从4字节增到6字节)对当时设备的计算、存储、传输成本也是相当巨大的。后来逐渐发现IP地址不够用了,然后就NAT就诞生了!(虽然ipv6也是解决办法,但始终普及不开来,而且未来到底ipv6够不够用仍是未知)。因此,NAT技术能够兴起的原因还是因为在我们国家公网IP地址太少了,不够用,所以才会采取这种地址转换的策略。可见,NAT的本质就是让一群机器公用同一个IP,这样就暂时解决了IP短缺的问题。NAT有什么优缺点?优势其实上面已经刚刚讨论过了,根据定义,比较容易看出,NAT可以同时让多个计算机同时联网,并隐藏其内网IP,因此也增加了内网的网络安全性;此外,NAT对来自外部的数据查看其NAT映射记录,对没有相应记录的数据包进行拒绝,提高了网络安全性。那么,NAT与此同时也带来一些弊端:首先是,NAT设备会对数据包进行编辑修改,这样就降低了发送数据的效率;此外,各种协议的应用各有不同,有的协议是无法通过NAT的(不能通过NAT的协议还是蛮多的),这就需要通过穿透技术来解决。我们后面会重点讨论穿透技术。简单的背景了解过后,下面介绍下NAT实现的主要方式,以及NAT都有哪些类型。NAT的实现方式静态NAT也就是静态地址转换。是指一个公网IP对应一个私有IP,是一对一的转换,同时注意,这里只进行了IP转换,而没有进行端口的转换NAPT端口多路复用技术。与静态NAT的差别是,NAPT不但要转换IP地址,还要进行传输层的端口转换。具体的表现形式就是,对外只有一个公网IP,通过端口来区别不同私有IP主机的数据NAT的主要类型对于NAPT我们主要分为两大类:锥型NAT和对称型NAT。其中锥型NAT又分:完全锥型,受限锥型和端口受限锥型。概括的说:对称型NAT是一个请求对应一个端口;锥型NAT(非对称NAT)是多个请求(外部发向内部)对应一个端口,只要源IP端口不变,无论发往的目的IP是否相同,在NAT上都映射为同一个端口,形象的看起来就像锥子一样。下面分别介绍这四种类型及其差异:完全锥型NAT(Full Cone NAT,后面简称FC)特点:IP和端口都不受限。表现形式:将来自内部同一个IP地址同一个端口号(IP_IN_A : PORT_IN_A)的主机监听/请求,映射到公网IP某个端口(IP_OUT_B : PORT_OUT_B)的监听。任意外部IP地址与端口对其自己公网的IP这个映射后的端口访问(IP_OUT_B : PORT_OUT_B),都将重新定位到内部这个主机(IP_IN_A : PORT_IN_A)。该技术中,基于C/S架构的应用可以在任何一端发起连接。是不是很绕啊。再简单一点的说,就是,只要客户端,由内到外建立一个映射(NatIP:NatPort -> A:P1)之后,其他IP的主机B或端口A:P2都可以使用这个洞给客户端发送数据。受限锥型NAT(Restricted Cone NAT)特点:IP受限,端口不受限。表现形式:与完全锥形NAT不同的是,在公网映射端口后,并不允许所有IP进行对于该端口的访问,要想通信必需内部主机对某个外部IP主机发起过连接,然后这个外部IP主机就可以与该内部主机通信了,但端口不做限制。举个栗子。当客户端由内到外建立映射(NatIP:NatPort –> A:P1),A机器可以使用他的其他端口(P2)主动连接客户端,但B机器则不被允许。因为IP受限啦,但是端口随便。见下图(绿色是允许通信,红色是禁止通信)端口受限型NAT(Port Restricted Cone NAT)特点:IP和端口都受限。表现形式:该技术与受限锥形NAT相比更为严格。除具有受限锥形NAT特性,对于回复主机的端口也有要求。也就是说:只有当内部主机曾经发送过报文给外部主机(假设其IP地址为A且端口为P1)之后,外部主机才能以公网IP:PORT中的信息作为目标地址和目标端口,向内部主机发送UDP报文,同时,其请求报文的IP必须是A,端口必须为P1(使用IP地址为A,端口为P2,或者IP地址为B,端口为P1都将通信失败)。例子见下图。这一要求进一步强化了对外部报文请求来源的限制,从而较Restrictd Cone更具安全性对称型NAT(Symmetric NAT)特点:对每个外部主机或端口的会话都会映射为不同的端口(洞)。表现形式:只有来自同一内部IP:PORT、且针对同一目标IP:PORT的请求才被NAT转换至同一个公网(外部)IP:PORT,否则的话,NAT将为之分配一个新的外部(公网)IP:PORT。并且,只有曾经收到过内部主机请求的外部主机才能向内部主机发送数据包。内部主机用同一IP与同一端口与外部多IP通信。客户端想和服务器A(IP_A:PORT_A)建立连接,是通过NAT映射为NatIP:NatPortA来进行的。而客户端和服务器B(IP_B:PORT_B)建立连接,是通过NAT映射为NatIP:NatPortB来进行的。即同一个客户端和不同的目标IP:PORT通信,经过NAT映射后的公网IP:PORT是不同的。此时,如果B想要和客户端通信,也只能通过NatIP:NatPortB(也就是紫色的洞洞)来进行,而不能通过NatIP:NatPortA(也就是黄色的洞洞)小结可以看出从类型1至类型4,NAT的限制是越来越大的。NAT路由类型判断根据上面的介绍,我们可以了解到,在实际的网络情况中,各个设备所处的网络环境是不同的。那么,如果这些设备想要进行通信,首先判断出设备所处的网络类型就是非常重要的一步。举个例子来说:对于IM中的实时音视频功能和VoIP软件,对位于不同NAT内部的主机通信需要靠服务器来转发完成,这样就会增加服务器的负担。为了解决这种问题,要尽量使位于不同NAT内部的主机建立直接通信,其中,最重要的一点就是要判断出NAT的类型,然后才能根据NAT的类型,设计出直接通信方案。不然的话,两个都在NAT的终端怎么通信呢?我们不知道对方的内网IP,即使把消息发到对方的网关,然后呢?网关怎么知道这条消息给谁,而且谁允许网关这么做了?为了解决这个问题,也就是处于内网的主机之间能够穿越它们之间的NAT建立直接通信,已经提出了许多方法,STUN(Session Traversal Utilities for NAT,NAT会话穿越应用程序)技术就是其中比较重要的一种解决方法,并得到了广泛的应用。在这个部分,我们将重点介绍下STUN技术的原理。PS:除此之外,还有UPNP技术,ALG应用层网关识别技术,SBC会话边界控制,ICE交互式连接建立,TURN中继NAT穿越技术等等,本文不一一做介绍。STUN协议介绍STUN基本介绍STUN是一种网络协议,它允许位于NAT(或多重NAT)后的客户端找出自己的公网地址,查出自己位于哪种类型的NAT之后以及NAT为某一个本地端口所绑定的Internet端端口。这些信息被用来在两个同时处于NAT路由器之后的主机之间建立UDP通信。该协议由RFC 5389定义。STUN由三部分组成:STUN客户端;STUN服务器端;NAT路由器。STUN服务端部署在一台有着两个公网IP的服务器上,大概的结构参考下图。STUN客户端通过向服务器端发送不同的消息类型,根据服务器端不同的响应来做出相应的判断,一旦客户端得知了Internet端的UDP端口,通信就可以开始了STUN的检测过程STUN协议定义了三类测试过程来检测NAT类型:Test1:STUN Client通过端口{IP-C1:Port-C1}向STUN Server{IP-S1:Port-S1}发送一个Binding Request(没有设置任何属性)。STUN Server收到该请求后,通过端口{IP-S1:Port-S1}把它所看到的STUN Client的IP和端口{IP-M1,Port-M1}作为Binding Response的内容回送给STUN Client。Test1#2:STUN Client通过端口{IP-C1:Port-C1}向STUN Server{IP-S2:Port-S2}发送一个Binding Request(没有设置任何属性)。STUN Server收到该请求后,通过端口{IP-S2:Port-S2}把它所看到的STUN Client的IP和端口{IP-M1#2,Port-M1#2}作为Binding Response的内容回送给STUN Client。Test2:STUN Client通过端口{IP-C1:Port-C1}向STUN Server{IP-S1:Port-S1}发送一个Binding Request(设置了Change IP和Change Port属性)。STUN Server收到该请求后,通过端口{IP-S2:Port-S2}把它所看到的STUN Client的IP和端口{IP-M2,Port-M2}作为Binding Response的内容回送给STUN Client。Test3:STUN Client通过端口{IP-C1:Port-C1}向STUN Server{IP-S1:Port-S1}发送一个Binding Request(设置了Change Port属性)。STUN Server收到该请求后,通过端口{IP-S1:Port-S2}把它所看到的STUN Client的IP和端口{IP-M3,Port-M3}作为Binding Response的内容回送给STUN Client。STUN协议的输出是:1)公网IP和Port;2)防火墙是否设置;3)客户端是否在NAT之后,及所处的NAT的类型。因此我们进而整理出,通过STUN协议,我们可以检测的类型一共有以下七种:A:公开的互联网IP:主机拥有公网IP,并且没有防火墙,可自由与外部通信;B:完全锥形NAT;C:受限制锥形NAT;D:端口受限制形NAT;E:对称型UDP防火墙:主机出口处没有NAT设备,但有防火墙,且防火墙规则如下:从主机UDP端口A发出的数据包保持源地址,但只有从之前该主机发出包的目的IP/PORT发出到该主机端口A的包才能通过防火墙;F:对称型NAT;G:防火墙限制UDP通信。STUN协议的判断过程输入和输出准备好后,附上一张维基百科的流程图,就可以描述STUN协议的判断过程了。STEP1:检测客户端是否有能力进行UDP通信以及客户端是否位于NAT后 – Test1客户端建立UDP socket,然后用这个socket向服务器的(IP-1,Port-1)发送数据包要求服务器返回客户端的IP和Port,客户端发送请求后立即开始接受数据包。重复几次。如果每次都超时收不到服务器的响应,则说明客户端无法进行UDP通信,可能是:G防火墙阻止UDP通信;如果能收到回应,则把服务器返回的客户端的(IP:PORT)同(Local IP: Local Port)比较: - 如果完全相同则客户端不在NAT后,这样的客户端是:A具有公网IP可以直接监听UDP端口接收数据进行通信或者E。 - 否则客户端在NAT后要做进一步的NAT类型检测(继续)。STEP2:检测客户端防火墙类型 – Test2STUN客户端向STUN服务器发送请求,要求服务器从其他IP和PORT向客户端回复包:收不到服务器从其他IP地址的回复,认为包前被前置防火墙阻断,网络类型为E;收到则认为客户端处在一个开放的网络上,网络类型为A。STEP3:检测客户端NAT是否是FULL CONE NAT – Test2客户端建立UDP socket然后用这个socket向服务器的(IP-1,Port-1)发送数据包要求服务器用另一对(IP-2,Port-2)响应客户端的请求往回发一个数据包,客户端发送请求后立即开始接受数据包。 重复这个过程若干次。如果每次都超时,无法接受到服务器的回应,则说明客户端的NAT不是一个Full Cone NAT,具体类型有待下一步检测(继续);如果能够接受到服务器从(IP-2,Port-2)返回的应答UDP包,则说明客户端是一个Full Cone NAT,这样的客户端能够进行UDP-P2P通信。STEP4:检测客户端NAT是否是SYMMETRIC NAT – Test1#2客户端建立UDP socket然后用这个socket向服务器的(IP-1,Port-1)发送数据包要求服务器返回客户端的IP和Port, 客户端发送请求后立即开始接受数据包。 重复这个过程直到收到回应(一定能够收到,因为第一步保证了这个客户端可以进行UDP通信)。用同样的方法用一个socket向服务器的(IP-2,Port-2)发送数据包要求服务器返回客户端的IP和Port。比较上面两个过程从服务器返回的客户端(IP,Port),如果两个过程返回的(IP,Port)有一对不同则说明客户端为Symmetric NAT,这样的客户端无法进行UDP-P2P通信(检测停止)因为对称型NAT,每次连接端口都不一样,所以无法知道对称NAT的客户端,下一次会用什么端口。否则是Restricted Cone NAT,是否为Port Restricted Cone NAT有待检测(继续)。STEP5:检测客户端NAT是Restricted Cone 还是 Port Restricted Cone – Test3客户端建立UDP socket然后用这个socket向服务器的(IP-1,Port-1)发送数据包要求服务器用IP-1和一个不同于Port-1的端口发送一个UDP 数据包响应客户端, 客户端发送请求后立即开始接受数据包。重复这个过程若干次。如果每次都超时,无法接受到服务器的回应,则说明客户端是一个Port Restricted Cone NAT,如果能够收到服务器的响应则说明客户端是一个Restricted Cone NAT。以上两种NAT都可以进行UDP-P2P通信。通过以上过程,至此,就可以分析和判断出客户端是否处于NAT之后,以及NAT的类型及其公网IP,以及判断客户端是否具备P2P通信的能力了。 ...

March 17, 2019 · 1 min · jiezi

物联网高并发编程之P2P技术NAT穿越方案

物联网高并发编程之P2P技术NAT穿越方案更多物联网高并发编程知识请移步:https://www.yuque.com/shizhiy…内容概述P2P即点对点通信,或称为对等联网,与传统的服务器客户端模式(如下图“P2P结构模型”所示)有着明显的区别,在即时通讯方案中应用广泛(比如IM应用中的实时音视频通信、实时文件传输甚至文字聊天等)。P2P可以是一种通信模式、一种逻辑网络模型、一种技术、甚至一种理念。在P2P网络中(如右图所示),所有通信节点的地位都是对等的,每个节点都扮演着客户机和服务器双重角色,节点之间通过直接通信实现文件信息、处理器运算能力、存储空间等资源的共享。P2P网络具有分散性、可扩展性、健壮性等特点,这使得P2P技术在信息共享、即时通讯、协同工作、分布式计算、网络存储等领域都有广阔的应用。1经典的CS模式: P2P结构模型:NAT技术和P2P技术作为经典的两项网络技术,在现在的网络上有着广泛的应用,P2P主机位于NAT网关后面的情况屡见不鲜。NAT技术虽然在一定程度上解决了IPv4地址短缺的问题,在构建防火墙、保证网络安全方面都发挥了一定的作用,却破坏了端到端的网络通信。NAT阻碍主机进行P2P通信的主要原因是NAT不允许外网主机主动访问内网主机,但是P2P技术却要求通信双方都能主动发起访问,所以要在NAT网络环境中进行有效的P2P通信,就必须采用新的解决方案。P2P作为一项实用的技术,有很大的优化空间,并且相对于网络设备,基于P2P的应用程序在实现上更为灵活。所以为了兼容NAT,基于P2P的应用程序在开发的时候大多会根据自身特点加入一些穿越NAT的功能以解决上述问题。以下着重介绍几种常见的P2P穿越NAT方案。**反向链接技术一种特殊的P2P场景(通信双方中只有一方位于NAT设备之后)此种情况是所有P2P场景中最简单的,它使用一种被称为“反向链接技术”来解决这个问题。大致的原理如下所述。如图所示,客户端A位于NAT之后,它通过TCP端口1234连接到服务器的TCP端口1235上,NAT设备为这个连接重新分配了TCP端口62000。客户端B也通过TCP端口1234连接到服务器端口1235上。A和B从服务器处获知的对方的外网地址二元组{IP地址:端口号}分别为{138.76.29.7:1234}和{155.99.25.11:62000},它们在各自的本地端口上进行侦听。由于B 拥有外网IP地址,所以A要发起与B的通信,可以直接通过TCP连接到B。但如果B尝试通过TCP连接到A进行P2P通信,则会失败,原因是A位于NAT设备后,虽然B发出的TCP SYN请求能够到达NAT设备的端口62000,但NAT设备会拒绝这个连接请求。要想与Client A通信, B不是直接向A发起连接,而是通过服务器给A转发一个连接请求,反过来请求A连接到B(即进行反向链接),A在收到从服务器转发过来的请求以后,会主动向B发起一个TCP的连接请求,这样在NAT设备上就会建立起关于这个连接的相关表项,使A和B之间能够正常通信,从而建立起它们之间的TCP连接。基于UDP协议的P2P打洞技术原理概述UDP打洞技术是通过中间服务器的协助在各自的NAT网关上建立相关的表项,使P2P连接的双方发送的报文能够直接穿透对方的NAT网关,从而实现P2P客户端互连。如果两台位于NAT设备后面的P2P客户端希望在自己的NAT网关上打个洞,那么他们需要一个协助者——集中服务器,并且还需要一种用于打洞的Session建立机制。什么是集中服务器?集中服务器本质上是一台被设置在公网上的服务器,建立P2P的双方都可以直接访问到这台服务器。位于NAT网关后面的客户端A和B都可以与一台已知的集中服务器建立连接,并通过这台集中服务器了解对方的信息并中转各自的信息。同时集中服务器的另一个重要作用在于判断某个客户端是否在NAT网关之后。具体的方法是:一个客户端在集中服务器上登陆的时候,服务器记录下该客户端的两对地址二元组信息{IP地址:UDP端口},一对是该客户端与集中服务器进行通信的自身的IP地址和端口号,另一对是集中服务器记录下的由服务器“观察”到的该客户端实际与自己通信所使用的IP地址和端口号。我们可以把前一对地址二元组看作是客户端的内网IP地址和端口号,把后一对地址二元组看作是客户端的内网IP地址和端口号经过NAT转换后的外网IP地址和端口号。集中服务器可以从客户端的登陆消息中得到该客户端的内网相关信息,还可以通过登陆消息的IP头和UDP头得到该客户端的外网相关信息。如果该客户端不是位于NAT设备后面,那么采用上述方法得到的两对地址二元组信息是完全相同的。P2P的Session建立原理:假定客户端A要发起对客户端B的直接连接,具体的“打洞”过程如下:1)A最初不知道如何向客户端B发起连接,于是A向集中服务器发送消息,请求集中服务器帮助建立与客户端B的UDP连接。2)集中服务器将含有B的外网和内网的地址二元组发给A,同时,集中服务器将包含有A的外网和内网的地址二元组信息的消息也发给B。这样一来, A与B就都知道对方外网和内网的地址二元组信息了。3)当A收到由集中服务器发来的包含B的外网和内网的地址二元组信息后, A开始向B的地址二元组发送UDP数据包,并且A会自动锁定第一个给出响应的B的地址二元组。同理,当B收到由集中服务器发来的A的外网和内网地址二元组信息后,也会开始向A的外网和内网的地址二元组发送UDP数据包,并且自动锁定第一个得到A回应的地址二元组。由于A与B互相向对方发送UDP数据包的操作是异步的,所以A和B发送数据包的时间先后并没有时序要求。下面来看下这三者之间是如何进行UDP打洞的。在这我们分三种具体情景来讨论:第一种是最简单的一种情景,两个客户端都位于同一个NAT设备后面,即位于同一内网中;第二种是最普遍的一种情景,两个客户端分别位于不同的NAT设备后面,分属不同的内网;第三种是客户端位于两层NAT设备之后,通常最上层的NAT是由网络提供商提供的,第二层NAT是家用的NAT路由器之类的设备提供的。典型P2P情景1: 两客户端位于同一NAT设备后面这是最简单的一种情况(如图4所示):客户端A和B分别与集中服务器建立UDP连接,经过NAT转换后,A的公网端口被映射为62000,B的公网端口映射为62005。位于同一个NAT设备后的UDP打洞过程: 当A向集中服务器发出消息请求与B进行连接,集中服务器将B的外网地址二元组以及内网地址二元组发给A,同时把A的外网以及内网的地址二元组信息发给B。A和B发往对方公网地址二元组信息的UDP数据包不一定会被对方收到,这取决于当前的NAT设备是否支持不同端口之间的UDP数据包能否到达(即Hairpin转换特性),无论如何A与B发往对方内网的地址二元组信息的UDP数据包是一定可以到达的,内网数据包不需要路由,且速度更快。A与B推荐采用内网的地址二元组信息进行常规的P2P通信。假定NAT设备支持Hairpin转换,P2P双方也应忽略与内网地址二元组的连接,如果A 和B采用外网的地址二元组做为P2P通信的连接,这势必会造成数据包无谓地经过NAT设备,这是一种对资源的浪费。就目前的网络情况而言,应用程序在“打洞”的时候,最好还是把外网和内网的地址二元组都尝试一下。如果都能成功,优先以内网地址进行连接。什么是Hairpin技术?Hairpin技术又被称为Hairpin NAT、Loopback NAT或Hairpin Translation。Hairpin技术需要NAT网关支持,它能够让两台位于同一台NAT网关后面的主机,通过对方的公网地址和端口相互访问,NAT网关会根据一系列规则,将对内部主机发往其NAT公网IP地址的报文进行转换,并从私网接口发送给目标主机。目前有很多NAT设备不支持该技术,这种情况下,NAT网关在一些特定场合下将会阻断P2P穿越NAT的行为,打洞的尝试是无法成功的。好在现在已经有越来越多的NAT设备商开始加入到对该转换的支持中来。典型P2P情景2: 两客户端位于不同的NAT设备后面这是最普遍的一种情况(如图5所示):客户端A与B经由各自的NAT设备与集中服务器建立UDP连接, A与B的本地端口号均为4321,集中服务器的公网端口号为1234。在向外的会话中, A的外网IP被映射为155.99.25.11,外网端口为62000;B的外网IP被映射为138.76.29.7,外网端口为31000。如下所示:**客户端A——>本地IP:10.0.0.1,本地端口:4321,外网IP:155.99.25.11,外网端口:62000客户端B——>本地IP:10.1.1.3,本地端口:4321,外网IP:138.76.29.7,外网端口:31000位于不同NAT设备后的UDP打洞过程:在A向服务器发送的登陆消息中,包含有A的内网地址二元组信息,即10.0.0.1:4321;服务器会记录下A的内网地址二元组信息,同时会把自己观察到的A的外网地址二元组信息记录下来。同理,服务器也会记录下B的内网地址二元组信息和由服务器观察到的客户端B的外网地址二元组信息。无论A与B二者中的任何一方向服务器发送P2P连接请求,服务器都会将其记录下来的上述的外网和内网地址二元组发送给A或B。A和B分属不同的内网,它们的内网地址在外网中是没有路由的,所以发往各自内网地址的UDP数据包会发送到错误的主机或者根本不存在的主机上。当A的第一个消息发往B的外网地址(如图3所示),该消息途经A的NAT设备,并在该设备上生成一个会话表项,该会话的源地址二元组信息是{10.0.0.1:4321},和A与服务器建立连接的时候NAT生成的源地址二元组信息一样,但它的目的地址是B的外网地址。在A的NAT设备支持保留A的内网地址二元组信息的情况下,所有来自A的源地址二元组信息为{10.0.0.1:4321}的数据包都沿用A与集中服务器事先建立起来的会话,这些数据包的外网地址二元组信息均被映射为{155.99.25.11:62000}。A向B的外网地址发送消息的过程就是“打洞”的过程,从A的内网的角度来看应为从{10.0.0.1:4321}发往{138.76.29.7:31000},从A在其NAT设备上建立的会话来看,是从{155.99.25.11:62000}发到{138.76.29.7:31000}。如果A发给B的外网地址二元组的消息包在B向A发送消息包之前到达B的NAT设备,B的NAT设备会认为A发过来的消息是未经授权的外网消息,并丢弃该数据包。B发往A的消息包也会在B的NAT设备上建立一个{10.1.1.3:4321,155.99.25.11:62000}的会话(通常也会沿用B与集中服务器连接时建立的会话,只是该会话现在不仅接受由服务器发给B的消息,还可以接受从A的NAT设备{155.99.25.11:6200}发来的消息)。一旦A与B都向对方的NAT设备在外网上的地址二元组发送了数据包,就打开了A与B之间的“洞”,A与B向对方的外网地址发送数据,等效为向对方的客户端直接发送UDP数据包了。一旦应用程序确认已经可以通过往对方的外网地址发送数据包的方式让数据包到达NAT后面的目的应用程序,程序会自动停止继续发送用于“打洞”的数据包,转而开始真正的P2P数据传输。 典型P2P情景3: 两客户端位于两层(或多层)NAT设备之后此种情景最典型的部署情况就像这样:最上层的NAT设备通常是由网络提供商(ISP)提供,下层NAT设备是家用路由器。如图所示:假定NAT C是由ISP提供的NAT设备,NAT C提供将多个用户节点映射到有限的几个公网IP的服务,NAT A和NAT B作为NAT C的内网节点将把用户的内部网络接入NAT C的内网,用户的内部网络就可以经由NAT C访问公网了。从这种拓扑结构上来看,只有服务器与NAT C是真正拥有公网可路由IP地址的设备,而NAT A和NAT B所使用的公网IP地址,实际上是由ISP服务提供商设定的(相对于NAT C而言)内网地址(我们将这种由ISP提供的内网地址称之为“伪”公网地址)。同理,隶属于NAT A与NAT B的客户端,它们处于NAT A,NAT B的内网,以此类推,客户端可以放到到多层NAT设备后面。客户端A和客户端B发起对服务器S的连接的时候,就会依次在NAT A和NAT B上建立向外的Session,而NAT A、NAT B要联入公网的时候,会在NAT C上再建立向外的Session。现在假定客户端A和B希望通过UDP“打洞”完成两个客户端的P2P直连。最优化的路由策略是客户端A向客户端B的“伪公网”IP上发送数据包,即ISP服务提供商指定的内网IP,NAT B的“伪”公网地址二元组,{10.0.1.2:55000}。由于从服务器的角度只能观察到真正的公网地址,也就是NAT A,NAT B在NAT C建立session的真正的公网地址{155.99.25.11:62000}以及{155.99.25.11:62005},非常不幸的是客户端A与客户端B是无法通过服务器知道这些“伪”公网的地址,而且即使客户端A和B通过某种手段可以得到NAT A和NAT B的“伪”公网地址,我们仍然不建议采用上述的“最优化”的打洞方式,这是因为这些地址是由ISP服务提供商提供的或许会存在与客户端本身所在的内网地址重复的可能性(例如:NAT A的内网的IP地址域恰好与NAT A在NAT C的“伪”公网IP地址域重复,这样就会导致打洞数据包无法发出的问题)。因此客户端别无选择,只能使用由公网服务器观察到的A,B的公网地址二元组进行“打洞”操作,用于“打洞”的数据包将由NAT C进行转发。当客户端A向客户端B的公网地址二元组{155.99.25.11:62005}发送UDP数据包的时候,NAT A首先把数据包的源地址二元组由A的内网地址二元组{10.0.0.1:4321}转换为“伪”公网地址二元组{10.0.1.1:45000},现在数据包到了NAT C,NAT C应该可以识别出来该数据包是要发往自身转换过的公网地址二元组,如果NAT C可以给出“合理”响应的话,NAT C将把该数据包的源地址二元组改为{155.99.25.11:62000},目的地址二元组改为{10.0.1.2:55000},即NAT B的“伪”公网地址二元组,NAT B最后会将收到的数据包发往客户端B。同样,由B发往A的数据包也会经过类似的过程。目前也有很多NAT设备不支持类似这样的“Hairpin转换”,但是已经有越来越多的NAT设备商开始加入对该转换的支持中来。一个需要考虑的现实问题:UDP在空闲状态下的超时当然,从应用的角度上来说,在完成打洞过程的同时,还有一些技术问题需要解决,如UDP在空闲状态下的超时问题。由于UDP转换协议提供的“洞”不是绝对可靠的,多数NAT设备内部都有一个UDP转换的空闲状态计时器,如果在一段时间内没有UDP数据通信,NAT设备会关掉由“打洞”过程打出来的“洞”。如果P2P应用程序希望“洞”的存活时间不受NAT网关的限制,就最好在穿越NAT以后设定一个穿越的有效期。对于有效期目前没有标准值,它与NAT设备内部的配置有关,某些设备上最短的只有20秒左右。在这个有效期内,即使没有P2P数据包需要传输,应用程序为了维持该“洞”可以正常工作,也必须向对方发送“打洞”心跳包。这个心跳包是需要双方应用程序都发送的,只有一方发送不会维持另一方的Session正常工作。除了频繁发送“打洞”心跳包以外,还有一个方法就是在当前的“洞”超时之前,P2P客户端双方重新“打洞”,丢弃原有的“洞”,这也不失为一个有效的方法。基于TCP协议的P2P打洞技术详细建立穿越NAT设备的P2P的TCP连接只比UDP复杂一点点,TCP协议的”“打洞”从协议层来看是与UDP的“打洞”过程非常相似的。尽管如此,基于TCP协议的打洞至今为止还没有被很好的理解,这也造成了的对其提供支持的NAT设备不是很多。在NAT设备支持的前提下,基于TCP的“打洞”技术实际上与基于UDP的“打洞”技术一样快捷、可靠。实际上,只要NAT设备支持的话,基于TCP的P2P技术的健壮性将比基于UDP技术的更强一些,因为TCP协议的状态机给出了一种标准的方法来精确的获取某个TCP session的生命期,而UDP协议则无法做到这一点。**套接字和TCP端口的重用实现基于TCP协议的P2P打洞过程中,最主要的问题不是来自于TCP协议,而是来自于应用程序的API接口。这是由于标准的伯克利(Berkeley)套接字的API是围绕着构建客户端/服务器程序而设计的,API允许TCP流套接字通过调用connect()函数来建立向外的连接,或者通过listen()和accept函数接受来自外部的连接,但是,API不提供类似UDP那样的,同一个端口既可以向外连接,又能够接受来自外部的连接。而且更糟的是,TCP的套接字通常仅允许建立1对1的响应,即应用程序在将一个套接字绑定到本地的一个端口以后,任何试图将第二个套接字绑定到该端口的操作都会失败。为了让TCP“打洞”能够顺利工作,我们需要使用一个本地的TCP端口来监听来自外部的TCP连接,同时建立多个向外的TCP连接。幸运的是,所有的主流操作系统都能够支持特殊的TCP套接字参数,通常叫做“SO_REUSEADDR”,该参数允许应用程序将多个套接字绑定到本地的一个地址二元组(只要所有要绑定的套接字都设置了SO_REUSEADDR参数即可)。BSD系统引入了SO_REUSEPORT参数,该参数用于区分端口重用还是地址重用,在这样的系统里面,上述所有的参数必须都设置才行。打开P2P的TCP流假定客户端A希望建立与B的TCP连接。我们像通常一样假定A和B已经与公网上的已知服务器建立了TCP连接。服务器记录下来每个接入的客户端的公网和内网的地址二元组,如同为UDP服务的时候一样。从协议层来看,TCP“打洞”与UDP“打洞”是几乎完全相同的过程:客户端A使用其与服务器的连接向服务器发送请求,要求服务器协助其连接客户端B;服务器将B的公网和内网的TCP地址的二元组信息返回给A,同时,服务器将A的公网和内网的地址二元组也发送给B;客户端A和B使用连接服务器的端口异步地发起向对方的公网、内网地址二元组的TCP连接,同时监听各自的本地TCP端口是否有外部的连接联入;A和B开始等待向外的连接是否成功,检查是否有新连接联入。如果向外的连接由于某种网络错误而失败,如:“连接被重置”或者“节点无法访问”,客户端只需要延迟一小段时间(例如延迟一秒钟),然后重新发起连接即可,延迟的时间和重复连接的次数可以由应用程序编写者来确定;TCP连接建立起来以后,客户端之间应该开始鉴权操作,确保目前联入的连接就是所希望的连接。如果鉴权失败,客户端将关闭连接,并且继续等待新的连接联入。客户端通常采用“先入为主”的策略,只接受第一个通过鉴权操作的客户端,然后将进入P2P通信过程不再继续等待是否有新的连接联入。TCP打洞:与UDP不同的是,因为使用UDP协议的每个客户端只需要一个套接字即可完成与服务器的通信,而TCP客户端必须处理多个套接字绑定到同一个本地TCP端口的问题,如图7所示。现在来看实际中常见的一种情景,A与B分别位于不同的NAT设备后面,如图5所示,并且假定图中的端口号是TCP协议的端口号,而不是UDP的端口号。图中向外的连接代表A和B向对方的内网地址二元组发起的连接,这些连接或许会失败或者无法连接到对方。如同使用UDP协议进行“打洞”操作遇到的问题一样,TCP的“打洞”操作也会遇到内网的IP与“伪”公网IP重复造成连接失败或者错误连接之类的问题。客户端向彼此公网地址二元组发起连接的操作,会使得各自的NAT设备打开新的“洞”允许A与B的TCP数据通过。如果NAT设备支持TCP“打洞”操作的话,一个在客户端之间的基于TCP协议的流通道就会自动建立起来。如果A向B发送的第一个SYN包发到了B的NAT设备,而B在此前没有向A发送SYN包,B的NAT设备会丢弃这个包,这会引起A的“连接失败”或“无法连接”问题。而此时,由于A已经向B发送过SYN包,B发往A的SYN包将被看作是由A发往B的包的回应的一部分,所以B发往A的SYN包会顺利地通过A的NAT设备,到达A,从而建立起A与B的P2P连接。从应用程序的角度来看TCP“打洞”从应用程序的角度来看,在进行TCP“打洞”的时候都发生了什么呢?假定A首先向B发出SYN包,该包发往B的公网地址二元组,并且被B的NAT设备丢弃,但是B发往A的公网地址二元组的SYN包则通过A的NAT到达了A,然后,会发生以下的两种结果中的一种,具体是哪一种取决于操作系统对TCP协议的实现:(1)A的TCP实现会发现收到的SYN包就是其发起连接并希望联入的B的SYN包,通俗一点来说就是“说曹操,曹操到”的意思,本来A要去找B,结果B自己找上门来了。A的TCP协议栈因此会把B作为A向B发起连接connect的一部分,并认为连接已经成功。程序A调用的异步connect()函数将成功返回,A的listen()等待从外部联入的函数将没有任何反映。此时,B联入A的操作在A程序的内部被理解为A联入B连接成功,并且A开始使用这个连接与B开始P2P通信。由于收到的SYN包中不包含A需要的ACK数据,因此,A的TCP将用SYN-ACK包回应B的公网地址二元组,并且将使用先前A发向B的SYN包一样的序列号。一旦B的TCP收到由A发来的SYN-ACK包,则把自己的ACK包发给A,然后两端建立起TCP连接。简单的说,第一种,就是即使A发往B的SYN包被B的NAT丢弃了,但是由于B发往A的包到达了A。结果是,A认为自己连接成功了,B也认为自己连接成功了,不管是谁成功了,总之连接是已经建立起来了。(2)另外一种结果是,A的TCP实现没有像(1)中所讲的那么“智能”,它没有发现现在联入的B就是自己希望联入的。就好比在机场接人,明明遇到了自己想要接的人却不认识,误认为是其他的人,安排别人给接走了,后来才知道是自己错过了机会,但是无论如何,人已经接到了任务已经完成了。然后,A通过常规的listen()函数和accept()函数得到与B的连接,而由A发起的向B的公网地址二元组的连接会以失败告终。尽管A向B的连接失败,A仍然得到了B发起的向A的连接,等效于A与B之间已经联通,不管中间过程如何,A与B已经连接起来了,结果是A和B的基于TCP协议的P2P连接已经建立起来了。第一种结果适用于基于BSD的操作系统对于TCP的实现,而第二种结果更加普遍一些,多数Linux和Windows系统都会按照第二种结果来处理。总结在IP地址极度短缺的今天,NAT几乎已经是无所不在的一项技术了,以至于现在任何一项新技术都不得不考虑和NAT的兼容。作为当下应用最广泛的技术之一,P2P技术也必然要面对NAT这个障碍。打洞技术看起来是一项近似乎蛮干的技术,却不失为一种有效的技术手段。在集中服务器的帮助下,P2P的双方利用端口预测的技术在NAT网关上打出通道,从而实现NAT穿越,解决了NAT对于P2P的阻隔,为P2P技术在网络中更广泛的推广作出了非常大的贡献。

March 17, 2019 · 1 min · jiezi

物联网高并发编程之P2P技术NAT详解

物联网高并发编程之P2P技术之NAT技术本时代由于 IPv6 的崛起建议各位看官先滑到文章最后看以下NAT现阶段的状况再决定要不要使用您宝贵的时间观看此片文章IPv4协议和NAT的由来今天,无数快乐的互联网用户在尽情享受Internet带来的乐趣。他们浏览新闻,搜索资料,下载软件,广交新朋,分享信息,甚至于足不出户获取一切日用所需。企业利用互联网发布信息,传递资料和订单,提供技术支持,完成日常办公。然而,Internet在给亿万用户带来便利的同时,自身却面临一个致命的问题:构建这个无所不能的Internet的基础IPv4协议已经不能再提供新的网络地址了。2011年2月3日中国农历新年, IANA对外宣布:IPv4地址空间最后5个地址块已经被分配给下属的5个地区委员会。2011年4月15日,亚太区委员会APNIC对外宣布,除了个别保留地址外,本区域所有的IPv4地址基本耗尽。一时之间,IPv4地址作为一种濒危资源身价陡增,各大网络公司出巨资收购剩余的空闲地址。其实,IPv4地址不足问题已不是新问题,早在20年以前,IPv4地址即将耗尽的问题就已经摆在Internet先驱们面前。这不禁让我们想去了解,是什么技术使这一危机延缓了尽20年。要找到问题的答案,让我们先来简略回顾一下IPv4协议。IPv4即网际网协议第4版——Internet Protocol Version 4的缩写。IPv4定义一个跨越异种网络互连的超级网,它为每个网际网的节点分配全球唯一IP地址。如果我们把Internet比作一个邮政系统,那么IP地址的作用就等同于包含城市、街区、门牌编号在内的完整地址。IPv4使用32bits整数表达一个地址,地址最大范围就是232 约为43亿。以IP创始时期可被联网的设备来看,这样的一个空间已经很大,很难被短时间用完。然而,事实远远超出人们的设想,计算机网络在此后的几十年里迅速壮大,网络终端数量呈爆炸性增长。更为糟糕的是,为了路由和管理方便,43亿的地址空间被按照不同前缀长度划分为A,B,C,D类地址网络和保留地址。其中,A类网络地址127段,每段包括主机地址约1678万个。B类网络地址16384段,每段包括65536个主机地址。IANA向超大型企业/组织分配A类网络地址,一次一段。向中型企业或教育机构分配B类网络地址,一次一段。这样一种分配策略使得IP地址浪费很严重,很多被分配出去的地址没有真实被利用,地址消耗很快。以至于二十世纪90年代初,网络专家们意识到,这样大手大脚下去,IPv4地址很快就要耗光了。于是,人们开始考虑IPv4的替代方案,同时采取一系列的措施来减缓IPv4地址的消耗。正是在这样一个背景之下,本期的主角闪亮登场,它就是网络地址转换——NAT。NAT是一项神奇的技术,说它神奇在于它的出现几乎使IPv4起死回生。在IPv4已经被认为行将结束历史使命之后近20年时间里,人们几乎忘了IPv4的地址空间即将耗尽这样一个事实——在新技术日新月异的时代,20年可算一段漫长的历史。更不用说,在NAT产生以后,网络终端的数量呈加速上升趋势,对IP地址的需求剧烈增加。此足见NAT技术之成功,影响之深远。说它神奇,更因为NAT给IP网络模型带来了深远影响,其身影遍布网络每个角落。根据一份最近的研究报告,70%的P2P用户位于NAT网关以内。因为P2P主要运行在终端用户的个人电脑之上,这个数字意味着大多数PC通过NAT网关连接到Internet。如果加上2G和3G方式联网的智能手机等移动终端,在NAT网关之后的用户远远超过这个比例。然而当我们求本溯源时却发现一个很奇怪的事实:NAT这一意义重大的技术,竟然没有公认的发明者。NAT第一个版本的RFC作者,只是整理归纳了已被广泛采用的技术。NAT的工作模型和特点NAT的概念模型NAT名字很准确,网络地址转换,就是替换IP报文头部的地址信息。NAT通常部署在一个组织的网络出口位置,通过将内部网络IP地址替换为出口的IP地址提供公网可达性和上层协议的连接能力。什么是内部网络IP地址?RFC1918规定了三个保留地址段落:10.0.0.0-10.255.255.255;172.16.0.0-172.31.255.255;192.168.0.0-192.168.255.255。这三个范围分别处于A,B,C类的地址段,不向特定的用户分配,被IANA作为私有地址保留。这些地址可以在任何组织或企业内部使用,和其他Internet地址的区别就是,仅能在内部使用,不能作为全球路由地址。这就是说,出了组织的管理范围这些地址就不再有意义,无论是作为源地址,还是目的地址。对于一个封闭的组织,如果其网络不连接到Internet,就可以使用这些地址而不用向IANA提出申请,而在内部的路由管理和报文传递方式与其他网络没有差异。对于有Internet访问需求而内部又使用私有地址的网络,就要在组织的出口位置部署NAT网关,在报文离开私网进入Internet时,将源IP替换为公网地址,通常是出口设备的接口地址。一个对外的访问请求在到达目标以后,表现为由本组织出口设备发起,因此被请求的服务端可将响应由Internet发回出口网关。出口网关再将目的地址替换为私网的源主机地址,发回内部。这样一次由私网主机向公网服务端的请求和响应就在通信两端均无感知的情况下完成了。依据这种模型,数量庞大的内网主机就不再需要公有IP地址了。NAT转换过程示意图实际过程远比这个复杂,NAT处理报文的几个关键特点:**网络被分为私网和公网两个部分,NAT网关设置在私网到公网的路由出口位置,双向流量必须都要经过NAT网关;网络访问只能先由私网侧发起,公网无法主动访问私网主机; NAT网关在两个访问方向上完成两次地址的转换或翻译,出方向做源信息替换,入方向做目的信息替换; NAT网关的存在对通信双方是保持透明的; NAT网关为了实现双向翻译的功能,需要维护一张关联表,把会话的信息保存下来。随着后面对NAT的深入描述,会发现这些特点是鲜明的,但又不是绝对的。其中第二个特点打破了IP协议架构中所有节点在通讯中的对等地位,这是NAT最大的弊端,为对等通讯带来了诸多问题,当然相应的克服手段也应运而生。事实上,第四点是NAT致力于达到的目标,但在很多情况下,NAT并没有做到,因为除了IP首部,上层通信协议经常在内部携带IP地址信息。这些我们稍后解释。一对一的NAT如果一个内部主机唯一占用一个公网IP,这种方式被称为一对一模型。此种方式下,转换上层协议就是不必要的,因为一个公网IP就能唯一对应一个内部主机。显然,这种方式对节约公网IP没有太大意义,主要是为了实现一些特殊的组网需求。比如用户希望隐藏内部主机的真实IP,或者实现两个IP地址重叠网络的通信。一对多的NATNAT最典型的应用场景就如同图片“NAT转换过程示意图”描述的,一个组织网络,在出口位置部署NAT网关,所有对公网的访问表现为一台主机。这就是所谓的一对多模型。这种方式下,出口设备只占用一个由Internet服务提供商分配的公网IP地址。面对私网内部数量庞大的主机,如果NAT只进行IP地址的简单替换,就会产生一个问题:当有多个内部主机去访问同一个服务器时,从返回的信息不足以区分响应应该转发到哪个内部主机。此时,需要NAT设备根据传输层信息或其他上层协议去区分不同的会话,并且可能要对上层协议的标识进行转换,比如TCP或UDP端口号。这样NAT网关就可以将不同的内部连接访问映射到同一公网IP的不同传输层端口,通过这种方式实现公网IP的复用和解复用。这种方式也被称为端口转换PAT、NAPT或IP伪装,但更多时候直接被称为NAT,因为它是最典型的一种应用模式。按照NAT端口映射方式分类在一对多模型中,按照端口转换的工作方式不同,又可以进行更进一步的划分。为描述方便,以下将IP和端口标记为(nAddr:nPort),其中n代表主机或NAT网关的不同角色。全锥形NAT其特点为:一旦内部主机端口对(iAddr:iPort)被NAT网关映射到(eAddr:ePort),所有后续的(iAddr:iPort)报文都会被转换为(eAddr:ePort);任何一个外部主机发送到(eAddr:ePort)的报文将会被转换后发到(iAddr:iPort)。限制锥形NAT其特点为:一旦内部主机端口对(iAddr:iPort)被映射到(eAddr:ePort),所有后续的(iAddr:iPort)报文都会被转换为(eAddr:ePort);只有 (iAddr:iPort)向特定的外部主机hAddr发送过数据,主机hAddr从任意端口发送到(eAddr:ePort)的报文将会被转发到(iAddr:iPort)。端口限制锥形NAT其特点为:一旦内部主机端口对(iAddr:iPort)被映射到(eAddr:ePort),所有后续的(iAddr:iPort)报文都会被转换为(eAddr:ePort);只有(iAddr:iPort)向特定的外部主机端口对(hAddr:hPort)发送过数据,由 (hAddr:hPort)发送到(eAddr:ePort)的报文将会被转发到(iAddr:iPort)。对称型NAT其特点为:NAT网关会把内部主机“地址端口对”和外部主机“地址端口对”完全相同的报文看作一个连接,在网关上创建一个公网“地址端口对”映射进行转换,只有收到报文的外部主机从对应的端口对发送回应的报文,才能被转换。即使内部主机使用之前用过的地址端口对去连接不同外部主机(或端口)时,NAT网关也会建立新的映射关系。事实上,这些术语的引入是很多混淆的起源。现实中的很多NAT设备是将这些转换方式混合在一起工作的,而不单单使用一种,所以这些术语只适合描述一种工作方式,而不是一个设备。比如,很多NAT设备对内部发出的连接使用对称型NAT方式,而同时支持静态的端口映射,后者可以被看作是全锥型NAT方式。而有些情况下,NAT设备的一个公网地址和端口可以同时映射到内部几个服务器上以实现负载分担,比如一个对外提供WEB服务器的站点可能是有成百上千个服务器在提供HTTP服务,但是对外却表现为一个或少数几个IP地址。NAT的限制与解决方案IP端到端服务模型IP协议的一个重要贡献是把世界变得平等。在理论上,具有IP地址的每个站点在协议层面有相当的获取服务和提供服务的能力,不同的IP地址之间没有差异。人们熟知的服务器和客户机实际是在应用协议层上的角色区分,而在网络层和传输层没有差异。一个具有IP地址的主机既可以是客户机,也可以是服务器,大部分情况下,既是客户机,也是服务器。端到端对等看起来是很平常的事情,而意义并不寻常。但在以往的技术中,很多协议体系下的网络限定了终端的能力。正是IP的这个开放性,使得TCP/IP协议族可以提供丰富的功能,为应用实现提供了广阔平台。因为所有的IP主机都可以服务器的形式出现,所以通讯设计可以更加灵活。使用UNIX/LINUX的系统充分利用了这个特性,使得任何一个主机都可以建立自己的HTTP、SMTP、POP3、DNS、DHCP等服务。与此同时,很多应用也是把客户端和服务器的角色组合起来完成功能。例如在VoIP应用中,用户端向注册服务器登录自己的IP地址和端口信息过程中,主机是客户端;而在呼叫到达时,呼叫处理服务器向用户端发送呼叫请求时,用户端实际工作在服务器模式下。在语音媒体流信道建立过程后,通讯双向发送语音数据,发送端是客户模式,接收端是服务器模式。而在P2P的应用中,一个用户的主机既为下载的客户,同时也向其他客户提供数据,是一种C/S混合的模型。上层应用之所以能这样设计,是因为IP协议栈定义了这样的能力。试想一下,如果IP提供的能力不对等,那么每个通信会话都只能是单方向发起的,这会极大限制通信的能力。细心的读者会发现,前面介绍NAT的一个特性正是这样一种限制。没错,NAT最大的弊端正在于此——破坏了IP端到端通信的能力。NAT的弊端NAT在解决IPv4地址短缺问题上,并非没有副作用,其实存在很多问题。首先,NAT使IP会话的保持时效变短。因为一个会话建立后会在NAT设备上建立一个关联表,在会话静默的这段时间,NAT网关会进行老化操作。这是任何一个NAT网关必须做的事情,因为IP和端口资源有限,通信的需求无限,所以必须在会话结束后回收资源。通常TCP会话通过协商的方式主动关闭连接,NAT网关可以跟踪这些报文,但总是存在例外的情况,要依赖自己的定时器去回收资源。而基于UDP的通信协议很难确定何时通信结束,所以NAT网关主要依赖超时机制回收外部端口。通过定时器老化回收会带来一个问题,如果应用需要维持连接的时间大于NAT网关的设置,通信就会意外中断。因为网关回收相关转换表资源以后,新的数据到达时就找不到相关的转换信息,必须建立新的连接。当这个新数据是由公网侧向私网侧发送时,就会发生无法触发新连接建立,也不能通知到私网侧的主机去重建连接的情况。这时候通信就会中断,不能自动恢复。即使新数据是从私网侧发向公网侧,因为重建的会话表往往使用不同于之前的公网IP和端口地址,公网侧主机也无法对应到之前的通信上,导致用户可感知的连接中断。NAT网关要把回收空闲连接的时间设置到不发生持续的资源流失,又维持大部分连接不被意外中断,是一件比较有难度的事情。在NAT已经普及化的时代,很多应用协议的设计者已经考虑到了这种情况,所以一般会设置一个连接保活的机制,即在一段时间没有数据需要发送时,主动发送一个NAT能感知到而又没有实际数据的保活消息,这么做的主要目的就是重置NAT的会话定时器。其次,NAT在实现上将多个内部主机发出的连接复用到一个IP上,这就使依赖IP进行主机跟踪的机制都失效了。如网络管理中需要的基于网络流量分析的应用无法跟踪到终端用户与流量的具体行为的关系。基于用户行为的日志分析也变得困难,因为一个IP被很多用户共享,如果存在恶意的用户行为,很难定位到发起连接的那个主机。即便有一些机制提供了在NAT网关上进行连接跟踪的方法,但是把这种变换关系接续起来也困难重重。基于IP的用户授权不再可靠,因为拥有一个IP的不等于一个用户或主机。一个服务器也不能简单把同一IP的访问视作同一主机发起的,不能进行关联。有些服务器设置有连接限制,同一时刻只接纳来自一个IP的有限访问(有时是仅一个访问),这会造成不同用户之间的服务抢占和排队。有时服务器端这样做是出于DOS攻击防护的考虑,因为一个用户正常情况下不应该建立大量的连接请求,过度使用服务资源被理解为攻击行为。但是这在NAT存在时不能简单按照连接数判断。总之,因为NAT隐蔽了通信的一端,把简单的事情复杂化了。我们来深入理解NAT一下对IP端到端模型的破坏力。NAT通过修改IP首部的信息变换通信的地址。但是在这个转换过程中只能基于一个会话单位。当一个应用需要保持多个双向连接时,麻烦就很大。NAT不能理解多个会话之间的关联性,无法保证转换符合应用需要的规则。当NAT网关拥有多个公有IP地址时,一组关联会话可能被分配到不同的公网地址,这通常是服务器端无法接受的。更为严重的是,当公网侧的主机要主动向私网侧发送数据时,NAT网关没有转换这个连接需要的关联表,这个数据包无法到达私网侧的主机。这些反方向发送数据的连接总有应用协议的约定或在初始建立的会话中进行过协商。但是因为NAT工作在网络层和传输层,无法理解应用层协议的行为,对这些信息是无知的。NAT希望自己对通信双方是透明的,但是在这些情况下这是一种奢望。此外,NAT工作机制依赖于修改IP包头的信息,这会妨碍一些安全协议的工作。因为NAT篡改了IP地址、传输层端口号和校验和,这会导致认证协议彻底不能工作,因为认证目的就是要保证这些信息在传输过程中没有变化。对于一些隧道协议,NAT的存在也导致了额外的问题,因为隧道协议通常用外层地址标识隧道实体,穿过NAT的隧道会有IP复用关系,在另一端需要小心处理。ICMP是一种网络控制协议,它的工作原理也是在两个主机之间传递差错和控制消息,因为IP的对应关系被重新映射,ICMP也要进行复用和解复用处理,很多情况下因为ICMP报文载荷无法提供足够的信息,解复用会失败。IP分片机制是在信息源端或网络路径上,需要发送的IP报文尺寸大于路径实际能承载最大尺寸时,IP协议层会将一个报文分成多个片断发送,然后在接收端重组这些片断恢复原始报文。IP这样的分片机制会导致传输层的信息只包括在第一个分片中,NAT难以识别后续分片与关联表的对应关系,因此需要特殊处理。NAT穿越技术前面解释了NAT的弊端,为了解决IP端到端应用在NAT环境下遇到的问题,网络协议的设计者们创造了各种武器来进行应对。但遗憾的是,这里每一种方法都不完美,还需要在内部主机、应用程序或者NAT网关上增加额外的处理。应用层网关应用层网关(ALG)是解决NAT对应用层协议无感知的一个最常用方法,已经被NAT设备厂商广泛采用,成为NAT设备的一个必需功能。因为NAT不感知应用协议,所以有必要额外为每个应用协议定制协议分析功能,这样NAT网关就能理解并支持特定的协议。ALG与NAT形成互动关系,在一个NAT网关检测到新的连接请求时,需要判断是否为已知的应用类型,这通常是基于连接的传输层端口信息来识别的。在识别为已知应用时,再调用相应功能对报文的深层内容进行检查,当发现任何形式表达的IP地址和端口时,将会把这些信息同步转换,并且为这个新连接创建一个附加的转换表项。这样,当报文到达公网侧的目的主机时,应用层协议中携带的信息就是NAT网关提供的地址和端口。一旦公网侧主机开始发送数据或建立连接到此端口,NAT网关就可以根据关联表信息进行转换,再把数据转发到私网侧的主机。很多应用层协议实现不限于一个初始连接(通常为信令或控制通道)加一个数据连接,可能是一个初始连接对应很多后续的新连接。比较特别的协议,在一次协商中会产生一组相关连接,比如RTP/RTCP协议规定,一个RTP通道建立后占用连续的两个端口,一个服务于数据,另一个服务于控制消息。此时,就需要ALG分配连续的端口为应用服务。ALG能成功解决大部分协议的NAT穿越需求,但是这个方法也有很大的限制。因为应用协议的数量非常多而且在不断发展变化之中,添加到设备中的ALG功能都是为特定协议的特定规范版本而开发的,协议的创新和演进要求NAT设备制造商必须跟踪这些协议的最近标准,同时兼容旧标准。尽管有如Linux这种开放平台允许动态加载新的ALG特性,但是管理成本仍然很高,网络维护人员也不能随时了解用户都需要什么应用。因此为每个应用协议开发ALG代码并跟踪最新标准是不可行的,ALG只能解决用户最常用的需求。此外,出于安全性需要,有些应用类型报文从源端发出就已经加密,这种报文在网络中间无法进行分析,所以ALG无能为力。探针技术STUN和TURN所谓探针技术,是通过在所有参与通信的实体上安装探测插件,以检测网络中是否存在NAT网关,并对不同NAT模型实施不同穿越方法的一种技术。STUN服务器被部署在公网上,用于接收来自通信实体的探测请求,服务器会记录收到请求的报文地址和端口,并填写到回送的响应报文中。客户端根据接收到的响应消息中记录的地址和端口与本地选择的地址和端口进行比较,就能识别出是否存在NAT网关。如果存在NAT网关,客户端会使用之前的地址和端口向服务器的另外一个IP发起请求,重复前面的探测。然后再比较两次响应返回的结果判断出NAT工作的模式。由前述的一对多转换模型得知,除对称型NAT以外的模型,NAT网关对内部主机地址端口的映射都是相对固定的,所以比较容易实现NAT穿越。而对称型NAT为每个连接提供一个映射,使得转换后的公网地址和端口对不可预测。此时TURN可以与STUN绑定提供穿越NAT的服务,即在公网服务器上提供一个“地址端口对”,所有此“地址端口对”接收到的数据会经由探测建立的连接转发到内网主机上。TURN分配的这个映射“地址端口对”会通过STUN响应发给内部主机,后者将此信息放入建立连接的信令中通知通信的对端。这种探针技术是一种通用方法,不用在NAT设备上为每种应用协议开发功能,相对于ALG方式有一定普遍性。但是TURN中继服务会成为通信瓶颈。而且在客户端中增加探针功能要求每个应用都要增加代码才能支持。中间件技术这也是一种通过开发通用方法解决NAT穿越问题的努力。与前者不同之处是,NAT网关是这一解决方案的参与者。与ALG的不同在于,客户端会参与网关公网映射信息的维护,此时NAT网关只要理解客户端的请求并按照要求去分配转换表,不需要自己去分析客户端的应用层数据。其中UPnP就是这样一种方法。UPnP中文全称为通用即插即用,是一个通用的网络终端与网关的通信协议,具备信息发布和管理控制的能力。其中,网关映射请求可以为客户动态添加映射表项。此时,NAT不再需要理解应用层携带的信息,只转换IP地址和端口信息。而客户端通过控制消息或信令发到公网侧的信息中,直接携带公网映射的IP地址和端口,接收端可以按照此信息建立数据连接。NAT网关在收到数据或连接请求时,按照UPnP建立的表项只转换地址和端口信息,不关心内容,再将数据转发到内网。这种方案需要网关、内部主机和应用程序都支持UPnP技术,且组网允许内部主机和NAT网关之间可以直接交换UPnP信令才能实施。中继代理技术准确说它不是NAT穿越技术,而是NAT旁路技术。简单说,就是在NAT网关所在的位置旁边放置一个应用服务器,这个服务器在内部网络和外部公网分别有自己的网络连接。客户端特定的应用产生网络请求时,将定向发送到应用代理服务器。应用代理服务器根据代理协议解析客户端的请求,再从服务器的公网侧发起一个新的请求,把客户端请求的内容中继到外部网络上,返回的相应反方向中继。这项技术和ALG有很大的相似性,它要求为每个应用类型部署中继代理业务,中间服务器要理解这些请求。特定协议的自穿越技术在所有方法中最复杂也最可靠的就是自己解决自己的问题。比如IKE和IPsec技术,在设计时就考虑了到如何穿越NAT的问题。因为这个协议是一个自加密的协议并且具有报文防修改的鉴别能力,其他通用方法爱莫能助。因为实际应用的NAT网关基本都是NAPT方式,所有通过传输层协议承载的报文可以顺利通过NAT。IKE和IPsec采用的方案就是用UDP在报文外面再加一层封装,而内部的报文就不再受到影响。IKE中还专门增加了NAT网关是否存在的检查能力以及绕开NAT网关检测IKE协议的方法。NAT的应用和实现NAT的应用NAT在当代Internet中被广泛采用,小至家庭网关,大到企业广域网出口甚至运营商业务网络出口。其实NAT在用户身边随处可见,一般家庭宽带接入的ADSL Modem和SOHO路由器都内置了NAT功能,WindowsXP支持网络连接共享,一个用户连接到公网可能会经过多层NAT而对此一无所知。很多企业也为节约IP费用采用NAT接入Internet,但是相比家庭用户有更复杂的需求。NAT多实例应用在VPN网络中,多实例路由意味着一个物理拓扑上承载多个逻辑拓扑,网络终端被分配到相互隔离的逻辑拓扑中,彼此之间没有路由的通路。但在访问Internet或者一些关键服务器资源时,被隔离的网络之间又存在共享资源的需求。NAT的多实例实现就是跨越这种逻辑拓扑的方法,把一个空间的网络地址映射到另一个空间。NAT的高可靠性组网提高网络可靠性是一个广泛的需求,NAT作为私网到公网的关键路径自然也需要高可靠性。当一个设备提供多个公网接口时,在多接口上部署NAT可以提供更高带宽和多ISP就近访问的能力。但是,当部署多个出口时,访问的流量可能会从不匹配的接口返回,这就要求NAT方案有良好的路由规划和部署合适的策略保证这种流量能够正确处理。在多个物理设备承担NAT功能时,不同设备之间的信息备份和流量分担也是一个组网难题。同时转换源和目的地址的应用前面我们介绍的所有NAT应用中,由内网向外网访问过程中,都是将源地址进行转换而目的地址保持不变,报文反方向进入时则处理目的地址。但有一些特殊应用需要在由内向外的IP通路上,替换目的IP地址。通常,这种应用会同时替换源地址和目的地址,在经过NAT网关以后完成两次地址转换。当两个均规划使用私属IP地址范围的网络进行合并时,终端用户都不想调整自己的IP地址方案,又希望开放一些网络资源给彼此访问。这时就可以通过NAT的两次地址转换来解决路由和地址规划无法解决的问题。NAT的设备实现NAT作为一个IP层业务特性,在产品实现中与防火墙、会话管理等特性有紧密联系,这是因为NAT判断一个进入设备的报文是否需要NAT处理,判断报文是否为一个新的连接,都需要通过匹配访问控制列表规则和查询会话关联表进行判断。为了满足不同应用场景的NAT需求, NAT的管理界面可提供用户多种配置策略。按照NAT的具体工作方式,又可以做如下分类。静态一对一地址映射这种工作方式下,NAT把一个私网地址和一个公网地址做静态关联,在从内而外的方向,将源IP匹配的私网IP替换为公网IP,反方向则将目的IP匹配公网IP的报文替换为私网IP。网络层以上的部分不进行替换处理,只修正校验和。静态多对多地址映射这种方式与上一种类似,只是把一段私网地址映射到一段公网地址。工作机制与前述的方式没有差别,只是简化配置工作量。动态端口映射这是最基本的工作方式,即前面多次介绍的将一段内网地址动态翻译为一个或多个公网IP,同时对传输层端口或其他上层协议信息进行转换,以实现IP复用。对由内而外的报文,替换源地址和端口,反向报文替换目的地址和端口。仅以连接公网的接口IP作为NAT转换的公网地址时,这种配置最简化,又被称为EasyIP。当以一段公网IP地址作为NAT转换地址时,需要配置一个地址池,NAT会自动在地址池中选择使用公网IP。动态地址映射(no-pat)这是介于静态多对多地址映射和动态端口映射方式之间的一种工作机制。当有一个私网向公网侧访问到达NAT网关时,NAT网关会检查这个私网IP是否已经有关联的公网IP映射。如果已经存在,则按照转换表直接替换IP,不修改上层协议。如果不存在关联表项,则在空闲的公网IP池中占用一个IP,并写入关联表中,以后按照这个关联关系进行地址转换。当这个私网主机发起的所有对外访问均关闭或超时后,回收公网IP。这种方式可以理解为一组内网主机抢占式地共享一个公网IP地址池。当公网IP地址池用完以后,新连接将无法建立。静态端口映射通过静态配置,把一个固定的私网IP地址和端口关联到一个公网地址和端口上。这种方式等同于前面介绍过的全锥模式,但是不需要内网主机首先发出报文。这种方式适用于在NAT网关上把一个知名服务(如HTTP)映射到一个内部主机上,也称为port forwarding。应用层网关(ALG)在所有NAT产品实现中,ALG是一个必需的功能组件。但在不同实现中,有些产品可以动态加载不同的ALG模块,有些产品可以提供ALG开关控制,有些则不提供任何用户接口。ALG解析上层应用协议的内容,并且根据需要修改IP和端口相关信息,创建和维护附加的关联表项。NAT转换关联表无论哪一种NAT工作方式,都要用到地址转换关联表,在不同产品的实现中,这个关联表的存储结构和在IP转发中调用的方式有很大不同。关联表中会记录源IP、目的IP、连接协议类型、传输层源端口、目的端口,以及转换后的源IP、源端口,目的IP、目的端口信息,这里的源和目的都是对应于从内网到外网的访问方向。依据NAT具体工作方式,这些信息可能全部填充,也可能部分填充。例如只按照IP做静态映射的方式,就不需要填入任何端口相关信息;对于静态端口映射,则只填入源相关的内容,而目的端的信息为空。后IPv4时代的NATNAT是为延缓IPv4地址耗尽而推出的技术。毫无疑问,它已经出色完成了自己的历史使命,IPv4比预期走得更远。作为继任者的IPv6吸取了IPv4的教训,被赋予充足地址空间的同时在各个方面做了优化——安全、高效、简洁。但是IPv6无法平滑地取代IPv4,导致IP升级步伐缓慢。尽管网络协议的分层设计很清晰,大量应用层协议和互联网软件中仍内嵌了IPv4地址的处理,要Internet全网升级到IPv6,必须先完成应用的改造。因为NAT和它的穿越技术结合能够满足大部分用户的需求,所以IPv6时代被不断推迟。随着IPv4地址的濒临耗尽,再经济的模式也无以为继,IPv4必须退出历史舞台。人们自然会认为,NAT作为IPv4的超级补丁技术使命已经完结。实际情况是,IPv4向IPv6过渡的阶段,NAT仍然是一项必不可少的技术手段。因为Internet无法在一日之内完成全网升级,必然是局部升级,逐渐替换。在两套协议并存的时期,用户和服务资源分布在不同网络之间,跨网访问的需求必须得到满足。这正是NAT所擅长的领域,地址替换,因此NAT-PT应运而生。由于IPv4和IPv6之间的差异,NAT要做的事比以往更复杂,有更多的限制和细节。此外,IETF也在制定纯IPv6网络使用的NAT规范。虽然人们还看不到这种应用的强烈需求,但是NAT仍有其独特的作用,比如隐藏内部网络的地址,实现重叠地址网络的合并等。毫不夸张地说,正是有了NAT,以IPv4为基础的Internet才能容纳数十亿的用户终端,成就今日之辉煌。IPv4已至日暮西山,IPv6的黎明尚未来临,Internet比任何时刻都更依赖NAT这项过渡技术。NAT的历史再次证明,翻天覆地的划时代进步不一定有市场,抱残守缺的修修补补未必不会成功。在世代更替之时让我们走近NAT,领略IP领域更多细微但不高深的知识,理解NAT就是理解变换万千的应用世界。

March 17, 2019 · 1 min · jiezi

车联网大数据:你的驾驶轨迹云知道

车联网大数据:你的驾驶轨迹云知道背景:中国道路交通事故死亡人数高居世界第二位,保障安全行车、降低交通事故伤害任重道远。靠单点监控和人力统筹是不可能完成的任务,因此智能交通系统是解决交通问题的根本。其中车联网是智能交通系统的重要组成部分。车与你很近,车联网,让你离安全更近一键导航、远程诊断车况、汽车追盗、自驾旅行导游、车辆监控、实时路况车联网现发展到什么阶段?华为云有什么车联网解决方案?方案如何有效保障路况安全?来看! 华为云微认证重磅课程—车联网大数据驾驶行为分析 (edu.huaweicloud.com/certifications/ )

March 14, 2019 · 1 min · jiezi

GPSR:贪婪转发与周边转发

博客原文地址:https://godbmw.com/passages/2019-03-02-gpsr/博客主题推荐:Theme Art Design,“笔记记录+搭建知识体系”的利器。这是之前学习《无线传感网络》这门课做的期末大作业,GPSR是"greedy perimeter stateless routing"的缩写。这是一种无状态的路由转发协议,巧妙地借助“贪婪转发”和“周边转发”有效地降低了每个物理节点的存储信息量,非常具有实用意义。除此之外,它还能快速地应对现实中外界条件、节点能耗等多种因素造成的频繁变化的节点分布。因此,特别重温一下,作为一次分享。0. 摘要随着路由节点的增加以及拓扑结构变化率的增大,传统的路由转发协议算法效率低、鲁棒性差。贪婪周界无状态路由协议(GPSR)只使用拓扑结构中的临近信息节点进行“贪婪转发”决策。当数据包进入“路由空洞”的时候,算法会先构造GG平面图或者RNG平面图,然后采用“周边转发”绕过此区域。此过程中,算法会自动切换“贪婪转发”和“周边转发”这两种模式。在频繁变化或者节点数量多的拓扑结构中,并且每个节点存储的信息量少,GPSR可以较低的成本快速地响应变化,查询正确的路由路径。关键词:GPSR, 贪婪转发, 周边转发, 路由空洞, 平面图1. 研究背景及意义1.1 研究背景与动机当下的一些路由具有节点多、拓扑结构变化快的特点,例如:Ad-hoc网络(无基础设施,支持军事用户、灾后救援人员以及临时协作)、传感器网络(由小型传感器组成,节点资源匮乏)、“屋顶”网络(非移动,但是密集遍布大都市区域,节点数量数十万)。传统的路由算法的节点成本和消息成本过高,造成在高移动性和密集节点拓扑结构中的的低适应性。因此,需要一种新的节点成本低、鲁棒性高的路由算法。1.2 研究意义论文提出的GPSR算法合理利用地理信息来实现高稳健性。在网络节点数量不断增加的情况下提高稳健性和迁移率,降低路由协议消息发送成本,各个路由节点消息传递成功率以及使得每个节点存储最少的信息量。2. 国内外研究现状论文中提出的DV和LS算法,要求将整个网络拓扑结构的映射到所有的路由节点。在DV算法的描述中,每个路由节点都记录了最新周期中到所有网络目的地的距离;在LS算法的描述中,每个路由节点都会接受到链路改变的相关信息状态。当拓扑结构变化率增大,或者路由区域中的路由节点的数量增多,DV算法和LS算法的复杂度就会增加,同时增加的还有每个节点的信息量储备和节点之间沟通成本。虽然“缓存”技术可以减少节点负载,但是当节点数目过多或者拓扑结构变化率过大的时候,现有算法仍然不能保证较高的鲁棒性以及较低的节点开销。3. 研究内容3.1 主要挑战及创新点为了让节点存储最少的信息量,并且能够快速响应拓扑结构的变化。需要使用贪心法的思想,让每一步都是最优解,这个转发过程就是“贪心转发”。但是有些时候无法满足“贪心转发”的条件,此时的情况就是“路由空洞”。解决“路由空洞”的重要技术是“右手法则”,这个转发过程就是“周边转发”。而在周边转发之前需要将图处理成平面图,有GG和RNG两种平面图供选择。在转发过程中,根据节点条件,切换“贪心转发”模式和“周边转发”模式,直到到达最终的目的节点。3.2 相关技术介绍GPSR算法的实现过程中,需要配合“信标算法”来确定邻居节点的位置信息。“信标算法”中,每个节点周期性的以广播方式传送一个信标,信标包括节点自身的位置信息,位置信息被编码成两个4字节的浮点数值,用于标记节点的x坐标和y坐标。数据格式是(IP, (x, y))。为了避免邻居节点发送的信标产生冲突,用B表示信标间的时间间隔,节点发送信标的时间统一分布在[0.5B, 1.5B]之间。设节点保留位置信息的最长时间为T,在超过T时间间隔后仍然没有收到邻居节点发送的信标,就认为邻居节点失效或超出覆盖范围,删除对应的位置信息。借助这些地理信息,GPSR算法的可以避免探测包的盲目洪泛,从而进行有效的路由转发,并且针对节点变动进行有效的路由维护。甚至实现基于无状态的分布式的非端到端的数据转发。3.3 贪婪转发贪婪转发的过程是指:数据包由源节点标记要发送数据包的目标节点或目标区域位置;每一个中间的转发节点都知道它的邻居节点的位置,转发节点在选择数据包的下一跳节点时使用贪婪转发策略,即选择地理位置最接近目标节点的节点作为下一跳节点;以此类推,每一次转发都会更加接近目标节点,直至到达目标节点。贪婪转发的原理就是利用“贪心”思想,让每个节点选择当前的最优选择(在满足条件的情况下),直到算法结束。如下图所示,根据贪婪转发的原则,节点x的下一跳节点就是节点y。毫无疑问,贪婪转发只需要保证节点的一条邻居信息即可。3.3 贪婪转发困境·路由空洞路由空洞是指当前节点比所有其他一跳邻居节点更接近目的节点,此时,根据贪婪转发的规则,当前节点不会转发数据给一跳的邻居节点。如果存在这种网络拓扑结构,那么就称之为“路由空洞”。如下图所示,void区域就是没有满足“贪婪转发”条件的区域。因为节点x的覆盖范围与以直线xD为半径的圆的交叉区域没有邻居节点。3.4 周边转发针对上述的“路由空洞”问题,算法会将模式(Mode)从贪婪转发切换到周边转发,进而绕过“路由空洞”。“周边转发”是根据“右手法则”来判断下一跳转节点:连接当前节点和目的结点形成直线,右手握住此线逆时针旋转,到达的第一条边(边代表其上的两个点可以互达)就是下一跳的方向。3.5 周边转发困境虽然周边转发可以绕过“路由空洞”,但在一些情况下,单纯地进行周边转发可能会陷入死循环,最终只能回到当前节点,无法抵达目的节点。这里举一个例子进行介绍。下图是一个由X、W、U、Z以及目的节点D构成的图,节点之间的连线代表着两端节点是相邻的(可以互相达到)。假设现在从节点X开始出发。从X节点开始,根据“右手法则”依次抵达U节点、Z节点和W节点。此时,对W节点再次使用“右手法则”,算法又重新跳回了U节点。最后,对U节点使用“右手法则”,跳回了开始节点X。显而易见,此时的周边转发陷入困境。这主要是由于这张图不是一个“平面图”的原因。需要删除一些边,从而使其变成GG或者RNG平面图,才能走出此困境。3.6 RNG平面图和GG平面图RNG平面图的定义是:若顶点U,V和任意其它顶点W之间的距离,全都大于或等于顶点u和v之间的距离d(u,v),则在顶点U和V之间存在RNG边(u,v)。用方程式表示如下:如下图所示,若(u,v)是RNG中的边,则在节点U和V之间的阴影半月形区域内,不能包含有任何证明节点w。此时,由于d(u, v) > max(d(u,w), d(w,v)),为了构建RNG平面图,必须把边(u, v) 舍去。关于RNG平面实现的伪代码如下。其中,N是对于任意节点u来说的邻接节点列表,v是集合N中的任一节点。GG平面图的定义是:如果节点u和节点v之间,直径为uv的圆内,不存在其它顶点W,则节点u和节点v存在GG边(u,v)。用方程式表示如下:如下图所示,若(u,v)是GG中的边,则在节点U和V之间的圆形阴影区域,不能包含有任何证明节点w。关于GG平面实现的伪代码如下。其中,N是对于任意节点u来说的邻接节点列表,v是集合N中的任一节点。对于GG和RNG两种平面图,RNG平面图是GG平面图的子集。它们之间的直接关系可以用下图表示出来:3.7 周边转发困境·RNG平面图解决构造上述的RNG平面图或者GG平面图就可以解决“周边转发”无法到达目的节点的困境。这里以构造RNG平面图为例,还是使用之前的图形。为了方便讲述,规定边xu长度为12,边xw长度为11,边uw长度为10。根据RNG的定义,D(U, X) > MAX(D(W, U), D(X, W)),所以移除UX边。此时,“周边转发”不再会陷入困境。4. 性能评估论文为了测试算法的性能,使用了Carnegie Mellon(卡梅隆)大学的测试数据。在畅通平面上,无线仿真模型节点进行运动。节点会在指定区域内随机选择一个目标,然后在指定范围内随机选择一个速度,以此速度到达目标并且停留一段时间。这个过程模拟了拓扑结构的高迁移率以及其中的节点。下图显示了不同的B(时间间隔)的情况下,GPSR传递成功的数据包。将从B=3s降低到B=1.5S并没有带来很大成功率提高,成功率也保持在97%以上。下图比较了DSR算法和GPSR算法的节点消耗,GPSR的节点消耗远远低于DSR的节点消耗,并且随着时间推移,GPSR节点的消耗也更加稳定。因此,GPSR算法达到了设计的初衷:在迁移率高的拓扑结构中,能够保持较高的鲁棒性,并且每个节点的资源消耗都得到了改善。论文中还分节点状态、路径长度等维度进行了比较,也只是说明GPSR算法的优势。主要的性能测试还是上述的传包成功率和节点消耗,其它测试这里不再冗赘。5. 阅读心得在本次论文的学习过程中,掌握了“贪婪转发”、“周边转发”、“RNG和GG平面图”,最重要的是理解了在GPSR算法中是如何调度进行状态转化(贪婪=>周边 / 周边=>贪婪),以及如何解决“路由空洞”和“周边转发困境”。除了算法的核心部分,也触类旁空地了解了“信标算法”的实现机制以及冲突解决方法。就我个人来看,GPSR算法和论文中提及的传统算法相比,已经实现了最小化节点的保存数据(节省节点资源),并且能够利用状态切换合理应对可变性高的拓扑结构。美中不足的是“信标机制”会带来额外的开销,但是相比于每个节点保存所有节点的信息,信标机制的这点开销完全可以忽略。6. 参考在阅读论文的过程中,我查找了大量的中文和英文资料,非常有助于理解这篇论文所讲述的GPSR算法。特此系统记录一下相关资料。论文:GPSR: Greedy Perimeter Stateless Routing for Wireless NetworksYoutube Videos(印度英语)https://www.youtube.com/watch…https://www.youtube.com/watch...https://www.youtube.com/watch…百度文库讲义(从43页开始): https://wenku.baidu.com/view/…博客原文地址:https://godbmw.com/passages/2019-03-02-gpsr/博客主题推荐:Theme Art Design,“笔记记录+搭建知识体系”的利器。

March 5, 2019 · 1 min · jiezi

2019阿里云开年Hi购季云通信分会场全攻略!

2019阿里云云上Hi购季活动已经于2月25日正式开启,从已开放的活动页面来看,活动分为三个阶段: 2月25日-3月04日的活动报名阶段、3月04日-3月16日的新购满返+5折抢购阶段、3月16日-3月31日的续费抽豪礼+5折抢购阶段。做为整个Hi购季非常重要的一个分会场——云通信会场,今日开放售卖!下面,云栖社区小编就为各位开发者分享该会场的攻略:丨云通信会场活动阵地:https://promotion.aliyun.com/ntms/act/product-section-2019/communication.html丨关键词:短信套餐包、0.028元/条、新人礼包、套餐折上折丨该会场必买爆款清单一、国内通用套餐包1.活动对象满足以下条件的阿里云用户:阿里云官网已实名认证的注册会员用户。2.活动时间2019年2月25日-2019年3月31日3.活动规则1)活动期间,用户通过相关具体活动页面,按照活动规则参与活动的可享受相应的代金券满减优惠待遇。2)满减代金券具体优惠内容如下:活动期间,短信套餐包订单金额满1800减100,满17000减1000,满32000减2000,满90000减6000。3)用户参加活动所购买的相关产品及所获得的相应权益,仅限本账号使用,不得转让、出售或以其他方式换取利益。4)活动期间,阿里云新老客户均可领取。同一用户同一面额满减券仅限领取一张。5)满减券仅限在国内通用短信套餐包购买时使用,购买内通用短信套餐包时直接减免。每个订单只能使用一张满减券。6)除特殊情况外,用户参加本活动购买的产品,不支持退订。如因特殊原因发生退订的,退订前需交回通过本活动所享受的相关权益,例如:补足差价、退还已使用的代金券金额、交回奖品等。7)如用户在活动中存在隐瞒、虚构、作弊、欺诈或通过其他非正常手段规避活动规则、获取不当利益的行为,例如:作弊领取、恶意套现、网络攻击、虚假交易等,阿里云有权收回相关权益、取消用户的活动参与资格,撤销违规交易,必要时追究违规用户的法律责任。8)活动名称仅为方便用户理解参考使用,不具有效力,实际活动内容以具体活动规则为准。二、云通信新人礼包①个人版新人礼包,支付9.9元即可获得400条国内短信包。②企业版新人礼包,支付19.9元即可获得700条国内短信+30条国际短信+30分钟语音通知 +30分钟号码隐私保护通话时长+30兆物联网+5000次号码认证。三、物联网无线连接服务以下4款产品享75折优惠,其他物联网产品享9折优惠四、场景套餐折上折(一)社区服务通信场景居民在手机上使用短信验证码服务或号码认证服务成功注册并登录社区服务APP,同时完成下单。社区服务云端系统获取下单信息,然后以语音通知或短信通知方式,将订单发送给提供服务的商家。服务提供商接单后,通过号码隐私保护服务隐藏双方号码,与终端用户互相联系。其他场景可广泛应用于电商、物流外卖、中介服务、用车出行等场景。套餐点此查看:https://promotion.aliyun.com/ntms/act/product-section-2019/communication.html(二)物联网通信场景产品描述物联网流量卡及模组合约是云通信基于物联网行业场景进行的流量卡和模组合约套餐服务,总补贴金额3000万,预购从速。建议使用场景充电桩、智能售货机、GPS行业、多媒体。活动声明模组补贴金额有限,所以属于预订业务,发货周期在3周左右。套餐点此查看:https://promotion.aliyun.com/ntms/act/product-section-2019/communication.html五、狂欢已“种草”,有问题咨询怎么办?面对如此折扣力度,丰富的促销活动,如果有问题建议一定要提前向云小二询问,避开购买高峰期,售前咨询:95187转1。云小二会为大家提供全方位的购买咨询、精准的配置推荐 、灵活的价格方案、1对1的贴心服务。阅读原文本文为云栖社区原创内容,未经允许不得转载。

March 5, 2019 · 1 min · jiezi

阿里云发布时间序列数据库TSDB,关于时序你了解多少?

摘要: 阿里云发布时间序列数据库TSDB,专家帮你解答时序那些事。概要介绍时间序列数据是一种表示物理设备,系统、应用过程或行为随时间变化的数据,广泛应用于物联网,工业物联网,基础运维系统等场景。阿里云TSDB 时间序列数据库可以解决大规模时序数据的可靠写入,降低数据存储成本,实时灵活的完成业务数据聚合分析。什么是时序数据我们来看感受一下平时自己特别熟悉的场景,就会发现时序和每个人都存在非常紧密的关系:电商系统获取每笔订单交易金额和支付金额数据以及商品库存和物流数据;智能电表,会实时记录每个小时的用电量数据,比给出账单数据;高山上的风车的获取实时转速,风速数据,发电量数据。应用服务调用量有没有异常,服务器的负载和资源使用率如何?这些应用程序均依赖一种衡量事物随时间的变化的数据形式,每一个数据源定期发送新的读数,创建一系列随时间推移收集到的测量结果,这就是时序数据,时序数据数据集主要有以下三个特点:新入库数据几乎总是作为新条目被记录数据通常按照产生时间顺序入库所有的数据都自带时间戳,因此,我们这样定义时间序列数据:统一表示系统、过程或行为随时间变化的数据时序数据的价值相较域非时序数据,核心区别在于时序数据能够反映“变化”本身。当你为某个物联网设备收集新数据时,是覆盖以往的读数,还是在新的一行创建全新的读数?尽管这两种方法都能为你提供系统的当前状态,但只有第二种方法才能跟踪系统的所有状态。所以时序数据的价值在于将系统的每个变化都记录为新的一行,从而可以去衡量变化,分析过去的变化,监测现在的变化,以及预测未来将如何变化。时序数据库TSDB 的价值为什么不能用常规数据库来管理时序数据呢,为什么需要时序数据库呢?事实上答案是你可以使用非时间序列数据库,如同你可以为航天飞行器配备一个普通的汽车发动机,虽然也可以飞起来,但是终究不能实现航天飞行的“梦想”。而更多业务场景选择择时序数据库而非通用数据库技术也是类似的原因归结起来就是两个核心点:规模和可用性。(1)规模:时间序列数据累计速度非常快。例如,一辆联网汽车每小时产生几百GB 的数据。关系型数据库处理大数据集的效果非常糟糕;NoSQ数据库可以很好地处理规模数据,但是仍然比不上一个针对时间序列数据微调过的数据库。相比之下,时间序列数据库将时间作为最高优先级来处理,通过提高区间数据实时查询效率来处理这种大规模数据,并带来性能的提升,包括:每秒写入速度,能够支撑的设备指标量,读取数据效率和非常高的存储压缩比。而时间序列数据在技术领域的关注度也日益提升。数据来源:DBengine 2018.9月报告(2)可用性:TSDB通常还包括一些共通的对时间序列数据分析的功能和操作:数据保留策略、连续查询、灵活的时间聚合等。以及很好的扩展性。比如常见的时序降精度和聚合计算,而非时序数据库都不具备这个能力。这就是为什么企业开发人员越来越多地采用时间序列数据库,并将它们用于各种使用场景。使用阿里云TSDB 的理由阿里巴巴业务覆盖面广,诸如 电商交易跟踪, 容器指标监控, 服务监控,物流配送跟踪,智慧园区的智能设备监控等对时序数据库存在强烈的需求,选择阿里云 TSDB 是因为具备如下的优势:高性能TSDB具有高效的吞吐能力,实际压测对比,TSDB 的读取效率比开源的OpenTSDB 和InfluxDB 读取效率要高出一个数量级,实际业务上过用TSDB 来代替传统的基于Hbase的方案,整体机器成本缩减了50%以上。数据存储成本更低 时序数据都是持续写入的,任何一个数据的变化都会记录到时序数据库,所以相比较OLTP类的数据库,对于数据库的容量要求是PB级别。TSDB 可以做到最高10:1的无损压缩效率。大大降低了业务的存储成本。分析能力强 时序最核心的能力在于数据分析能力,TSDB 提供专业全面的时序数据计算函数,支持降采样、数据插值和空间聚合计算,能满足各种复杂的业务数据查询场景。百万级别数据点聚合分析秒级完成。功能完备时序数据库支持丰富的计算能力,如降精度和聚合计算。降精度我们看一个降精度例子, 园区管理员要把园区所有的照明灯的用电量数据采集起来,进行统一的监控分析,达到节能管控的目的。如果管理员要查看最近24小时耗电量的时候,那么可以直接从TSDB里获取原始数据查看用电量趋势。 而管理员要查看最近3年的用电量趋势的时候,管理员可以随机按照“天”,“周”,“月”这些比较粗粒度的时间精度来进行数据计算,所有降精度的数据通过原始小时数据按照时序提供的函数(如平均求和,最大值,最小值等)计算出来,而所有的计算过程由时序数据库“包办”,应用可以直接获取计算结果。聚合计算如果管理员要查看某个具体楼层的用电量的时候,那么只需把楼层信息请求到TSDB,就可以实时获取所需楼层所有灯的用电量。 那么如果管理员查看飞利浦品牌的耗电量的时候,只需传递品牌值到TSDB即可,按照园区名称也可以统计。所以时序聚合提供了强大非常灵活的能力,完全可以随机定义查询聚合的纬度,实时的获取不同分析纬度的查询结果。而不要用户主动创建任何索引信息。时空分析随着车联网以及智能交通和新零售配送相关行业发展,地理位置信息类型的数据存储和分析场景也日渐显现,技术领域称为“时空分析”。车联网的管理人员需要清楚的知道在当天有多少车辆在运营区域内行使,有多少车辆驶出了运营区域,每个车辆的行使轨迹是怎样的,进行全局的车辆管理。政府的管理人员需要清楚当天城区内人员流动的热力分布趋势,以提升城市管理的效率。新零售的配送管理员需要知道配送员是否按照规定在区域内配送,配送员的配送轨迹如何,以便于做管理和配送路径的优化。这些都依赖时空分析能力。TSDB 即将发布时空分析功能,提供地理位置信息类型数据的存储和分析。满足轨迹追踪,空间位置统计分析的业务需求。时序洞察数据可视化是呈现数据分析结果的重要一环,TSDB 提供了基础的可视化功能时序洞察,可以实时的提供给用户交互式的数据分析过程。用户无需开发任何的代码,就可以完成数据查询和分析,同时直观的看到数据的趋势效果。快速体验阿里云TSDBTSDB 新发布的时序洞察,能够通过demo 数据的导入,只需三个步骤,就可以快速体验交互式的时序数据分析能力:第一步,创建TSDB 实例第二步,进行demo数据导入第三步,创建时序洞察, 进行数据分析了解更多时序洞察,万物互联>>立即报名直播>>本文作者:lyrewu阅读原文本文为云栖社区原创内容,未经允许不得转载。

February 26, 2019 · 1 min · jiezi

阿里云MWC 2019发布7款重磅产品,助力全球企业迈向智能化

当地时间2月25日,在巴塞罗那举行的MWC 2019上,阿里云面向全球发布了7款重磅产品,涵盖无服务器计算、高性能存储、全球网络、企业级数据库、大数据计算等主要云产品,可满足电子商务、物流、金融科技以及制造等各行业企业的数字化转型需求,助力全球企业迈向智能化。在大会期间,阿里云还携手德勤、Red Hat以及VMware等合作伙伴展示了从基础设施到企业级应用的智能化解决方案。阿里云在MWC 2019上展示了从基础设施到企业级应用的智能化解决方案据悉,本次发布的产品包含:可实现每秒17亿次计算能力的实时计算引擎Blink,EB级数据存储能力的大数据计算引擎MaxCompute 2.0,集成数据汇聚、数据研发以及数据开放共享的Dataworks,业界首款企业级MariaDB云数据库,面向高性能计算场景的并行文件系统CPFS,可秒级启动的弹性容器ECI,以及为国际企业定制的全球网络连接解决方案,产品均已大规模应用于阿里巴巴集团内部淘宝、天猫、菜鸟等核心业务场景。此外,阿里云还面向全球企业升级了可跨地域做数据分析的Data Lake Analytics,升级后用户使用标准SQL即可分析与集成对象存储(OSS)、数据库(PostgreSQL/MySQL/SQL Server等)、NoSQL(TableStore等)数据源的数据;同时,还升级了SQL Server Always On集群版,具备更高的可用性和灾备能力。阿里云欧洲、中东和非洲(EMEA)区域总经理王业明表示:“随着人工智能时代的到来,智能化是全球企业发展的目标,阿里云此次面向全球发布的产品提供了从基础设施到大数据分析的智能能力,基于这些产品企业可以灵活地应对智能化创新的需求。”举例来说,传统企业和互联网公司都已不再满足于Hadoop等技术的离线批处理能力,阿里云的实时计算Blink提供了实时大规模数据计算的能力,可以有效解决企业的问题,也是实时分析决策、在线机器学习、实时金融风控、IoT边缘计算、人工智能等领域的核心技术。上月底,Blink已经对外开源。全球范围内,阿里云服务了飞利浦、福特、施耐德、洲际酒店集团、Tokopedia(印度尼西亚电商)以及新加坡邮政等行业领先企业。阿里云ET城市大脑还与马来西亚吉隆坡等城市展开合作,帮助治理当地交通。拥有全球最丰富的云计算产品家族,阿里云可以提供涵盖弹性计算、存储、网络、数据库、人工智能、物联网、中间件、云安全等多个领域的技术产品。据阿里巴巴2019财年第三季度财报,仅这一季度,阿里云就推出了678种产品和功能,集中在数据智能、AI应用和企业解决方案相关方面,不断满足企业智能化需求。目前阿里云已在全球19个地域建立56个可用区,拥有1500多个CDN节点,为全球数十亿用户提供计算、存储以及智能服务。在Gartner最新公布的全球公共云市场份额报告中,阿里云继续拉大与IBM、Google云服务之间的差距,与亚马逊AWS和微软Azure位列前三。本文作者:阿里云头条阅读原文本文为云栖社区原创内容,未经允许不得转载。

February 26, 2019 · 1 min · jiezi

关于obd围栏报警的实现思考

围栏报警作为obd较为重要的一个功能实质上是依靠软件技术来实现的一个功能。什么是围栏根据地图服务提供能的路书功能,我们能将车辆行驶的坐标在地图上形成轨迹标示出来,如果车主将车停靠在某一个位置,而对这个位置的环境不放心的时候,车主可以在地图上将车所在的区域设置一个围栏,并设置如果车辆离开围栏则将警报信息发送给车主,这就是围栏报警。有哪些围栏以及使用场景一般情况下两种围栏即可满足大部分常规需求。一是规则围栏,以某一个位置画一个圆圈。这种围栏一般用来设定车辆的安全位置,当车发生移动并走出围栏则触发报警。二是多边形围栏,多边形围栏既可以满足规则一的使用场景也可以较为复杂的需求。如车辆行径路线的管理,在地图上将某一段路使用围栏围起来,划定车辆的行驶范围,当车辆超出行驶范围时触发警报。围栏的实现规则一围栏的实现较为简单,知道圆的半径后,根据车辆上报的坐标计算距离中心点的距离和半径做对比即可知道是否进入或开出围栏。规则二的实现涉及到较为复杂的算法,即为:判断一个点是否在一个多边形区域内。较为可靠的算法是投影法,以原始点为起点,沿着Y轴向上下两个防线分别话一条垂直线,判断这条线与多边形围栏的边相交点的个数。如果为偶数个则表示在多边形外,如果为奇数个则表示在多边形内。如上图中,目标点1坐标点在内部,以起始点画一条垂直线,即Y轴。在Y轴的上下两方和围栏在A,B点各有一处相交,则可以判断是在多边形内。目标点2,3分别和多边形围栏的各个边相交的情况为:目标点2,Y上0个,Y下两个目标点3:Y上0个,Y下0个所以目标点2和目标点3都在多边形围栏外。在实现的过程中要注意一点非常重要的问题,那就是不管是北斗还是GPS还是伽利略上传的坐标点是WGS标准的坐标,在百度地图或者高德地图上应用时需要转为地图相应的坐标才行,否则是失之毫厘谬以千里。在围栏的设置过程中,如果为一辆车在其必经的路线上设置了一个较小区域时,应当考虑到车速情况。obd平均15秒(可以设置上报间隔)上报一次数据,如果在进入围栏前上报了一条数据,等下一条上报时,已经穿过围栏了,这种情况并不会触发报警。

February 22, 2019 · 1 min · jiezi

大话:人工智能、大数据、物联网、云计算

半个多世纪的某个夏天,麦卡锡、明斯基等众科学家们举办了一次Party,共同研究用机器模拟智能的问题,也是在那时,“人工智能(AI)”的理念正式被提出!人工智能(Artificial Intelligence)简称AI,AI能根据大量的历史资料和实时观察(real-time observation)找出对于未来预测性的洞察(predictive insights)。如今人工智能商业化正在快速推进中,比如我们所知道和了解的人像识别、图像识别技术、语音识别、自然语言理解、用户画像等。此类技术也现阶段已经在金融、物联网等行业得到应用!对于未来而言,人工智能会在人类生活的方方面面,发挥越来越多的作用,也会刷更多的存在感,慢慢的更会懂我们很多!不远的将来会有越来越多的自动化的系统出现,比如刷脸支付已经在来的路上了!人工智能、大数据、物联网以及云计算,彼此之间皆存在着千丝万缕的“亲缘”关系!先以人工智能为例,抛弃其他任何,也便不会有今天大红大紫的人工智能!不得不说的人工智能背后的基石:大数据大数据是人工智能的基石,目前的深度学习主要是建立在大数据的基础上,即对大数据进行训练,并从中归纳出可以被计算机运用在类似数据上的知识或规律。简单而言何为大数据?虽然很多人将其定义为“大数据就是大规模的数据”。但是,这个说法并不准确!“大规模”只是指数据的量而言。数据量大,并不代表着数据一定有可以被深度学习算法利用的价值。例如:地球绕太阳运转的过程中,每一秒钟记录一次地球相对太阳的运动速度、位置,可以得到大量数据。可如果只有这样的数据,其实并没有太多可以挖掘的价值!大数据这里我们参阅马丁·希尔伯特的总结,今天我们常说的大数据其实是在2000年后,因为信息交换、信息存储、信息处理三个方面能力的大幅增长而产生的数据:信息交换:据估算,从1986年到2007年这20年间,地球上每天可以通过既有信息通道交换的信息数量增长了约217倍,这些信息的数字化程度,则从1986年的约20%增长到2007年的约99.9%。在数字化信息爆炸式增长的过程里,每个参与信息交换的节点都可以在短时间内接收并存储大量数据。信息存储:全球信息存储能力大约每3年翻一番。从1986年到2007年这20年间,全球信息存储能力增加了约120倍,所存储信息的数字化程度也从1986年的约1%增长到2007年的约94%。1986年时,即便用上我们所有的信息载体、存储手段,我们也不过能存储全世界所交换信息的大约1%,而2007年这个数字已经增长到大约16%。信息存储能力的增加为我们利用大数据提供了近乎无限的想象空间。信息处理:有了海量的信息获取能力和信息存储能力,我们也必须有对这些信息进行整理、加工和分析的能力。谷歌、Facebook等公司在数据量逐渐增大的同时,也相应建立了灵活、强大的分布式数据处理集群。大数据在应用层面:大数据往往可以取代传统意义上的抽样调查、大数据都可以实时获取、大数据往往混合了来自多个数据源的多维度信息、大数据的价值在于数据分析以及分析基础上的数据挖掘和智能决策。美国《大西洋月刊》公布的一段A.I.聊天记录截图延伸阅读:聊天机器人竟自创语言“对话” 脸书将其紧急关停实际上人工智能的发展,离不开海量数据进行训练,究其根本大数据的循环往复无数次的训练才有了人工+智能!没有人工智能的物联网:没大戏而物流网又让人工智能:更准确物联网:英文名为Internet of Things,可以简单地理解为物物相连的互联网,正是得益于大数据和云计算的支持,互联网才正在向物联网扩展,并进一步升级至体验更佳、解放生产力的人工智能时代。在未来,虚拟世界的一切将真正实现物理化!物联网主要通过各种设备(比如RFID,传感器,二维码等)的接口将现实世界的物体连接到互联网上,或者使它们互相连接,以实现信息的传递和处理。对于人工智能而言,物联网(IoT)其实肩负了一个至关重要的任务:资料收集概念上,物联网可连接大量不同的设备及装置,包括:家用电器和穿戴式设备。嵌入在各个产品中的传感器(sensor)便会不断地将新数据上传至云端。这些新的数据以后可以被人工智能处理和分析,以生成所需要的信息并继续积累知识。互联网在现实的物理世界之外新建了一个虚拟世界,物联网将会把两个世界融为一体。物联网的终极效果是万物互联,不仅仅是人机和信息的交互,还有更深入的生物功能识别读取等等!人工智能背后强大的助推器:云计算云计算(详情参阅之前回答:什么是云计算?)是将我们传统的IT工作转为以网络为依托的云平台运行,NIST(美国国家标准与技术研究院)在2011年下半年公布了云计算定义的最终稿,给出了云计算模式所具备的5个基本特征(按需自助服务、广泛的网络访问、资源共享、快速的可伸缩性和可度量的服务)、3种服务模式(SaaS(软件即服务)、PaaS(平台即服务)和IaaS(基础设施即服务))和4种部署方式(私有云、社区云、公有云和混合云)云计算发展较早,经过10年发展,国内已经拥有超百亿规模,云计算也不再只是充当存储与计算的工具而已!未来可以预见的是,云计算将在助力人工智能发展层面意义深远!而反之,人工智能的迅猛发展、巨大数据的积累,也将会为云计算带来的未知和可能性!人工智能也好、大数据也好、物联网及云计算也好,彼此依附相互助力,藕不断丝且相连!合力搭档在一起:给未来多一些可能,给未知多一些可能性,给不可能多一些可能!

February 21, 2019 · 1 min · jiezi

指明方向与趋势!2019开发者技能报告出炉!!!

近日国外开发者平台 HankerRank 发布了 2019 年开发者技能调查报告( https://research.hackerrank.com/developer-skills/2019 ),该报告根据对71,281开发者的调查得出。2018 年最受欢迎的开发语言经过调查,2018年的所有开发语言中,JavaScript是最受欢迎的语言,2017年最受欢迎的语言是Java,今年被JavaScript超越,位居第二。2019年开发者最想学的语言报告调查了开发者最想学习的开发语言,结果显示,Go语言、Kotlin语言和Python语言位列前三。 Go语言 Go语言是谷歌2009发布的第二款开源编程语言。Go语言专门针对多处理器系统应用程序的编程进行了优化,使用Go编译的程序可以媲美C或C++代码的速度,而且更加安全、支持并行进程。Go语言是谷歌推出的一种全新的编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性。Kotlin Kotlin 是一个用于现代多平台应用的静态编程语言 ,由 JetBrains 开发。Kotlin可以编译成Java字节码,也可以编译成JavaScript,方便在没有JVM的设备上运行。Kotlin已正式成为Android官方支持开发语言。Python Python是一种计算机程序设计语言。是一种动态的、面向对象的脚本语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越来越多被用于独立的、大型项目的开发。2018年最闻名的开发框架2018年,最闻名的开发框架是AngularJS、其次是Spring。AngularJS AngularJS 是一个 JavaScript框架。它是一个以 JavaScript 编写的库。它可通过 标签添加到HTML 页面。Spring Spring是一个开放源代码的设计层面框架,它解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用。Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson创建。简单来说,Spring是一个分层的JavaSE/EE full-stack(一站式) 轻量级开源框架。2019最想学习的框架2019年,开发者最想学洗的框架是React,Java系的Spring排名第七。React React主要用于构建UI。你可以在React里传递多种类型的参数,如声明代码,帮助你渲染出UI、也可以是静态的HTML DOM元素、也可以传递动态变量、甚至是可交互的应用组件。最容易落地的新技术是什么最近几年,新技术层出不穷,如IoT(物联网)、深度学习、机器学习、计算机视觉、区块链、量子计算、AR(增强现实)、VR(虚拟现实)等。这些新技术,到底哪个在开发者心目中是最接近现实,目前看来最容易落地的呢。经过调查,IoT以53%占比获得第一名、量子计算排名最后,区块链倒数第二。找工作最看重什么不同程序员找工作的时候,会看重不同的东西,比如薪资、成长等。那么报告结果是如何的呢?初级开发者和高级开发者找工作最看重的东西排名前三名是一致的:个人成长和学习空间、其次是工作与生活的平衡,也就是加班的多少、排名第三的是有竞争力的薪酬。总结以上就是2018开发者技能报告的所有主要内容。报告中分别围绕开发者、编程语言等展开。涉及到多个方面。希望能对所有读者有所启发。活在当下,既要脚踏实地,也要仰望星空。作为一名程序员,我们也要时不时的抬起头,看一看自己所在的行业。本文作者:阿里高级开发工程师 洪亮阅读原文本文首发自微信公众号“Hollis”,如需转载请联系原作者。

February 19, 2019 · 1 min · jiezi

无监控、不运维。运维系统架构设计附带思维导图

无监控、不运维运维行业有句话:“无监控、不运维”。是的,一点也不夸张,监控俗称“第三只眼”。没了监控,什么基础运维,业务运维都是“瞎子”。**开篇所以说监控是运维这个职业的第一步。尤其是在现在DevOps这么火的时候,用监控数据给自己撑腰,这显得更加必要。有人说运维是背锅侠,那么,有了监控,有了充足的数据,一切以数据说话,运维还需要背锅吗,所以作为一个运维工程师,如何构建一套监控系统是你的第一件工作。统一运维监控平台设计思路运维监控平台不是简单的下载一个开源工具,然后搭建起来就行了,它需要根据监控的环境和特点进行各种整合和二次开发,以达到与自己的需求完全吻合的程度。**那么下面就谈谈运维监控平台的设计思路。构建一个智能的运维监控平台,必须以运行监控和故障报警这两个方面为重点,将所有业务系统中所涉及的网络资源、硬件资源、软件资源、数据库资源等纳入统一的运维监控平台中,并通过消除管理软件的差别。数据采集手段的差别,对各种不同的数据来源实现统一管理、统一规范、统一处理、统一展现、统一用户登录、统一权限控制,最终实现运维规范化、自动化、智能化的大运维管理。架构设计智能的运维监控平台,设计架构从低到高可以分为6层,三大模块,如下图:设计架构从低到高可以分为6层数据收集层:位于最底层,主要收集网络数据、业务系统数据、数据库数据、操作系统数据等,然后将收集到的数据进行规范化并进行存储。数据展示层:位于第二层,是一个Web展示界面,主要是将数据收集层获取到的数据进行统一展示,展示的方式可以是曲线图、柱状图、饼状态等,通过将数据图形化,可以帮助运维人员了解一段时间内主机或网络的运行状态和运行趋势,并作为运维人员排查问题或解决问题的依据。数据提取层:位于第三层,主要是对从数据收集层获取到的数据进行规格化和过滤处理,提取需要的数据到监控报警模块,这个部分是监控和报警两个模块的衔接点。报警规则配置层:位于第四层,主要是根据第三层获取到的数据进行报警规则设置、报警阀值设置、报警联系人设置和报警方式设置等。报警事件生成层:位于第五层,主要是对报警事件进行实时记录,将报警结果存入数据库以备调用,并将报警结果形成分析报表,以统计一段时间内的故障率和故障发生趋势。用户展示管理层:**位于最顶层,是一个Web展示界面,主要是将监控统计结果、报警故障结果进行统一展示,并实现多用户、多权限管理,实现统一用户和统一权限控制。功能实现划分3大模块在这6层中,从功能实现划分,又分为三个模块,分别是数据收集模块、数据提取模块和监控报警模块,每个模块完成的功能如下:数据收集模块:此模块主要完成基础数据的收集与图形展示。数据收集的方式有很多种,可以通过SNMP实现,也可以通过代理模块实现,还可以通过自定义脚本实现。常用的数据收集工具有Cacti、Ganglia等。数据提取模块:此模板主要完成数据的筛选过滤和采集,将需要的数据从数据收集模块提取到监控报警模块中。可以通过数据收集模块提供的接口或自定义脚本实现数据的提取。监控报警模块:此模块主要完成监控脚本的设置、报警规则设置,报警阀值设置、报警联系人设置等,并将报警结果进行集中展现和历史记录。常见的监控报警工具有Nagios、Centreon等。思维导图

February 13, 2019 · 1 min · jiezi

物联网高并发编程之网络编程中的线程模型

如需了解更多物联网网络编程知识请点击:物联网云端开发武器库物联网高并发编程之网络编程中的线程模型值得说明的是,具体选择线程还是进程,更多是与平台及编程语言相关。例如 C 语言使用线程和进程都可以(例如 Nginx 使用进程,Memcached 使用线程),Java 语言一般使用线程(例如 Netty),为了描述方便,下面都使用线程来进行描述。线程模型1:传统阻塞 I/O 服务模型特点:1)采用阻塞式 I/O 模型获取输入数据;2)每个连接都需要独立的线程完成数据输入,业务处理,数据返回的完整操作。存在问题:1)当并发数较大时,需要创建大量线程来处理连接,系统资源占用较大;2)连接建立后,如果当前线程暂时没有数据可读,则线程就阻塞在 Read 操作上,造成线程资源浪费。线程模型2:Reactor 模式基本介绍针对传统阻塞 I/O 服务模型的 2 个缺点,比较常见的有如下解决方案: 1)基于 I/O 复用模型:多个连接共用一个阻塞对象,应用程序只需要在一个阻塞对象上等待,无需阻塞等待所有连接。当某条连接有新的数据可以处理时,操作系统通知应用程序,线程从阻塞状态返回,开始进行业务处理;2)基于线程池复用线程资源:不必再为每个连接创建线程,将连接完成后的业务处理任务分配给线程进行处理,一个线程可以处理多个连接的业务。Reactor 模式,是指通过一个或多个输入同时传递给服务处理器的服务请求的事件驱动处理模式。 服务端程序处理传入多路请求,并将它们同步分派给请求对应的处理线程,Reactor 模式也叫 Dispatcher 模式。即 I/O 多了复用统一监听事件,收到事件后分发(Dispatch 给某进程),是编写高性能网络服务器的必备技术之一。Reactor 模式中有 2 个关键组成:1)Reactor:Reactor 在一个单独的线程中运行,负责监听和分发事件,分发给适当的处理程序来对 IO 事件做出反应。 它就像公司的电话接线员,它接听来自客户的电话并将线路转移到适当的联系人;2)Handlers:处理程序执行 I/O 事件要完成的实际事件,类似于客户想要与之交谈的公司中的实际官员。Reactor 通过调度适当的处理程序来响应 I/O 事件,处理程序执行非阻塞操作。根据 Reactor 的数量和处理资源池线程的数量不同,有 3 种典型的实现:1)单 Reactor 单线程;2)单 Reactor 多线程;3)主从 Reactor 多线程。单 Reactor 单线程其中,Select 是前面 I/O 复用模型介绍的标准网络编程 API,可以实现应用程序通过一个阻塞对象监听多路连接请求,其他方案示意图类似。方案说明:1)Reactor 对象通过 Select 监控客户端请求事件,收到事件后通过 Dispatch 进行分发;2)如果是建立连接请求事件,则由 Acceptor 通过 Accept 处理连接请求,然后创建一个 Handler 对象处理连接完成后的后续业务处理;3)如果不是建立连接事件,则 Reactor 会分发调用连接对应的 Handler 来响应;4)Handler 会完成 Read→业务处理→Send 的完整业务流程。优点:模型简单,没有多线程、进程通信、竞争的问题,全部都在一个线程中完成。缺点:性能问题,只有一个线程,无法完全发挥多核 CPU 的性能。Handler 在处理某个连接上的业务时,整个进程无法处理其他连接事件,很容易导致性能瓶颈。可靠性问题,线程意外跑飞,或者进入死循环,会导致整个系统通信模块不可用,不能接收和处理外部消息,造成节点故障。使用场景:客户端的数量有限,业务处理非常快速,比如 Redis,业务处理的时间复杂度 O(1)。单 Reactor 多线程方案说明:1)Reactor 对象通过 Select 监控客户端请求事件,收到事件后通过 Dispatch 进行分发;2)如果是建立连接请求事件,则由 Acceptor 通过 Accept 处理连接请求,然后创建一个 Handler 对象处理连接完成后续的各种事件;3)如果不是建立连接事件,则 Reactor 会分发调用连接对应的 Handler 来响应;4)Handler 只负责响应事件,不做具体业务处理,通过 Read 读取数据后,会分发给后面的 Worker 线程池进行业务处理;5)Worker 线程池会分配独立的线程完成真正的业务处理,将响应结果发给 Handler 进行处理;6)Handler 收到响应结果后通过 Send 将响应结果返回给 Client。优点:可以充分利用多核 CPU 的处理能力。缺点:多线程数据共享和访问比较复杂;Reactor 承担所有事件的监听和响应,在单线程中运行,高并发场景下容易成为性能瓶颈。主从 Reactor 多线程针对单 Reactor 多线程模型中,Reactor 在单线程中运行,高并发场景下容易成为性能瓶颈,可以让 Reactor 在多线程中运行。方案说明:1)Reactor 主线程 MainReactor 对象通过 Select 监控建立连接事件,收到事件后通过 Acceptor 接收,处理建立连接事件;2)Acceptor 处理建立连接事件后,MainReactor 将连接分配 Reactor 子线程给 SubReactor 进行处理;3)SubReactor 将连接加入连接队列进行监听,并创建一个 Handler 用于处理各种连接事件;4)当有新的事件发生时,SubReactor 会调用连接对应的 Handler 进行响应;5)Handler 通过 Read 读取数据后,会分发给后面的 Worker 线程池进行业务处理;6)Worker 线程池会分配独立的线程完成真正的业务处理,如何将响应结果发给 Handler 进行处理;7)Handler 收到响应结果后通过 Send 将响应结果返回给 Client。优点:父线程与子线程的数据交互简单职责明确,父线程只需要接收新连接,子线程完成后续的业务处理。父线程与子线程的数据交互简单,Reactor 主线程只需要把新连接传给子线程,子线程无需返回数据。这种模型在许多项目中广泛使用,包括 Nginx 主从 Reactor 多进程模型,Memcached 主从多线程,Netty 主从多线程模型的支持。小结3 种模式可以用个比喻来理解:(餐厅常常雇佣接待员负责迎接顾客,当顾客入坐后,侍应生专门为这张桌子服务)1)单 Reactor 单线程,接待员和侍应生是同一个人,全程为顾客服务;2)单 Reactor 多线程,1 个接待员,多个侍应生,接待员只负责接待;3)主从 Reactor 多线程,多个接待员,多个侍应生。Reactor 模式具有如下的优点:1)响应快,不必为单个同步时间所阻塞,虽然 Reactor 本身依然是同步的;2)编程相对简单,可以最大程度的避免复杂的多线程及同步问题,并且避免了多线程/进程的切换开销;3)可扩展性,可以方便的通过增加 Reactor 实例个数来充分利用 CPU 资源;4)可复用性,Reactor 模型本身与具体事件处理逻辑无关,具有很高的复用性。线程模型2:Proactor 模型在 Reactor 模式中,Reactor 等待某个事件或者可应用或者操作的状态发生(比如文件描述符可读写,或者是 Socket 可读写)。然后把这个事件传给事先注册的 Handler(事件处理函数或者回调函数),由后者来做实际的读写操作。其中的读写操作都需要应用程序同步操作,所以 Reactor 是非阻塞同步网络模型。如果把 I/O 操作改为异步,即交给操作系统来完成就能进一步提升性能,这就是异步网络模型 Proactor。Proactor 是和异步 I/O 相关的,详细方案如下:1)Proactor Initiator 创建 Proactor 和 Handler 对象,并将 Proactor 和 Handler 都通过 AsyOptProcessor(Asynchronous Operation Processor)注册到内核;2)AsyOptProcessor 处理注册请求,并处理 I/O 操作;3)AsyOptProcessor 完成 I/O 操作后通知 Proactor;4)Proactor 根据不同的事件类型回调不同的 Handler 进行业务处理;5)Handler 完成业务处理。可以看出 Proactor 和 Reactor 的区别:1)Reactor 是在事件发生时就通知事先注册的事件(读写在应用程序线程中处理完成);2)Proactor 是在事件发生时基于异步 I/O 完成读写操作(由内核完成),待 I/O 操作完成后才回调应用程序的处理器来进行业务处理。理论上 Proactor 比 Reactor 效率更高,异步 I/O 更加充分发挥 DMA(Direct Memory Access,直接内存存取)的优势。但是Proactor有如下缺点: 1)编程复杂性,由于异步操作流程的事件的初始化和事件完成在时间和空间上都是相互分离的,因此开发异步应用程序更加复杂。应用程序还可能因为反向的流控而变得更加难以 Debug;2)内存使用,缓冲区在读或写操作的时间段内必须保持住,可能造成持续的不确定性,并且每个并发操作都要求有独立的缓存,相比 Reactor 模式,在 Socket 已经准备好读或写前,是不要求开辟缓存的;3)操作系统支持,Windows 下通过 IOCP 实现了真正的异步 I/O,而在 Linux 系统下,Linux 2.6 才引入,目前异步 I/O 还不完善。因此在 Linux 下实现高并发网络编程都是以 Reactor 模型为主。参考:http://www.52im.net/forum.php ...

February 11, 2019 · 2 min · jiezi

快速理解TCP和UDP的差异

前言最头疼的问题莫过于到底该选TCP还是UDP作为传输层协议。通过快速对比分析 TCP 和 UDP 的区别,来帮助即时通讯初学者快速了解这些基础的知识点,从而在IM、消息推送等网络通信应用场景中能准确地选择合适的传输层协议。建立连接方式的差异TCP说到 TCP 建立连接,相信大多数人脑海里肯定可以浮现出一个词,没错就是–“三次握手”。TCP 通过“三次握手”来建立连接,再通过“四次挥手”断开一个连接。在每次挥手中 TCP 做了哪些操作呢?流程如下图所示(TCP的三次握手和四次挥手):上图就从客户端和服务端的角度,清楚的展示了 TCP 的三次握手和四次挥手。可以看到,当 TCP 试图建立连接时,三次握手指的是客户端主动触发了两次,服务端触发了一次。我们可以先明确一下 TCP 建立连接并且初始化的目标是什么呢?1初始化资源;2告诉对方我的序列号。所以三次握手的次序是这样子的:client端首先发送一个SYN包告诉Server端我的初始序列号是X;Server端收到SYN包后回复给client一个ACK确认包,告诉client说我收到了;接着Server端也需要告诉client端自己的初始序列号,于是Server也发送一个SYN包告诉client我的初始序列号是Y;Client收到后,回复Server一个ACK确认包说我知道了。其中的 2 、3 步骤可以简化为一步,也就是说将 ACK 确认包和 SYN 序列化包一同发送给 Client 端。到此我们就比较简单的解释了 TCP 建立连接的“三次握手”。UDP我们都知道 TCP 是面向连接的、可靠的、有序的传输层协议,而 UDP 是面向数据报的、不可靠的、无序的传输协议,所以 UDP 压根不会建立什么连接。就好比发短信一样,UDP 只需要知道对方的 ip 地址,将数据报一份一份的发送过去就可以了,其他的作为发送方,都不需要关心。数据发送方式的差异关于 TCP、UDP 之间数据发送的差异,可以体现二者最大的不同之处:TCP:由于 TCP 是建立在两端连接之上的协议,所以理论上发送的数据流不存在大小的限制。但是由于缓冲区有大小限制,所以你如果用 TCP 发送一段很大的数据,可能会截断成好几段,接收方依次的接收。UDP:由于 UDP 本身发送的就是一份一份的数据报,所以自然而然的就有一个上限的大小。那么每次 UDP 发送的数据报大小由哪些因素共同决定呢?UDP协议本身,UDP协议中有16位的UDP报文长度,那么UDP报文长度不能超过2^16=65536;以太网(Ethernet)数据帧的长度,数据链路层的MTU(最大传输单元);socket的UDP发送缓存区大小先来看第一个因素,UDP 本身协议的报文长度为 2^16 - 1,UDP 包头占 8 个字节,IP 协议本身封装后包头占 20 个字节,所以最终长度为: 2^16 - 1 - 20 - 8 = 65507 字节。只看第一个因素有点理想化了,因为 UDP 属于不可靠协议,我们应该尽量避免在传输过程中,数据包被分割。所以这里有一个非常重要的概念 MTU – 也就是最大传输单元。在 Internet 下 MTU 的值为 576 字节,所以在 internet 下使用 UDP 协议,每个数据报最大的字节数为: 576 - 20 - 8 = 548数据有序性的差异TCP对于 TCP 来说,本身 TCP 有着超时重传、错误重传、还有等等一系列复杂的算法保证了 TCP 的数据是有序的,假设你发送了数据 1、2、3,则只要发送端和接收端保持连接时,接收端收到的数据始终都是 1、2、3。UDP而 UDP 协议则要奔放的多,无论 server 端无论缓冲池的大小有多大,接收 client 端发来的消息总是一个一个的接收。并且由于 UDP 本身的不可靠性以及无序性,如果 client 发送了 1、2、3 这三个数据报过来,server 端接收到的可能是任意顺序、任意个数三个数据报的排列组合。可靠性的差异其实大家都知道 TCP 本身是可靠的协议,而 UDP 是不可靠的协议。TCPTCP 内部的很多算法机制让他保持连接的过程中是很可靠的。比如:TCP 的超时重传、错误重传、TCP 的流量控制、阻塞控制、慢热启动算法、拥塞避免算法、快速恢复算法 等等。所以 TCP 是一个内部原理复杂,但是使用起来比较简单的这么一个协议。UDPUDP 是一个面向非连接的协议,UDP 发送的每个数据报带有自己的 IP 地址和接收方的 IP 地址,它本身对这个数据报是否出错,是否到达不关心,只要发出去了就好了。所以来研究下,什么情况会导致 UDP 丢包:数据报分片重组丢失:在文章之前我们就说过,UDP 的每个数据报大小多少最合适,事实上 UDP 协议本身规定的大小是 64kb,但是在数据链路层有 MTU 的限制,大小大概在 5kb,所以当你发送一个很大的 UDP 包的时候,这个包会在 IP 层进行分片,然后重组。这个过程就有可能导致分片的包丢失。UDP 本身有 CRC 检测机制,会抛弃掉丢失的 UDP 包;UDP 缓冲区填满:当 UDP 的缓冲区已经被填满的时候,接收方还没有处理这部分的 UDP 数据报,这个时候再过来的数据报就没有地方可以存了,自然就都被丢弃了。使用场景总结在文章最后的一部分,聊聊 TCP、UDP 使用场景。先来说 UDP 的吧,有很多人都会觉得 UDP 与 TCP 相比,在性能速度上是占优势的。因为 UDP 并不用保持一个持续的连接,也不需要对收发包进行确认。但事实上经过这么多年的发展 TCP 已经拥有足够多的算法和优化,在网络状态不错的情况下,TCP 的整体性能是优于 UDP 的。那在什么时候我们非用 UDP 不可呢?对实时性要求高:比如实时会议,实时视频这种情况下,如果使用 TCP,当网络不好发生重传时,画面肯定会有延时,甚至越堆越多。如果使用 UDP 的话,即使偶尔丢了几个包,但是也不会影响什么,这种情况下使用 UDP 比较好;多点通信:TCP 需要保持一个长连接,那么在涉及多点通讯的时候,肯定需要和多个通信节点建立其双向连接,然后有时在NAT环境下,两个通信节点建立其直接的 TCP 连接不是一个容易的事情,而 UDP 可以无需保持连接,直接发就可以了,所以成本会很低,而且穿透性好。这种情况下使用 UDP 也是没错的。以上我们说了 UDP 的使用场景,在此之外的其他情况,使用 TCP 准没错。毕竟有一句话嘛:when in doubt,use TCP。 ...

January 20, 2019 · 1 min · jiezi

UDP中一个包的大小最大能多大?

前言因为UDP数据传输的无连接特性,最简单的UDP数据传输就是一次数据交互一个UDP包搞定,这样就不用管分包问题(因为不像TCP,UDP传输时如果分包则是不能保证顺序的,这会带来很多问题)。所以你一次交互的数据如果太多的话,用UDP实现就很可能并不优雅。思考在进行UDP编程的时候,我们最容易想到的问题就是,一次发送多少bytes好? 当然,这个没有唯一答案,相对于不同的系统,不同的要求,其得到的答案是不一样的,我这里仅对像ICQ一类的发送聊天消息的情况作分析,对于其他情况,你或许也能得到一点帮助。网络原理首先,我们知道,TCP/IP通常被认为是一个四层协议系统:包括链路层、网络层、运输层、应用层 。UDP属于运输层,下面我们由下至上一步一步来看。结论1:局域网环境下,建议将UDP数据控制在1472字节以下以太网(Ethernet)数据帧的长度必须在46-1500字节之间,这是由以太网的物理特性决定的,这个1500字节被称为链路层的MTU(最大传输单元)。 但这并不是指链路层的长度被限制在1500字节,其实这这个MTU指的是链路层的数据区,并不包括链路层的首部和尾部的18个字节。所以,事实上这个1500字节就是网络层IP数据报的长度限制。因为IP数据报的首部为20字节,所以IP数据报的数据区长度最大为1480字节。而这个1480字节就是用来放TCP传来的TCP报文段或UDP传来的UDP数据报的。又因为UDP数据报的首部8字节,所以UDP数据报的数据区最大长度为1472字节。这个1472字节就是我们可以使用的字节数当我们发送的UDP数据大于1472的时候会怎样呢?这也就是说IP数据报大于1500字节,大于MTU,这个时候发送方IP层就需要分片(fragmentation)。把数据报分成若干片,使每一片都小于MTU,而接收方IP层则需要进行数据报的重组。这样就会多做许多事情,而更严重的是,由于UDP的特性,当某一片数据传送中丢失时,接收方无法重组数据报,将导致丢弃整个UDP数据报。因此,在普通的局域网环境下,我建议将UDP的数据控制在1472字节以下为好。结论2:Internet编程时,建议将UDP数据控制在548字节以下进行Internet编程时则不同,因为Internet上的路由器可能会将MTU设为不同的值。如果我们假定MTU为1500来发送数据,而途经的某个网络的MTU值小于1500字节,那么系统将会使用一系列的机制来调整MTU值,使数据报能够顺利到达目的地,这样就会做许多不必要的操作。鉴于Internet上的标准MTU值为576字节,所以我建议在进行Internet的UDP编程时, 最好将UDP的数据长度控件在548字节(576-8-20)以内。这句话貌似有问题,unix网络编程第一卷里说:ipv4协议规定ip层的最小重组缓冲区大小为576!所以,建议udp包不要超过这个大小,而不是因为internet的标准MTU是576!

January 20, 2019 · 1 min · jiezi

快速理解TCP协议一篇就够

前言TCP 是互联网的核心协议之一,鉴于它的重要性,本文将单独介绍它的基础知识,希望能加深您对TCP协议的理解。TCP 协议的作用互联网由一整套协议构成。TCP 只是其中的一层,有着自己的分工。TCP 是以太网协议和 IP 协议的上层协议,也是应用层协议的下层协议最底层的以太网协议(Ethernet)规定了电子信号如何组成数据包(packet),解决了子网内部的点对点通信。以太网协议解决了局域网的点对点通信但是,以太网协议不能解决多个局域网如何互通,这由 IP 协议解决。IP 协议可以连接多个局域网IP 协议定义了一套自己的地址规则,称为 IP 地址。它实现了路由功能,允许某个局域网的 A 主机,向另一个局域网的 B 主机发送消息。路由器就是基于 IP 协议。局域网之间要靠路由器连接路由的原理很简单。市场上所有的路由器,背后都有很多网口,要接入多根网线。路由器内部有一张路由表,规定了 A 段 IP 地址走出口一,B 段地址走出口二,……通过这套"指路牌",实现了数据包的转发。本机的路由表注明了不同 IP 目的地的数据包,要发送到哪一个网口(interface)IP 协议只是一个地址协议,并不保证数据包的完整。如果路由器丢包(比如缓存满了,新进来的数据包就会丢失),就需要发现丢了哪一个包,以及如何重新发送这个包。这就要依靠 TCP 协议。简单说,TCP 协议的作用是,保证数据通信的完整性和可靠性,防止丢包TCP 数据包的大小以太网数据包(packet)的大小是固定的,最初是1518字节,后来增加到1522字节。其中, 1500 字节是负载(payload),22字节是头信息(head)。IP 数据包在以太网数据包的负载里面,它也有自己的头信息,最少需要20字节,所以 IP 数据包的负载最多为1480字节。IP 数据包在以太网数据包里面,TCP 数据包在 IP 数据包里面TCP 数据包在 IP 数据包的负载里面。它的头信息最少也需要20字节,因此 TCP 数据包的最大负载是 1480 - 20 = 1460 字节。由于 IP 和 TCP 协议往往有额外的头信息,所以 TCP 负载实际为1400字节左右。因此,一条1500字节的信息需要两个 TCP 数据包。HTTP/2 协议的一大改进, 就是压缩 HTTP 协议的头信息,使得一个 HTTP 请求可以放在一个 TCP 数据包里面,而不是分成多个,这样就提高了速度。以太网数据包的负载是1500字节,TCP 数据包的负载在1400字节左右TCP 数据包的编号(SEQ)一个包1400字节,那么一次性发送大量数据,就必须分成多个包。比如,一个 10MB 的文件,需要发送7100多个包。发送的时候,TCP 协议为每个包编号(sequence number,简称 SEQ),以便接收的一方按照顺序还原。万一发生丢包,也可以知道丢失的是哪一个包。第一个包的编号是一个随机数。为了便于理解,这里就把它称为1号包。假定这个包的负载长度是100字节,那么可以推算出下一个包的编号应该是101。这就是说,每个数据包都可以得到两个编号:自身的编号,以及下一个包的编号。接收方由此知道,应该按照什么顺序将它们还原成原始文件当前包的编号是45943,下一个数据包的编号是46183,由此可知,这个包的负载是240字节TCP 数据包的组装收到 TCP 数据包以后,组装还原是操作系统完成的。应用程序不会直接处理 TCP 数据包。对于应用程序来说,不用关心数据通信的细节。除非线路异常,收到的总是完整的数据。应用程序需要的数据放在 TCP 数据包里面,有自己的格式(比如 HTTP 协议)。TCP 并没有提供任何机制,表示原始文件的大小,这由应用层的协议来规定。比如,HTTP 协议就有一个头信息Content-Length,表示信息体的大小。对于操作系统来说,就是持续地接收 TCP 数据包,将它们按照顺序组装好,一个包都不少。操作系统不会去处理 TCP 数据包里面的数据。一旦组装好 TCP 数据包,就把它们转交给应用程序。TCP 数据包里面有一个端口(port)参数,就是用来指定转交给监听该端口的应用程序。系统根据 TCP 数据包里面的端口,将组装好的数据转交给相应的应用程序。上图中,21端口是 FTP 服务器,25端口是 SMTP 服务,80端口是 Web 服务器。应用程序收到组装好的原始数据,以浏览器为例,就会根据 HTTP 协议的 Content-Length 字段正确读出一段段的数据。这也意味着,一次 TCP 通信可以包括多个 HTTP 通信。慢启动和 ACK服务器发送数据包,当然越快越好,最好一次性全发出去。但是,发得太快,就有可能丢包。带宽小、路由器过热、缓存溢出等许多因素都会导致丢包。线路不好的话,发得越快,丢得越多。最理想的状态是,在线路允许的情况下,达到最高速率。但是我们怎么知道,对方线路的理想速率是多少呢?答案就是慢慢试。TCP 协议为了做到效率与可靠性的统一,设计了一个慢启动(slow start)机制。开始的时候,发送得较慢,然后根据丢包的情况,调整速率:如果不丢包,就加快发送速度;如果丢包,就降低发送速度。Linux 内核里面设定了(常量TCP_INIT_CWND),刚开始通信的时候,发送方一次性发送10个数据包,即"发送窗口"的大小为10。然后停下来,等待接收方的确认,再继续发送。默认情况下,接收方每收到两个 TCP 数据包,就要发送一个确认消息。“确认"的英语是 acknowledgement,所以这个确认消息就简称 ACK。ACK 携带两个信息:期待要收到下一个数据包的编号;接收方的接收窗口的剩余容量。发送方有了这两个信息,再加上自己已经发出的数据包的最新编号,就会推测出接收方大概的接收速度,从而降低或增加发送速率。这被称为"发送窗口”,这个窗口的大小是可变的。每个 ACK 都带有下一个数据包的编号,以及接收窗口的剩余容量,双方都会发送 ACK注意:由于 TCP 通信是双向的,所以双方都需要发送 ACK。两方的窗口大小,很可能是不一样的。而且 ACK 只是很简单的几个字段,通常与数据合并在一个数据包里面发送。上图一共4次通信。第一次通信,A 主机发给B 主机的数据包编号是1,长度是100字节,因此第二次通信 B 主机的 ACK 编号是 1 + 100 = 101,第三次通信 A 主机的数据包编号也是 101。同理,第二次通信 B 主机发给 A 主机的数据包编号是1,长度是200字节,因此第三次通信 A 主机的 ACK 是201,第四次通信 B 主机的数据包编号也是201。即使对于带宽很大、线路很好的连接,TCP 也总是从10个数据包开始慢慢试,过了一段时间以后,才达到最高的传输速率。这就是 TCP 的慢启动数据包的遗失处理TCP 协议可以保证数据通信的完整性,这是怎么做到的?前面说过,每一个数据包都带有下一个数据包的编号。如果下一个数据包没有收到,那么 ACK 的编号就不会发生变化。举例来说,现在收到了4号包,但是没有收到5号包。ACK 就会记录,期待收到5号包。过了一段时间,5号包收到了,那么下一轮 ACK 会更新编号。如果5号包还是没收到,但是收到了6号包或7号包,那么 ACK 里面的编号不会变化,总是显示5号包。这会导致大量重复内容的 ACK。如果发送方发现收到三个连续的重复 ACK,或者超时了还没有收到任何 ACK,就会确认丢包,即5号包遗失了,从而再次发送这个包。通过这种机制,TCP 保证了不会有数据包丢失。Host B 没有收到100号数据包,会连续发出相同的 ACK,触发 Host A 重发100号数据包 ...

January 19, 2019 · 1 min · jiezi

被神话的大数据——从大数据(big data)到深度数据(deep data)思维转变

摘要: 自从阿法狗战胜人类顶级棋手之后,深度学习、人工智能变得再一次火热起来,但有一个基本的误解是更大的数据会产生更好的机器学习结果。然而,更大的数据池/仓库并不一定有助于模型学习到更深刻的见解。正确的答案是? 自从阿法狗战胜人类顶级棋手之后,深度学习、人工智能变得再一次火热起来。有些人认为,深度学习的再一次兴起是源于硬件的提升、数据量的增多以及高效算法的研究。这并不完全精确,有一个基本的误解是更大的数据会产生更好的机器学习结果。然而,更大的数据池/仓库并不一定有助于模型学习到更深刻的见解。正确的答案是,要把重心专注于数据的质量、价值以及多样性,而不仅仅是数据的规模——“深度数据”(deep data)比大数据(big data)好。随着研究的进行,人们对大数据的炒作逐渐在减弱。云计算、Hadoop及其变种已经能够解决一些大数据的问题。但是“大数据”是指许多人仍在花费大量资金建设更大的基础设施来处理、保存和管理的庞大数据库。这种盲目追求“大”的做法,在基础设施和人力资源方面产生了巨大的、且本可避免的成本。目前,越来越多的声音讨论是否从“大数据”转向为“深度数据”了,我们现在需要更加的明智和思考全面,而不是收集所有可能的数据来实现“大数据”。我们现在需要让一些数据落实到位,并寻求数量和质量的多样性,这将给我们带来许多长期的收益。被神话的大数据 要理解从“大”到“深”的这种转变,让我们首先看一下我们对大数据的一些错误观念:可以并且应该捕获和存储所有数据;更多数据总是有助于构建更准确的预测模型;存储更多的数据,其存储成本几乎为零;更多数据的计算成本几乎为零;以下是现实:来自物联网和网络流量的数据仍然超过了我们目前具备的捕获所有数据的能力。有些数据必须在摄取时被丢弃。我们需要变得聪明,这就需要我们根据价值对数据进行分类;重复一千次的相同数据示例并不会提高预测模型的准确性;存储更多数据的成本不仅仅是网络服务向用户收取的费用(比如云盘),这也是查找和管理多个数据源的额外复杂性以及员工移动和使用该数据的隐藏代价,这些成本通常高于存储和计算费用。人工智能算法对计算资源的需求甚至可以快速超越弹性云基础设施。虽然计算资源可以线性增长,但计算需求可以超线性增长,甚至指数级增长。 相信这些神话的问题在于,我们将以一种在纸上或长期看来都很好的方式构建信息系统,但在即时时间框架内过于繁琐,无法发挥作用。大数据的四个问题以下是在数据方面盲目相信“越多越好”时存在的四个问题:更多相同的数据是没有作用的。为人工智能构建机器学习模型时,训练示例的多样性至关重要,原因是模型是根据数据来试图确定概念边界。例如,如果模型试图通过使用年龄和职业来定义“退休工人”的概念,那么32岁的注册会计师的重复示例对该模型并没有什么好处,因为它们表示的含义都是没有退休。在65岁的概念边界获得示例并了解退休如何随职业而变化对模型会更有帮助;嘈杂的数据可能会伤害模型。如果新数据中存在错误或者不精确,那么它只会混淆模型试图学习的两个概念之间的界限。在这种情况下,更多的数据将无济于事,实际上可能会降低现有模型的准确性;大数据让一切都变慢了。在数TB的数据上构建模型可能比在数GB的数据上构建模型花费一千倍的时间,或者它可能需要一万倍的时间,这都取决于学习算法。数据科学就是快速实验,快速实验,快速更新以获得较为合适的模型;大数据可实现的模型。任何预测模型的最终目标都是创建一个可以为业务部署的高度准确的模型。有时使用来自数据池深处更加模糊的数据可能会导致更高的准确性,但所使用的数据对于实际部署可能是不可靠的。最好有一个不太准确的模型,它可以快速运行并可供企业使用。能做得更好的四件事以下是我们可以采取的一些措施来对抗大数据的“黑暗面”,并将大数据思维转向深度数据思维:了解准确性/执行权衡。数据科学家常常认为目标是获得更准确的模型。而是要根据准确性和部署速度,以明确的ROI预期启动项目;使用随机样本构建每个模型。如果你的数据集足够大,那么你就没有理由一次性全部使用整个数据集。如果数据集具有良好的随机抽样功能,那么我们就可以使用来自大数据集中的小样本构建模型,并进行准确预测。小样本使得模型迭代更新更加快速,然后使用整个数据库构建最终模型。丢弃一些数据。如果对来自物联网设备和其他来源的数据流感到不知所措,那么就可以聪明地随意丢弃一些数据。这个方法适合于构建模型的早期阶段,如果到后期的话,这样操作会使得后期工作一团糟。寻找更多的数据源。人工智能最近的许多突破并非来自更大的数据集,而是源于机器学习算法利用到了以前无法获得数据的能力。例如,二十年前,现在普遍存在的大型文本、图像、视频和音频数据集在那个时代并不存在,因此,我们应该不断寻找产生这些新的数据的机会。变得更好的四件事如果我们转换思路,专注于深度数据而不仅仅是大数据,这样将享受到以下这些好处:一切都会变得更快。使用较小的数据,对数据进行移动、实验、训练和模型评估都会快得多;需要更少的存储和计算资源。专注于深度数据意味着我们将更加智能地使用更小的磁盘并通过云计算,这样会直接降低基础设施的成本,节省下来的资金就可以聘请更多数据科学家和人工智能专家;减轻研究人员的压力并变得更加快乐。在有了深度数据思维后,团队将发现自己不太可能只是做一些打杂工作,比如制作数据集或者杀死那些占用所有云资源的错误程序等。同样,数据科学家也会花更多的时间在构建和测试模型上,而不是被数据移动或等待长时间的训练过程,这样也会使其变得更快乐。可以解决更难的问题。构建一个人工智能模型并不是一个只有像巫师一样的研究人员才能完成的神奇体验。与其说人工智能是魔法,不如说是一种逻辑。这类似于一个艺术老师告诉他班上一半的学生,他们的分数将基于他们制作的艺术作品的数量,另一半的学生将根据他们最好的作品的质量来评分。毫不奇怪,学生创作的艺术品数量会大大增加。令人震惊的是,在产量增多的同时,高品质的产品也会出现——数量有时会产生质量。在我们的例子中,在相同资源约束下尝试的更多模型可能意味着更好的最佳模型。大数据和支持它的技术突破极大地促进了许多公司在决策过程中成为数据驱动的动力。随着人工智能的兴起以及处理这些强大资源的能力,现在需要更加精确地根据我们的数据需求建立一种理解深度数据的思维,而不仅仅是大数据。本文作者:【方向】阅读原文本文为云栖社区原创内容,未经允许不得转载。

January 14, 2019 · 1 min · jiezi

专访阿里云MVP王俊杰:开发者的超能力是用技术让世界更美好

摘要: 在事业刚刚起步的时候,王俊杰毅然决定支教半年。支教归来后,他先后参加了扶贫智能平台、污水处理智能系统等等项目,并利用业余时间完成了未来幼儿园的公益项目。在他的身上,正是验证着那句话:用技术让世界更美好,这就是开发者拥有的超能力。【王俊杰:阿里云MVP,陕西创博网络科技有限公司总经理。大数据与物联网的爱好者与实践者。 8年以上互联网从业经验,曾从事军工相关仿真分析软件研发与集成、4年以上大数据系统开发经验。目前正与天水市秦州区政府配合建设智慧安监、智慧环保、智慧党建、智慧妇联等智慧城市相关配套服务平台。】*2018年的9月18日,湖畔大学,阿里云MVP全球闭门会的现场。在会议开始之前,门前的公益项目认领台前人头攒动,来自西安的MVP王俊杰仔细地阅读公益项目的要求,最后他把自己的印章郑重地印在未来幼儿园公益项目上。之后的4个月,他担任起为这个云南地区偏远幼儿园开发APP的任务。每周需投入14个多小时进行开发,时常要开异地电话会议,不计次数地进行方案修改……为了更好的效果,王俊杰甚至拽上了自己公司的技术人员和设计师一起来做,4个月后,未来幼儿园APP初见雏形。“这就是我们想要的!”幼儿园老师孙海若看到群内的照片,高兴地说。对于王俊杰来说,用技术让世界更美好,这只是他的一小步。事业刚起步,他去支教了对于王俊杰来说,2013年是个特别的年份。这一年,已经开始工作3年的他做了一个令人意外的决定:休个长假,去支教。他参加了西安当地的一个公益组织的支教项目,这个项目专门针对真实需求的山区学校,招募、培训支教志愿者以弥补当地基础课程和素质拓展课程的不足。王俊杰选择了一个学期的支教项目,在四川的大山深处,他开始了自己4个月的支教生活。“当时我们去的小学,就是在大山深处的半山腰上。”王俊杰现在还记得去那所小学的辗转路程:从四川广元出发,乘坐两个小时的大巴到县城,再坐半个多小时的当地的小班车到镇上,然后再步行一个多小时的山路,才能到那所半山腰的小学。附近几个村子的孩子,都在这所小学读书。在那儿的4个月,王俊杰成为这群山区孩子的语文和美术老师。在别人看来,在关键的事业起步期拿出将近半年的时间支教,无疑是件很“任性”的事,但王俊杰觉得这件事很正常。“我自己是农村长大的孩子,当年教我的老师就是来支教的。” 王俊杰把这段支教时间当做自己沉淀的一个机会,在山区的这段时间,他也在思考自己的职业方向。作为大数据与人工智能的爱好者与实践者,支教结束后,王俊杰继续从事大数据系统开发等等工作。他利用云计算和大数据平台,和团队一起完成了一款智慧扶贫大数据云平台,通过这个平台,相关部门可以更快速更精确甄别贫困人口,通过大数据让扶贫措施精确到位,同时通过精准检测和评估,为科学扶贫决策提供支撑。与阿里云一起,用技术让世界更美好王俊杰的职业生涯,一直和阿里云密切联系在一起,他所架构的大数据平台,很多都是在阿里云上。因为自己的技术贡献和对阿里云产品的深入了解,2018年3月,王俊杰成为阿里云MVP(最有价值专家)。在这里,他感受到一种特别亲近感。“很多MVP都参加了技术扶贫等等公益项目,这让我感到非常亲切,也希望自己有机会成为他们中的一员。”王俊杰的愿望很快实现了。2018年9月,阿里云MVP全球闭门会举行,在本次闭门会上,开放了多个公益项目供阿里云MVP认领,王俊杰选择的是未来幼儿园项目。需求方希望能够搭建一个供幼儿园老师工作使用的APP,但一方面很难找到合适的APP供应商,只有一些提供基于网页服务的供应商,且需要每年持续付费;另一方面目前联系了几家云端供应商,但其界面较为复杂,老师难以上手。王俊杰接过这个项目后,每周定期和相关方开会,数次修改方案,甚至拉进来了自己公司的开发人员和设计师,经过了4个月,幼儿园APP已经初见雏形,2019年春节前就可以落地。未来,200名幼儿班教师可以通过手机界面汇总学生出勤情况、每日户外活动小时数、每周重大事件、每日课堂现场照片等,同时,老师还可以方便的对文件进行备份共享等。对于王俊杰来说,加入阿里云MVP不仅仅找到了自己的公益同行人,也在事业上找到了一群良师益友。“在阿里云MVP我体会最深的一点,就是技术交流。我们公司现在主要做工业领域物联网的实践,在MVP中有很多这方面的技术大咖,通过交流,我们能少走很多弯路。”现在的王俊杰,正在利用阿里云IoT平台进行智能污水处理系统的探索。在这个极具经济效益和环保效益的市场上,王俊杰看到了行业的痛点:“由于污水处理企业下属厂区分布零散,很多生产环节需要依靠人工来运营维护,无法远程对各水厂自动化设备进行管理,需要相关人员跑场操控,人工巡视成本高,工作效率低。同时污水处理厂数据统计源头不一,不仅造成资源浪费,相关管理人员也无法清晰掌控各厂区数据。”不仅如此,由于污水处理过程中药品添加和设备启停的管控,都是依靠人工经验操作,既有可能造成药品、电力能耗的资源浪费,还会因为人为判断失误导致出水水质超标,让企业承担巨额的罚款。王俊杰和他的团队针对这些难点,开始研发智能化污水处理系统。这个系统是依靠阿里云IOT云平台,借助大数据、GIS、移动互联网等新一代信息技术,打造智能污水处理综合运营管理平台,为污水运营企业安全管理、生产运行、水质化验、设备管理、日常办公等关键业务提供智能化统一业务信息管理操控平台。(详见《智能污水处理系统最佳实践》)就在前不久,王俊杰接到了云南幼儿园老师的热情邀请,希望他到这所幼儿园来参观,看看自己搭建起的APP服务的这群人。在俊杰看来,这正是成为做技术的迷人之处——用技术让世界更美好,这就是开发者拥有的超能力。本文作者:辰悠阅读原文本文为云栖社区原创内容,未经允许不得转载。

January 4, 2019 · 1 min · jiezi

阿里云图数据库GraphDB上线,助力图数据处理

GraphDB简介GraphDB图数据库适用于存储,管理,查询复杂并且高度连接的数据,图库的结构特别适合发现大数据集下数据之间的共性和特性,特别善于释放蕴含在数据关系之间的巨大价值。GraphDB引擎本身并不额外收费,仅收取云hbase费用。适合的业务场景在如下多种场景中图数据库比其他类型数据库(RDBMS和NoSQL)更合适推荐及个性化几乎所有的企业都需要了解如何快速并且高效地影响客户来购买他们的产品并且推荐其他相关商品给他们。这可能需要用到云服务的推荐,个性化,网络分析工具。如果使用得当,图分析是处理推荐和个性化任务的最有效武器,并根据数据中的价值做出关键决策。举个例子,网络零售商需要根据客户过往消费记录及订单推荐其他商品给这个客户。为了能成功的达到目的,当前回话下用户浏览操作等都可以实时集成到一张图中。图非常适合这些类似的分析用例,如推荐产品,或基于用户数据,过去行为,推荐个性化广告。电商商品推荐案例如何使用GraphDB做商品实时推荐安全和欺诈检测在复杂及高度相关的用户,实体,事务,时间,交互操作的网络中,图数据库可以帮助检测哪些实体,交易,操作是有欺诈性质的,从而规避风险。简而言之,图数据库可以帮助在数不清金融活动中产生的关系及事件组成的海量数据集中找到那根坏针。某深圳大数据风控案例客户介绍:该大数据有限公司专注于为银行、消费金融、三方支付、P2P、小贷、保险、电商等客户解决线上风险和欺诈问题。案例背景及痛点近几年互联网金融行业兴起,诞生了很多互联网金融企业,用户参加线上贷款,金融消费,P2P融资等金融活动门槛大大降低,在这些金融行为中如何有效规避风险,进行风控是每个金融企业面临的比较严峻的问题。用户的金融行为中会沉淀大量有价值的数据,在白骑士客户小贷场景中会产生一笔笔贷款记录关联的手机号,身份证,银行卡号,设备号等。这些数据代表一个个实体人,正常金融活动中,贷款,金融服务不是高频行为,一个实体人一般有一个唯一身份证,常用银行卡号,手机号,设备号。这几者顶点见不会产生高密度图,但有一些高危低信用用户可能会使用同一手机设备申请贷款进行骗贷。客户痛点在于如何高效识别这些高危低信用用户。解决方案建立图模型分别创建手机号,设备号,身份证,银行卡号四类顶点及相互关联的边,扩展属性便于查询。从原数据仓库清洗后通过graph-loader工具导入GraphDB在线评估用户信用资质在申请贷款流程中,可以通过使用图库可以实时查询图中任意一手机号关联的身份证数量(一跳/二跳查询),恶意申请有如下特点,关联子图各类顶点过多,并且可能关联上离线分析标注过得黑名单用户,说明当前用户存在恶意申请风险,实时拒掉贷款申请。下图显示如何与自身小贷平台打通,做实时风控预警,箭头方向代表数据流方向。主动识别黑名单用户借助spark graphframes分析能力,离线计算全图中各个顶点出入度及pagerank,主动挖掘超级顶点,超级顶点如一个手机号关联了多个身份证顶点,说明该用户金融活动频繁,背后的故事是一个实体人有多笔申请记录,分别关联了不同的身份证,手机号,说明该用户在进行恶意欺诈活动,人工标注黑名单用户,从源头禁掉用户金融活动。物联网物联网(IoT)是另一个非常适合图数据库领域。 物联网使用案例中,很多通用的设备都会产生时序相关的信息如事件和状态数据。在这种情况下,图数据库效果很好,因为来自各个独立的终端的流汇聚起来的时候产生了高度复杂性此外,涉及诸如分析根本原因之类的任务时,也会引入多种关系来做整体检查,而非隔离检查。GraphDB特性整体架构使用Apache TinkerPop构建GraphDB是Apache TinkerPop3接口的一个实现,支持Tinkerpop全套软件栈,支持Gremlin语言,可以快速上手。在GraphDB中,为应对不同的业务场景,数据模型已经做到尽可能的灵活。例如,GraphDB中点和边均支持用户自定义ID;自定义ID可以是字符串或数字;属性值可以是任意类型,包括map,数组,序列化的对象等。因此,应用不需要为了适应图数据库的限制而做多余的改造,只需要专注在功能的实现上面。GraphDB具有完善的索引支持。支持对顶点建立label索引和属性索引;支持对边建立label索引,属性索引和顶点索引;支持顶点索引和边索引的范围查询和分页。良好的索引支持保证了顶点In/Out查询和根据属性查找顶点/边的操作都具有很好的性能。与HBase深度集成GraphDB使用企业认证的HBase版本作为其持久数据存储。 由于与HBase的深度集成,GraphDB继承了HBase的所有主要优势,包括服务可用性指标,写/读/时刻都在线高可用功能,线性可扩展性,可预测的低延迟响应时间,hbase专家级别的的运维服务。 在此基础上,GraphDB增强了性能,其中包括自适应查询优化器,分片数据位置感知能力。使用spark graphframes做图分析借助阿里云HBase X-Pack提供的Spark产品,可以对GraphDB中的图数据进行分析。作为优秀的大数据处理引擎,Spark能够对任意数据量的数据进行快速分析,Spark支持scala、java、python多种开发语言,可本地调试,开发效率高。此外,阿里云HBase X-Pack的Spark服务通过全托管的方式为用户提供企业级的服务,大大降低了使用门槛和运维难度。Spark GraphX中内置了常见的图分析操作,例如PageRank、最短路径、联通子图、最小生成树等。云上大规模GraphDB优势全托管,全面解放运维,为业务稳定保驾护航大数据应用往往涉及组件多、系统庞杂、开源与自研混合,因此维护升级困难,稳定性风险极高。云HBase GraphDB提供的全托管服务相比其他的半托管服务以及用户自建存在天然的优势。依托持续8年在内核和管控平台的研发,以及大量配套的监控工具、跨可用区、跨域容灾多活方案,GraphDB的底层核心阿里云HBase提供目前业界最高的4个9的可用性(双集群),11个9的可靠性的高SLA的支持,满足众多政企客户对平台高可用、稳定性的诉求。使用阿里云GraphDBGraphDB引擎包含在HBase 2.0版本中,用户在购买云上HBase数据库服务时,可以选择GraphDB作为其图数据引擎。GraphDB引擎本身并不额外收费,对于需要使用图数据功能的用户而言,将大幅降低应用和开发成本。了解更多关于阿里云云数据库HBase及图引擎GraphDB请戳链接:产品入口:https://cn.aliyun.com/product/hbase?spm=5176.224200.100.35.7f036ed6YlCDxm帮助文档:https://help.aliyun.com/document_detail/92186.html?spm=a2c4g.11174283.6.610.260d3c2eONZbgs本文作者:恬泰阅读原文本文为云栖社区原创内容,未经允许不得转载。

January 2, 2019 · 1 min · jiezi

手机秒变IoT设备?——巧妙利用阿里云物联网平台

摘要: 手机秒变IoT设备?什么?嵌入五行代码可以实现用户定位,用户在线数量统计,还能和云端消息交互?免费的MQ?谁用谁知道~作者序什么?嵌入五行代码可以实现用户定位,用户在线数量统计,还能和云端消息交互!没错得益于阿里云物联网套件创建设备免费,消息收费也只有百万消息三块六(先使用后付费,不满不要钱),尤其对于学生党来说,基本是用不了这么多,也就意味着免费!(学生党福音[手动滑稽])Talk is cheap,show me the codepublic static void main(String[] args) { //去阿里云官网上创建一个产品,设置好地理位置属性。可以变相用做分组 String productKey = “<your productKey>”; //english name only String deviceName = “anyDeviceName”; //自动创建设备的构造方法 Simulator simulator = new Simulator(productKey, deviceName); //如果已经有了三元组(productKey, deviceName, deviceSecret)可以使用下面的构造方法 // Simulator simulator = new Simulator("<your productKey>", “<your deviceName>”, “<your deviceSecret>”); simulator.connect(msgJson -> { System.out.println(“received: " + msgJson); //可以变相当成mq使用,执行收到消息之后的逻辑 }); //可以放在带有定位的设备中,手机,手表等等。通过api获取经纬度上报 UplinkMessage uplinkMessage = new UplinkMessage() .put(“GeoLocation”, new GeoLocation(122.250852f,30.193851f, 12f, 2)); //可以根据产品定义上报额外属性 //.put(“PM25”, 60) //.put(“CO2Value”, 123) //.put(“HeatSwitch”, 0) //.put(“LightSwitch”, 1); simulator.uplink(uplinkMessage); }(咳咳,精简一下差不多能五行。)同学们看一下代码里的注释,麻雀虽小,五脏俱全呢。整体目录结构是这样的,不久就放到github上,迫切需要的烙铁可以进钉钉群21939141艾特群主要代码How to use用法看起来是比较简单的,唯一需要的是三个关键key:productKey (传入到Simulator构造方法里)AppKey (配置到api.json)AppSecret(配置到api.json)这三个key不需要编码,上阿里云申请就可以。请看分解动作:productKey访问阿里云物联网控制台创建一个高级版产品(高级版也不收费,功能更强大), 分类选择自定义,后续我们为他定义功能。查看你的产品,在功能定义里添加一个地理位置功能(其他类型中搜索后任选一个)敲黑板!! 拿出小本本记住你的ProductKeyAppKey&AppSecret访问物联网开发者平台控制台创建一个自定义项目进入你的项目,点击左侧菜单栏软件开发>web应用, 创建一个web应用(前端应用)点击进入你的web应用,能看到AppKey和AppSecret敲黑板!! 拿出小本本记住你的AppKey和AppSecretReady?go!参数都设置好之后运行程序。在在空间数据可视化中创建一个二维场景,选择你之前创建的产品。一切顺利的话你可以看到如下画面不好意思设备名填了girlFriend - -,并设置到了海里。当然你也可以用来统计你的客户端数量(用户数)和消息收发情况enjoy!本文作者:侯吉阅读原文本文为云栖社区原创内容,未经允许不得转载。 ...

December 29, 2018 · 1 min · jiezi

管理日志、IoT和事件数据的设计模式

Trafodion在IoT(物联网)空间、电信和网络安全中的一个常见应用场景是用一个非常大的单表,记录实时事件。用户希望快速摄取新数据,查询数据,并清理过时的数据。对于这种情况,我们一般建议客户使用一种设计模式。该模式包含三个要素:Salting、分块和Stripe合并。Salting第一个要素是salting,在集群中平均分布数据。通过salting 不仅平均分布全部数据,而且在集群中的所有节点均匀分布热(最新)数据。Salting基于哈希散列,运用哈希散列函数计算每一行的 region 号。一般情况下,这是基于运营型查询中使用的一列或多列,比如客户id或设备id。Trafodion自动管理salt。计算哈希散列函数,并自动对Salt列执行条件判断。SQL的Insert、Select和Delete语句不需要任何特殊的操作。数据均匀分布之后,我们面临下一个问题——选择一个恰当的行键。为了让数据查询、过时数据清理和合并更容易,我们需要在每个region的末尾添加新行,但并不是随机添加。我们还希望按日期范围对时间序列的数据进行查询,并对其他重要的列(例如,customer id或device id)进行查询。为了实现以上两个目标,我们紧接着在salt后面采用了另一个键前缀——分块标识(divisionid)。分块是一个时间范围,比如一天、一周或一个月。它将该时间范围内所有的行全部归并在一起,以便我们选择一列(例如,customer id)作为主键列。这类情景中典型的运营型查询如下所示:SELECT * FROM tWHERE cust_id = x AND transaction_timestamp BETWEEN y AND z在cust_id上做Salting可确保用户x的所有行均放在同一个HBase region 中。Trafodion通过对该salt列进行条件判断,确保查询仅访问该 region 服务器。分块按列分块确保我们只需要读取相关时间范围中的数据,而非多年的历史数据。此外,我们能够使用cust_id作为主键列,从而在数百万用户数据中迅速为我们的用户锁定所需数据。有时我们想要查询多位用户的数据和多天的数据。Trafodion采用独特的多维访问方法(MDAM)将多个复杂的条件判断分离,只扫描相关范围,略过中间不需要的数据,从而有效地实现该目标。我们已经证明,通过salting和分块,很容易在时间结构表中插入数据,并且在查询时仅需要访问特定时间范围和关键列中的所需的数据。Stripe合并还有两个容易忽视的问题:数据过时处理和HBase主合并。为此,HBase的stripe合并可以起到很大的作用。将HBase region中的数据分成多个stripe,每个Strip对应一个键的范围(比如每个stripe中存储一个月的数据)。只合并这些stripe内的文件。这意味着数月不曾改变的历史数据不需要通过压缩重复改写。这些数据保持原状,直到过时(即删除)。到那时,一些“stripe”中的数据清空,然后与更新的非空stripe合并。总之:Trafodion和HBase提供了三个强大的设计要素,使您能够在一个表中存储大量基于时间的数据。对于SQL查询,salting、分块和stripe合并是透明的。通过这三个要素可以有效地实现数据摄取、查询和过时处理。

December 26, 2018 · 1 min · jiezi

阿里巴巴在内蒙古旱区试水物联网灌溉技术,一年省出1.5个西湖

阿里巴巴正用物联网技术解决干旱地区的灌溉问题,通过搭建农业物联网平台,全面监测农作物的生长状态,从而匹配最节约的灌溉方案。12月19日试验区研究人员得出预测结果:一年可以省出1.5个西湖的水。一直以来干旱是困扰人类的重要环境问题,2000年前曾导致玛雅文明的毁灭。在现代中国,干旱问题依然存在,数据显示2017年全国3亿亩耕地就受干旱威胁。导致无水可浇的不只是自然原因,更多是人为导致。在内蒙古巴林右旗,据当地林业局透露,地下水位的大幅下降从近几年开始,耕种者用机电井等设备大规模抽水漫灌,最严重的地区水位下降18米。改变这种粗放型灌溉方式,是阿里巴巴解决问题的切入点。阿里云物联网技术专家谢士杰表示:“精细化灌溉的前提是准确了解作物的生长情况,及周边的环境条件,农业物联网是解决这些问题的前提。”沙漠国家以色列,正是用这一方式实现了农业史上的奇迹,高度智能化的灌溉系统像空气一样随处存在。农产品不仅满足了本国需求,还大量出口欧洲。在国内,智能化的灌溉系统受到成本、技术等诸多因素的限制。但阿里云已经同京蓝科技一起在巴林右旗进行了首次尝试。通过对气温、光照、湿度以及蒸腾量等环境条件的长时间监测,判断环境因子和作物生长各方面的关系,形成专家决策系统,对作物生长环境精准化控制,指挥草原上的灌溉设备浇水。什么时候浇水、浇多少水都由这个智能系统来决定。据估算,巴林右旗因此一年可以节省1550万立方米的水,相当于省出1.5个西湖,当地地下水位也已停止下降。谢士杰表示:“整个过程包含了设备管理、空间管理、数据汇聚、环境监测、水肥一体化等,形成平台后可以更大规模推广。”据了解,阿里巴巴还计划通过物联网在农场侧进行边缘计算,提高灌溉决策的实时性。用科技改造人类赖以生存的农业已经是全球趋势。日本正用互联网实现种植技术与知识的数据化,从而使得这些宝贵的经验被下一代农户和农企继承。美国则在研发可以自己采摘苹果的机器人,提高工作效率。本文作者:阿里云头条阅读原文本文为云栖社区原创内容,未经允许不得转载。

December 20, 2018 · 1 min · jiezi

30 行 Javascript 代码搞定智能家居系统

本文首发于『阿里云 IoT 开发者社区』,更多精彩物联网内容欢迎前往浏览。智能家居可谓是今年物联网的热门领域,通过智能单品和智能音箱,人们已然把『智能』两个字变成了生活的理所应当。搭建云上之家除了买买买,还能 DIY。依托阿里云物联网平台,我们用 30 行代码来搞定一套智能家居解决方案。常见的智能家居解决方案包括了设备端、上云、应用端三大部分,更广的还涉及大数据及人工智能。传统的物联网开发非常强调流程性,即设备端、云、应用端三个步骤需要依次进行。而今天,依托于阿里云物联网平台的『物模型』基础,物联网开发的两端可以齐头并进,节省大量的人力物力成本。齐头并进显然很诱人,但是能否再更进一步,一人 Handle 全部开发呢?答案是 YES!目前,有大量互联网开发者由于缺乏嵌入式开发能力,如C/C++语言基础,止步于物联网蓝海的大门。通过阿里云 IoT 提供的 TinyEngine 引擎,可以快速使用 Javascript 进行设备端开发,完美解决这部分开发者的心头大患。而针对不熟悉前后端开发的嵌入式开发者,阿里云物联网平台一样提供了『可视化搭建应用』等快速上手的功能,零代码实现应用开发,大大减轻学习负担。下面我们就使用阿里云物联网开发平台的 TinyEngine 引擎和可视化搭建功能,30 行代码快速开发一个由灯和温湿度计组成的智能家居系统。一、开通服务首先,申请阿里云账号,并开通登陆 Link Develop 一站式开发平台:https://linkdevelop.aliyun.com。之后,新建项目(项目名任意)—— 设备开发 —— 新增产品 —— 所属分类按需选择『灯』或『温湿度计』,通讯方式选择 WiFi ,数据格式选择Alink —— 完成。完成后选择『设备开发』标签页 —— 新增调试设备,记录下设备三元组。二、设备开发打开嵌入式 Javascript 在线工作台(没错,开发环境都不用搭建),创建新项目。替换 index.js代码:1. 灯var deviceShadow = require(‘deviceShadow’);var ledHandle = GPIO.open(“led1”);deviceShadow.bindDevID({ productKey: “”, deviceName: “”, deviceSecret: “”});function main(err){ if(err){ console.log(“连接平台失败”); }else{ console.log(“主程序开始”); deviceShadow.addDevSetPropertyNotify(“LightSwitch”, function (lightStatus) { GPIO.write(ledHandle, 1-lightStatus); }); var mainLoop = setInterval(function () { var ledStatus = GPIO.read(ledHandle); deviceShadow.postProperty(“LightSwitch”, 1-ledStatus); }, 2000); }}deviceShadow.start(main);2. 温湿度计var deviceShadow = require(‘deviceShadow’);var shtc1 = require(‘shtc1’);var handle = new shtc1(‘shtc1’);var ledHandle = GPIO.open(“led”);deviceShadow.bindDevID({ productKey: “a17vi82MmxP”, deviceName: “0001”, deviceSecret: “tYUngSMqYeDxODgtX3DNKkQ7920I3t4T”});function main(err) { if (err) { console.log(“连接平台失败”); } else { console.log(“主程序开始”); var mainLoop = setInterval(function () { var val = handle.getTempHumi(); console.log(‘shtc1:temp=’ + val[0] + ’ humi:’ + val[1]); deviceShadow.postProperty(“CurrentTemperature”, val[0]); deviceShadow.postProperty(“RelativeHumidity”, val[1]); }, 2000); }}deviceShadow.start(main);将设备连接至电脑,点击『连接』并『运行』,设备启动后会自动加载并运行index.js这个文件,同时上报数据至阿里云物联网平台。三、应用开发既然是系统,没有应用可不行,我们利用可视化搭建功能 0 代码快速完成一个应用,只需依次拖入仪表盘和开关组件,替换图片,绑定设备即可完成全部操作。齐活,短短 30 行代码搭建出的端到端智能家居系统就完成了,保存发布后就可以分享给他人访问了。*配合的 TinyEngine 引擎和可视化搭建,开发者无需学习新的编程语言,即可无缝快速切入物联网开发,也彰显了阿里云物联网平台的包容性和独创性。各位开发者,赶紧丢掉犹豫,上手试试吧!https://linkdevelop.aliyun.com本文作者:cxlwill阅读原文本文为云栖社区原创内容,未经允许不得转载。 ...

December 11, 2018 · 1 min · jiezi

MQ消息队列产品测试

一、产品背景消息队列是阿里巴巴集团自主研发的专业消息中间件。 产品基于高可用分布式集群技术,提供消息订阅和发布、消息轨迹查询、定时(延时)消息、资源统计、监控报警等一系列消息云服务,是企业级互联网架构的核心产品。 MQ 目前提供 TCP 、MQTT 两种协议层面的接入方式,支持 Java、C++ 以及 .NET 不同语言,方便不同编程语言开发的应用快速接入 MQ 消息云服务。 用户可以将应用部署在阿里云 ECS、企业自建云,或者嵌入到移动端、物联网设备中与 MQ 建立连接进行消息收发,同时本地开发者也可以通过公网接入 MQ 服务进行消息收发。从官方文档中看到MQ消息队列的产品为一个提供消息服务的中间件,可以提供端到云的消息服务,这个端的覆盖面包括了移动端和IOT物联网设备,并且为了支持IOT的需要除TCP协议外提供了MQTT来支持物联网设备的消息服务,在云上的支持不止包括阿里云,可以支持用户将服务部署在企业自建云上。作为PAAS层的服务支持用户通过API的方式将消息队列服务集成在自己的平台上,目前在产品的结构上分成两部分,移动端和物联网的消息队列服务单独作为一个子产品MQ FOR IOT提供服务,这项服务和MQ主服务比主要的区别就是增加了对MQTT通讯协议的支持。从编程语言来看,因为MQ FOR IOT是面向移动端和物联网,所以需要支持的编程语言更多,包括ANDROID、IOS和PYTHON环境在消息队列服务中都已经支持。二、消息队列MQ产品测试开通服务进入控制台后看到菜单将消息队列服务清晰的分成两部分,支持MQTT的微消息服务单独列出子菜单,菜单选项按照功能分成三大部分,生产管理类子菜单,消息查询追踪类子菜单和监控报警类子菜单。TOPIC是消息队列服务中一个重要概念,用于区分消息的不同类型,比如在一次交易中,用户对于商品所下的订单和支付的订单虽然针对的是同一件事情,但是对于消息队列来说,这两种消息的功能和类型有明显的不同,可以用不同的TOPIC来区分,在TOPIC下还有个标签TAG用于二级分类,如一个用户对不同商品的购买订单可以作为不同的TAG。针对消息的配置来讲,需要定义消息的名字和消息的类型。在类型上普通消息、事务消息、定时消息、分区消息等都可以将不同类型的TOPIC根据类型区分。将TOPIC按什么类型进行分类及归入哪个分类需要用户根据实际情况进行确定。除了TOPIC外,对于一条消息,还有三个独特的属性可以为查询提供方便,生产者的编号(PRODUCT ID)、消费者的编号(CONSUMER ID)和消息编号(MESSAGE ID),加上TOPIC的配置,可以准确定义海量消息中的每一条,方便查询和监控等功能的支持。消息路由是指的在不同地域间的消息同步,需要配置源地域和TOPIC、目标地域和TOPIC,从最新写入源的消息开始进行同步。资源报表分成两个子项,生产者和消费者,可以对于消息的两个源头的情况进行查看,如果需要对于消息服务的可以在监控报警设置中进行配置,对于消息的报警项,有两个重要指标堆积量和消息延迟,分别从数量和时间对于消息服务的异常情况进行报警,通过短信方式通知用户。三、微消息队列MQ FOR IOT产品测试从微消息队列的按量付费的计费项目就可以看出物联网在消息通讯上的几个主要特征,即时连接数、订阅消息数和消息收发量。万物互联后物联网设备的消息数在这三个维度都会到达海量的程度,特别是即时连接这个特点和一般的MQ服务有很大不同,可以代表物联网中消息传递的特征。此外,微消息队列服务对于消息的分类同一般MQ服务不同的是,将TOPIC分成父TOPIC和子TOPIC的方式而不是TOPIC和TAG的分类方式,子TOPIC从属于父TOPIC,这个特点我想也是因为需要支持物联网的关系,因为传统下的消息都是针对应用比较多,但是物联网情况下,消息的类型如设备的状态、工业监测数据等会比一般情况多的多,并且消息服务的实时性要求更高,所以将TOPIC设置成父子从属关系更有利于对海量不同类型的消息进行区分。本文作者:朱祺阅读原文本文为云栖社区原创内容,未经允许不得转载。

December 6, 2018 · 1 min · jiezi

工业物联网常见的工业协议简介

[TOC]前言在目前软件事业部有很大一部分是传统IT从业人员,对于工业控制协议比较陌生,因此再做工业大数据采集时,对于各类工业协议有时容易搞不清楚,我简单把在做工业大数据采集时常见的几种工业协议整理了一下,以便搞清这些工业协议的概念和区别。OSI(Open System Interconnect)参考模型常见的工业协议按照OSI(Open System Interconnect)参考模型分到了不同层次这只是为了容易理解和区分各类协议,实际上,随着各种协议的发展,很多自身都跨越了很多层次,能够实现多层协议的功能,我们做的划分只是它最重要的功能所处的协议层。物理层RS232在串行通讯时,要求通讯双方都采用一个标准接口,使不同的设备可以方便地连接起来进行通讯。RS-232-C接口是目前最常用的 一种串行通讯接口。RS-232-C是美国电子工业协会EIA(Electronic IndustryAssociation)制定的一种串行物理接口标准。RS是英文“推荐标准”的缩写,232为标识号,C表示修改次数(“RS-232-C”中的“-C”只不过表示RS-232的版本,所以与“RS-232”简称是一样的) 。RS-232-C总线标准设有25条信号线,包括一个主通道和一个辅助通道。工业控制的RS-232口一般只使用RXD、TXD、GND三条线。通常 RS-232 接口以9个引脚 (DB-9) 或是25个引脚 (DB-25) 的型态出现,一般个人计算机上会有两组 RS-232 接口,分别称为 COM1 和 COM2。RS485随着企业信息化法发着的需要,企业在仪表选型时其中的一个必要条件就是要具有联网通信接口。最初是数据模拟信号输出简单过程量,后来仪表接口是RS232接口,这种接口可以实现点对点的通信方式,但这种方式不能实现联网功能。随后出现的RS485解决了这个问题。485通讯接口一个对通讯接口的硬件描述,它只需要两根通讯线,即可以在两个或两个以上的设备之间进行数据传输。这种数据传输的连接,是半双工的通讯方式。在某一个时刻,一个设备只能进行发送数据或接收数据。而RS232是全双工,最少3条通信线(RX,TX,GND),因为使用绝对电压表示逻辑,由于干扰,导线电阻等原因,通讯距离不远,低速时几十米也是可以的。在RS232或RS485设备联成的设备网中,如果设备数量超过2台,就必须使用RS485做通讯介质,RS485网的设备间要想相互通信息只有通过“主(Master)”设备中转才能实现,这个主设备通常是PC,而这种设备网中只允许存在一个主设备,其余全部是"从(Slave)“设备。而现场总线技术是以ISO/OSI模型为基础的,具有完整的软件支持系统,能够解决总线控制、冲突检测、链路维护等问题 。数据链路层CAN控制器局域网CAN( Controller Area Network)属于现场总线的范畴,是一种有效支持分布式控制系统的串行通信网络。是由德国博世公司在20世纪80年代专门 为汽车行业开发的一种串行通信总线。由于其高性能、高可靠性以及独特的设计而越来越受到人们的重视,被广泛应用于诸多领域。CAN协议分为二层:物理层和数据链路层。CAN的信号传输采用短帧结构,传输时间短,具有自动关闭功能,具有较强的抗干扰能力。CAN支持多主工作方式,并采用了非破坏性总线仲裁技术,通过设置优先级来避免冲突,通讯距离最远可达10KM/5Kbps/s,通讯速率最高可达40M /1Mbp/s,网络节点数实际可达110个。由于CAN总线本身的特点,其应用范围目前已不再局限于汽车行业,而向自动控制、航空航天、航海、过程工业、机械工业、纺织机械、农用机械、机器人、数控机床、医疗器械及传感器等领域发展;ProfiBusProfiBus是德国标准(DIN19245)和欧洲标准(EN50170)的现场总线标准。由PROFIBUS–DP、PROFIBUS-FMS、PROFIBUS-PA系列组成。DP用于分散外设间高速数据传输,适用于加工自动化领域。FMS适用于纺织、楼宇自动化、可编程控制器、低压开关等。PA用于过程自动化的总线类型,服从IEC1158-2标准。PROFIBUS是一种用于工厂自动化车间级监控和现场设备层数据通信与控制的现场总线技术。可实现现场设备层到车间级监控的分散式数字控制和现场通信网络,从而为实现工厂综合自动化和现场设备智能化提供了可行的解决方案。该标准广泛适用于制造业自动化、流程工业自动化和楼宇、交通电力等其他领域自动化。应用层ModBusModbus是由Modicon(现为施耐德电气公司的一个品牌)在1979年发明的,是全球第一个真正用于工业现场的总线协议。ModBus网络是一个工业通信系统,由带智能终端的可编程序控制器和计算机通过公用线路或局部专用线路连接而成。其系统结构既包括硬件、亦包括软件。它可应用于各种数据采集和过程监控。ModBus网络只有一个主机,所有通信都由他发出。网络可支持247个之多的远程从属控制器,但实际所支持的从机数要由所用通信设备决定。采用这个系统,各PC可以和中心主机交换信息而不影响各PC执行本身的控制任务。Modbus协议是应用于电子控制器上的一种通用语言。==通过此协议,控制器相互之间、控制器经由网络(例如以太网)和其它设备之间可以通信==。它已经成为一通用工业标准。有了它,不同厂商生产的控制设备可以连成工业网络,进行集中监控。此协议定义了一个控制器能认识使用的消息结构,而不管它们是经过何种网络进行通信的。它描述了一控制器请求访问其它设备的过程,如何回应来自其它设备的请求,以及怎样侦测错误并记录。它制定了消息域格局和内容的公共格式。==Modbus是通讯协议,而RS232、RS485只能代表通讯的物理介质层和链路层。==Modbus协议支持传统的RS-232、RS-422、RS-485和以太网设备。许多工业设备,包括PLC,DCS,智能仪表等都在使用Modbus协议作为他们之间的通讯标准。软件接口OPCOPC全称是Object Linking and Embedding(OLE) for Process Control,它的出现为基于Windows的应用程序和现场过程控制应用建立了桥梁。在过去,为了存取现场设备的数据信息,每一个应用软件开发商都需要编写专用的接口函数。由于现场设备的种类繁多,且产品的不断升级,往往给用户和软件开发商带来了巨大的工作负担。通常这样也不能满足工作的实际需要,系统集成商和开发商急切需要一种具有高效性、可靠性、开放性、可互操作性的即插即用的设备驱动程序。在这种情况下,OPC标准应运而生。OPC标准以微软公司的OLE技术为基础,它的制定是通过提供一套标准的OLE/COM接口完成的,在OPC技术中使用的是OLE 2技术,OLE标准允许多台微机之间交换文档、图形等对象。总结大致上可以这样理解,RS232、RS485是硬件接口技术,CAN、ProBus等是现场总线技术,ModBus是工业控制协议,OPC是网络数据接口

November 15, 2018 · 1 min · jiezi

在物联网中应用机器学习

欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~本文由未来守护者发表于云+社区专栏本项目探讨如何将机器学习(Machine learning)应用到物联网(IoT,Internet of Things)中。我们将使用 Android Things 作为我们的物联网平台,并且采用 Google TensorFlow 作为我们的机器学习引擎。如今,机器学习与物联网都是技术话题中的大热门。下面是维基百科上对机器学习的一个简单定义:机器学习是计算机科学中的一个领域,它使计算机系统能够利用数据进行 “学习”(即逐步提高特定任务的性能),而不需要进行显式编程(Explicitly programmed)。换句话说,在进行训练步骤以后,系统就可以预测结果(即使这不是专门为这些结果进行编程的)。另一方面,我们都了解物联网以及连接设备的概念。最有前途的话题之一便是如何将机器学习应用于物联网之中,以构建能够 “学习” 的专家系统。此外,该系统会运用这些知识来控制和管理实物。下面列举一些应用到机器学习,以及物联网能产生重要价值的领域:预测维护(Predictive maintenance)中的工业物联网(IIoT,Industrial IoT)。在消费者物联网(Consumer IoT)中,机器学习可以使设备变得更加智能化,从而适应我们的习惯。在本教程中,我们将探索如何使用 Android Things 和 TensorFlow 将机器学习应用到物联网中。这一 Android Things 物联网项目背后的基本思想就是,探索如何构建一个能够识别一些基本形状(比如箭头)并被控制的机器人小车(Robot car)。我们已经介绍过如何使用 Android Things 构建机器人小车,我建议您在开始此项目之前先阅读那篇教程。本次机器学习和物联网项目主要涵盖以下主题:如何使用 Docker 配置 TensorFlow 环境如何训练 TensorFlow 系统如何集成 TensorFlow 与 Android Things如何使用 TensorFlow 输出结果来控制机器人小车本项目衍生自 Android Things TensorFlow 图像分类器。我们开始吧!如何在 Tensorflow 中创建一个图像分类器在开始之前,我们有必要先安装并配置好 TensorFlow 环境。我并非机器学习专家,所以我需要找一些速成的东西并准备好使用,以便我们可以构建 TensorFlow 图像分类器。因此,我们可以使用 Docker 来运行一个搭载了 TensorFlow 的映像。照着以下步骤进行:1. 克隆 TensorFlow 仓库:git clone https://github.com/tensorflow/tensorflow.gitcd /tensorflowgit checkout v1.5.02. 创建一个目录(/tf-data),该目录将保存我们在项目中需要用到的所有文件。3. 运行 Docker:docker run -it --volume /tf-data:/tf-data --volume /tensorflow:/tensorflow \ –workdir /tensorflow tensorflow/tensorflow:1.5.0 bash使用这些命令,我们就可以运行一个交互式 TensorFlow 环境并增加(Mount)一些我们将在项目中使用到的目录。如何训练 TensorFlow在 Android Things 系统能够识别图像之前,我们有必要先训练 TensorFlow 引擎,以构建其模型。以此为由,收集一些图片是有必要的。如前所述,我们希望使用箭头来控制 Android Things 机器人小车 —— 所以我们必须收集至少四种类型的箭头:向上箭头向下箭头左箭头右箭头为训练该系统,我们有必要对这四种不同的图像类别创建一个“知识库”。在 /tf-data 中一个名为 images 的目录下创建四个目录,命名如下:up-arrowdown-arrowleft-arrowright-arrow现在是时候去搜集图像资源了。我使用的是 Google 图片搜索,您也可以使用其他方法进行搜集。为了简化图片下载过程,您应该安装 Chrome 插件,它能够一键下载所有图片。可别忘了,您下载的图像越多,其训练过程(Training process)越好(即使创建模型的时间可能会有所增加)。打开浏览器,开始查找以下四类图像:每个类别我分别下载了 80 张图。我并不关心图片的扩展。一旦所有类别都有其图像,请按照以下步骤操作(在 Docker 界面中):python /tensorflow/examples/image_retraining/retrain.py \ –bottleneck_dir=tf_files/bottlenecks --how_many_training_steps=4000 --output_graph=/tf-data/retrained_graph.pb --output_labels=/tf-data/retrained_labels.txt --image_dir=/tf-data/images这操作可能需要花费一些时间,所以要耐心等待。最后,在你的文件夹 /tf-data 中应有两个文件:retrained_graph.pbretrained_labels.txt第一个文件包含我们的模型,这是 TensorFlow 训练过程的结果。而第二个文件则包含了与我们的四个图像类别相关的标签。如何测试 Tensorflow 模型如果你想测试模型,以检查一切是否正常,你可以使用以下命令:python scripts.label_image --graph=/tf-data/retrained-graph.pb --image=/tf-data/images/[category]/[image_name.jpg]优化模型在能够使用这个 TensorFlow 模型到 Android Things 项目中之前,我们有必要优化它:python /tensorflow/python/tools/optimize_for_inference.py --input=/tf-data/retrained_graph.pb --output=/tf-data/opt_graph.pb --input_names=“Mul” --output_names=“final_result"这就是我们的模型。我们将使用此模型将机器学习应用于物联网(即集成 Android Things 与 TensorFlow)。其目标是为 Android Things 应用提供智能识别箭头图像,并作出相应反应,从而控制机器人小车的方向。如果您想了解更多关于 TensorFlow 的细节,以及如何生成模型,请查看官方文档和这个教程。如何使用 Android Things 和 TensorFlow 将机器学习应用到物联网中一旦 TensorFlow 数据模型准备就绪,我们就可以进入下一步:如何集成 Android Things 与 TensorFlow。为达成这一目的,我们可以将此任务分为两步:硬件部分,我们将电机和其他外围设备(Peripheral)连接到 Android Things 板上实现应用程序Android Things 原理图在深入探讨如何连接外围设备之前,我们先看看下面这个 Android Things 项目中使用的组件列表:Android Things 板(树莓派 3,Raspberry Pi 3)树莓派相机一个 LED 灯LN298N 双H桥(用以控制电机)带两个轮子的机器人小车底盘我不在此介绍如何使用 Android Things 控制电机,因为我们已经在之前的文章中介绍过这一点。以下是原理图:上图中,相机组件并未表现出来。其最终的结果如下:基于 TensorFlow 实现 Android Things App最后一步便是实现 Android Things 应用程序。为此,我们可以重用 GitHub 上名为 TensorFlow 图像分类器示例的示例项目。在开始之前,先克隆 GitHub 仓库,以便您可以修改源代码。该 Android Things 应用与原来的应用有所不同,在于:它不使用按钮来启动相机捕捉图像它使用不同的模型它使用一个闪烁的 LED 进行通知,摄像机在 LED 停止闪烁后拍摄照片它在 TensorFlow 检测到图像(箭头)时控制电机。此外,在从步骤 3 开始循环之前,先打开电机 5 秒要处理闪烁的 LED,请使用以下代码:private Handler blinkingHandler = new Handler();private Runnable blinkingLED = new Runnable() { @Override public void run() { try { // If the motor is running the app does not start the cam if (mc.getStatus()) return ; Log.d(TAG, “Blinking..”); mReadyLED.setValue(!mReadyLED.getValue()); if (currentValue &lt;= NUM_OF_TIMES) { currentValue++; blinkingHandler.postDelayed(blinkingLED, BLINKING_INTERVAL_MS); } else { mReadyLED.setValue(false); currentValue = 0; mBackgroundHandler.post(mBackgroundClickHandler); } } catch (IOException e) { e.printStackTrace(); } }};当 LED 停止闪烁时,应用程序将捕获图像。现在有必要关注如何根据检测到的图像来控制电机。修改方法如下:@Overridepublic void onImageAvailable(ImageReader reader) { final Bitmap bitmap; try (Image image = reader.acquireNextImage()) { bitmap = mImagePreprocessor.preprocessImage(image); } final List&lt;Classifier.Recognition&gt; results = mTensorFlowClassifier.doRecognize(bitmap); Log.d(TAG, “Got the following results from Tensorflow: " + results); // Check the result if (results == null || results.size() == 0) { Log.d(TAG, “No command..”); blinkingHandler.post(blinkingLED); return ; } Classifier.Recognition rec = results.get(0); Float confidence = rec.getConfidence(); Log.d(TAG, “Confidence " + confidence.floatValue()); if (confidence.floatValue() &lt; 0.55) { Log.d(TAG, “Confidence too low..”); blinkingHandler.post(blinkingLED); return ; } String command = rec.getTitle(); Log.d(TAG, “Command: " + rec.getTitle()); if (command.indexOf(“down”) != -1) mc.backward(); else if (command.indexOf(“up”) != -1) mc.forward(); else if (command.indexOf(“left”) != -1) mc.turnLeft(); else if (command.indexOf(“right”) != -1) mc.turnRight();}在这种方法中,当 TensorFlow 返回匹配捕获图像的可能标签后,应用程序会将结果与可能的方向进行比较,从而控制电机。最后,是时候使用在刚开始时创建的模型了。拷贝 assets 文件夹下的 opt_graph.pb 与 reatrained_labels.txt 文件,并替换现有文件。打开 Helper.java 并修改以下几行:public static final int IMAGE_SIZE = 299;private static final int IMAGE_MEAN = 128;private static final float IMAGE_STD = 128;private static final String LABELS_FILE = “retrained_labels.txt”;public static final String MODEL_FILE = “file:///android_asset/opt_graph.pb”;public static final String INPUT_NAME = “Mul”;public static final String OUTPUT_OPERATION = “output”;public static final String OUTPUT_NAME = “final_result”;运行应用程序,试试向相机展示箭头,并检查结果。机器人小车必须按照所示的箭头进行移动。小结在本教程的最后,我们介绍了如何运用 Android Things 与 TensorFlow 将机器学习应用到物联网中。我们可以使用图像控制机器人小车,并根据显示的图像移动机器人小车。相关阅读【每日课程推荐】机器学习实战!快速入门在线广告业务及CTR相应知识 ...

November 9, 2018 · 3 min · jiezi