<snapdata remixID="9399215"><project name="MQTT chat" app="Snap! 6, https://snap.berkeley.edu" version="1"><notes></notes><thumbnail>data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAYAAAB1ovlvAAADhElEQVR4nO3VPWsUURjF8TP3qoWFtaxJobVNUEhvrb1WqYSAIeJHSKfgFkIaI/gCprKKTRDEwiiYLdzYWMQP81jMnZedRIOge4LnFD9W7t6Z+Tvz7AQAwoyIHmDa6AGmjR7QStN/fI0l/v+xr1rlN5wCgyGYlM9HiLQ3WJsg0ltEeoLIL8raFIERIj1EVCu9tea4UTn3jV9HpK/lc6O31pxjv/7MzxHpc1k7GBz/sdbf3z7klW6tWkVUdxA4i0hfZvfl7fLvESLtlHN9QGAZkcaItHv80OR1BBIibyHyLUR6PLvvuCFL78p1Nur7hkVE+lS++47IT8veU/aDmcsAAojqXj2AACJv9r4rN61aK8O53K3jGqJaLzfxW/ncPTos7TXW6oeTt8sDSd0ANg+7fWBjBBbKcffL/uu/GejxYEhudg80TRDpRznHsGkF3Q8GiDNvEOlw9nzp9tEBzK/rAcRS3XfSALbXWy3390L3A8qvensW6cMx/wHsvwHbteatUgYwb3Y3Nh0gcLHeX91F4Eq3P+10w9gOQXPOw96bphnS8/VD76+1117oHTtFoBqcb3+wv/9dM9BlAHHu6J/7/LJcezR7XNorb8DJ8QOVy48ub9X78oOTBzC9R+BSbwAv1294AIGriPys6z0FAzLfAfxTzYP5nw3fqPZX0QNMGz3AtNEDTBs9wLTRA0wbPcC00QNMGz3AtNEDTBs9wLTRA0wbPcC00QNMGz3AtNEDTBs9wLTRA0wbPcC00QNMGz3AtNEDTBs9wLTRA0wbPcC00QNMGz3AtNEDTBs9wLTRA0wbPcC00QNMGz3AtNEDTBs9wLTRA0wbPcC00QNMGz3AtNEDTBs9wLTRA0wbPcC00QNMGz3AtNEDTBs9wLTRA0wbPcC00QNMGz3AtNEDTBs9wLTRA0wbPcC00QNMGz3AtNEDTBs9wLTRA0wbPcC00QNMGz3AtNEDTBs9wLTRA0wbPcC00QNMGz3AtNEDTBs9wLTRA0wbPcC00QNMGz3AtNEDTBs9wLTRA0wbPcC00QNMGz3AtNEDTBs9wLTRA0wbPcC00QNMGz3AtNEDTBs9wLTRA0wbPcC00QNMGz3AtNEDTBs9wLTRA0wbPcC00QNMGz3AtNEDTBs9wLTRA0wbPcC00QNMGz3AtNEDTBs9wLTRA0wbPcC00QNMGz3AtNEDTBs9wIT9BBDREK2pD6EzAAAAAElFTkSuQmCC</thumbnail><stage name="Stage" width="480" height="360" costume="1" color="255,255,255,1" tempo="60" threadsafe="false" penlog="false" volume="100" pan="0" lines="round" ternary="true" hyperops="true" codify="false" inheritance="true" sublistIDs="false" scheduled="false" id="1"><pentrails>data:image/png;base64,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</pentrails><costumes><list id="2"><item><costume name="Untitled" center-x="240" center-y="180" image="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAeAAAAFoCAYAAACPNyggAAAGFUlEQVR4nO3OIQHAQBAEsfNvunXxCyYgPHd3HwDw3DwAAEXzAAAUzQMAUDQPAEDRPAAARfMAABTNAwBQNA8AQNE8AABF8wAAFM0DAFA0DwBA0TwAAEXzAAAUzQMAUDQPAEDRPAAARfMAABTNAwBQNA8AQNE8AABF8wAAFM0DAFA0DwBA0TwAAEXzAAAUzQMAUDQPAEDRPAAARfMAABTNAwBQNA8AQNE8AABF8wAAFM0DAFA0DwBA0TwAAEXzAAAUzQMAUDQPAEDRPAAARfMAABTNAwBQNA8AQNE8AABF8wAAFM0DAFA0DwBA0TwAAEXzAAAUzQMAUDQPAEDRPAAARfMAABTNAwBQNA8AQNE8AABF8wAAFM0DAFA0DwBA0TwAAEXzAAAUzQMAUDQPAEDRPAAARfMAABTNAwBQNA8AQNE8AABF8wAAFM0DAFA0DwBA0TwAAEXzAAAUzQMAUDQPAEDRPAAARfMAABTNAwBQNA8AQNE8AABF8wAAFM0DAFA0DwBA0TwAAEXzAAAUzQMAUDQPAEDRPAAARfMAABTNAwBQNA8AQNE8AABF8wAAFM0DAFA0DwBA0TwAAEXzAAAUzQMAUDQPAEDRPAAARfMAABTNAwBQNA8AQNE8AABF8wAAFM0DAFA0DwBA0TwAAEXzAAAUzQMAUDQPAEDRPAAARfMAABTNAwBQNA8AQNE8AABF8wAAFM0DAFA0DwBA0TwAAEXzAAAUzQMAUDQPAEDRPAAARfMAABTNAwBQNA8AQNE8AABF8wAAFM0DAFA0DwBA0TwAAEXzAAAUzQMAUDQPAEDRPAAARfMAABTNAwBQNA8AQNE8AABF8wAAFM0DAFA0DwBA0TwAAEXzAAAUzQMAUDQPAEDRPAAARfMAABTNAwBQNA8AQNE8AABF8wAAFM0DAFA0DwBA0TwAAEXzAAAUzQMAUDQPAEDRPAAARfMAABTNAwBQNA8AQNE8AABF8wAAFM0DAFA0DwBA0TwAAEXzAAAUzQMAUDQPAEDRPAAARfMAABTNAwBQNA8AQNE8AABF8wAAFM0DAFA0DwBA0TwAAEXzAAAUzQMAUDQPAEDRPAAARfMAABTNAwBQNA8AQNE8AABF8wAAFM0DAFA0DwBA0TwAAEXzAAAUzQMAUDQPAEDRPAAARfMAABTNAwBQNA8AQNE8AABF8wAAFM0DAFA0DwBA0TwAAEXzAAAUzQMAUDQPAEDRPAAARfMAABTNAwBQNA8AQNE8AABF8wAAFM0DAFA0DwBA0TwAAEXzAAAUzQMAUDQPAEDRPAAARfMAABTNAwBQNA8AQNE8AABF8wAAFM0DAFA0DwBA0TwAAEXzAAAUzQMAUDQPAEDRPAAARfMAABTNAwBQNA8AQNE8AABF8wAAFM0DAFA0DwBA0TwAAEXzAAAUzQMAUDQPAEDRPAAARfMAABTNAwBQNA8AQNE8AABF8wAAFM0DAFA0DwBA0TwAAEXzAAAUzQMAUDQPAEDRPAAARfMAABTNAwBQNA8AQNE8AABF8wAAFM0DAFA0DwBA0TwAAEXzAAAUzQMAUDQPAEDRPAAARfMAABTNAwBQNA8AQNE8AABF8wAAFM0DAFA0DwBA0TwAAEXzAAAUzQMAUDQPAEDRPAAARfMAABTNAwBQNA8AQNE8AABF8wAAFM0DAFA0DwBA0TwAAEXzAAAUzQMAUDQPAEDRPAAARfMAABTNAwBQNA8AQNE8AABF8wAAFM0DAFA0DwBA0TwAAEXzAAAUzQMAUDQPAEDRPAAARfMAABTNAwBQNA8AQNE8AABF8wAAFM0DAFA0DwBA0TwAAEXzAAAUzQMAUDQPAEDRPAAARfMAABTNAwBQNA8AQNE8AABF8wAAFM0DAFA0DwBA0TwAAEXzAAAUzQMAUDQPAEDRPAAARfMAABTNAwBQNA8AQNE8AABF8wAAFM0DAFA0DwBA0TwAAEXzAAAUzQMAUDQPAEDRPAAARfMAABTNAwBQNA8AQNE8AABF8wAAFM0DAFA0DwBA0TwAAEXzAAAUzQMAUDQPAEDRPAAARfMAABTNAwBQNA8AQNE8AABF8wAAFM0DAJDzAwnWhGGOnjSMAAAAAElFTkSuQmCC" id="3"/></item></list></costumes><sounds><list struct="atomic" id="4"></list></sounds><variables></variables><blocks></blocks><scripts></scripts><sprites><sprite name="Sprite" idx="1" x="-230" y="144.00000000000003" heading="90" scale="1" volume="100" pan="0" rotation="1" draggable="true" hidden="true" costume="0" color="3,219,0,1" pen="tip" id="9"><costumes><list struct="atomic" id="10"></list></costumes><sounds><list struct="atomic" id="11"></list></sounds><blocks></blocks><variables></variables><scripts><script x="30" y="30"><block s="receiveGo"></block><custom-block s="MQTT connect %s %s %s"><l>test.mosquitto.org:8081</l><l></l><l></l></custom-block><custom-block s="MQTT sub %s %s %cmdRing"><l>test.mosquitto.org:8081</l><l>snap-chat</l><block s="reifyScript"><script><block s="doAddToList"><block var="message"/><custom-block s="messages"></custom-block></block><custom-block s="refresh messages"></custom-block></script><list><l>#1</l><l>message</l></list></block></custom-block><block s="doForever"><script><block s="doAsk"><l></l></block><custom-block s="MQTT pub %s %s %s"><l>test.mosquitto.org:8081</l><l>snap-chat</l><block s="reportJoinWords"><list><block var="username"/><l>: </l><block s="getLastAnswer"></block></list></block></custom-block></script></block></script><script x="531" y="56"><block s="receiveGo"></block><block s="doSetVar"><l>username</l><block s="evaluate"><block s="reportJSFunction"><list></list><l>return this.parentThatIsA(IDE_Morph).cloud.username</l></block><list></list></block></block><block s="doIf"><block s="reportEquals"><block var="username"/><l>0</l></block><script><block s="doSetVar"><l>username</l><block s="reportListItem"><l>1</l><block s="reportTextSplit"><block s="reportURL"><l>https://namey.muffinlabs.com/name.json</l></block><l><option>json</option></l></block></block></block></script></block></script></scripts></sprite><watcher var="message list" style="normal" x="10" y="10" color="243,118,29" hidden="true"/><watcher var="username" style="normal" x="10" y="103.000002" color="243,118,29" hidden="true"/></sprites></stage><hidden></hidden><headers></headers><code></code><blocks><block-definition s="refresh messages" type="command" category="other"><header></header><code></code><translations></translations><inputs></inputs><script><block s="doWarp"><script><block s="clear"></block><block s="gotoXY"><l>-230</l><l>160</l></block><block s="doForEach"><l>message</l><custom-block s="messages"></custom-block><script><block s="write"><block var="message"/><l>12</l></block><block s="setXPosition"><l>-230</l></block><block s="changeYPosition"><l>-16</l></block></script></block></script></block></script></block-definition><block-definition s="messages" type="reporter" category="other"><header></header><code></code><translations></translations><inputs></inputs><script><block s="doUntil"><block s="reportLessThan"><block s="reportListLength"><block var="message list"/></block><l>20</l></block><script><block s="doDeleteFromList"><l>1</l><block var="message list"/></block></script></block><block s="doReport"><block var="message list"/></block></script><scripts><script x="327" y="57.200000000000045"><block s="doSetVar"><l>message list</l><block s="reportNewList"><list></list></block></block></script></scripts></block-definition><block-definition s="username" type="reporter" category="other"><header></header><code></code><translations></translations><inputs></inputs><script><block s="doIf"><block s="reportEquals"><block var="username"/><l>0</l></block><script></script></block><block s="doReport"><block var="username"/></block></script></block-definition><block-definition s="load JS from url: %&apos;url&apos; waiting for object: %&apos;object&apos;" type="command" category="other"><header></header><code></code><translations></translations><inputs><input type="%s"></input><input type="%s"></input></inputs><script><block s="doRun"><block s="reportJSFunction"><list><l>url</l><l>object</l></list><l>var nodes = document.getElementsByTagName(&apos;*&apos;),&#xD;    node = nodes[nodes.length - 1].parentNode,&#xD;    script = document.createElement(&apos;script&apos;);&#xD;&#xD;if (object == null) {&#xD;  throw new Error(&#xD;    &apos;You need to specify the name of an object that you expect the library to create.&apos;&#xD;  );&#xD;}&#xD;&#xD;script.id = object.replace(/[^a-z]/gi,&apos;&apos;); &#xD;&#xD;if (!document.getElementById(script.id)) {&#xD;  script.setAttribute(&apos;type&apos;, &apos;text/javascript&apos;);&#xD;  script.setAttribute(&apos;src&apos;, url);&#xD;  node.appendChild(script);&#xD;}</l></block><list><block var="url"/><block var="object"/></list></block><block s="doWaitUntil"><block s="evaluate"><block s="reportJSFunction"><list><l>objectName</l></list><l>return (typeof window[objectName]) !== &apos;undefined&apos;</l></block><list><block var="object"/></list></block></block></script></block-definition><block-definition s="MQTT connect %&apos;broker&apos; %&apos;username&apos; %&apos;password&apos;" type="command" category="sensing"><header></header><code></code><translations></translations><inputs><input type="%s">test.mosquitto.org:8081</input><input type="%s"></input><input type="%s"></input></inputs><script><block s="doDeclareVariables"><list><l>connection status</l></list></block><custom-block s="load MQTT library"></custom-block><block s="doSetVar"><l>connection status</l><l>connecting</l></block><block s="doRun"><block s="reportJSFunction"><list><l>broker</l><l>username</l><l>password</l><l>process</l></list><l>/* github.com/pixavier/mqtt4snap  */&#xD;&#xD;stage =  this.parentThatIsA(StageMorph);&#xD;&#xD;if (!(&apos;mqtt&apos; in stage)){&#xD;  stage.mqtt = [];&#xD;}&#xD;&#xD;let wabroker;&#xD;if (broker.startsWith(&apos;ws://&apos;)) {&#xD;  wsbroker = broker;&#xD;} else if (broker.startsWith(&apos;wss://&apos;)) {&#xD;  wsbroker = broker;&#xD;} else {&#xD;  let prefix;&#xD;  prefix = window.location.protocol == &apos;https:&apos;?&apos;wss&apos;:&apos;ws&apos;;&#xD;  wsbroker = prefix + &apos;://&apos; + broker;&#xD;}&#xD;&#xD;try{&#xD;  stage.mqtt[broker].end();&#xD;}catch(e){}&#xD;&#xD;delete stage.mqtt[broker];&#xD;&#xD;if (username) {&#xD;console.log(&apos;ei&apos;);&#xD;  stage.mqtt[broker] = mqtt.connect(wsbroker, {&#xD;    username: username,&#xD;    password: password,&#xD;//  reconnectPeriod: -1 &#xD;  });&#xD;}else{&#xD;  stage.mqtt[broker] = mqtt.connect(wsbroker);&#xD;}&#xD;&#xD;stage.mqtt[broker].on(&apos;connect&apos;, function(connack) {&#xD;  process.doSetVar(&apos;connection status&apos;, &apos;connected&apos;);&#xD;  console.log(&apos;Connected to &apos;+wsbroker);&#xD;});&#xD;&#xD;stage.mqtt[broker].on(&apos;close&apos;, function() {&#xD;  process.doSetVar(&apos;connection status&apos;, new Error(&apos;Connection closed&apos;));&#xD;  console.log(&apos;Connection closed on &apos; + wsbroker);&#xD;  try{ stage.mqtt[broker].end(); }catch(e){}&#xD;  delete stage.mqtt[broker];&#xD;});&#xD;&#xD;stage.mqtt[broker].on(&apos;connect&apos;, function(connack) {&#xD;  process.doSetVar(&apos;connection status&apos;, &apos;connected&apos;);&#xD;  console.log(&apos;Connected to &apos;+wsbroker);&#xD;});&#xD;&#xD;stage.mqtt[broker].on(&apos;error&apos;, function(error) {&#xD;  console.log(&apos;error&apos;, error.message);&#xD;  process.doSetVar(&apos;connection status&apos;, error);&#xD;  try{&#xD;    stage.mqtt[broker].end();&#xD;  }catch(e){}&#xD;  delete stage.mqtt[broker];&#xD;  alert(error.message);&#xD;});&#xD;</l></block><list><block var="broker"/><block var="username"/><block var="password"/></list></block><block s="doWaitUntil"><block s="reportNot"><block s="reportEquals"><block var="connection status"/><l>connecting</l></block></block></block><block s="doIf"><block s="reportNot"><block s="reportEquals"><block var="connection status"/><l>connected</l></block></block><script><block s="doRun"><block s="reportJSFunction"><list><l>status</l></list><l>throw status;</l></block><list><block var="connection status"/></list></block></script></block></script></block-definition><block-definition s="MQTT pub %&apos;broker&apos; %&apos;topic&apos; %&apos;msg&apos;" type="command" category="sensing"><header></header><code></code><translations></translations><inputs><input type="%s">test.mosquitto.org:8081</input><input type="%s">topicName</input><input type="%s">Hello</input></inputs><script><custom-block s="load MQTT library"></custom-block><block s="doRun"><block s="reportJSFunction"><list><l>broker</l><l>topic</l><l>msg</l></list><l>/* github.com/pixavier/mqtt4snap  */&#xD;&#xD;let stage =  this.parentThatIsA(StageMorph);&#xD;&#xD;if (!(&apos;mqtt&apos; in stage)){&#xD;  throw new Error(&apos;No connection to broker &apos; + broker);&#xD;}&#xD;&#xD;if(!stage.mqtt[broker]){&#xD;  throw new Error(&apos;No connection to broker &apos; + broker);&#xD;}&#xD;&#xD;let prefix = window.location.protocol == &apos;https:&apos;?&apos;wss&apos;:&apos;ws&apos;;&#xD;let wsbroker = prefix+&apos;://&apos;+broker;&#xD;&#xD;try{&#xD;  let client = stage.mqtt[broker];&#xD;  client.publish(topic, &apos;&apos; + msg);&#xD;}catch(e){&#xD;//  console.log(e);&#xD;  throw e;&#xD;}&#xD;</l></block><list><block var="broker"/><block var="topic"/><block var="msg"/></list></block></script></block-definition><block-definition s="MQTT sub %&apos;broker&apos; %&apos;topic&apos; %&apos;callback&apos;" type="command" category="sensing"><header></header><code></code><translations></translations><inputs><input type="%s">test.mosquitto.org:8081</input><input type="%s">topicName</input><input type="%cmdRing"></input></inputs><script><custom-block s="load MQTT library"></custom-block><block s="doRun"><block s="reportJSFunction"><list><l>broker</l><l>topic</l><l>callback</l></list><l>/* github.com/pixavier/mqtt4snap  */&#xD;&#xD;let stage =  this.parentThatIsA(StageMorph);&#xD;&#xD;if (!(&apos;mqtt&apos; in stage)){throw new Error(&apos;No connection to broker &apos;+broker);}&#xD;&#xD;let prefix = window.location.protocol == &apos;https:&apos;?&apos;wss&apos;:&apos;ws&apos;;&#xD;let wsbroker = prefix+&apos;://&apos;+broker;&#xD;&#xD;if(stage.mqtt[broker]){&#xD;  try {stage.mqtt[broker].unsubscribe(topic);}catch(e){}&#xD;}else{&#xD;  throw new Error(&apos;No connection to broker &apos;+broker);&#xD;}&#xD;&#xD;stage.mqtt[broker].subscribe(topic);&#xD;&#xD;let mqttListener = function (aTopic, payload) {	&#xD;//  if (aTopic !== topic) { return; }&#xD;  if (!mqttWildcard(aTopic, topic)) {return;}&#xD;  let p = new Process();&#xD;  try {&#xD;    p.initializeFor(callback, new List([aTopic, payload.toString()]));&#xD;  } catch(e) {&#xD;    p.initializeFor(callback, new List([]));&#xD;  }&#xD;  stage.threads.processes.push(p);&#xD;};&#xD;&#xD;stage.mqtt[broker].on(&apos;message&apos;, mqttListener);&#xD;&#xD;let mqttWildcard = function (topic, wildcard) {&#xD; 	if (topic === wildcard) {return true;} &#xD; 	else if (wildcard === &apos;#&apos;) {return true;}&#xD;&#xD; 	var res = [];&#xD; 	var t = String(topic).split(&apos;/&apos;);&#xD; 	var w = String(wildcard).split(&apos;/&apos;);&#xD; 	var i = 0;&#xD; 	for (var lt = t.length; i &lt; lt; i++) {&#xD;		  if (w[i] === &apos;+&apos;) {&#xD; 		  	res.push(t[i]);&#xD;	  	} else if (w[i] === &apos;#&apos;) {&#xD; 	  		res.push(t.slice(i).join(&apos;/&apos;));&#xD;   			return true;&#xD;  		} else if (w[i] !== t[i]) {&#xD;   			return false;&#xD; 	  }&#xD;  }&#xD; 	if (w[i] === &apos;#&apos;) {i += 1;}&#xD; 	return (i === w.length) ? true : false;&#xD;}&#xD;</l></block><list><block var="broker"/><block var="topic"/><block var="callback"/></list></block></script></block-definition><block-definition s="MQTT unsub %&apos;broker&apos; %&apos;topic&apos;" type="command" category="sensing"><header></header><code></code><translations></translations><inputs><input type="%s">test.mosquitto.org:8081</input><input type="%s">topicName</input></inputs><script><custom-block s="load MQTT library"></custom-block><block s="doRun"><block s="reportJSFunction"><list><l>broker</l><l>topic</l></list><l>/* github.com/pixavier/mqtt4snap  */&#xD;&#xD;let stage =  this.parentThatIsA(StageMorph);&#xD;try{&#xD;  stage.mqtt[broker].unsubscribe(topic);&#xD;}catch(e){&#xD;  console.log(e);&#xD;}</l></block><list><block var="broker"/><block var="topic"/></list></block></script></block-definition><block-definition s="MQTT disconnect %&apos;broker&apos;" type="command" category="sensing"><header></header><code></code><translations></translations><inputs><input type="%s">test.mosquitto.org:8081</input></inputs><script><custom-block s="load MQTT library"></custom-block><block s="doRun"><block s="reportJSFunction"><list><l>broker</l></list><l>/* github.com/pixavier/mqtt4snap  */&#xD;&#xD;let stage =  this.parentThatIsA(StageMorph);&#xD;&#xD;try{&#xD;  if(broker==&apos;all&apos;){&#xD;    for(let brok of Object.keys(stage.mqtt)){&#xD;      try {&#xD;        stage.mqtt[brok].end();&#xD;      } catch (e0) {&#xD;        console.log(e0);&#xD;      }&#xD;    } &#xD;  }else{&#xD;    stage.mqtt[broker].end();&#xD;  }&#xD;}catch(e1){&#xD;  console.log(e1);&#xD;}&#xD;try{&#xD;  if(broker==&apos;all&apos;){&#xD;    try {&#xD;      delete stage.mqtt;&#xD;      stage.mqtt=[];&#xD;    } catch (e2) {&#xD;      console.log(e2);&#xD;    }&#xD;  }else{&#xD;    delete stage.mqtt[broker];&#xD;  }&#xD;}catch(e3){&#xD;//  console.log(e3);&#xD;}&#xD;</l></block><list><block var="broker"/></list></block></script></block-definition><block-definition s="MQTT request %&apos;broker&apos; %&apos;topic&apos; %&apos;idCall&apos; %&apos;msg&apos; %&apos;callback&apos;" type="command" category="sensing"><header></header><code></code><translations></translations><inputs><input type="%s">test.mosquitto.org:8081</input><input type="%s">topicName</input><input type="%s">idCall</input><input type="%s">Hello</input><input type="%cmdRing"></input></inputs><script><custom-block s="MQTT sub %s %s %cmdRing"><block var="broker"/><block s="reportJoinWords"><list><l>idCall</l><block var="idCall"/></list></block><block s="reifyScript"><script><block s="doRun"><block var="callback"/><list><block var="#2"/><block var="#1"/></list></block><custom-block s="MQTT unsub %s %s"><block var="broker"/><block s="reportJoinWords"><list><l>idCall</l><block var="idCall"/></list></block></custom-block></script><list><l>#1</l><l>#2</l></list></block></custom-block><custom-block s="MQTT pub %s %s %s"><block var="broker"/><block s="reportJoinWords"><list><block var="topic"/><l>/</l><block s="reportJoinWords"><list><l>idCall</l><block var="idCall"/></list></block></list></block><block var="msg"/></custom-block></script></block-definition><block-definition s="MQTT response %&apos;broker&apos; %&apos;topic&apos; %&apos;reply&apos;" type="command" category="sensing"><header></header><code></code><translations></translations><inputs><input type="%s">test.mosquitto.org:8081</input><input type="%s">topicName/#</input><input type="%repRing"></input></inputs><script><block s="doDeclareVariables"><list><l>resp</l><l>callbackTopic</l></list></block><custom-block s="MQTT sub %s %s %cmdRing"><block var="broker"/><block var="topic"/><block s="reifyScript"><script><block s="doSetVar"><l>resp</l><block s="evaluate"><block var="reply"/><list><block var="#1"/><block var="#2"/></list></block></block><block s="doSetVar"><l>callbackTopic</l><block s="reportListItem"><l><option>last</option></l><block s="reportTextSplit"><block var="#1"/><l>/</l></block></block></block><custom-block s="MQTT pub %s %s %s"><block var="broker"/><block var="callbackTopic"/><block var="resp"/></custom-block></script><list><l>#1</l><l>#2</l></list></block></custom-block></script></block-definition><block-definition s="example MQTT response reporter %&apos;topic&apos; %&apos;msg&apos;" type="reporter" category="sensing"><header></header><code></code><translations></translations><inputs><input type="%s">topicName</input><input type="%s">msg</input></inputs><script><block s="doThinkFor"><block s="reportJoinWords"><list><l>hello </l><block var="msg"/></list></block><l>1</l></block><block s="doReport"><block var="msg"/></block></script></block-definition><block-definition s="MQTT request %&apos;broker&apos; %&apos;topic&apos; %&apos;idCall&apos; %&apos;msg&apos;" type="reporter" category="sensing"><header></header><code></code><translations></translations><inputs><input type="%s">test.mosquitto.org:8081</input><input type="%s">topicName</input><input type="%s">idCall</input><input type="%s">Hello</input></inputs><script><block s="doDeclareVariables"><list><l>resp</l><l>semaphor</l></list></block><custom-block s="MQTT sub %s %s %cmdRing"><block var="broker"/><block s="reportJoinWords"><list><l>idCall</l><block var="idCall"/></list></block><block s="reifyScript"><script><block s="doSetVar"><l>resp</l><block var="#2"/></block><custom-block s="MQTT unsub %s %s"><block var="broker"/><block s="reportJoinWords"><list><l>idCall</l><block var="idCall"/></list></block></custom-block><block s="doSetVar"><l>semaphor</l><block s="reportBoolean"><l><bool>true</bool></l></block></block></script><list><l>#1</l><l>#2</l></list></block></custom-block><custom-block s="MQTT pub %s %s %s"><block var="broker"/><block s="reportJoinWords"><list><block var="topic"/><l>/</l><block s="reportJoinWords"><list><l>idCall</l><block var="idCall"/></list></block></list></block><block var="msg"/></custom-block><block s="doWaitUntil"><block var="semaphor"/></block><block s="doReport"><block var="resp"/></block></script></block-definition><block-definition s="load MQTT library" type="command" category="other"><header></header><code></code><translations></translations><inputs></inputs><script><custom-block s="load JS from url: %s waiting for object: %s"><l>https://unpkg.com/mqtt/dist/mqtt.min.js</l><l>mqtt</l></custom-block><block s="doWaitUntil"><block s="evaluate"><block s="reportJSFunction"><list></list><l>return (typeof mqtt.connect) !== &apos;undefined&apos;</l></block><list></list></block></block></script></block-definition></blocks><variables><variable name="message list"><list struct="atomic" id="451">bromagosa: Welcome to the Snap! MQTT chat!</list></variable><variable name="username"><l>bromagosa</l></variable></variables></project><media name="MQTT chat" app="Snap! 6, https://snap.berkeley.edu" version="1"></media></snapdata>