之前的教程都有讲过如何控制Intel Galileo上的GPIO,以及如何通过Intel Galileo发送微博,至此,算是实现了物联网的一半,将本地的信息实时发布到网络,当然最为关键的是,如何实现通过网络控制Intel Galileo呢?
如图所示,Intel Galileo不断向服务器轮询查看是否有来自用户的指令,若有则检查是否为预定指令,然后开始执行,否则继续轮询,如此往返。这里对服务的唯一要求是必须有公网IP,无论是用户还是Intel Galileo均能够访问其数据。
好了,下面就开始写代码吧,需要说明的是,这里的代码在Linux系统下均能运行,只是在操作GPIO有些区别而已。虽然微博现在有些过时,但是其提供了丰富的API,可以省去自己搭建服务的麻烦,对于物联网应用的简单演示是再合适不过了,当然,有一定基础的用户可以选择微信公共号或者其他平台。
#!/usr/bin/envpython
如上所示,先导入若干autohome,weibo,mraa等若干相关库文件,然后设置5号引脚的模式为输出。
因为这里用到的是获取@ 当前用户的微博,并检查是否有“#Intel Galileo#”标记符,然后再检查是否有“开灯”、“关灯”、“闪灯”等命令。所以,先写一个检查包含“#Intel Galileo#”的函数,并根据其返回的True 或 False进行下一步判断:
defcheck(text):
其次是检查符合上面条件的微博中是否有“开灯”、“关灯”、“闪灯”等命令的函数“check_cmd”
defcheck_cmd(text):
下面开始进入主循环了,这里需要注意的是,获取含有相关命令的微博后,指令执行后,Intel Galileo在其微博下方回复相应的评论。
比如:用户发出一条微博,@plantpark #Intel Galileo#开灯;Intel Galileo接收到后,先将灯打开,然后在这条微博下评论“灯已开”+当前时间,这里为了避免在一条微博下重复评论,特对每条新的微博做对比,分别是“pre_time”和“this_time”通过获取每条微博特有的ID进行比对。为何如此写“autohome.get_mention().split(',')”,具体请参照微博API和weibo.py这里不做赘述。
whileTrue:
不够,这里仅仅是demo,控制逻辑并不完整,大家可以根据自己的兴趣和时间进行修改和完善,比如“else if”进行多层嵌套,以适应更多条件,或者限定只接收特定用户的指令,增加一定的安全性,诸如此类,可玩性还是非常高的。
好了,把下面的代码复制到你的Intel Galileo中,直接运行看看效果吧(效果如上图所示)。对于这一系列的文章,有问题欢迎邮箱交流hi@oszine.com.
#!/usr/bin/envpython#coding=utf-8 importautohome,time,mraa,sys fromtimeimportlocaltime,strftime reload(sys) sys.setdefaultencoding('utf-8') x=mraa.Gpio(5) x.dir(mraa.DIR_OUT) info=autohome.get_user_info() defcheck(text): if(text[0:len(info.screen_name)+1]=='@'+'%s'%info.screen_name)and(text.find('#IntelGalileo#')>0): returnTrue else: returnFalse defblink(): x.write(1) time.sleep(0.2) x.write(0) time.sleep(0.2) defcheck_cmd(text): iftext.find('开灯')>0: return'开灯' eliftext.find('关灯')>0: return'关灯' eliftext.find('闪灯')>0: return'闪灯' elif(text.find('开灯')==-1andtext.find('关灯')==-1)andtext.find('闪灯')==-1: returnFalse timenow=strftime("%H:%M:%S",localtime()) pre_time=autohome.get_mention().split(',') whileTrue: this_time=autohome.get_mention().split(',') text=this_time[4] weibo_id=this_time[1] ifthis_time[1]!=pre_time[1]: print'youhavesentanewweibo' ifcheck(text)==True: ifcheck_cmd(text)=='关灯': x.write(0) autohome.send_comments(weibo_id,'#IntelGalileo#灯已关%s'%strftime("%m-%d%H:%M:%S",localtime())) print"灯已关" elifcheck_cmd(text)=='开灯': x.write(1) autohome.send_comments(weibo_id,'#IntelGalileo#灯已开%s'%strftime("%m-%d%H:%M:%S",localtime())) print"灯已开" elifcheck_cmd(text)=='闪灯': blink() autohome.send_comments(weibo_id,'#IntelGalileo#灯在闪%s'%strftime("%m-%d%H:%M:%S",localtime())) print"灯在闪" else: autohome.send_comments(weibo_id,'#IntelGalileo#命令错误或当前命令不支持%s'%strftime("%m-%d%H:%M:%S",localtime())) else: print"youhaven'tsentanynewweibos" time.sleep(20) pre_time=autohome.get_mention().split(',')
“夸克微小,却能成就伟大,因为有你。请关注英特尔Quark开发者俱乐部微信公共号intelquark,还有机会得到小礼品哦~!”