`
hanbaohong
  • 浏览: 407269 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

研究成功:利用MQTT技术实现扫码签到大屏时时显示姓名

    博客分类:
  • MQTT
 
阅读更多

一、功能需求:

1、用手机扫一扫大屏上的动态二维码完成签到。

2、能按会场座位图自动分配所有人员的座位。

3、大屏上能时时显示已签到人姓名、未签到人姓名、未签到总人数。

 

二、实现方法:

1、大屏电脑端利用mqtt.js建立即时通讯连接,等待手机扫码发来签到信息。

2、大屏电脑端用JS调用后端API接口获取所有人员的姓名和ID,并按会场座位图在大屏上显示每个姓名的指定座位。

3、大屏电脑端用qrcode.js动态生成签到二维码并显示在大屏上。

4、人员到会场时用手机扫大屏二维码后自动把本人的姓名和ID发送到大屏电脑端。

5、大屏电脑端接收到手机端发来的签到人员信息,在大屏上时时显示已签到人姓名、未签到人姓名、未签到总人数。

 

三、部份代码:

1、大屏电脑端的代码:

<!DOCTYPE html><html>
<head>
	<meta charset="utf-8">
	<title>教师例会签到系统</title>
	<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
	<style>
		* {font-size: 16px;padding: 0;margin: 0;}
		.tbmingdan td {border: 1px solid #333;}
		.tbmingdan span {border: 1px solid #333;width: 70px;margin: 3px 1px;padding: 5px 0px;float: left;text-align: center;}
		#boxCenter {width: 822px;}
		.boxLeftRight {width: 448px;}
		.box {border: 1px solid #333;text-align: center;margin: 3px 1px;padding: 5px 0px;}
	</style>
</head>
<body>
	<div id="tisi" style="color: red;"></div>
	<table border="0" cellspacing="15" cellpadding="1" v-scope>
		<tr align="center">
			<td id="showewm"></td>
			<td colspan="2"><img src="gssyxx400.jpg" />
				<H1 style="font-size: 38px; margin: 9px;">教师例会签到系统</H1><br><br>
				<P style="font-size: 24px;" v-scope>请用手机“企业微信”扫一扫左面的二维码,即可完成签到,签到后按下图中指定位置就坐,谢谢!<br><br>
					签到成功显示蓝色姓名,未签到显示黑色姓名({{store.wqdRenshu}}人)</P>
			</td>
		</tr>
		<tr class="tbmingdan">
			<td valign="top">
				<div class="box">从第二排开始:四五六年级副班主任座位</div>
				<div class="boxLeftRight">
					<div>
						<span v-for="js in store.fbzr2Arr" v-bind:id="'jsid'+js.jsid">{{js.jsname}}</span>
					</div>
				</div>
			</td>
			<td valign="top">
				<div class="box">第一排:行政座位</div>
				<div class="box">第二排:助理座位,从第三排开始是班主任座位</div>
				<div id="boxCenter">
					<span v-for="js in store.bzrArr" v-bind:id="'jsid'+js.jsid">{{js.jsname}}</span>

				</div>
			</td>
			<td valign="top">
				<div class="box">从第二排开始:一二三年级副班主任座位</div>
				<div class="boxLeftRight">
					<div>
						<span v-for="js in store.fbzr1Arr" v-bind:id="'jsid'+js.jsid">{{js.jsname}}</span>
					</div>
				</div>
			</td>
		</tr>
	</table>
	<script src="js/jquery.min.js"></script>
	<script src="js/qrcode.min.js"></script>
	<script src="js/mqtt.min.4.1.0.js"></script>
	<script src="js/petite-vue.min.js"></script>
	<script>
		const store = PetiteVue.reactive({ bzrArr: [], fbzr1Arr: [], fbzr2Arr: [], jsids: "", wqdRenshu: 0, linkok: 0 })
		PetiteVue.createApp({ store }).mount();
		function getById(id) { return document.getElementById(id) }
		const topic = "GssyXXX" + new Date().getTime();
		const connectUrl = "ws://broker-cn.emqx.io:8083/mqtt";
		getById("tisi").innerText = "正在连接MQTT服务器,请等待..."
		const client = mqtt.connect(connectUrl, {
			clean: false,
			connectTimeout: 4000,
			reconnectPeriod: 1000,
			keepalive: 30,
			clientId: topic
		})
		client.on('connect', () => {
			client.subscribe(topic, () => {
				getById("tisi").innerText = ""
				if (store.linkok == 0) {
					makeCode();
					getdata();
					store.linkok = 1;
				}
			})
		});
		client.on('reconnect', function (error) {
			getById("tisi").innerText = "正在重连MQTT服务器..."
		})
		client.on('message', function (topic, message) {
			var tmpArr = message.toString().split('_');
			var toTopic = tmpArr[0];
			var jsid = tmpArr[1];
			$("#jsid" + jsid).css("color", "blue");
			store.jsids = store.jsids.replace(',' + jsid + ',', ',');
			store.wqdRenshu = store.jsids.split(',').length - 2;
			client.publish(toTopic, jsid.toString(), { qos: 1 });
		});
		client.on("close", function () { getById("tisi").innerText = "已断开连接" });
		function makeCode() {
			var qrcode = new QRCode(getById("showewm"), { width: 300, height: 300 });
			qrcode.makeCode("http://xxx.xxx.xxx/xxxxx?topic=" + topic);
		}
		function getdata() {
			$.get("/xxx/xxxxx", function (res) {
				store.bzrArr = res.bzr;
				store.fbzr1Arr = res.fbzr1;
				store.fbzr2Arr = res.fbzr2;
				store.jsids = res.jsids;
				store.wqdRenshu = res.jsids.split(',').length - 2;
			}, "json")
		}
	</script>
</body>
</html>

 

 

2、手机扫码后发送签到信息的代码:

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title>教师例会签到</title>
	<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
	<script src="js/mqtt.min.4.1.0.js"></script>
</head>
<body>
	<div id="tisi" style="color:red;"></div>
	<script>
		var getUrl = location.search.substr(1);
		var tmpArr = getUrl.split("_");
		var topic = tmpArr[0];
		var jsId = tmpArr[1];
		if (topic == "" || jsId == "") {
			getById("tisi").innerText = "扫码有误,请重新扫码签到!";
		} else {
			var jsname = decodeURI(tmpArr[2]);
			var dyTopic = "GssyJslh";
			var myclientId = "GssyXXX" + jsId;
			function getById(id) { return document.getElementById(id) }
			const connectUrl = "ws://broker-cn.emqx.io:8083/mqtt";
			const client = mqtt.connect(connectUrl, {
				connectTimeout: 4000,
				reconnectPeriod: 1000,
				clientId: myclientId
			})
			client.on('reconnect', function (error) {
				getById("tisi").innerText = myclientId + "重连MQTT服务器" + getUrl;
			})
			client.on('connect', () => {
				getById("tisi").innerText = "MQTT服务器连接成功!"
				var toMsg = dyTopic + '_' + jsId;
				client.publish(topic, toMsg.toString(), { qos: 1 });
				client.subscribe(dyTopic, () => {
					var toMsg = dyTopic + '_' + jsId;
					getById("tisi").innerText = "正在提交扫码签到信息‘" + toMsg + "’,请等待反馈...";
					client.publish(topic, toMsg.toString(), { qos: 1 });
				})
			})
			client.on('message', function (topic, message) {if (message == jsId){location.href = "qiandao_ok.html?" + jsname}});
			client.on("close", function () {getById("tisi").innerText = "已断开连接"});
		}
	</script>
</body>
</html>

 

 

 

分享到:
评论

相关推荐

    MQTT MQTTnet 实现

    **MQTT MQTTnet 实现详解** MQTT(Message Queuing Telemetry Transport)是一种轻量级的发布/订阅式消息协议,常用于物联网(IoT)设备之间的通信,它设计的目标是低带宽、高可靠性以及低功耗。MQTTnet是.NET平台上...

    C++实现mqtt协议

    本文将深入探讨如何利用C++来实现MQTT协议,以及涉及的主要概念和技术。 首先,我们需要了解MQTT协议的基本原理。它基于TCP/IP协议栈,以小的消息格式传输数据,支持QoS(Quality of Service)等级0、1、2,确保...

    mqtt-proxy:动态 MQTT 代理 (node.js) - 映射到 clientId 和用户名

    mqtt-代理该项目旨在解决通过单个面向公众的主机/端口组合将单个客户端与特定代理匹配的问题。 用法: 节点 mqtt-proxy &lt;[host:]port&gt; &lt;map&gt; IE 节点 mqtt-proxy localhost:1883 map.json 地图格式: 编辑 map....

    qt编写的mqtt客户端程序,带源码

    此外,理解源码还能帮助开发者更好地掌握Qt的事件驱动模型、异步编程思想以及如何利用信号和槽机制来实现组件间的通信。这不仅对Qt初学者,对有一定经验的开发者来说,也是提升技能和扩展知识的好机会。 总之,`qt...

    app-利用MQTT协议+阿里云平台实现视频监控系统.zip

    当前的项目是采用MQTT协议实现,那么先来了解一下什么是MQTT协议。 软件采用Qt设计,QT版本是5.12.6 设备A的功能:获取摄像头的数据—》缩放成240*320—》编码成JPEG格式—》转码成base64—》组合成MQTT报文—》...

    毕业设计:基于MQTT的物联网设备接入平台。使用Flink流处理框架.zip

    毕业设计:基于MQTT的物联网设备接入平台。使用Flink流处理框架

    MQTT(一)C#使用 MQTTnet 快速实现 MQTT 通信demo

    **MQTT(一)C#使用 MQTTnet 快速实现 MQTT 通信demo** MQTT (Message Queuing Telemetry Transport) 是一种轻量级的发布/订阅...开发者可以利用这些工具轻松地实现设备间的通信,从而构建高效、可靠和灵活的系统。

    C#使用 MQTTnet 快速实现 MQTT 通信 Demo

    在本文中,我们将深入探讨如何使用C#编程语言和MQTTnet库快速实现MQTT通信。MQTT(Message Queuing Telemetry Transport)是一种轻量级的发布/订阅式消息协议,广泛应用于物联网(IoT)场景,因为它具有低开销、高...

    MQTT协议-有这一篇就够了

    MQTT协议知识点大全 MQTT是一种轻量级、开放、简单、规范的消息传输协议,主要用于机器与机器的通信(M2M)和物联网(IoT)环境。MQTT协议的设计思想是轻巧、开放、简单、规范,易于实现。 MQTT控制报文格式: * ...

    基于mqtt的遥控器,在app上点击按钮,将码(空调码,电视码,风扇码)发送到mqqt,mqtt通过WiFi发给esp8266

    【作品名称】:基于mqtt的遥控器,在app上点击按钮,将码(空调码,电视码,风扇码)发送到mqqt,mqtt通过WiFi发给esp8266 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计...

    MQTT技术 实现 彩票相关功能

    下面将详细介绍如何利用MQTT技术实现彩票相关的功能。 1. **基础概念** - **发布/订阅模型**:MQTT的核心是发布/订阅模型,其中客户端可以作为发布者发送消息,也可以作为订阅者接收消息。这种模型使得消息传递变...

    基于MQTT协议实现(推送系统)

    在本文中,我们将深入探讨如何基于MQTT协议实现一个推送系统。 首先,理解MQTT协议的基本概念至关重要。MQTT采用发布/订阅模型,其中客户端可以作为发布者(Publisher)发送消息,也可以作为订阅者(Subscriber)...

    【PyQT实现MQTT上位机】:协程、paho.mqtt库、json文件读写

    图形用户界面:利用PyQT设计直观易用的操作界面,支持消息订阅/发布、主题管理等功能。 异步通信:通过协程实现非阻塞式的网络通讯和文件读写,确保GUI响应迅速且流畅。 MQTT协议支持:采用paho.mqtt库来连接至MQTT...

    c#实现的mqtt_server服务器端

    综上所述,"C#实现的mqtt_server服务器端"项目涵盖了从基础的MQTT协议理解到高级的服务器设计和部署等多个IT领域的知识点,对于希望深入学习C#和物联网技术的开发者来说,是一个宝贵的实践案例。

    MQTT OneNET实现 V2.8

    - **实现方式**:利用MQTT协议的多播机制。 ##### 7. **平台命令下发** - **功能说明**:平台可以向设备发送控制指令。 - **实现方式**:通过特定的topic向设备发送指令。 ##### 8. **QoS级别** - **功能说明*...

    基于MQTT推送服务端java实现

    基于MQTT的推送服务端在Java中的实现是一个常见需求,尤其在实时数据传输和设备通信场景中。本教程将深入探讨如何在Java中构建一个MQTT服务器,结合提供的描述和标签,我们将主要关注以下几个知识点: 1. **MQTT...

    MQTT实现前后端实时通信

    在本文中,我们将深入探讨如何利用MQTT实现前后端的实时通信,并讨论如何设计高效且优雅的主题(topic)策略。 首先,让我们理解**前后端实时通信**的基本概念。在传统的Web开发中,前后端交互通常基于HTTP请求-...

    MQTT嵌入式实现通信.doc

    【MQTT通信协议】 ...总结来说,MQTT协议在STM32等嵌入式系统中实现通信,需要对协议细节有深入理解,同时利用合适的工具进行调试和测试。通过这种方式,我们可以为物联网应用构建可靠的、高效的通信基础设施。

    基于Java MQTT实现的兼职管理系统课程设计

    【作品名称】:基于Java MQTT实现的兼职管理系统【课程设计】 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【项目介绍】: 基于...

    hivemq-mqtt-client:HiveMQ MQTT客户端是与MQTT 5.0和MQTT 3.1.1兼容且功能丰富的高性能Java客户端库,具有不同的API风格和背压支持

    HiveMQ MQTT客户端 MQTT 5.0和3.1.1兼容且功能丰富的高性能Java客户端库,具有不同的API风格和背压支持。 文档: : 社区论坛: : HiveMQ网站: ://www.hivemq.com/ 贡献准则: 执照: MQTT资源: 特征MQTT 3.1.1和...

Global site tag (gtag.js) - Google Analytics