<snapdata remixID="9337213"><project name="MQTT library" app="Snap! 6, https://snap.berkeley.edu" version="1"><notes></notes><thumbnail>data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAYAAAB1ovlvAAABnklEQVR4nO3Vsa3CUBAFUbqBwFRiB3abDigKCnk/QiIxhCP5nyNtfoOR9jIgdKkH8L8JkJQASQmQlABJCZCUAEkJkJQASQmQlABJCZCUAEkJkJQASQmQlABJCZCUAEkJkJQASQmQlABJCZCUAEkJkJQASQmQlABJCZCUAEkJkJQASQmQlABJCZCUAEkJkJQASQmQlABJCZCUAEkJkJQASQmQlABJCZCUAEkJkJQASQmQlABJCZCUAEkJkJQAD9xut7Hvez3j9AT4xbZtY13Xsa7rmKZpPJ/PetLpCPCHd4Cft23bWJalnnYKAvzhKMB5nutppyDALz5f8P1+H6/Xq550OgI8cL1ex+PxqGecngBJCZCUAEkJkJQASQmQlABJCZCUAEkJkJQASQmQlABJCZCUAEkJkJQASQmQlABJCZCUAEkJkJQASQmQlABJCZCUAEkJkJQASQmQlABJCZCUAEkJkJQASQmQlABJCZCUAEkJkJQASQmQlABJCZCUAEkJkJQASQmQlABJCZCUAEkJkJQASQmQlABJCZCUAEn9AXE1r8uAI+NYAAAAAElFTkSuQmCC</thumbnail><stage name="Escenario" width="480" height="360" costume="0" color="255,255,255,1" tempo="60" threadsafe="false" penlog="false" volume="100" pan="0" lines="round" ternary="false" hyperops="true" codify="false" inheritance="true" sublistIDs="false" scheduled="false" id="1"><pentrails>data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAeAAAAFoCAYAAACPNyggAAACtUlEQVR4nO3BMQEAAADCoPVPbQwfoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+Bo3+AAF/RMkcAAAAAElFTkSuQmCC</pentrails><costumes><list struct="atomic" id="2"></list></costumes><sounds><list struct="atomic" id="3"></list></sounds><variables></variables><blocks></blocks><scripts></scripts><sprites><sprite name="Sprite" idx="1" x="0" y="0" heading="90" scale="1" volume="100" pan="0" rotation="1" draggable="true" costume="0" color="80,80,80,1" pen="tip" id="8"><costumes><list struct="atomic" id="9"></list></costumes><sounds><list struct="atomic" id="10"></list></sounds><blocks></blocks><variables></variables><scripts></scripts></sprite></sprites></stage><hidden></hidden><headers></headers><code></code><blocks><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;  let listeners = stage.mqtt[broker].listeners(&apos;message&apos;);&#xD;  listeners.forEach((listener) =&gt; { stage.mqtt[broker].removeListener(&apos;message&apos;, listener); })&#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></variables></project><media name="MQTT library" app="Snap! 6, https://snap.berkeley.edu" version="1"></media></snapdata>