DIY带数据的NFC“袖扣”

NFC近场通讯技术一直是物联网的经典应用。

这一次,我们将向大家介绍如何制作一对NFC数据袖扣。

小小的一个NFC袖扣,非常适合存储网站URL,密码或其他机密信息。适用于喜欢Dry Martinis的绅士间谍(007),或者经常忘记Wi-Fi密码的普通群众……

NFC技术

NFC允许两个设备在物理上彼此靠近时进行无线通信。随着RFID的发展,NFC在消费级技术中变得越来越流行,并且已经普遍用于非接触式支付系统和标识徽章。NFC腕带也被用于为主题公园或其他场所的游客创造更好的体验。

NFC的发展也没有忽视业余爱好者和创客,Pimoroni和Adafruit等公司出售的配件使得大家在项目中添加NFC功能变得较为容易。

在这里,我们将用智能手机或外部NFC读写器来编码微小的NFC标签。

由于该类标签可以透过非金属屏障(例如塑料)被读取,因此我们将其嵌入树脂中,可以做成精美的装饰袖扣。将其与智能手机或NFC阅读器相连,你就可以将数据读取或写入芯片。

微型NFC/RFID应答器

在该项目中,我们使用了最小的NFC标签,即Adafruit提供的微型NFC/RFID应答器(产品编号2800)。这些15.6mm x 6mm柔性标签采用现在的标准NDEF格式进行格式化,并且可以与更新的电话和大多数NFC读取器一样使用。

如果你碰巧拿到了较旧的Mifare Classic格式标签,则可能需要将它们重新格式化为NDEF才能与你的读取器/写入器一起使用。

重新格式化不是大多数NFC读/写应用程序的功能,但可以使用Adafruit的PN532 NFC/RFID控制器分线板或屏蔽板来完成。

接下来是一些制作工艺。

环氧树脂分为两部分,使用前必须等比例混合在一起。在进入固化阶段并完全硬化之前,树脂形状可在短时间内进行调整。

弄清楚到底要混合多少树脂和固化剂绝对是一门艺术。甚至还有一些在线工具可以帮你进行计算。不过对于这样的小型项目,稍微超出比例也没什么关系。

如果你不想在浇注的时候搞砸,必须在固化前最后一分钟快速搅拌。如果你要给树脂着色,你得把杯里的树脂和染色剂充分拌匀。

如果你不满足于一对袖扣,也可以将NFC标签和树脂做成别的饰品,例如吊坠或钥匙链、表链。这些都可以作为重要节日或生日的礼物送给朋友,同时还能体现一下你的技术和工艺水准。

树脂铸造的饰品已经流行了几十年,在工艺品商店和网上有很多树脂模具可供选择。最好的树脂模具是用硅树脂做的。

柔性硅胶模具可轻松脱落固件,并产生有光泽的表面。而袖扣坯,戒指坯和吊坠都可以在珠宝供应商店里买到。

选择袖扣和环形坯时,请参考你的模具, 以确保这些坯与你选择的铸坯尺寸一致,反之亦然。

浇注须知

首先收集好必要的材料并布置你的工作环境以便使用树脂。期间会有很多搅拌,倾倒和滴落的事情发生,记得用纸覆盖工作区,并在附近准备一些纸巾。

阅读并注意树脂和固化剂上的安全警告。尽管按说明书使用某些树脂被认为是无毒的,但我们依然建议你在通风良好的地方工作并戴上丁腈手套,以便在工作时使树脂远离你的皮肤。

一旦将两部分树脂混合在一起,硬化之前你将没什么时间倒入树脂,因此提前计划好份量和比例是关键。

检查树脂上标明的“可使用时间”,这是混合后树脂开始硬化之前的工作时间。比如我这里用的树脂“可使用时间”为30分钟。设置计时器可能会很有帮助,这样你可以跟踪进度。

如果你有多个模具,请在树脂混合之前确定要使用哪一个类型,并确保NFC标签适合你计划中要的形状。比如15.6mm小标签非常适合16mm大小的饰品。如果要制作匹配的两个袖扣饰品,请记住,你将需要两个相同的模具形状,而且混合树脂的量一定要比两个袖扣饰品加起来的所需树脂稍微多一些。

准备NFC标签

拆开NFC标签,并确保它们干净并且可以嵌入树脂中。如果为了点亮效果,你可能希望将数据标签与LED标签结合使用,就像我们在其他产品中所做的那样。NFC LED指甲贴纸的背面具有粘性,因此很容易将其直接粘贴到较大的数据标签上。

测量,混合并倒入

我们混合了约6盎司(170克)树脂,然后将其染成绿色,以呈现高科技翡翠的外观。这足以容纳两个凸圆和三到四个额外形状的模具。当然,具体要遵循你买的产品说明书来混合你的树脂。

通常,体积比是1:1。一个好的方法是将两种液体分别倒入匹配的容器中,直到相同的计量位置。

然后,将它们倒入第三杯中搅拌。缓慢但彻底地搅拌至少两到三分钟,确保经常刮一刮搅拌杯的侧面。如果未完全拌匀混合树脂,它将无法正常固化。如果要对树脂着色​​,请一次将一滴颜料添加到混合树脂中,使颜色逐渐变深,直至达到你的喜好。

树脂混合并着色后,搅拌时会混入许多细小的气泡。让混合物静置几分钟,以便气泡可以漂浮到顶部,然后使用木棍将气泡移到容器的侧面并戳破。

当你去除了尽可能多的气泡,就可以浇注了!将你的模具放置在水平表面,使它们能够不受干扰地固化。

将稀薄的树脂倒入模具的深处,使其慢慢升至模具上方。但勿将模具过满填充,否则你将其从模具中取出时,树脂会弯曲并且底部凸出。将树脂细流般倒入时可以戳破仍在混合物中的大气泡。

嵌入NFC标签

将树脂放入模具中后,将NFC标签置入相应的位置。再用镊子将标签浸入未浇注的树脂中,先将其涂覆 —— 这将避免模具中的树脂产生太多气泡。

然后,将标签轻轻滑入模具,并使其居中。它会缓慢下沉到模具的底部,理想情况下,它会保持在中心。你可能需要用镊子或细棒为其做调整,但尽量不要引入任何新的气泡。

倒入树脂并将NFC标签放置到位后,让树脂在模具中静置约十分钟。这足以使大多数气泡上升到顶表面。然后,在树脂上喷异丙醇细雾以使气泡破裂。

此步骤是可选的,但我们注意到它确实有助于获得更好的结果。

对你要倒入的所有模具重复此过程,并向其添加NFC标签。几分钟后对其进行检查,以确保标签没有移位。切记要留意“适用期”计时器。在树脂开始变硬之前,请完成所有位置调整和气泡处理的操作。然后,将树脂固化至说明书中指定的时间。

脱模你的固化树脂

等树脂完全硬化后,就该进行最令人兴奋的部分了 —— 从模具中取出固化的树脂。

如果使用硅树脂模具,那你脱模应该不会有什么难的。轻轻弯曲有机硅,使空气渗入硬化树脂和模具壁之间。然后,你应该能够小心地将定型的树脂从模具中拉出。

花一点时间欣赏你闪亮的“宝石”!如果发现模具浇注过多,或者树脂蠕变了模具的侧面,使它向后弯曲,请不要担心。树脂可以湿喷;只要确保打磨时将砂纸和碎纸都放在水下,并戴上口罩以防止吸入树脂颗粒。

制作袖扣

用胶水将平底的 “宝石” 固定在袖扣坯上。我们使用了E6000,这是一种工业强度的粘合剂,在塑料上效果很好。同样,请确保在通风良好的地方工作,并在使用E6000时戴上口罩。

将胶粘到袖扣坯上,并在胶凝结时将 “宝石” 保持在适当的位置。补两,就完成了!你也可以将 “宝石” 粘贴到环空以制作NFC数据环。对于吊坠,你可以使用珠宝首饰,例如提钩和跳环来制作项链或钥匙链、表链。

编程NFC标签

现在,你已经做好了NFC袖扣。接下来可以使用URL,密码或秘密消息之类的数据加载它们。

有几种方法可以做到这一点。如果你有支持NFC的智能手机(例如Android)则不需要其他硬件。你可以下载NFC工具应用在袖扣上写入和读取数据。而 NFC Tasks 是另一个免费应用程序,可让你创建自动操作,让手机在读取NFC标签时执行某些命令。

如果你用的是iPhone(截止到本文发布时),则无法从手机直接写入NFC标签。但是不用担心!你仍然可以通过购买USB NFC读/写器来获得NFC的乐趣。

你可以使用NFC工具桌面应用程序在计算机上读取和写入NFC标签。

Amazon上的 NFC读/写器大约是35美元一个。iOS 12.1及其以后的版本支持后台NFC标签读取。你仍然可以在iPhone上执行一些基本操作,例如在浏览器中打开URL。

对于更自定义的硬件/软件方法,请尝试Adafruit的PN532 NFC/RFID控制器分线板,该板可让你向Raspberry Pi或Arduino项目添加NFC功能。设置过程需要一些焊接和编程,但是此突破使你可以对NFC标签进行更底层的控制,并且受到Adafruit NFC Arduino库的支持。该库包括方便的示例代码,用于读取和写入标签,以及使用NDEF格式重新格式化Mifare Classic标签。

在你的下一个盛装活动中戴上新袖扣,你将既神秘又优雅!或者,将这些礼物赠送给你的朋友,里面有着仅供他们查看的秘密信息。

介绍自己时,你可以把手腕放在对方的智能手机上,打开网页获取信息。不再需要拿出一张名片与对方联系。

这不是魔法,是技术。

作者:Alex Bate

来自:Raspberrypi.org

翻译:王文文

鸟巢盒子:用树莓派拍摄自己的《春日观察》

英国BBC有一档节目叫做《Springwatch》,翻译过来差不多叫《春日观察》。是在春天万物复苏之际,观察和报道野生动物生活的一档节目。

那持续的拍摄野生动物总会需要特制的道具,大的先不说,像鸟类一样娇小的动物,有没有好的办法可以拍到它从筑巢到孵卵的全过程呢?

英国利物浦的Jay Wainwright就做了这么一个带互联网属性的“鸟巢盒子”。

该巢盒通过树莓派将高质量图像和视频从英国的鸟巢盒子发到Facebook上。

Jay  运营着一个小型的巢盒直播网络,目前有3个已经部署,另外3个正在筹备中。令人兴奋的是,新的巢盒将包括一个红隼盒和一个谷仓猫头鹰盒!

在春季,所有摄像机的视频流都传向“鸟巢盒子”的Facebook页面,该页面稳定地吸引了数千名野生动物爱好者。

鸟巢盒子使用Raspberry Pi和摄像头模块以及Raspberry Pi PoE HAT来提供电源和Internet连接,因此只需要一根电缆接进去。

如果要收音的话,还可以外接USB麦克风,大约几十块钱RMB。

Jay还增加了LED灯和红外线滤光器,以确保白天和晚上都可获得高质量的画面。

最重要的是,他还写了一些Python代码来记录巢箱的访客以便在有突发事件时进入直播模式。

鸟巢盒子的设计显然已经过充分考虑,既能为鸟类提供有吸引力的空间,同时也便于集成所有电子组件。

鸟巢盒子的主要结构

如果想在Facebook上Follow这个项目,请访问:https://www.facebook.com/NestBoxLive

相关小鸟的视频地址:

https://v.qq.com/x/page/a30354fv7jw.html

素材:Facebook.com

编译:王文文,热爱物联网,喜欢研究开源软硬件和各种有意思的应用。前51CTO安全频道主编,RedHat认证工程师,华为HCIP-IoT认证工程师。

一小时入门Scratch机器学习

一说到人工智能和机器学习,人们总会觉得很高深。除了相关从业者,其他人可能就望而却步了。别说让孩子学,自己都很少看一眼。

其实除了那些涉及算法的专项研究和底层嵌入式开发,还有很多上层应用需要人们开发,去运用。

比如今天我要讲的,一个用Scratch机器学习完成智能化教室控制的演示。

在这个项目中,我们将使用 MachinelearningforKids.co.uk 的在线服务来制作一个智能教室助理,让它对我们所输入的内容作出反应。

首先,我们将创建一个使用规则列表来理解命令的助手。但这种方法比较单调,不是很智能。

而我们这次的重点是让计算机能读懂我们的“弦外之意”。

具体是怎么操作的呢?

首先找一台能联网的计算机,且能正常浏览网页。

在浏览器中打开 machinelearningforkids.co.uk ,然后点击“Get Started”,如果你是中文环境,应该是“开始使用”。

点击“立即尝试”后,+ Add a new project 创建一个项目。

这里先说明一下,该平台是支持中文识别的。但为了方便大家入门,我这里用他们的英文版本做讲解了。

建好之后, 再点击“smart classroom”会看到三个选项,选最后一个 “Make”。

这个时候Scratch要出场了。

选择“ Scratch 3”,然后再点“Open in Scratch 3”。不想自己从零开始,就从“ Project templates”里面选择“智能教室”。

点击箭头处的classroom,然后在代码区输入以下内容:

然后点击“小绿旗”测试一下程序是否正常工作。

挨个输入以下命令,并查看程序的反应:

  • Turn on the lamp
  • Turn off the lamp
  • Turn on the fan
  • Turn off the fan

输入“ Turn on the lamp”的时候,看看画面中的灯是不是真的亮了。

如果你上面的操作都没错的话,你现在已经做好了一个传统的教室电器控制系统。接下来就是我们今天的重头戏了。让计算机经过训练之后,不再呆板的钉是钉,铆是铆。要举一反三,像人类一样理解话语中的含义。

比如有时候我们不一定会说“打开这个电扇!”,而是会感叹“天好热啊。”

那如果是一个聪明的助理,肯定就默默的把电扇打开了,并不需要你一字不差的发号施令。

这个是怎么做的呢?

收集训练样本

首先,你要收集足够多的样本。

回到项目首页,点击第一个“Train”。

然后“ + Add new label ”,添加四个新标签。分别在四个池子里输入要训练的词,这一步相当关键。

在“fan on”这个标签里面,你可以表示房间里太热了。

在“fan off”,你可以抱怨房间里太凉了。

在“lamp on”,你可以表示你看不见。

在“lamp off”,你可以抱怨灯太亮了。

如果还不太理解,就照着图做吧。

样本输入的要点:

1、表达一定要准确,不要在冷的要命的时候还说要更多风。

2、词汇尽量多一些,这样计算机可以理解的也更多。

训练和测试一个机器学习模型

再次返回项目首页, 点击“Learn & Test”, 我们要开始让计算机学习,并测试它的学习效果。

如果你的样本数量比较多,可能要在这个环节多等一会儿。如果就几个,基本上一分钟内就可以测试了。

在箭头处输入你想表达的冷热明暗相关意思,看看计算机是不是都认对了。如果觉得满意,就可以继续下一步了。

在Scratch中使用机器学习

再次回到“Make”,点击“Open in Scratch 3”。

你会发现左下角多了一个块积木,那就是我们刚才让计算机辛勤努力后的成果。用它来改造我们前面的程序。

再次单击绿色小旗,看看程序是不是比之前聪明多了?人性多了?

到现在为止,你的“智能教室助理”基本雏形已经完成,如果有兴趣,可以把电视机、音乐播放机什么的都加上。

小结:

一般情况下,真正智能助理都是可以语音控制的。以后如果想实战相关的内容,可以进行更高阶段的研究,比如和IoT的硬件结合等等。

目前已经有人根据亚马逊的Alexa语音识别功能制作了自己的智能助手。国内也有相关厂商提供类似服务,你也可以试试。

素材:Raspberrypi.org

作者:王文文,前51CTO安全频道主编,RedHat认证工程师,华为HCIP-IoT认证工程师。

一个懂音乐的汽车雨刮器

有的人在车上听音乐的时候,遇到喜欢的节奏总会随着一起摇摆。

如果雨刮器能和音乐联动,那该是多么酷的事情啊。

国外有个伊恩·查纳斯(Ian Charnas)的创客,就改装了自己的汽车雨刮器,可以和车载音响播放的音乐联动。

一起来看看他是怎么让树莓派控制雨刮器的吧。

视频地址:https://v.qq.com/x/page/g3009vxldud.html

创客妹子教你做《偷天陷阱》激光警报系统

喜欢电影的朋友可能看过凯瑟琳.泽塔琼斯和肖恩.康纳利演的《偷天陷阱》。

片中,女主角绕过激光警报系统的过程让人印象深刻。

1999年上映的《偷天陷阱》

那这个激光警报系统实现起来难不难呢?

答案可能比你想象的要简单。

对于那些想要尝试自己构建防盗系统的人,创客妹子 Estefannie 提供了一个制作指南。

示例目标:

建立激光警报系统,保护饼干不被窃取。

工作流程:

激光阵列发现入侵者,摄像头拍照并把照片通过Twitter短消息发给主人,同时蜂鸣器警报响起。

配件清单:

10个激光头

10个光敏电阻

10个电容器

1个树莓派Zero W

1个蜂鸣器

1个树莓派相机模块

12英尺PVC管+ 4个角

1个丙烯酸面板

1个电池组

8根扎带

一罐饼干

Estefannie 并联焊接了10个激光头,又把十个光敏电阻连接到它们自己的GPIO引脚。由于灵敏度的原因,她没有将它们串联起来,这样可以简化调试。

选框架需要几次尝试。Estefannie 从一个木头架子开始试,最后意识到更好的解决方案是PVC管。所有的导线都可以放置在管道内部,然后从管道顶部的一个小窗口出来,连到树莓派Zero W。使用PVC管还可以降低制作成本,因为12英尺的管道大约只需要3美元。

管道内部的布线非常棘手,为完成电路, Estefannie 不得不将一些导线先置入管道内再进行焊接。

Estefannie 尝试将激光头粘合到PVC框架上,但是激光使胶水融化导致失焦。她又尝试使用胶带,后来发现腻子比较完美。成型后可以作为激光器的底座,并可在需要时重新校准。此外,无论激光的温度有多高,它们都能保持不移位。

虽然激光不是很强,但在长时间的校准后, Estefannie 还是会紧张她的眼睛。所以大家在调试的时候,可以戴上太阳镜。

Estefannie 最终在自家厨房里把这个装置搞定了。如果你认真观看影片,会发现她最后还皮了一下。希望大家能和她一样,在创作的过程中收获快乐。

相关视频地址:https://v.qq.com/x/page/l3014nzcgx0.html

相关代码: https://github.com/IoToutpost/Lasers/

素材:Raspberrypi.org

编译:王文文,前51CTO安全频道主编,RedHat认证工程师,华为HCIP-IoT认证工程师。

创客妹子教你做“一键发Twitter眼镜”

关注“IoT前哨站”的朋友可能记得之前我们发过一篇“让相机根据GPS定位自动拍照”的文章。

是的,那位名叫“Estefannie” 的创客妹子又出现了,这次她给大家带来的是一个可以自动发Twitter的眼镜,而且是“侏罗纪公园模式”。

什么叫侏罗纪公园模式呢?

看看这个眼镜发的Twitter内容就知道了。

发现梁龙一只
发现雷龙一只

准确的说, Estefannie 做的这个装置应该叫“侏罗纪恐龙抓拍系统”。因为她这个发的每张照片都会标一个恐龙的名字,比如:“发现梁龙”,“发现雷龙”……她在眼镜上装了一个按钮。按下就能把照片发到Twitter上。

制作流程:

Estefannie 先是找了一个像护目镜一样的眼镜模型。

用3D打印机把眼镜的原型做出来以后,对其进行打磨、喷漆、抛光。然后在上面接好树莓派Zero W,LED和按钮,加上可调节部分、软垫以及绿色镜片……

大量的涂胶、焊接和布线工作之后,她最终得到了一副漂亮的眼镜。

紧接着,她写了一个Python脚本来拍照、与Twitter交互,并通过LED环来提供眼镜当前的状态信息。树莓派系统启动时,会先连到她手机的无线热点。然后,眼镜上的红色LED亮起,表示程序正常运行。

然后,就可以戴着这个眼镜去抓拍有意思的景物了。

背景:

原本这是她被邀请去“Coolest Projects”青少年创客大会演讲而制作的道具,但你可以根据她的代码自己改改,做一个发微博或者抖音的版本。

关于详细流程,建议大家看视频。

相关视频:https://v.qq.com/x/page/c3010lo613b.html

3D模型文件: https://www.thingiverse.com/thing:3732889

代码下载: https://github.com/IoToutpost/JurassicGoggles

素材:Raspberrypi.org

编译:王文文,前51CTO安全频道主编,RedHat认证工程师,华为HCIP-IoT认证工程师。

AIoT开发者的灵魂拷问:过程低效且成本高的问题你解决了么?

企业将业务搬上云端已是大势所趋,云服务经过多年的发展,也已进入稳定增长的2.0时代。

2019年1月,华为基于ARM架构打造了自己的鲲鹏处理器。紧接着,华为云又基于鲲鹏处理器推出了鲲鹏云服务和解决方案。“鲲鹏”一词逐渐在互联网圈内成为热议的焦点,对于技术人而言,迫切地想揭开鲲鹏背后的技术细节,想知道鲲鹏到底有多牛。

机会来了!

10月18日,“DevRun · 选择不凡,华为云开发者沙龙 ”北京站将邀请华为云鲲鹏凌云计划架构师白雁,全面解析华为云鲲鹏云服务中的关键技术,并从操作系统、中间件、数据库以及代码层级对开源和自有软件的鲲鹏移植进行指导,通过实际案例分享移植经验,给开发者讲解为什么移植,以及如何移植。

除此之外,华为云的4位技术专家也针对各自擅长的领域,与开发者交流技术难点与解决方案,这些话题如下:

1、企业上云之前,数据库的痛点怎么解决?

数据库逐渐演变为云时代下核心竞争力的关键。如今,传统存储计算一体、一主多辅的数据库虽然仍有不小的价值,但局限性也愈加明显:资源利用率低、扩展性弱、有许多冗余写入、数据回档慢等难题,也造成了企业的上云需求越发难以满足。

在数字化、智能化时代下,企业面对的是海量的用户和交易,拥有超过几百个节点的业务系统并不稀奇,未来这种规模还将不断扩大,这为系统的运营和管理提出了不小的挑战。随着摩尔定律遇到瓶颈,不同领域的计算平台呈现出多样化的趋势。虽然这在一定程度上满足了不同场合的应用需要,但如何通过软件实现计算能力的整体协调和优化,这对于应用开发人员和 DBA 而言,是新的挑战。此外,海量的半结构、结构化数据,也迫切需要一个行之有效的解决方案来实现统一的计算和管理,并进行优化。

华为从2001年就已经开始布局数据库的研发,针对当下数据库技术的发展痛点有着深刻的理解,华为云也推出了新的解决方案。本次沙龙,华为云数据库高级技术专家宋立勇将为大家分享华为在数据库领域的研发经验,带来应对诸多数据库挑战的实战经验,并分享针对不同的业务场景,数据库如何布局才能经济高效地满足高算力、低时延、敏捷部署的业务诉求。

2、AI开发者最棘手的难题,你是不是也遇到过?

对于AI开发者而言,训练一个模型通常需要经历几个“难关”:数据标注、调参、大规模分布式训练和训练部署,然后才有可能开发出一个普通的AI应用。每一步几乎都是AI开发者的痛:数据标注需要耗费大量的人工时间,难以在最短的时间内找到最优的参数配置,需要漫长的时间进行大规模训练,最后还要面对复杂的模型部署。

一直以来,AI开发者对普惠算力的需求从未间断过,但现实情况是:稀缺、昂贵的算力将AI束之高阁,大量的资源被重复耗费,开发者宝贵的时间和精力也未能创造出真正的价值,整个AI开发过程低效且成本高昂,不利于企业及行业的智能化升级。基于这些痛点,华为推出了ModelArts 一站式AI开发平台。

相信 AI 开发者对于这一平台一定不陌生,但如何用好 ModelArts 恰恰是开发者最该了解的内容。本次沙龙,华为云EI布道师、华为开源中心算法专家王龙步将为AI开发者解析在云上构建及部署AI模型的具体过程。为什么有的 AI 开发者可以更快速、更高效地开发AI模型?差别在哪?专家给你支招!

3、都在聊 IoT,落地的事谁来负责?

在物联网业务快速发展的同时,企业和创业者也面临着网络连接复杂的问题,而且终端和传感器种类众多,这就导致集成困难,新业务上市周期长。企业都在聊IoT,但归根结底还在于谁能解决IoT开发中的难题。

对于开发者而言,如何切实可行地解决开发周期长、开发成本高、稳定性不佳、维护成本高等一系列问题,高效地完成行业应用构建,将物联网能力快速投入到生产流程或业务运营中?华为IoT生态服务产品总监谢冲,基于自己深耕IoT领域多年的经验,针对开发者在IoT 上经常“纸上谈兵”、缺乏落地实践的问题,全方位地“对症下药”。 

4、想用微服务架构,如何保证数据一致性?    

我们知道,微服务架构中的各个模块可以独立地开发,迭代;不同团队之间的技术栈分离可以根据团队的特点来使用更合适的技术解决问题;将系统切分为细粒度的服务,好处不言而喻,但问题是,如何保证数据的一致性?越来越多的企业开始向微服务架构转型,不幸的是,很多企业发现微服务实施起来并不像看上去那么轻松。各家公司提出的解决方案并不少,不过哪一种才最适合?

对此,华为云PaaS团队架构师王启军将在本次沙龙为大家分享华为在微服务架构中的实践,帮助企业和开发者清楚地了解为什么要做微服务,以及在过程中有哪些必须要避的坑。

干货满满的讲解与实操演练相结合,10月18日“DevRun · 选择不凡,华为云开发者沙龙 2019”北京站,将与开发者一道,深挖技术背后的细节,重新审视如何落地 AI 的问题。

5、北京站讲师和议题安排

温馨提示:因为现场设置实操环节,建议开发者携带笔记本电脑参会,与讲师一起在现场快速构建一套AI模型。

报名地址: https://e-campaign.huawei.com/cloud/CloudUniversalForm/register/199/phoneRegister.html?access_token=2d22ca77-2dbd-4cd3-afc9-15e92366779a (请在微信中打开)

一条命令将树莓派变成Wi-Fi接入点

很多开发者都配过无线AP,这几乎是IoT网络配置的一个基本技能。像TP-Link和D-Link那种小盒子,用不了几个步骤就能快速开启无线网络。

这次我们要介绍的是把树莓派编程无线AP的方法。

和之前动则十几个步骤的教程不同。我们借助一个叫 RaspAP 的工具,只要一条命令就能完成部署。

wget -q https://git.io/voEUQ -O /tmp/raspap && bash /tmp/raspap

等到命令执行完成后,重启树莓派,无线AP就做好了。

默认的连接信息如下:

IP 地址: 10.3.141.1
用户名: admin
密码: secret
DHCP 范围: 10.3.141.50 – 10.3.141.255
SSID: raspi-webgui
WiFi 密码: ChangeMe

其实树莓派的Raspbian已经自带了一些无线AP所需的组件, 而RaspAP的好处是它不但自动化相关操作,而且还有一套响应式的 WebUI。非常省事。

对手机浏览器的支持也很好。

官方团队是建议大家在Raspbian Buster版本的树莓派上使用这个工具,在执行安装命令前最好先更新系统。

sudo apt-get update
sudo apt-get dist-upgrade
sudo reboot

然后用sudo raspi-config 命令,在 菜单Localisation Options中设置 WiFi 地区。

如果你还再用没有Wi-Fi模块的老树莓派,可以装一个USB无线网卡。

目前 RaspAP 已通过 GNU Gettext 支持简体中文在内的多国语言,但你得确定系统内已经装中文环境了,如果没装,需要用 sudo dpkg-reconfigure locales  之类的命令自行配置一下语言包。

RaspAP 建议的最佳搭配就是一条有线接树莓派eth0的以太网口,然后通过树莓派自带的Wi-Fi提供无线AP服务。不用重启,也不用额外的操作。

还有一句话官方没明说:为使效果最佳,还是用树莓派3B或3B以后的硬件版本吧。

作者:王文文,前51CTO安全频道主编,RedHat认证工程师,华为HCIP-IoT认证工程师。热爱Linux、Python、Micro:bit和树莓派。

树莓派Raspberry Pi开发板 – 淘宝购买链接:

https://s.click.taobao.com/ClJnOqv

解析Python开发的一款迷你跑步游戏

之前“IoT前哨站”上发了一些用Python写文本游戏的文章。不管对于Python开发者来说还是对于游戏爱好者来说,都非常适合打基础。

这次我们迈入图形时代,来看看国外开发者“Rik Cross”制作的一款迷你跑步游戏。

他用了不到一百行代码,就写出了值得一玩的2D动作游戏,怎么做到的?

在此之前,先向大家介绍一个游戏框架:pgzero。

该框架全名Pygame Zero,是一个基于Pygame的游戏编程框架。它可以更容易地编辑游戏,无需模板、不用编写事件循环,也无需学习复杂的Pygame API,而且支持树莓派。

安装
pip install pgzero

需求:
通过键盘的左右键操作,让运动员向前奔跑,每过25米有路标提醒,最后看谁在百米跑步中耗时最少。

代码下载地址:
https://github.com/IoToutpost/Python_game/tree/master/Sprint

素材(地址同上):
Images文件夹中有21张图,包括运动员的动作分解、跑道等。

其中的关键代码,是一个叫做Sprinter()的类。

class Sprinter(Actor):
     def init(self, **kwargs):
         super().init(image='idle', pos=(200,220), **kwargs)
         self.startTime = time()
         self.finishTime = time()
         self.runFrames = ['run' + str(i) for i in range(1,16)]
         self.timeOnCurrentFrame = 0
         self.speed = 0
         self.lastPressed = None
         self.keyPressed = False
         self.distance = 0
# 将运动员推进到下一帧
def nextFrame(self):
    # 如果当前空闲,则启动正在运行的动画。 
    if self.image == 'idle':
        self.image = self.runFrames[0]
    else:
        # 在列表中找到下一个图像,然后返回到第一个图像 
        # 当列表已经到末尾的时候
        nextImageIndex = (self.runFrames.index(self.image) + 1) % len(self.runFrames)
        self.image = self.runFrames[nextImageIndex]

# 检查左右方向键是否正确
# 被交替按下
def isNextKeyPressed(self):
    if keyboard.left and self.lastPressed is not 'left' and not keyboard.right:
        self.lastPressed = 'left'
        return True
    if keyboard.right and self.lastPressed is not 'right' and not keyboard.left:
        self.lastPressed = 'right'
        return True
    return False

def update(self):
    # 更新运动员的速度
    # 交替按键加速
    if self.isNextKeyPressed() and self.distance < 100:
        self.speed = min(self.speed + ACCELERATION, 0.15)
    # 如果没有按键,减速
    else:
        self.speed = max(0, self.speed-DECELERATION)
    # 根据运动员的速度更新距离 
    self.distance += self.speed
    # 根据运动员的速度对其进行动画 
    self.timeOnCurrentFrame += 1
    if self.speed > 0 and self.timeOnCurrentFrame > 10 - (self.speed * 75):
        self.timeOnCurrentFrame = 0
        self.nextFrame()
    # 如果不移动,则设置为空闲
    if self.speed <= 0:
        self.image = 'idle'

里面有一些变量用来跟踪运动员的速度和距离,以及全局的常量(ACCELERATION和DECELERATION的值)。这样可以确定玩家的速度变化。这些数字很小,因为它们代表了玩家加速和减速时,每一帧对应的米数。

玩家通过交替按左右键来增加运动员的速度。这个输入由Sprinter类中的isNextKeyPressed()方法处理,如果按下正确的键,该方法将返回True。

lastPressed变量用于确保左右键被交替按压。如果未按下任何键,玩家会减速,并且该减速程度应小于加速度,以免让玩家突然停下。

在游戏设计中,作者用了gameart2d.com上一个名为“The Boy”的免费形象来作为运动员,里面有15张跑步动作分解图构成的循环。他将从空闲状态开始,只要速度大于0,就切换到跑步动作循环。

这是通过index()在runFrames列表中查找当前运动员图像的名称来实现的,程序会将当前图像设置为列表中的下一个图像(并且在到达列表的末尾时返回第一个图像)。

我们还需要让运动员在跑步动作循环中以成比例的速度向前移动,通过跟踪当前图像显示的帧数来实现(在那个名为timeOnCurrentFrame的变量中)。

为了给玩家一种移动的错觉,作者添加了一些经过玩家的物品:一条终点线和三个显示跑动距离的标记。

这些物品出现的时机是根据运动员在屏幕上的x位置和运动距离计算出来的。

​然而,这意味着每个物品距离玩家最多只有100像素的距离,似乎移动的有点缓慢。我们可以通过SCALE因子来解决,它对应的是运动员跑过的米数和屏幕上像素之间的关系。比如设成1:75。

这些物品最初被绘制在屏幕看不见的右侧,然后向左移动并更快地经过运动员。

最后,startTime和finishTime变量用于计算比赛时间。这两个值最初都设置为比赛开始的时间,只要跑动的距离小于100,finishTime就会更新。使用time模块,比赛时间可以简单地计算为finishTime – startTime。

附注:该游戏在树莓派和Windows PC上都能跑,如果要试玩,记得在Python文件前面加pgzrun命令。

Have fun.

素材:Wireframe #23

编译:王文文,前51CTO安全频道主编,RedHat认证工程师,华为HCIP-IoT认证工程师。

Python图形界面开发入门之Guizero

不管是手机电脑,还是带触摸屏的终端设备,简单易用的图形界面,总是很受欢迎。

而提起Python下的图形界面开发,大家一定都会想到 PyQt 和 wxPython、Kivy 等经典模块。

不过我们这次要介绍的“guizero”,是一个非常易用的GUI库,能让初学者快速、轻松地为他们的程序创建图形界面。

安装很简单:

pip3 install guizero

这里先来个基础的例子。

from guizero import App, Text, PushButton
app = App(title="IoT前哨站")
intro = Text(app, text="试着用guizeo开发图形界面")
ok = PushButton(app, text="Ok")
app.display()

这个例子应该很容易懂,先设置窗体、标题,然后放入一个文本框和一个按钮。

由于文本框没有设置内容,所以不太看得出来,整个窗体只能发现一个按钮孤零零的杵那儿。

下面我们试着给按钮加功能,让它做一个显示字符的操作(准备让文本框发挥作用了)。

from guizero import App, Text, PushButton

def say_hello():
    text.value = "欢迎关注IoT前哨站"

from guizero import App, Text, PushButton
app = App()
text = Text(app)
button = PushButton(app, command=say_hello)
app.display() 

当你单击 Button 按钮时,原本空着的文本框会显示“欢迎关注IoT前哨站”。

如果你的程序功能比较复杂,需要另外一个窗体展示内容的时候……

from guizero import App, Window, Text
app = App(title="主窗体")
window = Window(app, title="第二窗体")
text = Text(window, text="这段文字将在第二窗体显示")
app.display()

默认情况下,guizero是自动布局,或者通过修改窗体内各部件的align属性,来调整它们的基本方位,但那肯定不够。

更细致一点的布局方式 —— 网格。

from guizero import App, PushButton
app = App(title="IoT前哨站",layout="grid")
button1 = PushButton(app, text="1", grid=[0,0])
button2 = PushButton(app, text="2", grid=[1,0])
button3  = PushButton(app, text="3", grid=[2,0])
button4  = PushButton(app, text="4", grid=[0,1])
button5  = PushButton(app, text="5", grid=[1,1])
button6  = PushButton(app, text="6", grid=[2,1])
button7  = PushButton(app, text="7", grid=[0,2])
button8  = PushButton(app, text="8", grid=[1,2])
button9  = PushButton(app, text="9", grid=[2,2])
button0  = PushButton(app, text="0", grid=[1,3])
app.display()

通过grid参数来修改各部件的[x,y]坐标,以此改变它们在窗体中出现的位置。

你也可以通过在网格参数中指定范围,使部件跨越多个列或行。这些都是可选的,但必须用[x,y,xspan,yspan]这样的格式来指定它们。

比如下面这个图片摆放的例子。

from guizero import App, Picture
app = App(title="IoT前哨站",layout="grid")
picture1 = Picture(app, image="Debian.jpg", grid=[0,0])
picture2 = Picture(app, image="IotOutpost.jpg", grid=[1,0])
picture3 = Picture(app, image="wide.jpg", grid=[0,1,2,1])
picture4 = Picture(app, image="tall.jpg", grid=[2,0,2,2])
app.display()

弹出框大家也经常在用,一般经典的就是询问、提示和警告。

from guizero import App
app = App(title="月饼提问")
build_a_snowman = app.yesno("问题", "你喜欢吃蛋黄月饼吗?")
if build_a_snowman == True:
    app.info("月饼", "这就给你拿一块过来。")
else:
    app.error("月饼", "好吧,那就不吃了。")
app.display()

再看一个经典的滑动条,假设要调整空调的温度。

from guizero import App, PushButton, Slider
app = App(title="空调操作")
button = PushButton(app, text="开/关",width=30, height=5)
slider = Slider(app, width=200, height=30)
app.display() 

下面来一个读取传感器数值并每秒钟刷新的例子。当然,为了方便演示,里面用的是随机数。

from guizero import *
import random
def read_sensor():
    return random.randrange(3200, 5310, 10) / 100
def update_label():
    text.value = read_sensor()
    # recursive call
    text.after(1000, update_label)

if name == 'main':
    app = App(title='Sensor Display!',
              height=100,
              width=200,
              layout='grid')

title = Text(app, 'Sensor value:', grid=[0, 0]) 
text = Text(app, "xx", grid=[1, 0]) 
text.after(1000, update_label) 
app.display()

最后,来一个带菜单选项的例子。

 from guizero import *

 def switch_screen(switch_to):
     hide_all()
     switch_to.show()

 def hide_all():
     for screen in all_screens:
         screen.hide()

 app = App("多选择框运用", layout="grid")
 all_screens = []

 创建一个菜单区域
 menu = Box(app, grid=[0,0], layout="grid")
 menu.tk.width = 900
 menu.bg = "gray"

 选项1
 option1 = Box(app, grid=[1,0])
 text1 = Text(option1, text="这是列表区的内容")
 combo = Combo(option1, options=["树莓派","小熊派","香橙派"])
 all_screens.append(option1)

 选项2
 option2 = Box(app, grid=[1,0])
 text2 = Text(option2, text="这是滑动框")
 slider = Slider(option2)
 all_screens.append(option2)
 
 option1_button = PushButton(menu, text="列表区", \
 command=switch_screen, args=[option1], grid=[0,0], align="left")
 option2_button = PushButton(menu, text="滑动框", \
 command=switch_screen, args=[option2], grid=[0,1], align="left")
 hide_all()
 all_screens[0].show()
 app.display()

左侧灰色的两个菜单选项,分别是“列表区”和“滑动框”,单击任意一个按钮后会出现相应内容,列表区中有个下拉式清单,而滑动框点进去是与其对应的部件。

其他的用法大家可以继续挖掘,不管你的系统是 Windows 还是 Mac、Raspbian Linux,Guizero均可支持。

虽然看着似乎有一点糙,但好在上手快。哪怕你是一个刚开始研究图形界面的 Python 开发者,也能轻松掌握。

作者:王文文,前51CTO安全频道主编,RedHat认证工程师,华为HCIP-IoT认证工程师。