从Oregon Scientific WMR500气象站下载数据

一旦我们确定站点需要窗口之外的实际天气。这意味着您需要具有Internet连接的某种气象站。便宜 对于像戴维斯Vantage Pro2 Plus这样的东西来说,要花10万多卢布,甚至要用一台单独的计算机连接它(就像他们在mail.ru中所做的那样),在预算和复杂性方面都不希望这样做。







选择是依靠便宜,新鲜的Oregon Scientific WMR500气象站。我不会对其进行审核,您可以自己搜索Internet。她可以测量温度,湿度,压力,风速和风向就足够了。从理论上讲,它也了解空气质量和紫外线辐射的水平,但是我们没有找到相应的附加传感器。预算的价格就是它的工作方式。她自己通过Wi-Fi将数据发送到云端。数据访问既可以在移动应用程序中访问,也可以从Web中访问,但是有些奇怪。实际上,将对此进行讨论。



要访问Web部件,您需要在移动应用程序中创建的帐户。实际上,仅在最初连接到站点本身的临时访问点的应用程序中才进行站点配置(使用哪个Wi-Fi进行连接)。在这里,一切都按照说明完成,没有什么复杂的。结果,在应用程序中,我们获得了添加的设备,我们将需要进一步的设备ID。







Web界面位于http://web-wmr500.idtlive.com/







输入后,您可以通过单击“显示”按钮查看平均美丽度的图表,以及以XLS格式导出选定时间段内的数据(“导出”按钮)。我必须马上说在图表上显示湿度有效,但是导出无效,因为湿度数据与温度数据一起导出。这是奇怪的情况。查看这些请求,您会发现有一些图表专用的api将数据返回给json,这已经很好了。你可以抢牛!







例如,我们“窃取”每天温度的数据集。请求将转到带有参数的web-wmr500.idtlive.com/index/api.show/index.html(此处是一个PHP参数数组示例):



$request = [
	'type'		=> 'temperature',
	'unit'		=> '°C',
	'id'		=> 'id--',
	'channel'	=> '---',
	'start'		=> "'2020-07-20T00:00:00Z'",
	'end'		=> "'2020-07-21T00:00:00Z'",
];


必须使用单引号和没有TimeZone的ISO 8601格式的日期。通道号(通道)-1、2或3,取决于传感器单元所连接的通道。不同类型的请求数据在请求数据的实际类型(类型)和度量单位(单位)方面有所不同。



所有可用的类型和单位:



temperature – °C  °F
humidity – %
rain – mm/h  inch/h
wind – m/s, knots, kph, mph
pressure – mbar,hPa,mmHg,inHg


一件不好的事,通过api.show您只能获取指定参数的数据,例如,您无法找出风向或露点,但是有很多统计信息。我想要。在这里,出口将为我们提供帮助。



我们使用相同的参数向地址web-wmr500.idtlive.com/index/api.export/index.html发出第一个请求。作为响应,野外某处的服务器会生成一个静态XLS文件并提供指向该文件的链接。之后,您可以随时下载它(我在服务器上看到了2018年其他人的文件,该文件夹已打开以供索引)。文件中已经有更多信息,或者说,所有信息都可以在那找到。







但这也有其优点和缺点。另外-您可以获取所需期间的数据。减号-此数据以15分钟的间隔发送到Web部件。它甚至可以将天气存储在数据库中,甚至可以在气象站启动后立即下载所有数据。但是,如果您想更频繁或更快速地接收最新信息,则必须进行更高级的研究。



我吓坏了,决定拦截该应用程序的流量,它几乎立即接收数据。相反,它“直接”从站接收数据,该数据给出了从传感器单元接收到的最新数据。并且每15秒轮询一次传感器单元。



事实证明,通过MQTT协议的应用程序到达某个Amazon实例(地址35.161.38.128是通过拦截流量,咳嗽而获得的),订阅具有随机topic-id的主题,将其发送到站点的主题(她自己通过wi-fi和它仅通过MQTT进行连接,Web部件显然也定期从MQTT代理接收相同的数据),其ID为“亲爱的,请告诉我您的状态,以topic-id回答”这样的命令。如果我使用php + curl从Web部件获取数据(您可以使用任意控件),则在一个连接中需要异步。很快,我只想到使用node.js。您将需要mqtt模块。



就我而言,这只是一个控制台脚本,我通过exec将其“拉”入php。



#!/usr/bin/node

var mqtt  = require('mqtt');
var md5   = require('md5');

String.prototype.insert = function (index, string) {
  if (index > 0)
   return this.substring(0, index) + string + this.substring(index, this.length);
  else
    return string + this;
};

var host       = 'mqtt.idtlive.com';
var your_mail  = 'your_account_mail@somehost.com'; // see in app, registered account
var clientId   = 'Android_' + your_mail;
var deviceId   = 'your-device-id'; // see in app connected device section, something like F9987D92-E180-64DE-A202-D43AAD0D5784
var channelId  = 1; // channel beetwen station & external sensors block

var timeInMs   = Date.now();
var uniqTopic  = md5(timeInMs).toUpperCase().insert(8,'-').insert(13,'-').insert(18,'-').insert(23,'-');

var client = mqtt.connect( {
  host : host,
  port : 1883,
  cliendId : clientId
});

client.on('connect', function() {
  client.subscribe('enno/out/json/'+uniqTopic,
    function(err) {
      if (!err) {
        client.publish('enno/out/json/'+deviceId, '{"command":"getChannel'+channelId+'Status","id":"'+uniqTopic+'"}');
      } else {
        console.log('connect error');
      }
    })
});

client.on('message', function(topic, message) {
  console.log(message.toString())
  client.end()
});


我不会告诉您如何从Web部件(JSON),导出(Excel)或从MQTT(JSON)解析数据,在这里您可以根据需要进行处理。



就这样。如果有人突然帮忙,我只会高兴。



PS> Update,梳理了脚本代码,添加了随机MQTT主题的生成,以模拟应用程序中的工作,并且还发布在此处



All Articles