物联网工程必备!!!

引脚示意图

1.前端

<!-- 纵向flex -->
<view class="body mg16" wx:for="{{parameter}}"  wx:key="id" wx:for-item="item" wx:for-index="index">
<!-- 上半部分 -->
<view class="text mg4">
<view class="mg4">{{item.name}}</view>
</view>
<!-- 下半部分,横向flex -->
<view class="flex mg8">
    <button type="primary" size="mini" bindtap="handleTap" data-operation="{{1}}" data-index="{{index}}">+</button>
    <view class="input"><input class="mgt4" value="{{item.inital_value}}" bindinput="handleInputInit" data-index="{{index}}"/></view>
    <button type="primary" size="mini" bindtap="handleTap" data-operation="{{0}}" data-index="{{index}}">-</button>
</view>
</view>

<view class="flex mg64">
<button type="primary" size="mini" class="button mgt32" bindtap="Switch">开关</button>
<button type="primary" size="mini" class="button mgt32" bindtap="Mode">图像</button>
</view>
<view class="flex mg64">
<button type="primary" size="mini" class="button mgt32" bindtap="Get">获取</button>
<button type="primary" size="mini" class="button mgt32" bindtap="Reset">重置</button>
</view>

<view class="flex mg64">
<button type="primary" size="mini" class="button mgt32" bindtap="Light1">点灯</button>
<button type="primary" size="mini" class="button mgt32" bindtap="Light2">急闪</button>
</view>
// pages/control/control.js
const app = getApp()
Page({

    /**
     * 页面的初始数据
     */
    data: {
        parameter:[
            {
                id: 1,
                name:"",
                inital_value: null,
                bujin: null,
                range: null,
            }
        ],
        mode:0,
    },
    handleInputInit(e){
        // console.log(e);
        var inital_value = e.detail.value
        var index = e.currentTarget.dataset.index
        let parameter0=this.data.parameter[index]
        parameter0.inital_value=String(inital_value)
        this.data.parameter[index]=parameter0   // 赋值
        console.log(this.data.parameter[index])
    },
    handleTap(e){
        // console.log(e);
        var index = e.currentTarget.dataset.index
        var op = e.currentTarget.dataset.operation
        let parameter=this.data.parameter
        let parameter0=this.data.parameter[index]
        var bujin = parameter0.bujin
        var inital_value = Number(parameter0.inital_value)

        if(op==1){
            if(parseInt(String(inital_value))==parseFloat(String(inital_value))){
                parameter0.inital_value=String(inital_value+bujin)
            }
            else{
                parameter0.inital_value=(parseFloat(inital_value)+bujin).toFixed(1)
            } 
        }
        if(op==0){
            if(parseInt(String(inital_value))==parseFloat(String(inital_value))){
                parameter0.inital_value=String(inital_value-bujin)
            }
            else{
                parameter0.inital_value=(parseFloat(inital_value)-bujin).toFixed(1)
            }  
        }
        this.setData({
            parameter:parameter
        })
        // console.log(parameter);
        // control实时控制
        wx.request({
            url: 'https://feedback.ywhao.bitworkshop.cn/command',
            // url: 'http://127.0.0.1:8088/command',
            data: {
                openid: app.user.openid,
                command: JSON.stringify(parameter0),
                port: app.port
            },
            header: {
                "Content-Type": "application/x-www-form-urlencoded"
            },
            dataType: "json",
            method: "POST",
            success: (result) => {
                console.log(result);
                // 云端保存数据
                wx.request({
                    url: 'https://feedback.ywhao.bitworkshop.cn/parameter',
                    // url: 'http://127.0.0.1:8001/parameter',
                    data: {
                        parameter: JSON.stringify(parameter), // JSON.stringify()对象转字符串
                        wxname: app.user.userInfo.nickName,
                        openid: app.user.openid,
                        cookie: app.user.cookie,
                        // wxname: "Dandan心魅かれてく",
                        // openid: "o1AFS5ImQTOhpuhCe7lU6Jw_7Fco",
                        // cookie: "RODSW1O3",
                        port: app.port
                    },
                    header: {
                        "Content-Type": "application/x-www-form-urlencoded"
                    },
                    dataType: "json",
                    method: "POST",
                    success: (result) => {
                        console.log(result);
                    }
                }) // parameter
            }
        }) // control
        
    },
    Get(e){
        // command实时控制
        wx.request({
            url: 'https://feedback.ywhao.bitworkshop.cn/command',
            // url: 'http://127.0.0.1:8088/command',
            data: {
                openid: app.user.openid,
                command: 'b',
            },
            header: {
                "Content-Type": "application/x-www-form-urlencoded"
            },
            dataType: "json",
            method: "POST",
            success: (result) => {
                console.log(result);
                var parameter_value = JSON.parse(result.data.parameter);
                let parameter0=this.data.parameter
                console.log(parameter_value);
                var len = parameter_value.length
                for(var i=0;i<len;i++){
                    parameter0[i].inital_value = parameter_value[i]
                }
                console.log(parameter0);
                this.setData({
                    parameter:parameter0
                })
            }
        }) // command
    },
    Light2(e){
        // command实时控制
        wx.request({
            url: 'https://feedback.ywhao.bitworkshop.cn/command',
            // url: 'http://127.0.0.1:8088/command',
            data: {
                openid: app.user.openid,
                command: 'f',
            },
            header: {
                "Content-Type": "application/x-www-form-urlencoded"
            },
            dataType: "json",
            method: "POST",
            success: (result) => {
                console.log(result);
            }
        }) // command
    },
    Light1(e){
        // command实时控制
        wx.request({
            url: 'https://feedback.ywhao.bitworkshop.cn/command',
            // url: 'http://127.0.0.1:8088/command',
            data: {
                openid: app.user.openid,
                command: 'e',
            },
            header: {
                "Content-Type": "application/x-www-form-urlencoded"
            },
            dataType: "json",
            method: "POST",
            success: (result) => {
                console.log(result);
            }
        }) // command
    },
    Reset(e){
        // command实时控制
        wx.request({
            url: 'https://feedback.ywhao.bitworkshop.cn/command',
            // url: 'http://127.0.0.1:8088/command',
            data: {
                openid: app.user.openid,
                command: 'd',
            },
            header: {
                "Content-Type": "application/x-www-form-urlencoded"
            },
            dataType: "json",
            method: "POST",
            success: (result) => {
                console.log(result);
            }
        }) // command
    },
    Mode(e){
        // command实时控制
        var mode = this.data.mode
        wx.request({
            url: 'https://feedback.ywhao.bitworkshop.cn/command',
            // url: 'http://127.0.0.1:8082/command',
            data: {
                openid: app.user.openid,
                port: app.port,
                command: 'c',
            },
            header: {
                "Content-Type": "application/x-www-form-urlencoded"
            },
            dataType: "json",
            method: "POST",
            success: (result) => {
                console.log(result);
            }
        }) // command
    },
    Change(e){
        // command实时控制
        wx.request({
            url: 'https://feedback.ywhao.bitworkshop.cn/command',
            // url: 'http://127.0.0.1:8088/command',
            data: {
                openid: app.user.openid,
                command: 'g',
            },
            header: {
                "Content-Type": "application/x-www-form-urlencoded"
            },
            dataType: "json",
            method: "POST",
            success: (result) => {
                console.log(result);
            }
        }) // command
        
    },
    Switch(e){
        // command实时控制
        wx.request({
            url: 'https://feedback.ywhao.bitworkshop.cn/command',
            // url: 'http://127.0.0.1:8088/command',
            data: {
                openid: app.user.openid,
                command: 'a',
            },
            header: {
                "Content-Type": "application/x-www-form-urlencoded"
            },
            dataType: "json",
            method: "POST",
            success: (result) => {
                console.log(result);
            }
        }) // command
        
    },
    /**
     * 生命周期函数--监听页面加载
     */
    onLoad(options) {
        this.setData({
            parameter: app.parameter
        })
        wx.request({
            url: 'https://feedback.ywhao.bitworkshop.cn/getparameter',
            // url: 'http://127.0.0.1:8001/getparameter',
            data: {
                openid: app.user.openid,
                cookie: app.user.cookie,
                // openid: "o1AFS5ImQTOhpuhCe7lU6Jw_7Fco",
                // cookie: "RODSW1O3"
            },
            header: {
                "Content-Type": "application/x-www-form-urlencoded"
            },
            dataType: "json",
            method: "POST",
            success: (result) => {
                console.log(result);
                if(result.data.parameter!=""){
                    var parameter = JSON.parse(result.data.parameter)
                    var port = result.data.port
                    this.setData({
                        parameter: JSON.parse(result.data.parameter), // JSON.parse()字符串转对象
                        port: port
                    })
                    app.parameter=parameter
                    app.port=port
                }
                else{
                    wx.reLaunch({
                        url: '../parameter/parameter',
                    })
                }
            }
        }) // getparameter
    },

})

2.后端

def command(request):
    if request.method == "POST":
        try:
            openid = request.POST["openid"]
            parameter = request.POST["parameter"]
            if(parameter):
                ob = Command.objects.get(openid=openid)
                ob.parameter_state = 1
                ob.parameter = parameter
                ob.save()
            content = {"state": "200", "parameter": parameter}
            return JsonResponse(content)
        except:
            print()

        try:
            openid = request.POST["openid"]
            cmd = request.POST["command"]
        except:
            content = {"state": "201"}
            return JsonResponse(content)

        allow_openid = ["o1AFS5ImQTOhpuhCe7lU6Jw_7Fco"]
        if(openid not in allow_openid):
            print("{}无权限".format(openid))
            content = {"state": "202"}
            return JsonResponse(content)

        else:
            ob = Command.objects.filter(openid=openid)
            parameter = 0
            if list(cmd)[0] == "{":
                cmd = eval(cmd)
                cmd = "{"+"{}:{}".format(cmd["id"]-1, int(eval(cmd["inital_value"])*100))+"}"
                print(cmd)
            if ob:
                ob = Command.objects.get(openid=openid)
                ob.state = 1
                ob.command = cmd
                ob.save()
                if ob.parameter_state:
                    ob.parameter_state = 0
                    ob.save()
                    parameter = ob.parameter
            else:
                Command.objects.create(state=1, openid=openid, command=cmd)
            content = {"state": "200", "command": cmd, "parameter": parameter}
            print(content)
            return JsonResponse(content)

    else:
        content = {"state": "203"}
        return JsonResponse(content)


def getcommand(request):
    if request.method == "POST":
        try:
            openid = request.POST["openid"]
            secret = request.POST["secret"]
        except:
            content = {"state": "201"}
            return JsonResponse(content)

        allow_people = ["ywh"]
        if(secret not in allow_people):
            print("{}无权限".format(secret))
            content = {"state": "202"}
            return JsonResponse(content)

        else:
            OB = Command.objects.filter(openid=openid)
            if(OB):
                ob = Command.objects.get(openid=openid)
                if(ob.state):
                    cmd = ob.command
                    ob.state = 0
                    ob.save()
                    content = {"state": "200", "command": cmd}
                else:
                    content = {"state": "200.5"}
                return JsonResponse(content)
            else:
                Command.objects.create(state=0, openid=openid)
                content = {"state": "200.5"}
                return JsonResponse(content)
    else:
        content = {"state": "203"}
        return JsonResponse(content)

3.TCP通信

与ESP8266建立TCP连接,有接收和请求两个线程。
接收线程:负责接收ESP8266发送的信息
请求线程:请求后端接口,不断查询是否有新的指令command

import socket, time, os, random
import requests
import json, threading, base64

picture0 = [0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X80,0XC0,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0XC0,0X40,0X40,0X40,0X40,0X40,0X7C,
0X18,0X30,0X20,0X20,0X30,0X18,0X0C,0X06,0X03,0X01,0XFF,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0XF0,0X80,0X80,0X00,0XF0,0XA0,0XF0,0X00,
0X70,0X50,0XF0,0X00,0XF0,0X00,0XF0,0X90,0XF0,0X00,0X00,0X00,0X00,0XF0,0X90,0X90,
0X00,0XF0,0X90,0XF0,0X00,0XF0,0X80,0XF0,0X00,0X80,0XF0,0X80,0X00,0XF0,0X80,0X80,
0X00,0XF0,0X90,0XF0,0X00,0XF0,0X10,0X00,0XF0,0X10,0X00,0XF0,0X90,0XD0,0X00,0XF0,
0X80,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0XF0,0XF0,0XF0,0XF0,0XF0,0XF0,0XFF,0XE0,0XC0,0X80,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0XFF,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X08,0X0C,0X0E,0X0E,0X0E,0X0E,0X0E,0X0E,0X0E,0X0E,
0XFE,0XFE,0XFE,0XFE,0XFE,0XFE,0XFE,0X00,0X0E,0X1E,0X3E,0X7E,0XFE,0XFE,0XFE,0XFE,
0XFE,0XEE,0XCE,0X8E,0X0E,0X0E,0X0E,0X0E,0X0E,0X0E,0X0E,0X0C,0X08,0X00,0XFE,0XFE,
0XFE,0XFE,0XFE,0XFE,0XCE,0X8E,0X0E,0X0E,0X0E,0X0E,0X0E,0X0E,0XFE,0XFE,0XFE,0XFC,
0XF8,0XF0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X02,
0X06,0X8E,0XDE,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,0XFC,
0XF8,0XF0,0XE0,0XC0,0X80,0X00,0X00,0X00,0X00,0X00,0X07,0X1C,0X30,0XE0,0X80,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X00,0X00,0X00,0X00,0X00,0X00,0X01,0X03,0X07,
0X0F,0X1F,0X3F,0X7F,0XFF,0XFE,0XFC,0XF8,0XF0,0XE0,0XC0,0X80,0X00,0X00,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0X03,0X07,0X0F,0X1E,0X3C,0X78,0XF0,0XE0,0XFF,0XFF,0XFF,0XFF,
0XFF,0XFF,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X10,0X18,0X1C,0X1E,
0X1F,0X1F,0X1F,0X1F,0X1F,0X1F,0X1F,0X1F,0X1F,0X1F,0X1F,0X1F,0X1F,0X1F,0X1F,0X1F,
0X3F,0X7F,0XFF,0XFF,0XFF,0XFF,0XFE,0XFC,0XF8,0XF0,0XE0,0XC0,0X80,0X00,0X01,0X07,
0X0C,0X38,0X20,0X30,0X18,0X0C,0XFE,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X1F,0X1F,0X1F,0X1F,0X1F,0X1F,0X1F,0X00,0X00,0X1C,0X1C,0X1C,0X1C,0X1C,0X1C,0X1C,
0X1C,0X1C,0X1C,0X1C,0X1C,0X1F,0X1F,0X1F,0X1F,0X1F,0X1F,0X1F,0X00,0X00,0X1F,0X1F,
0X1F,0X1F,0X1F,0X1F,0X1C,0X1C,0X1C,0X1C,0X1C,0X1C,0X1C,0X1D,0X1F,0X1F,0X1F,0X1F,
0X1F,0X1F,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X01,0X03,0X03,0X07,0X8F,0XCF,0XFF,0XFF,0XFF,0XFF,0XFE,0XFC,
0XF8,0XF0,0XE0,0XC0,0X80,0X00,0X1F,0X70,0XC0,0X80,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X02,0X03,0X03,0X03,0X03,0X03,0X03,0X03,0X03,0X03,
0X03,0X03,0X03,0X07,0X0F,0X0F,0X1E,0X3C,0X38,0X73,0X66,0XDC,0XF0,0XE0,0X80,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X01,0X01,0X03,0X07,
0X04,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,]


picture1 = [ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xC0,0xC0,0xE0,
 0xF0,0xF0,0xF0,0xF8,0xF8,0xF8,0xFC,0x7C,0x3E,0x3E,0x1E,0x1E,0x1E,0x1F,0x3F,0xFF,
 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xC7,0x81,0x81,0x01,
 0x01,0x81,0x81,0xC3,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
 0xFF,0x3F,0x1E,0x1E,0x1E,0x1E,0x3C,0x3C,0x7C,0xFC,0xF8,0xF8,0xF0,0xF0,0xF0,0xE0,
 0xC0,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x80,0xF0,0xF0,0xFC,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7C,0x70,0x70,0x30,0x30,0x30,0x30,0x78,0x7F,
 0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x3F,0x1F,0x1F,0xCF,0xC7,0xC7,0xE7,
 0xE3,0xE7,0xE7,0xC7,0x8F,0x8F,0x1F,0x3F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,
 0xFE,0x78,0x70,0x30,0x30,0x30,0x78,0x78,0x7E,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
 0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xFC,0xF8,0xE0,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0xC0,
 0xC0,0x80,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
 0xFF,0x3F,0x3F,0x03,0xF1,0xF1,0xF8,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFC,
 0xFC,0xF8,0xE3,0x8F,0x8F,0x3F,0xF7,0xF7,0xE0,0xFC,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF0,0xF1,0xF1,0x7F,0x0F,0x0F,0xC3,0xF9,0xFC,
 0xFC,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFC,0xFC,0xF1,0xF1,0x03,0x1F,0x1F,0xFF,
 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x1C,0x00,0x00,0x80,0x80,0x80,
 0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x04,0x7C,0x7C,0xFE,0xFE,0xFE,0xE8,0x80,0x1F,0x1F,0x7D,0x7F,0x7F,0x3D,0x2F,0xBF,
 0xBF,0xFF,0xFE,0xE0,0xE0,0xC0,0x87,0x87,0x0F,0x3F,0x7F,0x7F,0xFF,0xFF,0xFF,0xFF,
 0xFF,0xFC,0xFC,0xC0,0x9F,0x9F,0x3F,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,
 0x7F,0x3F,0x0F,0xCF,0xCF,0xFC,0xF0,0xF0,0xC7,0x9F,0x3F,0x3F,0x7F,0xFF,0xFF,0xFF,
 0xFF,0xFF,0xFF,0x7F,0x3F,0x3F,0x9F,0xC7,0xF1,0xF1,0xFC,0xEF,0xEF,0x0F,0x3F,0x7F,
 0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0x3F,0x1F,0x1F,0xC0,0xF8,0xF8,0xFF,
 0xFF,0xFF,0xFF,0x7F,0x3F,0x3F,0x1F,0x87,0xC1,0xC1,0xF0,0xBE,0xBE,0xBF,0x3F,0x7F,
 0x7F,0x7F,0x7F,0x7F,0x7F,0x86,0x00,0x00,0xE4,0xFC,0xFC,0xFC,0x3C,0x04,0x04,0x00,
 0x00,0x00,0x00,0x03,0x03,0x03,0x0F,0x3F,0x7F,0x7F,0xF8,0xF0,0xF0,0xC2,0xC7,0x9F,
 0x9F,0xBF,0x7F,0x3F,0x3F,0x1F,0x9F,0x9F,0x8F,0x96,0xF0,0xF0,0xF0,0xF1,0xF1,0xF1,
 0xC3,0x87,0x87,0x07,0x8F,0x8F,0x8E,0x1E,0x1C,0x1C,0x3C,0x3C,0x3C,0x3C,0x7C,0x7E,
 0x7E,0x7E,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFC,0xFC,0xFC,
 0xFC,0xFC,0xFC,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0x7F,0x7F,0x7E,0x7C,
 0x7C,0x7C,0x38,0x38,0x38,0x98,0x9C,0x9C,0x8C,0x8E,0xCF,0xCF,0xE7,0xE3,0xE3,0xD3,
 0xF1,0xF0,0xF0,0xE0,0x26,0x26,0x0F,0x1F,0x3F,0x3F,0x7F,0x7F,0x7F,0x0F,0xEF,0xE6,
 0xE6,0x20,0xF0,0xF8,0xF8,0x7F,0x3F,0x3F,0x0F,0x03,0x01,0x01,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x03,0x03,0x0D,
 0x0D,0x1E,0x1B,0x3C,0x3C,0x7E,0xF9,0xF9,0xE1,0xE1,0xF0,0xF0,0xCF,0xCF,0xCF,0x80,
 0x80,0x08,0x08,0x3B,0x3F,0x3F,0x7F,0x7F,0x3F,0x3F,0x3F,0x0F,0x0F,0x02,0xBC,0xBE,
 0xBE,0xFE,0xFC,0xFC,0xFC,0xEC,0x6C,0x6C,0x00,0x00,0xF8,0xF8,0xA8,0xFC,0xFC,0xFC,
 0xA8,0xF8,0xF8,0xF8,0x00,0x00,0x4C,0x4C,0xFC,0xFC,0xF4,0xFC,0xFC,0xFE,0x6E,0x00,
 0x00,0x0F,0x7F,0x7F,0x7F,0x5F,0x7D,0x7D,0x7F,0x3F,0xBC,0xBC,0xC1,0xC3,0xC3,0xC7,
 0xCE,0xCD,0xCD,0xE3,0xE3,0xE3,0xF8,0x78,0x78,0x78,0x7C,0x7E,0x7E,0x1E,0x06,0x01,
 0x01,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x03,0x03,0x0F,
 0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x1E,0x1E,0x1E,0x1E,0x1C,0x1C,0x1C,0x1E,0x3C,0x39,
 0x39,0x39,0x39,0x39,0x39,0x7D,0x7D,0x7D,0x78,0x78,0x00,0x00,0x00,0x79,0x79,0x5B,
 0x5B,0x79,0x79,0x73,0x78,0x78,0x70,0x79,0x79,0x79,0x3D,0x39,0x39,0x39,0x38,0x3C,
 0x3C,0x3C,0x1C,0x1C,0x1C,0x1F,0x1E,0x1E,0x0E,0x0E,0x04,0x04,0x03,0x06,0x06,0x03,
 0x03,0x01,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,]


picture = [picture0, picture1]

def request():
    while True:
            time.sleep(0.1)
            url = "https://feedback.ywhao.bitworkshop.cn/getcommand"
            # url = "http://127.0.0.1:8088/getcommand"
            headers = {
                "Cache-Control": "max-age=0",
                "Upgrade-Insecure-Requests": "1",
                "Origin": "https://feedback.ywhao.bitworkshop.cn",
                "referer": "https://feedback.ywhao.bitworkshop.cn/getcommand",
                "Content-Type": "application/x-www-form-urlencoded",
                "Accept": "*/*",
            }
            data = {
                 "secret": "ywh",
                 "openid": "o1AFS5ImQTOhpuhCe7lU6Jw_7Fco",
            }
            response = eval(requests.post(url=url, headers=headers, data=data).content.decode())
            if(response["state"]=="200"):
                command = response["command"]
                print("command:", command)
                dataSocket.send(command.encode("utf-8"))
                if(command == "c"):
                    pic = picture[random.randint(0,1)]
                    # time.sleep(1)
                    lens = len(pic)
                    for i in range(lens):
                        data = hex(pic[i])[2:]
                        length = len(data)
                        if (length < 2):
                            data = '0' + data
                        data = bytes.fromhex(data)
                        dataSocket.send(data)
                    print("Over!!!")




def request2(parameter):
            url = "https://feedback.ywhao.bitworkshop.cn/command"
            # url = "http://127.0.0.1:8088/command"
            headers = {
                "Cache-Control": "max-age=0",
                "Upgrade-Insecure-Requests": "1",
                "Origin": "https://feedback.ywhao.bitworkshop.cn",
                "referer": "https://feedback.ywhao.bitworkshop.cn/command",
                "Content-Type": "application/x-www-form-urlencoded",
                "Accept": "*/*",
            }
            data = {
                 "secret": "ywh",
                 "openid": "o1AFS5ImQTOhpuhCe7lU6Jw_7Fco",
                 "parameter": parameter,
            }
            response = eval(requests.post(url=url, headers=headers, data=data).content.decode())
            print(response)


def recv():
    while True:
        get_data = dataSocket.recv(1024)
        if get_data:
            info = get_data.decode("utf-8")
            print("{}:{}".format(ip2, info))
            try:
                info = info.split(":")
                if(info[0]=="Send"):
                    info = info[1]
                    request2(info)
            except:
                print()

# def send_picture():


def picture2base(path):
    """
    压缩图片数据
    """
    with open(path, 'rb') as img:
        b64encode = base64.b64encode(img.read())
        # 返回base64编码字符串
        return b64encode.decode('utf-8')


def main():
    global dataSocket, ip2
    # ip = socket.gethostbyname(socket.gethostname())
    ip = "0.0.0.0"
    # ip = "127.0.0.1"
    port = 8081

    tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    tcp_socket.bind((ip, port))

    tcp_socket.listen(5)
    print("服务端{}:{}启动成功,正在等待客户端连接...".format(ip, port))

    dataSocket, ip2 = tcp_socket.accept()
    print("已连接ip:{} port:{}".format(ip2[0], ip2[1]))

    # 多线程
    recv_thread = threading.Thread(target=recv)
    recv_thread.start()
    request_thread = threading.Thread(target=request)
    request_thread.start()


if __name__ == '__main__':
    main()

4.CCS项目

4.1ESP8266初始化

ESP8266的AT指令,要实现通信,必须开启透传模式。发送AT对方成功接收表示透传模式开启。

#include <headfile.h>
/*
 * esp.c
 *
 *  Created on: 2022年7月23日
 *      Author: ywh
 */

void ESP_Init()   //ESP8266初始化
{
//    UART_printf(USCI_A1_BASE, "AT+CWMODE=1\r\n");
////    delay5ms(400);
//    UART_printf(USCI_A1_BASE,"AT+RST\r\n");  //重启模块
//    delay5ms(400);
//    UART_printf(USCI_A1_BASE,"AT+CIFSR\r\n"); // 获取IP信息
//    delay5ms(400);
//    UART_printf(USCI_A1_BASE,"AT+CWJAP=\"dxxy16-406\",\"dxxy16-406\"\r\n");
//    delay5ms(400);
    UART_printf(USCI_A1_BASE,"AT+CIPSTART=\"TCP\",\"124.222.154.177\",8081\r\n"); // 124.222.154.177:3333
    delay5ms(1000);
    UART_printf(USCI_A1_BASE, "AT+CIPMODE=1\r\n");
    delay5ms(1000);
    UART_printf(USCI_A1_BASE, "AT+CIPSEND\r\n");
    delay5ms(1000);
    UART_printf(USCI_A1_BASE, "ESP_Init OK\r\n");
    delay5ms(1000);
    esp=1;
}

4.2ESP串口接收

/******************************************************************************
USCI_A1中断
在uart.h内初始化串口就打开中断
******************************************************************************/
#pragma vector=USCI_A1_VECTOR
__interrupt void UartISR_2(void){
    static unsigned short Flag_PID,i,j,l;
    switch(_even_in_range(UCA1IV,4))
    {
        case 2:{               // Vector 2 - RXIFG

            while (!(UCA1IFG&UCTXIFG));
///**************************************************************************
//说明: APP调参
//入口参数:无
//返回值 : 无
//作   者 : ywh
//参考  :平衡小车之家
//**************************************************************************/
            //串口参数
            if(esp){
                if(Debug_key==3)Pictrue_Buf[Pictrue_Buf_index++] = UCA1RXBUF;
                if(Pictrue_Buf_index>=1024){memset(Pictrue_Buf, 0, sizeof(uint8_t)*1024);Pictrue_Buf_index=0;}
                else{
                    UartRcvBuf[UartRcvBufIndex++] = UCA1RXBUF ;
                    if(UartRcvBufIndex>=128){memset(UartRcvBuf, 0, sizeof(uint8_t)*128);UartRcvBufIndex=0;}
                    Usart_Receive=UCA1RXBUF;
                    Usart2_Receive=UCA1RXBUF;
                }
            }
            //调试界面下方的按键
            if(Usart_Receive>=97&&Usart_Receive<=105)   //a~o 15个按键指令
            {
                switch(Usart_Receive)
                {
                    case 0x61:
                        if(Debug_key){Debug_key=0;break;}
                        else{Debug_key=1;break;}    //a
                    case 0x62: Debug_key=2; break;    //b
                    case 0x63: OLED_Clear();Debug_key=3; break;    //c
                    case 0x64: Debug_key=4;KP=5;Kp=5;KI=10;Ki=10;KD=0;Kd=0;Set_PID(&PID_left,KP,KD,KI);Set_PID(&PID_right,Kp,Kd,Ki);duoji=7.5;Target_L=25;Target_R=25;PID_SetPoint(&PID_left,Target_L);PID_SetPoint(&PID_right,Target_R);  break;    //d
                    case 0x65: Debug_key=5;
                               if(led1){led1=0;break;}
                               else{led1=1;}break;    //e
                    case 0x66: Debug_key=6;
                               if(led1){led1=0;break;}
                               else{led1=2;}break;    //f
                    case 0x67: OLED_Clear();Debug_key=7;  break;    //g
                    case 0x68: Debug_key=8;  break;    //h
                    case 0x69: Debug_key=9;  break;    //i
                    case 0x6A: Debug_key=10;  break;    //j
                    case 0x6B: Debug_key=11;  break;    //k
                    case 0x6C: Debug_key=12;  break;    //l
                    case 0x6D: Debug_key=13;  break;    //m
                    case 0x6E: Debug_key=14;  break;    //n
                    case 0x6F: Debug_key=15;  break;    //o
                }

            }

//*************************调试界面9通道按键**********************************************//
            if(Usart2_Receive==0x7B) Flag_PID=1;  //指令{==帧头-起始位
            if(Usart2_Receive==0x7D&&UartRcvBuf[UartRcvBufIndex]!=0x7D) Flag_PID=2;l=i;  //指令}==帧尾-停止位
            if(Flag_PID==1){Receive[i]=Usart2_Receive,i++;}             //记录参数
            if(Flag_PID==2)                                                 //解析数据
            {
                 if     (Receive[3]==0x50)  PID_Send=1;                    //指令P==获取设备参数,在APP_Show()中调用
                 else if(Receive[3]==0x57)  Flash_Send=1;                  //指令W==掉电保存参数
                 else if(Receive[1]!=0x23)                                 //指令#==更新PID参数
                 {

                     for(j=l;j>=4;j--)
                     {
                         Data+=(Receive[j-1]-48)*pow(10,l-j);
                     }
//                     Data=((float)(int)((Data+0.005)*100))/100;
                     switch(Receive[1])
                      {

                         case 0x30:  KP=Data/100;Kp=Data/100;break;        //参数1
                         case 0x31:  KD=Data/100;Kd=Data/100;break;         //参数2
                         case 0x32:  KI=Data/100;Ki=Data/100;break;         //参数3
                         case 0x33:  duoji=Data/100;break;         //参数4 6.7~8.4
                         case 0x34:  Target_L=Data/100;Target_R=Data/100;break;         //参数5
                         case 0x35:  break;   //参数6
                         case 0x36:  break;   //参数7
                         case 0x37:  break;   //参数8
                         case 0x38:  break;   //参数9
                      }
                      UART_printf(USCI_A1_BASE, "Data:%.1f\n",Data);
                      duoji_pwm_update(duoji);
                      Set_PID(&PID_left,KP,KD,KI);
                      Set_PID(&PID_right,Kp,Kd,Ki);
                      PID_SetPoint(&PID_left,Target_L);
                      PID_SetPoint(&PID_right,Target_R);
                 }

                 Flag_PID=0;   //标志位清零
                 i=0;j=0;l=0;
                 Data=0;
                 memset(Receive, 0, sizeof(unsigned short)*50);
            }
//*************************************************************************************//

        }


        break;
        case 4:{
                                // Vector 4 - TXIFG
        }break;
        default: break;
    }
}

4.3main.c

if(led1==0){GPIO_setOutputLowOnPin(GPIO_PORT_P1,GPIO_PIN0);}
if(led1==1){GPIO_setOutputHighOnPin(GPIO_PORT_P1,GPIO_PIN0);} // p1.0常亮
if(led1==2){GPIO_toggleOutputOnPin(GPIO_PORT_P1,GPIO_PIN0);}  // p1.0闪烁
if(!Debug_key){
           pwm_duty_update(left_Z, 0);
           pwm_duty_update(right_Z, 0);
        }
if(Debug_key==1){run();}
if(Debug_key==2){get_parameter();Debug_key=0;}
if(Debug_key==3){OLED_DrawBMP(0, 0, 127, 7,Pictrue_Buf);}
void get_parameter()
{
    UART_printf(USCI_A1_BASE, "Send:[%.2f,%.2f,%.2f,%.2f,%.2f]",(float)(PID_left.Proportion),(float)(PID_left.Integral),(float)(PID_left.Derivative),(float)(duoji),(float)(Target_L));

}