×

由Bing地图提供支持的粒子交通站

消耗积分:0 | 格式:zip | 大小:0.20 MB | 2022-12-23

王丽

分享资料个

描述

2015 年 9 月 28 日更新:创建了一个在 2 个不同目的地之间轮换的变体。软件部分的 GitHub 链接。流程大致相同,只需要创建 2 个不同的 webhook。

 
pYYBAGOkFyqADSzeAA0FOKt3-g8697.jpg
 

当我最近开始在 Microsoft 从事 IoT 业务开发工作时,我认为我会通过做一个项目来最好地学习。我还想要一些有用的东西。在西雅图地区,交通可能无法预测。有一个一目了然的设备可以告诉我回家或去健身房的所有路况,这很棒,我不需要在智能手机上激活我的路况应用程序。

 
poYBAGOkF1iAJh4AAAyUecUwwnU788.jpg
tot:指总行程 | Dly:比不堵车多多少分钟 | 更新:最后更新
 

挑战在于使这些信息与个人相关。这个想法在可浏览性方面类似于手表或气象站。但是,这些信息对于同一个地方的人来说是通用的,并且有许多站点可以随时提供可以解析的信息。

 
poYBAGOkF2uAQvv-AAPPTsjAo3I773.jpg
tot:指总行程 | Dly:比不堵车多多少分钟 | 更新:最后更新
 

对于交通信息,需要提交一条从工作到家的路线,并从那里提取交通信息。

有两个主要的见解使这个项目可行

  1. 我使用了必应地图 API这是一个相对简单的获取路线的API。响应——人们可以看到,以文本格式,只需通过 Web 浏览器提交该调用,就会以 JSON 形式出现。它有交通信息,包括在两个指定点之间有和没有交通的情况下需要多长时间。但是,生成的响应仍然很长,直接在刨花板中提取该信息会很复杂,可能会面临内存不足的问题。这就是洞察力#2 的帮助所在……
  2. 让云而不是小设备流汗怎么样?Particle 引入了一个名为webhooks的功能。基本上,它可以发送 Web 请求、缓冲和处理这些请求。它本身很有用,因为大的响应被切割成 512 字节,并且只有较小的块被发送到板。在 Bing 路由的情况下,响应将分解为 20 个应用程序,每个应用程序单独测试板处理数据的能力的可能性较小。不过,最棒的是 Webhook 能够解析来自 JSON 响应的数据。在这个项目中,从超过 10 kBytes 数据的 Bing 路由响应中,实际发送到 Particle board 的内容看起来像这样:“None~21.642~1120~1128~”

让我们开始吧!

获取必应应用密钥

  • 使用您的 MS 帐户登录 Bing 开发人员门户
  • 转到“我的帐户 -> 创建或查看密钥”
  • 创建一个新密钥,你可以做一个基本或试用
  • 将网址留空
  • 应用类型可以是移动应用
  • 我创建了一个将于 10 月到期的试用密钥: AllfFa2mK7DlUH0SYiEyJCin7zWQ1O7bWJeP7kU2kM1iinRriN7_BaEw61MIB1mQ
 
pYYBAGOkF26AMDIWAABWdxok1Fw233.png
 

必应路线

 

 
pYYBAGOkF3GAbcEgAABRpI2-RJI222.png
 

缩短网络电话

Bing 路由调用对于我们的目的来说太长了,所以使用 bitly.com 来缩短它

 
poYBAGOkF3WAdHBHAABJpOFbk3Q654.png
 

Bing 路由响应

Bing 路由调用会生成一个长响应 - 让我们从中理解一些意义

 
poYBAGOkF4KAKXtxAADbcXoMqCc910.png
 

格式 JSON

 
poYBAGOkF4SAbQ70AABMwR9MSgU899.png
 

创建网络钩子文件

 

{
  "event": “traffic_hackster_io",
  "event": “traffic_hackster_io",
  "url": "http://bit.ly/1MSkCBe",
  "requestType": "POST",
  "headers": null,
  "query": null,
  "responseTemplate": "{{#resourceSets}}{{#resources}}{{trafficCongestion}}~{{travelDistance}}~{{travelDuration}}~{{travelDurationTraffic}}~{{/resources}}{{/resourceSets}}",
  "json": null,
  "auth": null,
  "mydevices": true
}
 
pYYBAGOkF4eAKGFQAABdvz5rwg4409.png
 

在 Particle CLI 中创建 webhook

“粒子 webhook 创建 traffic_hackster_io.json”

 
poYBAGOkF4yAMh4VAABeKiK0cLA873.png
 

程序

初始化显示和 LED;该项目将与任何一个一起工作(因此可以使用显示器和/或 LED)

 
pYYBAGOkF46ARROdAAC_uuwJx_o762.png
 

在 webhook 响应中调用 gotTrafficData

 
pYYBAGOkF5GALdZIAAAhN0G4UIs633.png
 

这只是给出一个视觉提示,表明正在发生某些事情(LED 依次亮起)并且显示屏已初始化

 
poYBAGOkF5SASWuVAADJiq8eCMc762.png
 

每分钟都会调用 webhook(触发 gotTrafficResponse 函数)。此外,还会使用上次成功更新交通信息时的信息刷新显示。

 
poYBAGOkF5aATg7DAAB1rUD_y0o678.png
 

在 webhook 上,函数 gotTrafficResponse 被调用。此处的代码提取交通信息并将公里转换为英里,将秒转换为分钟。

 
poYBAGOkF5qAYbPVAAHG-tfmrwo468.png
 

其余的只是在显示屏和 LED 上显示该信息

 
poYBAGOkF56AbBu0AAFnFXip2eE619.png
 

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论(0)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !

'+ '

'+ '

'+ ''+ '
'+ ''+ ''+ '
'+ ''+ '' ); $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code ==5){ $(pop_this).attr('href',"/login/index.html"); return false } if(data.code == 2){ //跳转到VIP升级页面 window.location.href="//m.obk20.com/vip/index?aid=" + webid return false } //是会员 if (data.code > 0) { $('body').append(htmlSetNormalDownload); var getWidth=$("#poplayer").width(); $("#poplayer").css("margin-left","-"+getWidth/2+"px"); $('#tips').html(data.msg) $('.download_confirm').click(function(){ $('#dialog').remove(); }) } else { var down_url = $('#vipdownload').attr('data-url'); isBindAnalysisForm(pop_this, down_url, 1) } }); }); //是否开通VIP $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code == 2 || data.code ==5){ //跳转到VIP升级页面 $('#vipdownload>span').text("开通VIP 免费下载") return false }else{ // 待续费 if(data.code == 3) { vipExpiredInfo.ifVipExpired = true vipExpiredInfo.vipExpiredDate = data.data.endoftime } $('#vipdownload .icon-vip-tips').remove() $('#vipdownload>span').text("VIP免积分下载") } }); }).on("click",".download_cancel",function(){ $('#dialog').remove(); }) var setWeixinShare={};//定义默认的微信分享信息,页面如果要自定义分享,直接更改此变量即可 if(window.navigator.userAgent.toLowerCase().match(/MicroMessenger/i) == 'micromessenger'){ var d={ title:'由Bing地图提供支持的粒子交通站',//标题 desc:$('[name=description]').attr("content"), //描述 imgUrl:'https://'+location.host+'/static/images/ele-logo.png',// 分享图标,默认是logo link:'',//链接 type:'',// 分享类型,music、video或link,不填默认为link dataUrl:'',//如果type是music或video,则要提供数据链接,默认为空 success:'', // 用户确认分享后执行的回调函数 cancel:''// 用户取消分享后执行的回调函数 } setWeixinShare=$.extend(d,setWeixinShare); $.ajax({ url:"//www.obk20.com/app/wechat/index.php?s=Home/ShareConfig/index", data:"share_url="+encodeURIComponent(location.href)+"&format=jsonp&domain=m", type:'get', dataType:'jsonp', success:function(res){ if(res.status!="successed"){ return false; } $.getScript('https://res.wx.qq.com/open/js/jweixin-1.0.0.js',function(result,status){ if(status!="success"){ return false; } var getWxCfg=res.data; wx.config({ //debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId:getWxCfg.appId, // 必填,公众号的唯一标识 timestamp:getWxCfg.timestamp, // 必填,生成签名的时间戳 nonceStr:getWxCfg.nonceStr, // 必填,生成签名的随机串 signature:getWxCfg.signature,// 必填,签名,见附录1 jsApiList:['onMenuShareTimeline','onMenuShareAppMessage','onMenuShareQQ','onMenuShareWeibo','onMenuShareQZone'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2 }); wx.ready(function(){ //获取“分享到朋友圈”按钮点击状态及自定义分享内容接口 wx.onMenuShareTimeline({ title: setWeixinShare.title, // 分享标题 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享给朋友”按钮点击状态及自定义分享内容接口 wx.onMenuShareAppMessage({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 type: setWeixinShare.type, // 分享类型,music、video或link,不填默认为link dataUrl: setWeixinShare.dataUrl, // 如果type是music或video,则要提供数据链接,默认为空 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ”按钮点击状态及自定义分享内容接口 wx.onMenuShareQQ({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到腾讯微博”按钮点击状态及自定义分享内容接口 wx.onMenuShareWeibo({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ空间”按钮点击状态及自定义分享内容接口 wx.onMenuShareQZone({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); }); }); } }); } function openX_ad(posterid, htmlid, width, height) { if ($(htmlid).length > 0) { var randomnumber = Math.random(); var now_url = encodeURIComponent(window.location.href); var ga = document.createElement('iframe'); ga.src = 'https://www1.elecfans.com/www/delivery/myafr.php?target=_blank&cb=' + randomnumber + '&zoneid=' + posterid+'&prefer='+now_url; ga.width = width; ga.height = height; ga.frameBorder = 0; ga.scrolling = 'no'; var s = $(htmlid).append(ga); } } openX_ad(828, '#berry-300', 300, 250);