>  기사  >  위챗 애플릿  >  WeChat 애플릿--Raspberry Pi 자동차 제어를 위한 코드 흐름

WeChat 애플릿--Raspberry Pi 자동차 제어를 위한 코드 흐름

php是最好的语言
php是最好的语言원래의
2018-08-07 10:04:245209검색

디렉토리

1. 기본 아이디어

2. 코드 구조는 다음과 같습니다.

3. 인덱스 디렉토리

4. 프로젝트 전역 제어

주로 수행했습니다. . 다음은 주요 코드 조각에 대한 간략한 기록입니다. 우리는 또한 많은 함정을 겪었습니다. 예를 들어 WeChat 애플릿은 전체 전체 화면을 지원하지 않으며 WeChat 애플릿은 가로로 표시할 수 없습니다. 따라서 개발 과정에서 몇 가지 특별한 수단도 사용되었습니다. 이건 아주 기본적인 데모일 뿐이라 그 안에는 카메라 모니터링 IP나 페이지 요소 위치 지정 등 많은 부분에 하드코딩된 값을 사용했다고 할 수 있습니다. 특히 인터페이스는 아이폰6에서만 실험을 했기 때문에 다른 폰으로 바꾸면 인터페이스가 바뀌게 되더라구요.

1. 기본 아이디어

    미니 프로그램에 들어갈 때 인덱스 페이지를 표시하여 사용자가 서버 URL을 입력할 수 있도록 합니다(이전 기사의 브라우저에서 get 요청을 시뮬레이션)
  • 그런 다음 실제 페이지로 이동합니다. 자동차 제어 인터페이스, 그리고 버튼을 클릭하여 자동차를 제어할 수 있습니다
  • 자동차의 움직임을 제어하기 위해 가장 중요한 것은 control.js에서 인터페이스 버튼 이벤트에 대한 응답을 정의하고 http 요청 전송을 구현하는 것입니다. 이벤트 응대 중
  • index 페이지는 다음과 같습니다

WeChat 애플릿--Raspberry Pi 자동차 제어를 위한 코드 흐름들어간 후의 페이지는 다음과 같습니다 (가운데 공백에 카메라 모니터링이 뜨는데 아직 시작하지 않았습니다) , 그래서 볼 수 없음):

WeChat 애플릿--Raspberry Pi 자동차 제어를 위한 코드 흐름2. 코드 구조는 다음과 같습니다.

그 중 index는 홈페이지이고, control은 컨트롤 페이지이고, res 디렉토리는 이미지 리소스를 저장합니다

WeChat 애플릿--Raspberry Pi 자동차 제어를 위한 코드 흐름3. 인덱스 디렉터리

    index.js
  • //index.js
    //获取应用实例
    const app = getApp()
    
    Page({
      data: {
        logo: "/res/rasp-logo.png",
        welcome: "欢迎使用树莓小车",
        enterBtn: "进入",
        PromoteMsg: "Please enter the server address (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
  • <!--index.wxml-->
    <view>
      <view class="welcome">
        <view class="logo">
          <image style="width: 250rpx; height: 250rpx" src="{{logo}}"></image>
        </view>
        <view>
          <text class="words">{{welcome}}</text>
        </view>
      </view>
    
      <input class="requestURL" type="text" placeholder="{{PromoteMsg}}" focus=&#39;1&#39; cursor=&#39;10&#39; confirm-type="done" bindinput=&#39;getURL&#39;></input>
      <button class=&#39;enter&#39; bindtap=&#39;enterClicked&#39;>{{enterBtn}}</button>
    </view>
    index.wxss
  • /**index.wxss**/
    .welcome{
      display: flex;
      margin-top: 50rpx;
      flex-direction: column;
      align-items: center;
      justify-content: space-between;
    }
    
    .requestURL{
      margin: 50rpx 10rpx 30rpx 10rpx;
      border: 1px solid gray;
      font-style: italic;
      font-size: small
    }
    
    .enter{
      margin-right: 10rpx;
      width: 150rpx;
      height: 60rpx;
      font-size: small
    }
  • 4. 제어 디렉터리

    control.js
  • // pages/control/control.js
    const app = getApp()
    
    Page({
    
      /**
       * 页面的初始数据
       */
      data: {
        // Car control images
        "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",
    
        // Camera control images
        "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("post url in control page: " + 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
  • <!--pages/control/control.wxml-->
    <view class=&#39;control&#39;>
      <!-- This image shows the camera view -->
      <image class=&#39;cameraView&#39; src=&#39;http://192.168.1.104:8080/?action=stream&#39; style="z-index:1"></image>
    
      <!-- The following six images control the car move  -->
      <image class=&#39;button&#39; id=&#39;forward&#39; src=&#39;{{forwardBtn}}&#39; style="position:absolute;z-index:2" bindtouchstart=&#39;carMove&#39; data-direction=&#39;F&#39; bindtouchend=&#39;carStop&#39;></image>
      <image class=&#39;button&#39; id=&#39;left&#39; src=&#39;{{leftBtn}}&#39; style="position:absolute;z-index:2" bindtouchstart=&#39;carMove&#39; data-direction=&#39;L&#39; bindtouchend=&#39;carStop&#39;></image>
      <image class=&#39;button&#39; id=&#39;right&#39; src=&#39;{{rightBtn}}&#39; style="position:absolute;z-index:2" bindtouchstart=&#39;carMove&#39; data-direction=&#39;R&#39; bindtouchend=&#39;carStop&#39;></image>
      <image class=&#39;button&#39; id=&#39;backLeft&#39; src=&#39;{{backLeftBtn}}&#39; style="position:absolute;z-index:2" bindtouchstart=&#39;carMove&#39; data-direction=&#39;BL&#39; bindtouchend=&#39;carStop&#39;></image>
      <image class=&#39;button&#39; id=&#39;backRight&#39; src=&#39;{{backRightBtn}}&#39; style="position:absolute;z-index:2" bindtouchstart=&#39;carMove&#39; data-direction=&#39;BR&#39; bindtouchend=&#39;carStop&#39;></image>
      <image class=&#39;button&#39; id=&#39;back&#39; src=&#39;{{backBtn}}&#39; style="position:absolute;z-index:2" bindtouchstart=&#39;carMove&#39; data-direction=&#39;B&#39; bindtouchend=&#39;carStop&#39;></image>
    
      <!-- The following images control the camera move  -->
      <image class=&#39;button&#39; id=&#39;up&#39; src=&#39;{{upBtn}}&#39; style="position:absolute;z-index:2" bindtouchstart=&#39;camMove&#39; data-direction=&#39;VU&#39;></image>
      <image class=&#39;button&#39; id=&#39;camLeft&#39; src=&#39;{{camLeftBtn}}&#39; style="position:absolute;z-index:2" bindtouchstart=&#39;camMove&#39; data-direction=&#39;HL&#39;></image>
      <image class=&#39;button&#39; id=&#39;camRight&#39; src=&#39;{{camRightBtn}}&#39; style="position:absolute;z-index:2" bindtouchstart=&#39;camMove&#39; data-direction=&#39;HR&#39;></image>
      <image class=&#39;button&#39; id=&#39;down&#39; src=&#39;{{downBtn}}&#39; style="position:absolute;z-index:2" bindtouchstart=&#39;camMove&#39; data-direction=&#39;VD&#39;></image>
      <image class=&#39;button&#39; id=&#39;reset&#39; src=&#39;{{resetBtn}}&#39; style="position:absolute;z-index:2" bindtouchstart=&#39;camMove&#39; data-direction=&#39;RESET&#39;></image>
    </view>
    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 () {
        // 展示本地存储能力
        var logs = wx.getStorageSync(&#39;logs&#39;) || []
        logs.unshift(Date.now())
        wx.setStorageSync(&#39;logs&#39;, logs)
    
        // 登录
        wx.login({
          success: res => {
            // 发送 res.code 到后台换取 openId, sessionKey, unionId
          }
        })
        // 获取用户信息
        wx.getSetting({
          success: res => {
            if (res.authSetting[&#39;scope.userInfo&#39;]) {
              // 已经授权,可以直接调用 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: 200rpx 0;
      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": []
    		}
    	}
    }
  • 관련 권장 사항 :

raspberry pi pi, rpi에 대한 자세한 소개)

raspberry pi를 구현하려면 raspberry pi를 구현합니다. robots_PHP 튜토리얼

위 내용은 WeChat 애플릿--Raspberry Pi 자동차 제어를 위한 코드 흐름의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.