{"id":20626597,"url":"https://github.com/node-m2m/m2m-quicktour","last_synced_at":"2025-04-15T15:20:40.976Z","repository":{"id":55525972,"uuid":"500101575","full_name":"Node-M2M/M2M-Quicktour","owner":"Node-M2M","description":"A quick start-up guide on how to develop applications using Node-M2M framework.","archived":false,"fork":false,"pushed_at":"2024-05-11T18:50:57.000Z","size":262,"stargazers_count":5,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"main","last_synced_at":"2024-05-11T19:43:09.308Z","etag":null,"topics":["automation-framework","browser-framework","distributed-computing","iiot","industrie-40","iot","m2m","mqtt","smart-manufacturing"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Node-M2M.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-06-05T13:12:12.000Z","updated_at":"2024-05-30T00:26:03.810Z","dependencies_parsed_at":"2024-05-30T00:44:15.376Z","dependency_job_id":null,"html_url":"https://github.com/Node-M2M/M2M-Quicktour","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Node-M2M%2FM2M-Quicktour","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Node-M2M%2FM2M-Quicktour/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Node-M2M%2FM2M-Quicktour/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Node-M2M%2FM2M-Quicktour/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Node-M2M","download_url":"https://codeload.github.com/Node-M2M/M2M-Quicktour/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":249094939,"owners_count":21211837,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["automation-framework","browser-framework","distributed-computing","iiot","industrie-40","iot","m2m","mqtt","smart-manufacturing"],"created_at":"2024-11-16T13:14:08.460Z","updated_at":"2025-04-15T15:20:40.960Z","avatar_url":"https://github.com/Node-M2M.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Quick Tour\n   1. [M2M Publish-Subscribe Pattern](#m2m-publish-subscribe-pattern)\n   2. [M2M Client-Server Pattern](#m2m-client-server-pattern)\n   3. [M2M Browser Client](#m2m-browser-client)\n   4. [Edge Computing Using Local Area Networking](https://github.com/Node-M2M/m2m-edge-example)\n   5. [Create an Edge Gateway](https://github.com/Node-M2M/edge-gateway)\n   6. [Create an M2M Bridge Gateway](https://github.com/Node-M2M/m2m-bridge-gateway)\n   7. [Create a Load Balancer Server for Edge Computing](https://github.com/Node-M2M/edge-load-balancing)\n   8. [M2M Server-To-Server Communication](https://github.com/Node-M2M/m2m-server-to-server-communication)\n   9. [Edge Raspberry Pi GPIO Access](https://github.com/Node-M2M/edge-rpi-gpio-access)\n   \u003c!--8. [Edge C/C++ Connector Application](https://github.com/Node-M2M/CppEdgeConnector)\n   9. [Edge C# Connector Application](https://github.com/Node-M2M/CsharpEdgeConnector)--\u003e\n      \n   \u003c!--7. [Monitor Data from Remote C/C++ Application through IPC (inter-process communication)](https://github.com/EdAlegrid/cpp-ipc-application-demo)\n   7. [M2M Client-Server Using HTTP Api](https://github.com/EdAlegrid/http-api)\n   8. [Web application demo using the fetch api](https://github.com/EdAlegrid/m2m-web-application-demo)\n   9. [Web application demo using only an m2m browser client](https://github.com/EdAlegrid/m2m-browser-client-demo)\n   10. [Monitor Data from Remote C# Application through IPC (inter-process communication)](https://github.com/EdAlegrid/csharp-ipc-application-demo)\n   11. [File Integrity Monitoring](https://github.com/EdAlegrid/file-integrity-monitoring)\n   12. [Create A Simple Gateway Load Balancer](https://github.com/EdAlegrid/gateway-load-balancer)--\u003e\n\n\u003cbr\u003e\n\n\u003c!--- [API Reference](https://github.com/Node-M2M/M2M-API) ---\u003e\n\n---\n\n\u003cbr\u003e\n\n## M2M Publish-Subscribe Pattern\n![](assets/m2m-system-example.png)\n[](https://raw.githubusercontent.com/EdoLabs/src2/master/quicktour.svg?sanitize=true)\n\n\nBefore you start, \u0026nbsp;ensure you have a [node.js](https://nodejs.org/en/) installation in all of your remote endpoints.\n\n[Create an account](https://www.node-m2m.com/m2m/account/create) and register your server endpoints.\n\n#### Install *m2m* on your endpoints.\n\n```js\n$ npm install m2m\n```\n\n### Server 1 Setup\n\n#### 1. Choose any connect api below and save the code as *server.js* in your server 1 project directory.\n\nConnect using callback\n```js\nconst m2m = require('m2m');\n\nlet server = new m2m.Server(100);\n\nserver.connect(() =\u003e {\n  // server resources \n  server.publish('random-number', (ws) =\u003e {\n    let rn = Math.floor(Math.random() * 100);\n    let data = {id:ws.id, topic:ws.topic, value:rn};\n    ws.send(data);\n  });\n});\n```\nConnect using async/await\n\n```js\nconst m2m = require('m2m');\n\nlet server = new m2m.Server(100);\n\nlet main = async () =\u003e {\n  await server.connect();\n  // add server resources here\n}\n\nmain();\n```\nConnect using promise\n\n```js\nconst m2m = require('m2m');\n\nlet server = new m2m.Server(100);\n\nm2m.connect()\n.catch(console.log)\n.then(console.log) // success\n.then(() =\u003e {\n  // add server resources here\n})  \n```\n#### 2. Start server 1 application.\n\n```js\n$ node server.js\n```\n\nThe first time you run your application, \u0026nbsp;it will ask for your userid and password credentials.\n```js\n? Enter your userid (email):\n? Enter your password:\n\n```\nThe next time you run your application, \u0026nbsp;it will start automatically using a saved user token.\n\nAt anytime, \u0026nbsp;if you're having difficulty or issues restarting your application, \u0026nbsp;you can re-authenticate with an `-r` flag. This will refresh your token as shown below.\n```js\n$ node server.js -r\n```\n\n### Server 2 Setup\n\n#### 1. Save the code below as *server.js* in your server 2 project directory.\n\n```js\nconst m2m = require('m2m');\n\nlet server = new m2m.Server(200);\n\nlet main = async () =\u003e {\n  let result = await server.connect();\n  console.log(result); // success\n\n  server.pub('random-number', (ws) =\u003e {\n    let rn = Math.floor(Math.random() * 100);\n    ws.send({id:ws.id, topic:ws.topic, value:rn});\n  });\n}\n\nmain();\n```\n\n#### 2. Start server 2 application.\n\n```js\n$ node server.js\n```\n\n### Client Setup\n\n#### 1. Save the code below as *client.js* in your client project directory.\n\n**Method 1:** \u0026nbsp; Access each server using the access method\n```js\nconst m2m = require('m2m');\n\nlet client = new m2m.Client();\n\nclient.connect()\n.catch(console.log)\n.then(console.log) // success\n.then(() =\u003e {\n  let client1 = client.access(100);\n  let client2 = client.access(200);\n\n  // using the default 5 secs polling interval\n  client1.subscribe('random-number', (data) =\u003e {\n    console.log('client1 subscribe random-number', data);\n  });\n  \n  // using a polling interval of 10 secs \n  client2.sub('random-number', 10000, (data) =\u003e {\n    console.log('client2 subscribe random-number', data);\n  });\n\n  setTimeout(() =\u003e {\n    client1.unsubscribe('random-number');\n    console.log('client1 unsub');\n  }, 30000);\n\n  setTimeout(async () =\u003e {\n    // confirm unsubscribe if successful\n    let result = await client2.unsub('random-number');\n    console.log('client2 unsub', result); // true if successful\n  }, 60000);\n})\n```\n\n**Method 2:** \u0026nbsp; Access each server directly from the client object by providing the server id  \n```js\nconst { Client } = require('m2m');\n\nlet client = new Client();\n\nclient.connect()\n.catch(console.log)\n.then(console.log) // success\n.then(() =\u003e {\n\n  // using the default 5 secs polling interval\n  client.subscribe(100, 'random-number', (data) =\u003e {\n  // or\n  //client.subscribe({id:100, topic:'random-number'}, (data) =\u003e {\n    console.log('client1 subscribe random-number', data);\n  });\n  \n  // using a polling interval of 10 secs \n  client.sub(200, 'random-number', 10000, (data) =\u003e {\n  // or\n  //client.sub({id:200, topic:'random-number', interval:10000}, (data) =\u003e {\n    console.log('client2 subscribe random-number', data);\n  });\n\n  setTimeout(() =\u003e {\n    client.unsubscribe(100, 'random-number');\n    console.log('client1 unsub');\n  }, 30000);\n\n  setTimeout(async () =\u003e {\n    // confirm unsubscribe if successful\n    let result = await client.unsub({id:200, topic:'random-number'});\n    console.log('client2 unsub', result); // true if successful\n  }, 60000);\n})\n```\n\n#### 3. Start client application.\n```js\n$ node client.js\n```\nYou should get a similar output result as shown below.\n```js\nclient1 subscribe random-number { id: 100, topic: 'random-number', value: 18 }\nclient1 subscribe random-number { id: 100, topic: 'random-number', value: 8 }\nclient2 subscribe random-number { id: 200, topic: 'random-number', value: 98 }\nclient1 subscribe random-number { id: 100, topic: 'random-number', value: 96 }\nclient1 unsub\nclient2 subscribe random-number { id: 200, topic: 'random-number', value: 34 }\nclient1 subscribe random-number { id: 100, topic: 'random-number', value: 15 }\nclient2 unsub true\n```\n\n\u003cbr\u003e\n\n\n## M2M Client-Server Pattern\n![](assets/m2m-system-example.png)\n[](https://raw.githubusercontent.com/EdoLabs/src2/master/quicktour.svg?sanitize=true)\n\n### Server 1 Setup\n\n#### 1. Save the code below as *server.js* in your server 1 project directory.\n\n```js\nconst { Server } = require('m2m');\n\nlet server = new Server(100);\n\nserver.connect(() =\u003e {\n\n  // publish resource\n  server.publish('random-number', (ws) =\u003e {\n    let rn = Math.floor(Math.random() * 100);\n    ws.send({id:ws.id, topic:ws.topic, value:rn});\n  });\n\n  // common read/write resource \n  server.dataSource('/machine-1', (ws) =\u003e {\n    let data = { id:ws.id, rootTopic:ws.rootTopic, subTopic:ws.subTopic }\n\n    if(ws.topic === '/machine-1/sensor-1'){\n      data.type = 'sensor-1';\n      data.value = Math.floor(Math.random() * 200);\n    }\n    else if(ws.topic === '/machine-1/sensor-2'){\n      data.type = 'sensor-2';\n      data.value = Math.floor(Math.random() * 400);\n    }\n    else if(ws.topic === '/machine-1' \u0026\u0026 ws.payload){\n      data.type = ws.payload.type;\n      data.value = ws.payload.value;\n    }  \n    ws.send(data);\n  });\n});\n```\n\n#### 2. Start server 1 application.\n\n```js\n$ node server.js\n```\n\n### Server 2 Setup\n\n#### 1. Save the code below as *server.js* in your server 2 project directory.\n\n```js\nconst { Server } = require('m2m');\n\nlet server = new Server(200);\n\nserver.connect(() =\u003e {\n\n  // publish resource\n  server.pub('random-number', (ws) =\u003e {\n    let rn = Math.floor(Math.random() * 100);\n    ws.send({id:ws.id, topic:ws.topic, value:rn});\n  });\n\n  // http get resource \n  server.get('/update-server-data/:id/new-data/:data', (req, res) =\u003e {\n    res.send({id:res.id, query:req.query, params:req.params});\n  });\n\n  // http get resource\n  server.get('/device-state', (req, res) =\u003e {\n    res.send({id:res.id, path:res.path, query:req.query, params:req.params, state:'off'});\n  });\n\n  // http post resource \n  server.post('/machine-control/:id/actuator/:number/action/:state', (req, res) =\u003e {\n    res.send({id:res.id, path:res.path, query:req.query, params:req.params});\n  });    \n});\n```\n\n#### 2. Start server 2 application.\n\n```js\n$ node server.js\n```\n\n### Client Setup\n\n#### 1. Save any of the code below as *client.js* in your client project directory.\n\n**Method 1**\n\n```js\nconst m2m = require('m2m');\n\nlet client = new m2m.Client();\n\nconst main = async () =\u003e {\n  let result = await client.connect();\n  console.log(result); // success\n\n  let c1 = client.access(100);\n  let c2 = client.access(200);\n\n  let s1 = await c1.read('/machine-1/sensor-1')\n  console.log(s1)\n\n  let s2 = await c1.read('/machine-1/sensor-2')\n  console.log(s2)\n\n  let s3 = await c1.write('/machine-1', {type:'root topic', value:350})\n  console.log(s3)\n\n  let gr = await c2.get('/update-server-data/320/new-data/'+JSON.stringify({pet:'cat', name:'Captain'})+'?name=Rv')\n  console.log(gr)\n\n  let pr = await c2.post('/machine-control/150/actuator/5/action/on?name=Ed', {id:200, state:'true'})\n  console.log(pr)\n}\n\nmain();\n```\n**Method 2**\n\n```js\nconst m2m = require('m2m');\n\nlet client = new m2m.Client();\n\nclient.connect()\n.catch(console.log)\n.then(console.log) // success\n.then(() =\u003e {\n\n  client.read(100, '/machine-1/sensor-1')\n  .catch(console.log)\n  .then(console.log)\n\n  client.read(100, '/machine-1/sensor-2')\n  .catch(console.log)\n  .then(console.log)\n\n  client.write(100, '/machine-1', {type:'root topic', value:350})\n  .catch(console.log)\n  .then(console.log)\n\n  client.get(200, '/update-server-data/320/new-data/'+JSON.stringify({pet:'cat', name:'Captain'})+'?name=Rv')\n  .catch(console.log)\n  .then(console.log)\n  \n  client.post(200, '/machine-control/150/actuator/5/action/on?name=Ed', {id:200, state:'true'})\n  .catch(console.log)\n  .then(console.log)\n})\n```\n\n#### 3. Start client application.\n```js\n$ node client.js\n```\nYou should get a near similar output result as shown below.\n```js\n{ id: 100, subTopic: '/sensor-1', type: 'sensor-1', value: 126 }\n{ id: 100, subTopic: '/sensor-2', type: 'sensor-2', value: 373 }\n{\n  id: 100,\n  rootTopic: '/machine-1',\n  subTopic: '',\n  type: 'root topic',\n  value: 350\n}\n{\n  id: 200,\n  query: { name: 'Rv' },\n  params: { id: '320', data: '{\"pet\":\"cat\",\"name\":\"Captain\"}' }\n}\n{\n  id: 200,\n  path: '/machine-control/150/actuator/5/action/on?name=Ed',\n  query: { name: 'Ed' },\n  params: { id: '150', number: '5', state: 'on' },\n  body: { id: 200, state: 'true' }\n}\n\n```\n\n\u003cbr\u003e\n\n## M2M Browser Client\n\u003cbr\u003e\n\nUsing the client-server example, \u0026nbsp;we will use a browser client to access the available resources from the remote servers.\n## Browser Client Setup\n\n#### 1. Login to [node-m2m](https://www.node-m2m.com/m2m/account/login) and create a web access token. \n\nFrom the *manage security* section in the main menu under the *user account* tab, \u0026nbsp;generate a web access token.\n\n#### 2. Install *m2m* in your web server.\n\n```js\n$ npm install m2m\n```\n\nFrom `node_modules/m2m/dist` directory, \u0026nbsp;copy `node-m2m.min.js` file into your web server's public javascript directory.\n\n\u003c!--\nInclude `node-m2m.min.js` on your HTML file `\u003cscript src=\"YOUR_SCRIPT_PATH/node-m2m.min.js\"\u003e\u003c/script\u003e`.\n\nThis will create a global **NodeM2M** object. \n--\u003e\n\n#### 3. Create a client instance from the global NodeM2M object.\n\n\u003c!-- \n// Protect your access token at all times  \nvar tkn = 'fce454138116159a6ad9a4234e71de810a1087fa9e7fbfda74503d9f52616fc5';\n \n//var client = new NodeM2M.Client();\n// new 1/15/23\n//var client = new NodeM2M().createClient(); // ok\n  \n//var m2m = NodeM2M(); // ok\n//var client = m2m.createClient(); // ok\n--\u003e\n\n```js\n\u003cscript src=\"/javascripts/node-m2m.min.js\"\u003e\u003c/script\u003e\n\n\u003cscript\u003e \n\nconst { createClient } = NodeM2M(); \n\nlet client = createClient();        \n\n// web access token\nlet tkn = 'fce454138116159a6ad9a4234e71de810a1087fa9e7fbfda74503d9f52616fc5';\n\nclient.connect({server:'https://www.node-m2m.com', accessTkn:tkn})\n.catch(console.log)\n.then(console.log) // success\n.then(async () =\u003e {   \n\n   client.read(100, '/machine-1/sensor-1')\n  .then(console.log)\n\n  client.read(100, '/machine-1/sensor-2')\n  .then(console.log)\n\n  client.write(100, '/machine-1', {type:'root topic', value:350})\n  .then(console.log)\n\n  client.get(200, '/update-server-data/320/new-data/'+JSON.stringify({pet:'cat', name:'Captain'})+'?name=Rv')\n  .then(console.log)\n  \n  client.post(200, '/machine-control/150/actuator/5/action/on?name=Ed', {id:200, state:'true'})\n  .then(console.log)\n})\n\n\u003c/script\u003e\n```\n\nYou should get a near similar output result as shown below. \n```js\nsuccess\n{ id: 100, subTopic: '/sensor-1', type: 'sensor-1', value: 22 }\n{ id: 100, subTopic: '/sensor-2', type: 'sensor-2', value: 29 }\n{\n  id: 100,\n  rootTopic: '/machine-1',\n  subTopic: '',\n  type: 'root topic',\n  value: 350\n}\n{\n  id: 200,\n  query: { name: 'Rv' },\n  params: { id: '320', data: '{\"pet\":\"cat\",\"name\":\"Captain\"}' }\n}\n{\n  id: 200,\n  path: '/machine-control/m120/actuator/25/action/on?name=Ed',\n  query: { name: 'Ed' },\n  params: { id: '150', number: '5', state: 'on' },\n  body: { id: 200, state: 'true' }\n}\n```\n\u003cbr\u003e\n\n\u003c!--Check the [m2m browser client web application quick tour](https://github.com/EdAlegrid/m2m-browser-client-demo) for a complete web application using a browser client.--\u003e\n\n\u003cbr\u003e\n\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnode-m2m%2Fm2m-quicktour","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnode-m2m%2Fm2m-quicktour","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnode-m2m%2Fm2m-quicktour/lists"}