{"id":369,"date":"2022-03-19T21:01:50","date_gmt":"2022-03-19T10:01:50","guid":{"rendered":"https:\/\/blog.peter-johnson.com.au\/?p=369"},"modified":"2022-03-19T21:08:48","modified_gmt":"2022-03-19T10:08:48","slug":"import-helium-network-gateways","status":"publish","type":"post","link":"https:\/\/blog.peter-johnson.com.au\/index.php\/2022\/03\/19\/import-helium-network-gateways\/","title":{"rendered":"Importing Helium Network Gateways"},"content":{"rendered":"\n<p>With the <a href=\"https:\/\/telemetry2u.com\/\">Telemetry2U LoRaWAN IoT platform<\/a> now supporting Helium Network integration I wanted to import the complete list of Helium gateways into SQL\/Server for further analysis. The network is growing fast with over 650,000 Helium gateways currently registered of with just shy of 500,000 showing as active.<\/p>\n\n\n\n<p>The following C# code was used in LINQPad to perform the import. It takes around thirty minutes and the current size is around 300MB so can be imported into the Express edition of SQL\/Server. The code backs off for one minute when a 429 Too Many Requests is received from the Helium API, please don&#8217;t abuse the Helium Network by reducing that limit or running this script too often.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\nasync Task Main()\n{\n\tclient.DefaultRequestHeaders.Add(&quot;User-Agent&quot;, &quot;C# App&quot;);\n\tvar baseUrl = &quot;https:\/\/api.helium.io\/v1\/hotspots&quot;;\n\tvar lastCursor = &quot;&quot;;\n\tbool moreData = true;\n\tint curRecords = 0;\n\twhile (moreData)\n\t{\n\t\tvar url = baseUrl;\n\t\tif (lastCursor.Length &gt; 0)\n\t\t{\n\t\t\turl += &quot;?cursor=&quot; + lastCursor;\n\t\t}\n\t\tint retries = 0;\n\t\tstring json = &quot;&quot;;\n\t\twhile (json.Length == 0)\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\tjson = &quot;&quot;;\n\t\t\t\tHttpResponseMessage response = await client.GetAsync(url);\n\t\t\t\tresponse.EnsureSuccessStatusCode();\n\t\t\t\tjson = await response.Content.ReadAsStringAsync();\n\t\t\t}\n\t\t\tcatch (HttpRequestException ex)\n\t\t\t{\n\t\t\t\tConsole.WriteLine(ex.Message);\n\t\t\t\tif (retries &gt; 100)\n\t\t\t\t{\n\t\t\t\t\tthrow ex;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tretries++;\n\t\t\t\t\tawait Task.Delay(TimeSpan.FromMinutes(1));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tRoot data = JsonSerializer.Deserialize&lt;Root&gt;(json);\n\t\tforeach (var datum in data.Data)\n\t\t{\n\t\t\tHotspots.Add(new Hotspots {\n\t\t\t\tAddress = datum.Address,\n\t\t\t\tBlock = datum.Block,\n\t\t\t\tBlockAdded = datum.BlockAdded,\n\t\t\t\tCityId = datum.Geocode.CityId,\n\t\t\t\tElevation = datum.Elevation,\n\t\t\t\tGain = datum.Gain,\n\t\t\t\tHeight = datum.Status.Height,\n\t\t\t\tLastChangeBlock = datum.LastChangeBlock,\n\t\t\t\tLastPocChallenge = datum.LastPocChallenge,\n\t\t\t\tLat = datum.Lat,\n\t\t\t\tLng = datum.Lng,\n\t\t\t\tLocation = datum.Location,\n\t\t\t\tLocationHex = datum.LocationHex,\n\t\t\t\tLongCity = datum.Geocode.LongCity,\n\t\t\t\tLongCountry = datum.Geocode.LongCountry,\n\t\t\t\tLongState = datum.Geocode.LongState,\n\t\t\t\tLongStreet = datum.Geocode.LongStreet,\n\t\t\t\tMode = datum.Mode,\n\t\t\t\tName = datum.Name,\n\t\t\t\tNonce = datum.Nonce,\n\t\t\t\tOnline = datum.Status.Online,\n\t\t\t\tOwner = datum.Owner,\n\t\t\t\tPayer = datum.Payer,\n\t\t\t\tRewardScale = datum.RewardScale,\n\t\t\t\tShortCity = datum.Geocode.ShortCity,\n\t\t\t\tShortCountry = datum.Geocode.ShortState,\n\t\t\t\tShortState = datum.Geocode.ShortState,\n\t\t\t\tShortStreet = datum.Geocode.ShortStreet,\n\t\t\t\tTimestamp = datum.Status.Timestamp,\n\t\t\t\tTimestampAdded = datum.TimestampAdded\n\t\t\t});\n\t\t\tcurRecords++;\n\t\t}\n\t\tawait SaveChangesAsync();\n\t\tConsole.WriteLine($&quot;Saved {curRecords} records&quot;);\n\t\tmoreData = data?.Cursor?.Length &gt; 0;\n\t\tif (moreData)\n\t\t{\n\t\t\tlastCursor = data.Cursor;\n\t\t}\n\t}\n}\n\nstatic readonly HttpClient client = new HttpClient();\n\npublic record Status(\n\t&#x5B;property: JsonPropertyName(&quot;timestamp&quot;)] DateTime? Timestamp,\n\t&#x5B;property: JsonPropertyName(&quot;online&quot;)] string Online,\n\t&#x5B;property: JsonPropertyName(&quot;listen_addrs&quot;)] IReadOnlyList&lt;string&gt; ListenAddrs,\n\t&#x5B;property: JsonPropertyName(&quot;height&quot;)] int? Height\n);\n\npublic record Geocode(\n\t&#x5B;property: JsonPropertyName(&quot;short_street&quot;)] string ShortStreet,\n\t&#x5B;property: JsonPropertyName(&quot;short_state&quot;)] string ShortState,\n\t&#x5B;property: JsonPropertyName(&quot;short_country&quot;)] string ShortCountry,\n\t&#x5B;property: JsonPropertyName(&quot;short_city&quot;)] string ShortCity,\n\t&#x5B;property: JsonPropertyName(&quot;long_street&quot;)] string LongStreet,\n\t&#x5B;property: JsonPropertyName(&quot;long_state&quot;)] string LongState,\n\t&#x5B;property: JsonPropertyName(&quot;long_country&quot;)] string LongCountry,\n\t&#x5B;property: JsonPropertyName(&quot;long_city&quot;)] string LongCity,\n\t&#x5B;property: JsonPropertyName(&quot;city_id&quot;)] string CityId\n);\n\npublic record Datum(\n\t&#x5B;property: JsonPropertyName(&quot;lng&quot;)] double Lng,\n\t&#x5B;property: JsonPropertyName(&quot;lat&quot;)] double Lat,\n\t&#x5B;property: JsonPropertyName(&quot;timestamp_added&quot;)] DateTime TimestampAdded,\n\t&#x5B;property: JsonPropertyName(&quot;status&quot;)] Status Status,\n\t&#x5B;property: JsonPropertyName(&quot;reward_scale&quot;)] double? RewardScale,\n\t&#x5B;property: JsonPropertyName(&quot;payer&quot;)] string Payer,\n\t&#x5B;property: JsonPropertyName(&quot;owner&quot;)] string Owner,\n\t&#x5B;property: JsonPropertyName(&quot;nonce&quot;)] int Nonce,\n\t&#x5B;property: JsonPropertyName(&quot;name&quot;)] string Name,\n\t&#x5B;property: JsonPropertyName(&quot;mode&quot;)] string Mode,\n\t&#x5B;property: JsonPropertyName(&quot;location_hex&quot;)] string LocationHex,\n\t&#x5B;property: JsonPropertyName(&quot;location&quot;)] string Location,\n\t&#x5B;property: JsonPropertyName(&quot;last_poc_challenge&quot;)] int? LastPocChallenge,\n\t&#x5B;property: JsonPropertyName(&quot;last_change_block&quot;)] int LastChangeBlock,\n\t&#x5B;property: JsonPropertyName(&quot;geocode&quot;)] Geocode Geocode,\n\t&#x5B;property: JsonPropertyName(&quot;gain&quot;)] int Gain,\n\t&#x5B;property: JsonPropertyName(&quot;elevation&quot;)] int Elevation,\n\t&#x5B;property: JsonPropertyName(&quot;block_added&quot;)] int BlockAdded,\n\t&#x5B;property: JsonPropertyName(&quot;block&quot;)] int Block,\n\t&#x5B;property: JsonPropertyName(&quot;address&quot;)] string Address\n);\n\npublic record Root(\n\t&#x5B;property: JsonPropertyName(&quot;data&quot;)] IReadOnlyList&lt;Datum&gt; Data,\n\t&#x5B;property: JsonPropertyName(&quot;cursor&quot;)] string Cursor\n);\n<\/pre><\/div>\n\n\n<p>To run the above code you&#8217;ll need to create a database called Helium or similar and use the following SQL DDL to create the table. Then the two can be linked as a database connection within LINQPad.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; title: ; notranslate\" title=\"\">\nasync Task Main()\n{\n\tclient.DefaultRequestHeaders.Add(&quot;User-Agent&quot;, &quot;C# App&quot;);\n\tvar baseUrl = &quot;https:\/\/api.helium.io\/v1\/hotspots&quot;;\n\tvar lastCursor = &quot;&quot;;\n\tbool moreData = true;\n\tint curRecords = 0;\n\twhile (moreData)\n\t{\n\t\tvar url = baseUrl;\n\t\tif (lastCursor.Length &gt; 0)\n\t\t{\n\t\t\turl += &quot;?cursor=&quot; + lastCursor;\n\t\t}\n\t\tint retries = 0;\n\t\tstring json = &quot;&quot;;\n\t\twhile (json.Length == 0)\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\tjson = &quot;&quot;;\n\t\t\t\tHttpResponseMessage response = await client.GetAsync(url);\n\t\t\t\tresponse.EnsureSuccessStatusCode();\n\t\t\t\tjson = await response.Content.ReadAsStringAsync();\n\t\t\t}\n\t\t\tcatch (HttpRequestException ex)\n\t\t\t{\n\t\t\t\tConsole.WriteLine(ex.Message);\n\t\t\t\tif (retries &gt; 100)\n\t\t\t\t{\n\t\t\t\t\tthrow ex;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tretries++;\n\t\t\t\t\tawait Task.Delay(TimeSpan.FromMinutes(1));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tRoot data = JsonSerializer.Deserialize&lt;Root&gt;(json);\n\t\tforeach (var datum in data.Data)\n\t\t{\n\t\t\tHotspots.Add(new Hotspots {\n\t\t\t\tAddress = datum.Address,\n\t\t\t\tBlock = datum.Block,\n\t\t\t\tBlockAdded = datum.BlockAdded,\n\t\t\t\tCityId = datum.Geocode.CityId,\n\t\t\t\tElevation = datum.Elevation,\n\t\t\t\tGain = datum.Gain,\n\t\t\t\tHeight = datum.Status.Height,\n\t\t\t\tLastChangeBlock = datum.LastChangeBlock,\n\t\t\t\tLastPocChallenge = datum.LastPocChallenge,\n\t\t\t\tLat = datum.Lat,\n\t\t\t\tLng = datum.Lng,\n\t\t\t\tLocation = datum.Location,\n\t\t\t\tLocationHex = datum.LocationHex,\n\t\t\t\tLongCity = datum.Geocode.LongCity,\n\t\t\t\tLongCountry = datum.Geocode.LongCountry,\n\t\t\t\tLongState = datum.Geocode.LongState,\n\t\t\t\tLongStreet = datum.Geocode.LongStreet,\n\t\t\t\tMode = datum.Mode,\n\t\t\t\tName = datum.Name,\n\t\t\t\tNonce = datum.Nonce,\n\t\t\t\tOnline = datum.Status.Online,\n\t\t\t\tOwner = datum.Owner,\n\t\t\t\tPayer = datum.Payer,\n\t\t\t\tRewardScale = datum.RewardScale,\n\t\t\t\tShortCity = datum.Geocode.ShortCity,\n\t\t\t\tShortCountry = datum.Geocode.ShortState,\n\t\t\t\tShortState = datum.Geocode.ShortState,\n\t\t\t\tShortStreet = datum.Geocode.ShortStreet,\n\t\t\t\tTimestamp = datum.Status.Timestamp,\n\t\t\t\tTimestampAdded = datum.TimestampAdded\n\t\t\t});\n\t\t\tcurRecords++;\n\t\t}\n\t\tawait SaveChangesAsync();\n\t\tConsole.WriteLine($&quot;Saved {curRecords} records&quot;);\n\t\tmoreData = data?.Cursor?.Length &gt; 0;\n\t\tif (moreData)\n\t\t{\n\t\t\tlastCursor = data.Cursor;\n\t\t}\n\t}\n}\n\nstatic readonly HttpClient client = new HttpClient();\n\npublic record Status(\n\t&#x5B;property: JsonPropertyName(&quot;timestamp&quot;)] DateTime? Timestamp,\n\t&#x5B;property: JsonPropertyName(&quot;online&quot;)] string Online,\n\t&#x5B;property: JsonPropertyName(&quot;listen_addrs&quot;)] IReadOnlyList&lt;string&gt; ListenAddrs,\n\t&#x5B;property: JsonPropertyName(&quot;height&quot;)] int? Height\n);\n\npublic record Geocode(\n\t&#x5B;property: JsonPropertyName(&quot;short_street&quot;)] string ShortStreet,\n\t&#x5B;property: JsonPropertyName(&quot;short_state&quot;)] string ShortState,\n\t&#x5B;property: JsonPropertyName(&quot;short_country&quot;)] string ShortCountry,\n\t&#x5B;property: JsonPropertyName(&quot;short_city&quot;)] string ShortCity,\n\t&#x5B;property: JsonPropertyName(&quot;long_street&quot;)] string LongStreet,\n\t&#x5B;property: JsonPropertyName(&quot;long_state&quot;)] string LongState,\n\t&#x5B;property: JsonPropertyName(&quot;long_country&quot;)] string LongCountry,\n\t&#x5B;property: JsonPropertyName(&quot;long_city&quot;)] string LongCity,\n\t&#x5B;property: JsonPropertyName(&quot;city_id&quot;)] string CityId\n);\n\npublic record Datum(\n\t&#x5B;property: JsonPropertyName(&quot;lng&quot;)] double Lng,\n\t&#x5B;property: JsonPropertyName(&quot;lat&quot;)] double Lat,\n\t&#x5B;property: JsonPropertyName(&quot;timestamp_added&quot;)] DateTime TimestampAdded,\n\t&#x5B;property: JsonPropertyName(&quot;status&quot;)] Status Status,\n\t&#x5B;property: JsonPropertyName(&quot;reward_scale&quot;)] double? RewardScale,\n\t&#x5B;property: JsonPropertyName(&quot;payer&quot;)] string Payer,\n\t&#x5B;property: JsonPropertyName(&quot;owner&quot;)] string Owner,\n\t&#x5B;property: JsonPropertyName(&quot;nonce&quot;)] int Nonce,\n\t&#x5B;property: JsonPropertyName(&quot;name&quot;)] string Name,\n\t&#x5B;property: JsonPropertyName(&quot;mode&quot;)] string Mode,\n\t&#x5B;property: JsonPropertyName(&quot;location_hex&quot;)] string LocationHex,\n\t&#x5B;property: JsonPropertyName(&quot;location&quot;)] string Location,\n\t&#x5B;property: JsonPropertyName(&quot;last_poc_challenge&quot;)] int? LastPocChallenge,\n\t&#x5B;property: JsonPropertyName(&quot;last_change_block&quot;)] int LastChangeBlock,\n\t&#x5B;property: JsonPropertyName(&quot;geocode&quot;)] Geocode Geocode,\n\t&#x5B;property: JsonPropertyName(&quot;gain&quot;)] int Gain,\n\t&#x5B;property: JsonPropertyName(&quot;elevation&quot;)] int Elevation,\n\t&#x5B;property: JsonPropertyName(&quot;block_added&quot;)] int BlockAdded,\n\t&#x5B;property: JsonPropertyName(&quot;block&quot;)] int Block,\n\t&#x5B;property: JsonPropertyName(&quot;address&quot;)] string Address\n);\n\npublic record Root(\n\t&#x5B;property: JsonPropertyName(&quot;data&quot;)] IReadOnlyList&lt;Datum&gt; Data,\n\t&#x5B;property: JsonPropertyName(&quot;cursor&quot;)] string Cursor\n);\n<\/pre><\/div>","protected":false},"excerpt":{"rendered":"<p>With the Telemetry2U LoRaWAN IoT platform now supporting Helium Network integration I wanted to import the complete list of Helium gateways into SQL\/Server for further analysis. The network is growing fast with over 650,000 Helium gateways currently registered of with just shy of 500,000 showing as active. The following C# code was used in LINQPad [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[35,9,10],"tags":[],"class_list":["post-369","post","type-post","status-publish","format-standard","hentry","category-lorawan","category-radio-communications","category-sql-database"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.5 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\r\n<title>Importing Helium Network Gateways - Peter Johnson&#039;s Blog<\/title>\r\n<meta name=\"description\" content=\"Helium Network now contains over 650k registered gateways with just shy of 500k active gateways, here&#039;s how to import for offline analysis.\" \/>\r\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\r\n<link rel=\"canonical\" href=\"https:\/\/blog.peter-johnson.com.au\/index.php\/2022\/03\/19\/import-helium-network-gateways\/\" \/>\r\n<meta property=\"og:locale\" content=\"en_US\" \/>\r\n<meta property=\"og:type\" content=\"article\" \/>\r\n<meta property=\"og:title\" content=\"Importing Helium Network Gateways - Peter Johnson&#039;s Blog\" \/>\r\n<meta property=\"og:description\" content=\"Helium Network now contains over 650k registered gateways with just shy of 500k active gateways, here&#039;s how to import for offline analysis.\" \/>\r\n<meta property=\"og:url\" content=\"https:\/\/blog.peter-johnson.com.au\/index.php\/2022\/03\/19\/import-helium-network-gateways\/\" \/>\r\n<meta property=\"og:site_name\" content=\"Peter Johnson&#039;s Blog\" \/>\r\n<meta property=\"article:published_time\" content=\"2022-03-19T10:01:50+00:00\" \/>\r\n<meta property=\"article:modified_time\" content=\"2022-03-19T10:08:48+00:00\" \/>\r\n<meta name=\"author\" content=\"Peter Johnson\" \/>\r\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\r\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Peter Johnson\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 minutes\" \/>\r\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/blog.peter-johnson.com.au\/index.php\/2022\/03\/19\/import-helium-network-gateways\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/blog.peter-johnson.com.au\/index.php\/2022\/03\/19\/import-helium-network-gateways\/\"},\"author\":{\"name\":\"Peter Johnson\",\"@id\":\"https:\/\/blog.peter-johnson.com.au\/#\/schema\/person\/4c77aa7d5243430f95831ecb7277546c\"},\"headline\":\"Importing Helium Network Gateways\",\"datePublished\":\"2022-03-19T10:01:50+00:00\",\"dateModified\":\"2022-03-19T10:08:48+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/blog.peter-johnson.com.au\/index.php\/2022\/03\/19\/import-helium-network-gateways\/\"},\"wordCount\":159,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/blog.peter-johnson.com.au\/#\/schema\/person\/4c77aa7d5243430f95831ecb7277546c\"},\"articleSection\":[\"LoRaWAN\",\"Radio Communications\",\"SQL \/ Database\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/blog.peter-johnson.com.au\/index.php\/2022\/03\/19\/import-helium-network-gateways\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/blog.peter-johnson.com.au\/index.php\/2022\/03\/19\/import-helium-network-gateways\/\",\"url\":\"https:\/\/blog.peter-johnson.com.au\/index.php\/2022\/03\/19\/import-helium-network-gateways\/\",\"name\":\"Importing Helium Network Gateways - Peter Johnson&#039;s Blog\",\"isPartOf\":{\"@id\":\"https:\/\/blog.peter-johnson.com.au\/#website\"},\"datePublished\":\"2022-03-19T10:01:50+00:00\",\"dateModified\":\"2022-03-19T10:08:48+00:00\",\"description\":\"Helium Network now contains over 650k registered gateways with just shy of 500k active gateways, here's how to import for offline analysis.\",\"breadcrumb\":{\"@id\":\"https:\/\/blog.peter-johnson.com.au\/index.php\/2022\/03\/19\/import-helium-network-gateways\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/blog.peter-johnson.com.au\/index.php\/2022\/03\/19\/import-helium-network-gateways\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/blog.peter-johnson.com.au\/index.php\/2022\/03\/19\/import-helium-network-gateways\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/blog.peter-johnson.com.au\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Importing Helium Network Gateways\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/blog.peter-johnson.com.au\/#website\",\"url\":\"https:\/\/blog.peter-johnson.com.au\/\",\"name\":\"Peter Johnson&#039;s Blog\",\"description\":\"Hobart, Tasmania Software Development\",\"publisher\":{\"@id\":\"https:\/\/blog.peter-johnson.com.au\/#\/schema\/person\/4c77aa7d5243430f95831ecb7277546c\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/blog.peter-johnson.com.au\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/blog.peter-johnson.com.au\/#\/schema\/person\/4c77aa7d5243430f95831ecb7277546c\",\"name\":\"Peter Johnson\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/blog.peter-johnson.com.au\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/blog.peter-johnson.com.au\/wp-content\/uploads\/2022\/03\/168849_1786067253024_5579222_n.jpg\",\"contentUrl\":\"https:\/\/blog.peter-johnson.com.au\/wp-content\/uploads\/2022\/03\/168849_1786067253024_5579222_n.jpg\",\"width\":160,\"height\":120,\"caption\":\"Peter Johnson\"},\"logo\":{\"@id\":\"https:\/\/blog.peter-johnson.com.au\/#\/schema\/person\/image\/\"},\"sameAs\":[\"https:\/\/blog.peter-johnson.com.au\"],\"url\":\"https:\/\/blog.peter-johnson.com.au\/index.php\/author\/peterj\/\"}]}<\/script>\r\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Importing Helium Network Gateways - Peter Johnson&#039;s Blog","description":"Helium Network now contains over 650k registered gateways with just shy of 500k active gateways, here's how to import for offline analysis.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/blog.peter-johnson.com.au\/index.php\/2022\/03\/19\/import-helium-network-gateways\/","og_locale":"en_US","og_type":"article","og_title":"Importing Helium Network Gateways - Peter Johnson&#039;s Blog","og_description":"Helium Network now contains over 650k registered gateways with just shy of 500k active gateways, here's how to import for offline analysis.","og_url":"https:\/\/blog.peter-johnson.com.au\/index.php\/2022\/03\/19\/import-helium-network-gateways\/","og_site_name":"Peter Johnson&#039;s Blog","article_published_time":"2022-03-19T10:01:50+00:00","article_modified_time":"2022-03-19T10:08:48+00:00","author":"Peter Johnson","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Peter Johnson","Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/blog.peter-johnson.com.au\/index.php\/2022\/03\/19\/import-helium-network-gateways\/#article","isPartOf":{"@id":"https:\/\/blog.peter-johnson.com.au\/index.php\/2022\/03\/19\/import-helium-network-gateways\/"},"author":{"name":"Peter Johnson","@id":"https:\/\/blog.peter-johnson.com.au\/#\/schema\/person\/4c77aa7d5243430f95831ecb7277546c"},"headline":"Importing Helium Network Gateways","datePublished":"2022-03-19T10:01:50+00:00","dateModified":"2022-03-19T10:08:48+00:00","mainEntityOfPage":{"@id":"https:\/\/blog.peter-johnson.com.au\/index.php\/2022\/03\/19\/import-helium-network-gateways\/"},"wordCount":159,"commentCount":0,"publisher":{"@id":"https:\/\/blog.peter-johnson.com.au\/#\/schema\/person\/4c77aa7d5243430f95831ecb7277546c"},"articleSection":["LoRaWAN","Radio Communications","SQL \/ Database"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/blog.peter-johnson.com.au\/index.php\/2022\/03\/19\/import-helium-network-gateways\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/blog.peter-johnson.com.au\/index.php\/2022\/03\/19\/import-helium-network-gateways\/","url":"https:\/\/blog.peter-johnson.com.au\/index.php\/2022\/03\/19\/import-helium-network-gateways\/","name":"Importing Helium Network Gateways - Peter Johnson&#039;s Blog","isPartOf":{"@id":"https:\/\/blog.peter-johnson.com.au\/#website"},"datePublished":"2022-03-19T10:01:50+00:00","dateModified":"2022-03-19T10:08:48+00:00","description":"Helium Network now contains over 650k registered gateways with just shy of 500k active gateways, here's how to import for offline analysis.","breadcrumb":{"@id":"https:\/\/blog.peter-johnson.com.au\/index.php\/2022\/03\/19\/import-helium-network-gateways\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blog.peter-johnson.com.au\/index.php\/2022\/03\/19\/import-helium-network-gateways\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/blog.peter-johnson.com.au\/index.php\/2022\/03\/19\/import-helium-network-gateways\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/blog.peter-johnson.com.au\/"},{"@type":"ListItem","position":2,"name":"Importing Helium Network Gateways"}]},{"@type":"WebSite","@id":"https:\/\/blog.peter-johnson.com.au\/#website","url":"https:\/\/blog.peter-johnson.com.au\/","name":"Peter Johnson&#039;s Blog","description":"Hobart, Tasmania Software Development","publisher":{"@id":"https:\/\/blog.peter-johnson.com.au\/#\/schema\/person\/4c77aa7d5243430f95831ecb7277546c"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/blog.peter-johnson.com.au\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/blog.peter-johnson.com.au\/#\/schema\/person\/4c77aa7d5243430f95831ecb7277546c","name":"Peter Johnson","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/blog.peter-johnson.com.au\/#\/schema\/person\/image\/","url":"https:\/\/blog.peter-johnson.com.au\/wp-content\/uploads\/2022\/03\/168849_1786067253024_5579222_n.jpg","contentUrl":"https:\/\/blog.peter-johnson.com.au\/wp-content\/uploads\/2022\/03\/168849_1786067253024_5579222_n.jpg","width":160,"height":120,"caption":"Peter Johnson"},"logo":{"@id":"https:\/\/blog.peter-johnson.com.au\/#\/schema\/person\/image\/"},"sameAs":["https:\/\/blog.peter-johnson.com.au"],"url":"https:\/\/blog.peter-johnson.com.au\/index.php\/author\/peterj\/"}]}},"_links":{"self":[{"href":"https:\/\/blog.peter-johnson.com.au\/index.php\/wp-json\/wp\/v2\/posts\/369","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.peter-johnson.com.au\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.peter-johnson.com.au\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.peter-johnson.com.au\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.peter-johnson.com.au\/index.php\/wp-json\/wp\/v2\/comments?post=369"}],"version-history":[{"count":2,"href":"https:\/\/blog.peter-johnson.com.au\/index.php\/wp-json\/wp\/v2\/posts\/369\/revisions"}],"predecessor-version":[{"id":372,"href":"https:\/\/blog.peter-johnson.com.au\/index.php\/wp-json\/wp\/v2\/posts\/369\/revisions\/372"}],"wp:attachment":[{"href":"https:\/\/blog.peter-johnson.com.au\/index.php\/wp-json\/wp\/v2\/media?parent=369"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.peter-johnson.com.au\/index.php\/wp-json\/wp\/v2\/categories?post=369"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.peter-johnson.com.au\/index.php\/wp-json\/wp\/v2\/tags?post=369"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}