版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
MQTT通讯协议的实践InternetofThings目录ContentsSuccessWords2相关知识网关的作用任务实践网络基础知识MQTT协议实现猜拳游戏搭建简易聊天服务器实现五子棋游戏目录ContentsSuccessWords3网络基础知识13网络基础知识5
TCP/IP网络架构网络基础知识6TCP/IP协议栈的数据传输过程网络基础知识目录ContentsSuccessWords7网关的作用8网关的作用目录ContentsSuccessWords9MQTT协议10
MQTT协议简介MQTT(MessageQueuingTelemetryTransport,消息队列遥测传输协议),构建于TCP/IP协议上,由IBM在1999年发布。MQTT基于客户端-服务器的消息发布/订阅传输协议,以极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。MQTT协议是轻量、简单、开放、低开销和易于实现的,这些特点使它适用范围非常广泛。使其在物联网、小型设备、移动应用等方面有较广泛的应用。MQTT协议11MQTT协议架构MQTT协议12MQTT应用场景MQTT协议13MQTT协议主要特点使用发布/订阅消息模式,提供一对多的消息发布,解除应用程序耦合使用TCP/IP提供网络连接。主流的MQTT是基于TCP连接进行数据推送的,但是也有基于UDP的版本小型传输,开销很小,以降低网络流量有三种消息发布服务质量:"至多一次",消息发布完全依赖底层TCP/IP网络。会发生消息丢失或重复。"至少一次",确保消息到达,但消息重复可能会发送。"只有一次",确保消息到达一次。在一些要求比较严格的系统中会使用此级别,确保用户收到且只会收到一次。MQTT协议14MQTT协议主要特点遗愿标志(WillFlag)在可变报文头的连接标志位字段(ConnectFlags)里面有三个will标志位:WillFlagWillQos和RetainFlag。这些will字段用于监控客户端与服务器之间的连接状况。遗愿消息:服务器与客户端通信时,当遇到异常或客户端心跳超时的情况,MQTT服务器会替客户端发布一个will消息。当然如果服务器收到来自客户端的DISCONNECT消息则不会触发wiwll消息的发送。因此will字段可以应用于设备掉线后通知用户的场景MQTT协议15MQTT协议主要特点连接保活心跳机制(keepAliveTimer)MQTT客户端可以设置一个心跳间隔时间(keepAliveTimer),表示在每个心跳检测时间内发送一条消息。如果在这个时间周期内,没有业务数据相关的消息,客户端会发送一个PINGREQ消息,相应的,服务器会返回一个PINGRESP消息进行确认。如果服务器在一个半(1.5)个心跳间隔时间周期内没有收到来自客户端的消息,就会断开与客户端的连接。心跳间隔时间最大值可以设置为18个小时,8表示客户端不会断开。MQTT协议161.了解MQTT协议客户端与服务器客户端工作流程:(1)连接服务端(2)发布消息,这些消息其他客户端可能会订阅;(3)订阅其它客户端发布的消息;(4)退订或删除消息;(5)断开与服务器连接。
MQTT协议服务端工作流程:(1)接受来自客户的网络连接;(2)接受客户发布的信息;(3)处理来自客户端的订阅和退订请求;(4)向订阅的客户转发其已经订阅的消息。
目录ContentsSuccessWords17任务实践——安装MQTT服务端和客户端体验MQTT使用方法18下载地址:
/download/步骤一:下载并安装MQTT服务端任务实践
我们需要安装mosquitto,一款实现了消息推送协议MQTTv3.1的开源消息代理软件,提供轻量级的,支持可发布/可订阅的的消息推送模式,使设备对设备之间的短消息通信变得简单,比如现在应用广泛的低功耗传感器,手机、嵌入式计算机、微型控制器等移动设备。19保存文件到本地,双击运行步骤二:安装软件(1)任务实践20选择安装目录,确认安装完成步骤二:安装软件(2)任务实践21进入安装目录,双击启动服务步骤二:安装软件(3)任务实践22下载地址:http://www.jensd.de/apps/mqttfx/1.7.1/步骤三:下载并安装MQTT客户端任务实践
MQTT.fx是一款基于EclipsePaho,使用Java语言编写的MQTT客户端工具。支持通过Topic订阅和发布消息。MQTT.fx支持windows/linux/mac,请选择对应的版本进行安装,本例以Windows10为例,版本为1.7.123保存文件到本地,双击运行步骤三:安装软件(1)任务实践24安装完成后,双击运行步骤三:安装软件(2)任务实践25新建或编辑一个已经存在的连接,建立与MQTT服务器的联系步骤四:消息发布与订阅任务实践26填写相应的ProfileName,BrokerAddress和BrokerPort(如果修改过的话,默认是1883),ClientID可以点击Generate按钮自动生成。编辑完之后点击保存退出编辑界面。步骤五:填写MQTT服务器信息任务实践27
选择刚刚新建的本地连接后点击Connect按钮连接MQTT服务器。去Subscribe(订阅)选项中订阅主题(如/first_message)然后去发布Publish选项卡发布一条消息,如图所示收到发布者发送的消息(HelloMqtt!),这里需要注意一下顺序应该先订阅消息,订阅完成后如果有消息发布后就可以看到订阅的消息。步骤六:订阅的消息任务实践28
输入主题名称(如/first_message)在下方的输入区域写上你要发送的消息(如HelloMqtt!,中文在订阅者的消息显示上会乱码),这里的消息支持多种格式,然后点击Publish(发布)按钮。步骤七:发布消息任务实践29MQTT协议实现方式实现MQTT协议需要客户端和服务器端通讯完成在通讯过程中,MQTT协议中有三种身份:发布者(Publish)、代理(即服务器,Broker)、订阅者(Subscribe)消息的发布者和订阅者都是客户端,消息代理是服务器,消息发布者可以同时是订阅者MQTT传输的消息分为:主题(Topic)和负载(payload)两部分:Topic,可以理解为消息的类型,订阅者订阅(Subscribe)后,就会收到该主题的消息内容(payload)payload,可以理解为消息的内容,是指订阅者具体要使用的内容MQTT协议目录ContentsSuccessWords30任务实践——Python实现MQTT客户端发布信息31下载地址:/downloads/步骤一:下载并安装Python任务实践
Python是一种跨平台的计算机程序设计语言。是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越多被用于独立的、大型项目的开发。32步骤二:下载Python任务实践
选择适合自己机器的版本,下载并安装:33步骤三:安装Python(1)任务实践选择自定义安装,注意要勾选:AddPythonx.xtoPATH:34步骤三:安装Python(2)任务实践选择安装路径等信息:35步骤三:安装Python(4)任务实践安装完成:36步骤三:安装Python(5)任务实践开始——搜索框中输入“cmd”——回车,启动命令提示符——输入Python:37步骤四:安装Python的Mqtt相关依赖任务实践1.执行pipinstallpaho-mqtt2.新建订阅者Python脚本client_mqtt.py3.引入MQTT模块:importpaho.mqtt.clientasmqtt38步骤五:编写Python的Mqtt客户端任务实践4.定义连接服务端变量:HOST="localhost"PORT=1883client_id='test_client_neuai'if__name__=='__main__':publish.single("/first_message","helloMQTT",qos=1,hostname=HOST,port=PORT,client_id=client_id)5.连接Mqtt服务端,并发布信息:39步骤六:运行效果(1)任务实践6.执行client_mqtt.py:40步骤六:运行效果(2)任务实践6.使用MQTT.fx订阅主题消息/first_message收到信息"helloMQTT"MQTT主题MQTT协议基于主题(Topic)进行消息路由,主题(Topic)类似URL路径,例如:sensor/10/temperaturesensor/+/temperature$SYS/broker/metrics/#主题(Topic)通过’/’分割层级,支持’+’,‘#’通配符:'+':表示通配一个层级,例如a/+,匹配a/x,a/y'#':表示通配多个层级,例如a/#,匹配a/x,a/b/c/d订阅者可以订阅含通配符主题,但发布者不允许向含通配符主题发布消息。41MQTT协议目录ContentsSuccessWords42任务实践——Python实现MQTT客户端订阅信息43步骤一:编写客户端代码(1)任务实践1.新建订阅者Python脚本subscribe.py2.引入MQTT模块:importpaho.mqtt.clientasmqtt3.与服务端建立连接client=mqtt.Client()
client.connect('',1883,600)#600为keepalive的时间间隔connect方法有三个参数,host是MQTT服务器地址,port是服务器端口,keepalive表示连接最大超时时间44步骤一:编写客户端代码(2)任务实践4.新建订阅消息主题5.保持连接client.loop_forever()client.subscribe('topic',qos=0)qos=0"至多一次",消息发布完全依赖底层TCP/IP网络。会发生消息丢失或重复。qos=1"至少一次",确保消息到达,但消息重复可能会发送。qos=2"只有一次",确保消息到达一次。在一些要求比较严格的系统中会使用此级别,确保用户收到且只会收到一次。45步骤一:编写客户端代码(3)任务实践6.与服务器建立连接前,设置好处理信息的方法client=mqtt.Client()
client.on_connect=on_connect#与服务器建立连接后调用on_connect方法client.on_message=on_message#当订阅的主题收到数据后掉用on_message方法
client.connect('',1883,600)#600为keepalive的时间间隔7.与服务器建立连接后要的处理defon_connect(client,userdata,flags,rc):print("Connectedwithresultcode:"+str(rc))client:代表这个客户端的实例userdata:Client()或者userdata_set()方法设置的私有数据flags:响应标识,用来表示当前客户端是否之前连接过,是否还未超时rc:连接结果,如果是0表示连接成功参数:46步骤一:编写客户端代码(4)任务实践8.与服务器建立连接前,设置好处理信息的方法defon_message(client,userdata,msg):print(msg.topic+""+str(msg.payload))client:代表这个客户端的实例userdata:Client()或者userdata_set()方法设置的私有数据
msg:这个是一个消息对象,对象里包含消息主题topic,payload,qos,retain参数:47步骤一:编写客户端代码(5)任务实践9.代码概览importpaho.mqtt.clientasmqttdefon_connect(client,userdata,flags,rc):print("Connectedwithresultcode:"+str(rc))defon_message(client,userdata,msg):print(msg.topic+""+str(msg.payload))client=mqtt.Client()client.on_connect=on_connectclient.on_message=on_messageclient.connect('',1883,600)#600为keepalive的时间间隔client.subscribe('topic',qos=0)client.loop_forever()#保持连接10.执行代码pythonsubscribe.pyMQTT特殊消息MQTT遗愿消息(LastWill):MQTT客户端向服务器端CONNECT请求时,可以设置是否发送遗愿消息(WillMessage)标志,和遗愿消息主题(Topic)与内容(Payload)。MQTT客户端异常下线时(客户端断开前未向服务器发送DISCONNECT消息),MQTT消息服务器会发布遗愿消息。MQTT保留消息(RetainedMessage):MQTT客户端向服务器发布(PUBLISH)消息时,可以设置保留消息(RetainedMessage)标志。Broker会存储每个Topic的最后一条保留消息及其Qos,当订阅该Topic的客户端上线后,Broker需要将该消息投递给它。保留消息有两种清除方式:客户端向有保留消息的主题发布一个空消息:消息服务器设置保留消息的超期时间。48MQTT协议MQTT的keepaliveMQTT具有“keepalive”属性。此属性描述当订阅的主题上没有更新时,我的客户端将连接到MQTT服务器的时间(AFAIK将ping发送到服务器)MQTT客户端即使不发布或接收任何消息,也可以无限期保持连接状态。但是,经纪人需要跟踪仍在连接哪些客户端,以便它知道何时为该客户端发送“最后遗嘱”(LWT)消息。为此,它使用keepalive时间。每次客户端发送或接收消息时,代理都会重置计时器,如果该计时器超过时间值的1.5倍,则代理会将keepalive客户端标记为已断开并处理LWT。为防止消息速率非常低的客户端断开连接,代理将在计时器达到该keepalive值时将PINGREQ数据包发送给客户端,它从客户端收到一个PINGRESP数据包,证明它仍然有效,然后将计时器重置为零。并使客户端保持连接状态。49MQTT协议目录ContentsSuccessWords50任务实践——Python实现MQTTMQTT遗愿消息(LastWill)51步骤一:编写客户端代码(1)任务实践1.新建订阅者Python脚本subscribe.py2.引入MQTT模块:importpaho.mqtt.clientasmqtt3.与服务端建立连接client=mqtt.Client()
client.connect('',1883,600)#600为keepalive的时间间隔connect方法有三个参数,host是MQTT服务器地址,port是服务器端口,keepalive表示连接最大超时时间52步骤一:编写客户端代码(2)任务实践4.设置MQTT遗愿消息client=mqtt.Client()client.will_set('test/rensanning/will','Lastwillmessage',0,False)client.connect('localhost',1883)1个Topic只有唯一的retain消息,Broker会保存每个Topic的最后一条retain消息。每个Client订阅Topic后会立即读取到retain消息,不必要等待发送。订阅Topic时可以使用通配符,就会收到匹配的每个Topic的retain消息。发布消息时把retain设置为true,即为保留信息。如果需要删除retain消息,可以发布一个空的retain消息,因为每个新的retain消息都会覆盖最后一个retain消息。主要应用:1)如果订阅者无法和Broker连接,可以通过retain消息让订阅者在下次成功连接时一次性接收所有的内容2)发布者定时发布retain消息,订阅者获取该信息后能推测发布者的状态(lastgoodvalue)目录ContentsSuccessWords53任务实践——Python实现MQTT保留消息(RetainedMessage)54步骤一:编写客户端代码(1)任务实践1.新建订阅者Python脚本retained.py2.引入MQTT模块:importpaho.mqtt.clientasmqtt3.与服务端建立连接client=mqtt.Client()
client.connect('',1883,600)#600为keepalive的时间间隔connect方法有三个参数,host是MQTT服务器地址,port是服务器端口,keepalive表示连接最大超时时间55步骤一:编写客户端代码(2)任务实践4.设置MQTT遗愿消息与Retained的消息importpaho.mqtt.clientasmqtt
defon_connect(client,userdata,flags,rc):print("Connectedwithresultcode"+str(rc))client.subscribe("test/rensanning/#")
defon_message(client,userdata,msg):print(msg.topic+""+str(msg.payload))
client=mqtt.Client()client.on_connect=on_connectclient.on_message=on_message
client.connect("localhost",1883)client.loop_forever()56步骤六:运行效果(1)任务实践6.执行retained.py:MQTT消息QOS(一)MQTT有三种消息发布服务质量:0:至多一次1:至少一次2:只有一次57MQTT协议MQTT消息QOS(二)MQTT发布消息QoS保证不是端到端的,是客户端与服务器之间的。订阅者收到MQTT消息的QoS级别,最终取决于发布消息的QoS和主题订阅的QoS。58发布消息的QoS主题订阅的QoS接收消息的QoS000010020100111121200211222MQTT协议目录ContentsSuccessWords59任务实践——Python实现MQTT客户端QOS60步骤一:编写客户端代码(1)任务实践1.新建订阅者Python脚本qos.py2.引入MQTT模块:importpaho.mqtt.clientasmqtt3.与服务端建立连接client=mqtt.Client()
client.connect('',1883,600)#600为keepalive的时间间隔connect方法有三个参数,host是MQTT服务器地址,port是服务器端口,keepalive表示连接最大超时时间61步骤一:编写客户端代码(2)任务实践4.设置MQTT遗愿消息client.connect('',1883,5)#keeplive仅为5秒foriinrange(100):client.publish('fifa',payload=f'amazing{i}',qos=0)#client.loop()#或者loop()time.sleep(4)#不能超过5秒目录ContentsSuccessWords62任务实践1——搭建简易聊天室63MQTT协议1.安装MQTT服务端2.编写客户端代码64进入安装目录,双击启动服务步骤一:启动MQTT服务端任务实践65步骤二:编写客户端代码(6)任务实践1.新建订阅者Python脚本public.py:2.与服务器建立连接,连接回调,信息到达等处理方法参照subscribe.py3.发送MQTT消息方法client.publish('topic',payload='sendmessage!',qos=0)topic:指定主题.payload:给主题发送的消息内容qos:消息传递的次数参数:66步骤二:编写客户端代码(7)任务实践importpaho.mqtt.clientasmqttdefon_connect(client,userdata,flags,rc):print("Connectedwithresultcode:"+str(rc))defon_message(client,userdata,msg):print(msg.topic+""+str(msg.payload))client=mqtt.Client()client.on_connect=on_connectclient.on_message=on_messageclient.connect('',1883,600)#600为keepalive的时间间隔client.publish('topic',payload='sendmessage!',qos=0)4.代码概览5.执行代码pythonpublish.py67步骤二:编写客户端代码(8)任务实践1.首先运行subscribe.py,启动后订阅者会一直运行等待接收数据2.然后运行publish.py,启动后发布者会发送信息【sendmessage!】3.查看运行效果:运行后订阅者会接收到数据并打印出来。4.完成订阅和发送信息后,具体实现下聊天操作。68步骤二:编写客户端代码(9)任务实践importpaho.mqtt.clientasmqttimportjson1.新建订阅者Python脚本chat.py引入依赖包:defon_message(client,userdata,msg):payload=json.loads(msg.payload.decode())print(payload.get("user")+":"+payload.get("say"))3.收到聊天信息后的处理defon_connect(client,userdata,flags,rc):client.subscribe("chat")client.publish("chat",json.dumps({"user":user,"say":"Hello,anyone!"}))2.连接到服务端后的处理连接到服务端后订阅chat主题,并向chat主题发送一段欢迎信息引入mqtt和json包,json是一种格式化的数据,用来传递数据比较方便收到数据后,用json.loads方法解析后打印输出69步骤二:编写客户端代码(10)任务实践importpaho.mqtt.clientasmqttimportjson1.新建订阅者Python脚本chat.py引入依赖包:defon_message(client,userdata,msg):payload=json.loads(msg.payload.decode())print(payload.get("user")+":"+payload.get("say"))3.收到聊天信息后的处理defon_connect(client,userdata,flags,rc):client.subscribe("chat")client.publish("chat",json.dumps({"user":user,"say":"Hello,anyone!"}))2.连接到服务端的处理70步骤二:编写客户端代码(11)任务实践user=input("请输入昵称:")client.user_data_set(user)client.loop_start()4.获取用户昵称并设置到MQTT中:whileTrue:str=input()ifstr:client.publish("chat",json.dumps({"user":user,"say":str}))6.输入要发送的信息:client.loop_start()5.建立并保持与服务器端的连接:71步骤二:编写客户端代码(12)任务实践importpaho.mqtt.clientasmqttimportjsondefon_connect(client,userdata,flags,rc):client.subscribe("chat")client.publish("chat",json.dumps({"user":user,"say":"Hello,anyone!"}))defon_message(client,userdata,msg):payload=json.loads(msg.payload.decode())print(payload.get("user")+":"+payload.get("say"))7.代码概览1:72步骤二:编写客户端代码(13)任务实践if__name__=='__main__':client=mqtt.Client()#client.username_pw_set("admin","password")#如果没有密码可以不设置client.on_connect=on_connectclient.on_message=on_messageclient.connect("",1883,30)#client.loop_forever()user=input("请输入昵称:")client.user_data_set(user)client.loop_start()whileTrue:str=input()ifstr:client.publish("chat",json.dumps({"user":user,"say":str}))8.代码概览2:73步骤二:编写客户端代码(14)任务实践1.复制一个或多个chat.py2.运行chat.py,启动后在控制台输入昵称和要发送的消息3.查看多个客户端运行效果:聊天并打印数据。目录ContentsSuccessWords74实现多用户在线聊天目录ContentsSuccessWords75任务实践2——实现猜拳游戏目录ContentsSuccessWords76猜拳游戏的基本原理77游戏规则猜拳游戏,即“石头、剪子、布”,是一种广泛流传的手技游戏,通过不同的手势分别表示石头、剪刀或布游戏规则:石头胜剪刀,剪刀胜布,布胜石头78游戏原理猜拳游戏跟“掷硬币”、“掷骰子”的原理类似,就是用产生的随机结果来作决策在游戏中,用户通过按下不同的按键来表示不同的手势,分别代表石头、剪刀或布;电脑从“石头、剪刀、布”三者中随机选择一个手势,和用户的手势进行对比目录ContentsSuccessWords79猜拳游戏的核心代码80程序的流程图程序启动后,首先进行初始化,主要是对显示屏和按键进行设置完成初始化后,进行一个无限循环中,等待用户按键当用户发送手势数据后,等待对方回复手势数据;如果接收到其他用户回复的手势数据,则对用户输入进行对比,确定胜负关系更新界面显示等待用户的下一次输入81步骤一:编写客户端代码(1)任务实践1.新建订阅者Python脚本finger.py2.引入MQTT模块:importpaho.mqtt.clientasmqtt3.与服务端建立连接client=mqtt.Client()
client.connect('',1883,600)#600为keepalive的时间间隔connect方法有三个参数,host是MQTT服务器地址,port是服务器端口,keepalive表示连接最大超时时间82程序的类设计defon_message(client,userdata,msg):payload=json.loads(msg.payload.decode())
#判断胜负并显示结果resultMessage="平局!"if(self.playerStatus==puterStatus):#出拳相同,为平局self.equalNum+=1#平局次数加1elif(self.playerStatus==1andputerStatus==3):#用户剪刀、步骤二布,用户胜resultMessage="%s胜!"%self.playerNameself.playerScore+=1#用户获取次数加1elif(self.playerStatus==2andputerStatus==1):#用户石头、对方剪刀,用户胜resultMessage="%s胜!"%self.playerNameself.playerScore+=1elif(self.playerStatus==3andputerStatus==2):#用户布、对方拳头,用户胜resultMessage="%s胜!"%self.playerNameself.playerScore+=1else:#用其它情况,对方胜resultMessage="%s胜!"%puterNameputerScore+=1#对方获取次数加15.收到手势信息后的处理defon_connect(client,userdata,flags,rc):client.subscribe("chat")client.publish("chat",json.dumps({"user":user,"say":"Hello,anyone!"}))4.连接到服务端的处理83程序的类设计whileTrue:str=input()ifstr:client.publish("chat",json.dumps({"user":user,"say":str}))6.输入要发送的手势信息:84实践练习数据的处理逻辑,将Key4、Key3和Key2分别对应剪刀、石头和布,Key1对应结束游戏调整游戏流程:当出现平局的时候,提示让用户重新按下某个按键,并为计算机重新选择一个随机数,将两者进行比较判断胜负情况;如果平局则再次提示用户重新输入,直到分出胜负目录ContentsSuccessWords85五子棋游戏的基本原理86游戏规则这个案例中,我们可以实现五子棋游戏的两个玩家在指定的位置落子,画出落子后的棋盘,并且根据函数判断出输赢的功能猜拳游戏,即“石头、剪子、布”,是一种广泛流传的手技游戏,通过不同的手势分别表示石头、剪刀或布87程序的流程图这个案例的思路如下所示:首先,根据棋盘的样子画出棋盘然后,对棋盘进行初始化,将可以落子的位置进行统一化处理接下来,就是进入游戏的环节,双方轮流落子,落子后,并将棋盘画出最后,根据落子的位置判断选手的的输赢情况,游戏结束88程序的类设计defprint_init(guige):#打印出首行的棋盘列foriinrange(guige):print("%4d"%(i+1),end='')print()#双重循环,第一重为棋盘的行,隔一行输出棋盘的行数foriinrange(guige*2-1):1.按照五子棋的棋盘样式,画出棋盘89程序的类设计#打印出类似“1+---+---+---+---+---+”,行号,+,—if(i%2==0):print("%-3d"%((i+2)/2),end='')#第二重循环,为棋盘的列,主要在于找出对应位置显示的内容forjinrange(guige*4-3):if(j%4==0):print("+",end='')else:print("-",end='')#打印出类似“||||||”else:print("%3s"%'',end='')forjinrange(guige*4-3):if(j%4==0):print("|",end='')else:print("",end='')#每行输出完成之后换行print()2.按照五子棋的棋盘换行样式,画出棋盘90程序的类设计#重画棋盘,对双方下子进行重画defreprint(guige,wzq):foriinrange(guige*guige):ifi%2==0:xuanshou="X"else:xuanshou="O"#双方轮流下棋while1:print("现在轮到%s方落子"%xuanshou)position=input("请输入落子位置:")x_position=int(position.split()[0])y_position=int(position.split()[1])#判断输入的位置是否有子,有子一直输入,直到输入的位置无子ifwzq[(x_position,y_position)]in["X","O"]:print("您输入的位置有子,请重新输入!")else:3.重画棋盘,对双方下子进行重画91程序的类设计defon_message(client,userdata,msg):payload=json.loads(msg.payload.decode())
#判断胜负并显示结果resultMessage="平局!"if(self.playerStatus==puterStatus):#出拳相同,为平局self.equalNum+=1#平局次数加1else:#用其它情况,对方胜resultMessage="%s胜!"%puterNameputerScore+=1#对方获取次数加1
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年度旋挖设备销售协议典范
- 东方航空高端客户年度框架协议2024
- 2024年PIE工程师培训教程:实战项目演练
- 保安个人劳动协议格式 企业适用
- 房地产估价业务委托协议2024年
- 2024自然人资金出借协议模板
- 《消费行为学》教案:2024年消费者行为新解释
- 产权让渡正式协议文件样本
- 管理学研究实践模板
- 法学研究成果报告模板
- 运动技能学习原理课件
- 医学高级职称评审答辩报告PPT模板
- 《王戎不取道旁李》课堂作业设计
- 签收回执表(最新版)
- 中国气血健康白皮书
- 统编版语文5年级(上)期中单元复习课件
- 驾校大学招生策划书
- 燃气具安装维修工(中级)教学课件完整版
- 第二十八章作用于呼吸系统的药物(tly)
- 首诊负责制查检表
- 实验室审核检查表(参照模板)
评论
0/150
提交评论