当按下开始按钮时,前端js通过触发按钮事件调用ajax函数请求一个路由地址来调用django后台的通信程序
Ajax 即“Asynchronous Javascript And XML”(异步 JavaScript 和
XML),是指一种创建交互式、快速动态网页应用的网页开发技术,无需重新加载整个网页的情况下,能够更新部分网页的技术。
通过在后台与服务器进行少量数据交换,Ajax 可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。
var startbtn = $('#start');
startbtn.click(function (event) {
// 按下开始按钮
$.ajax({
type: 'GET',
url: 'http://192.168.0.112:8000/App/open/',
data: {
'data': 'OPEN',
},
});
});
这里的url指的是请求调用http://192.168.0.112:8000/App/open/
这个地址的python函数,将‘OPEN’
发送送到后端,而此地址的python函数如下:
def open(request):
content = request.GET.get('data') # 从前端获取数据
for i in range(2):
apphelper.senddata(content) # 通过udp发送数据,for语句表明点一次发送三次(确保发送成功)
print(content)
return HttpResponse(content)
这里把从地址‘get’到的data信息赋值给content,用一个for函数调用senddata()函数两次,表明重复发送,保证硬件端有效接收。
import socket
def senddata(content):
udp_send = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
data = content
udp_send.sendto(data.encode('gbk'), ("192.168.0.120", 4055))
udp_send.close()
函数的第一段代码是udp协议的固定格式,然后把content赋值给data。
udp_send.sendto(data.encode('gbk'), ("192.168.0.120", 4055))
这一句就是发送了,将data编码成‘gbk’格式(一种计算机能看懂的格式),把他发送给(“192.168.0.120”, 4055)此地址和此端口,这样就能在局域网下通信了,地址写的是硬件端wifi模块的地址,端口是发送到它那个地址的那个端口。
当硬件端发送信息给后台时,首先是前端js通过定时器定时调用getjson函数请求'http://192.168.0.112:8000/App/get/'
function saver() {
$.getJSON('http://192.168.0.112:8000/App/get/', function (data) {
if (data['data']) {
console.log('success')
}
})
}
后台调用get函数将数据存储到数据库
def get(request):
getcontent = apphelper.getdata()
temp = Temperature()
temp.tnum = getcontent
temp.save()
alreadydel = Temperature.objects.all()[10]
if alreadydel:
Temperature.objects.all()[0].delete()
# final_msgs = serializers.serialize("json", msg_list)
data = {
'data': 'save_ok',
'status': 200
}
return JsonResponse(data=data)
通过调用getdata函数获取数据,然后进行数据的保存,之后判断数据库是否已经存储了十条数据,如果是,我们就将数据库的第一条数据删除,这样就能保证数据库的数据不会过多,当我们在展示数据到前端html的时候,就只需要将数据库里的所有十条数据全部拿出来进行排列展示即可。
def getdata():
udp_get = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
udp_get.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
# 我们有时则需要一种超时机制使其在一定时间后返回而不管是否有数据到来,这里我们就会用到setsockopt()函数
udp_get.bind(('192.168.0.112', 8888))
# 接收数据
recv_data = udp_get.recvfrom(1024) # 接收数据最大字节数 recv_data为一个元组(数据,发送方ip,端口)
# recv_msg = recv_data[0] #数据
# recv_addr = recv_data[1] #发送方的地址
# print(recv_data,recv_msg.decode('gbk'),recv_addr) #decode解码windows系统默认编码方式是gbk
print(recv_data[0].decode('gbk'))
data = recv_data[0].decode('gbk')
udp_get.close()
return data
这里的udp.bind绑定的是自己电脑的地址和端口,硬件端在发送数据的时候需要将数据发送到这个地址和端口,就像是蜜蜂在固定的蜂窝里面存蜂蜜一样,这个过程是点对点进行拿取数据的
当然,我们拿取到的数据如果直接进行存储,到我们要用的时候是看不懂的,所以需要先进行解码后再存储。