微信小程序实现树莓派(raspberry pi)小车控制
本文是基于上一篇“网页版树莓派小车控制程序”改造而成。主要也练习了一下微信小程序的开发。这里简单记录一下主要代码片段。也是趟过了许多的坑,例如:微信小程序不支持完全全屏,微信小程序不能横屏展示。所以开发过程中也用了一些非常手段。可以说这只是一个很基本的demo,所以里面很多东西,比如摄像头监控ip、页面元素定位我都使用了写死的值。特别是界面,我只是在iPhone6上面做的实验,所以换到其他手机上时,界面就会变型了。
1.基本思路
- 进入小程序时展示index页,可以让用户输入服务端url(模拟上一篇中在浏览器获取get请求)
- 然后跳转到实际的小车控制界面,并可以通过点击按钮实现小车控制
- 控制小车的移动,主要是在control.js中定义了界面按钮事件的响应,在响应事件的过程中实现http请求的发送
index页面如下:
进去之后的页面如下(其中中间空白处会展示摄像头监控,不过我并没有启动,所以看不见):
2.代码结构如下:
其中,index下面是首页,control是控制页面,res目录下存放的是图片资源
3.index目录
index.js
//index.js //获取应用实例 constapp=getApp() Page({ data:{ logo:"/res/rasp-logo.png", welcome:"欢迎使用树莓小车", enterBtn:"进入", PromoteMsg:"Pleaseentertheserveraddress(eg:http://x.x.x.x:8080)", reqURL:"" }, //从输入框中获取用户输入的服务器地址信息 getURL:function(e){ this.setData({ reqURL:e.detail.value }) }, enterClicked:function(e){ /* *当按下进入按钮,需要做以下事情: *1.首先判断用户是否已经在输入框中输入完整的服务器地址 *2.发起一个到服务器的GET请求,并分析服务器的响应结果 *3.跳转到小车控制界面 */ console.log(this.data.reqURL) if(this.data.reqURL==''){ wx.showModal({ title:'提示', content:'请先输入正确的服务器地址!', }) return } //发起到服务器的GET请求 wx.request({ url:this.data.reqURL, success:function(res){ //在这里获取POST请求地址,以及视频流地址,然后赋值给全局变量,供control页面调用 console.log(res.data.match(/url=\"(\S*)\"/)[1]) console.log(res.data.match(/src=\"(\S*)\"/)[1]) app.globalData.postURL=res.data.match(/url=\"(\S*)\"/)[1] app.globalData.cameraURL=res.data.match(/src=\"(\S*)\"/)[1] //跳转到control页面 wx.navigateTo({ url:'/pages/control/control', }) }, fail:function(res){ wx.showModal({ title:'提示', content:'请检查输入的服务器地址!', }) } }) } })
index.json:无数据,只有一对打括号
index.wxml
{{welcome}} {{enterBtn}}
index.wxss
/**index.wxss**/ .welcome{ display:flex; margin-top:50rpx; flex-direction:column; align-items:center; justify-content:space-between; } .requestURL{ margin:50rpx10rpx30rpx10rpx; border:1pxsolidgray; font-style:italic; font-size:small } .enter{ margin-right:10rpx; width:150rpx; height:60rpx; font-size:small }
4.control目录
control.js
//pages/control/control.js constapp=getApp() Page({ /** *页面的初始数据 */ data:{ //Carcontrolimages "forwardBtn":"/res/forward.png", "leftBtn":"/res/left.png", "rightBtn":"/res/right.png", "backLeftBtn":"/res/back-left.png", "backRightBtn":"/res/back-right.png", "backBtn":"/res/backward.png", //Cameracontrolimages "upBtn":"/res/forward.png", "camLeftBtn":"/res/camLeft.png", "camRightBtn":"/res/camRight.png", "downBtn":"/res/backward.png", "resetBtn":"/res/reset.png" }, carMove:function(event){ wx.request({ url:this.data.postURL, data:event.currentTarget.dataset.direction, method:"POST", success:function(res){ }, fail:function(res){ } }) }, carStop:function(event){ wx.request({ url:this.data.postURL, data:"S", method:"POST", success:function(res){ }, fail:function(res){ } }) }, camMove:function(event){ wx.request({ url:this.data.postURL, data:event.currentTarget.dataset.direction, method:"POST", success:function(res){ }, fail:function(res){ } }) }, /** *生命周期函数--监听页面加载 */ onLoad:function(options){ //this.data.cameraURL=app.globalData.cameraURL this.setData({ cameraURL:app.globalData.cameraURL, postURL:app.globalData.postURL }) console.log(this.data.cameraURL) console.log("posturlincontrolpage:"+app.globalData.postURL) }, /** *生命周期函数--监听页面初次渲染完成 */ onReady:function(){ }, /** *生命周期函数--监听页面显示 */ onShow:function(){ //console.log(wx.getSystemInfoSync().windowWidth) //console.log(wx.getSystemInfoSync().windowHeight) }, /** *生命周期函数--监听页面隐藏 */ onHide:function(){ }, /** *生命周期函数--监听页面卸载 */ onUnload:function(){ }, /** *页面相关事件处理函数--监听用户下拉动作 */ onPullDownRefresh:function(){ }, /** *页面上拉触底事件的处理函数 */ onReachBottom:function(){ }, /** *用户点击右上角分享 */ onShareAppMessage:function(){ } })
control.json
{ "navigationBarBackgroundColor":"#ffffff", "navigationBarTextStyle":"black", "navigationBarTitleText":"树莓小车", "backgroundColor":"#eeeeee", "backgroundTextStyle":"light", "enablePullDownRefresh":false, "navigationStyle":"custom", "disableScroll":true }
control.wxml
control.wxss
/*pages/control/control.wxss*/ .control{ width:100%; height:100%; transform:rotate(90deg); background-color:#eee; justify-content:center; } .cameraView{ margin-left:0px; width:603px; height:375px; background-color:#eee; justify-content:center; } .button{ height:60px; width:60px; opacity:0.3; } #forward{ left:60px; top:135px; } #left{ left:0px; top:195px; } #right{ left:120px; top:195px; } #backLeft{ left:0px; top:255px; } #backRight{ left:120px; top:255px; } #back{ left:60px; top:315px; } #up{ left:480px; top:195px; } #camLeft{ left:420px; top:255px; } #camRight{ left:540px; top:255px; } #down{ left:480px; top:315px; } #reset{ left:480px; top:135px }
5.工程全局控制
app.js:实际似乎并没有用到,里面都是工程创建时的默认代码
//app.js App({ onLaunch:function(){ //展示本地存储能力 varlogs=wx.getStorageSync('logs')||[] logs.unshift(Date.now()) wx.setStorageSync('logs',logs) //登录 wx.login({ success:res=>{ //发送res.code到后台换取openId,sessionKey,unionId } }) //获取用户信息 wx.getSetting({ success:res=>{ if(res.authSetting['scope.userInfo']){ //已经授权,可以直接调用getUserInfo获取头像昵称,不会弹框 wx.getUserInfo({ success:res=>{ //可以将res发送给后台解码出unionId this.globalData.userInfo=res.userInfo //由于getUserInfo是网络请求,可能会在Page.onLoad之后才返回 //所以此处加入callback以防止这种情况 if(this.userInfoReadyCallback){ this.userInfoReadyCallback(res) } } }) } } }) }, globalData:{ userInfo:null, postURL:null, cameraURL:null } })
app.json:
{ "pages":[ "pages/index/index", "pages/control/control" ], "window":{ "backgroundTextStyle":"light", "navigationBarBackgroundColor":"#fff", "navigationBarTitleText":"树莓小车", "navigationBarTextStyle":"black", "showStatusBar":false } }
app.wxss:
/**app.wxss**/ .container{ height:100%; display:flex; flex-direction:column; align-items:center; justify-content:space-between; padding:200rpx0; box-sizing:border-box; } project.control.json: { "description":"项目配置文件。", "packOptions":{ "ignore":[] }, "setting":{ "urlCheck":false, "es6":true, "postcss":true, "minified":true, "newFeature":true }, "compileType":"miniprogram", "libVersion":"2.0.4", "appid":"wx18414b9f85bfc895", "projectname":"wechat-control", "isGameTourist":false, "condition":{ "search":{ "current":-1, "list":[] }, "conversation":{ "current":-1, "list":[] }, "game":{ "currentL":-1, "list":[] }, "miniprogram":{ "current":-1, "list":[] } } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。