本帖最后由 edmund 于 2017-6-24 10:50 编辑
通过本节的学习,您将了解到如何使用JavaScript代码来实现HTTP的客户端例子。JSDuino开发板上拥有3种可以上网的硬件模块:以太网,WIFI和GPRS。http模块提供了一个叫use函数可以选择使用哪种硬件作为http的底层通讯,例如:http.use("wifi"),这里我们指定wifi作为http的底层通信,默认http使用以太网。 http的通信会使用到非常大的内存空间。JSDuino提供了一种JS模块方便用户申请缓存空间,例如: //获取buffer缓存模块 var buf = require("buffer"); //申请1000个字节的缓存 var data = buf.alloc(1000); 其实Javascript语言在语法上是原生支持Buffer这样的变量类型的,但是为什么这里还是要自己实现一套buffer这样的js模块呢。原因是因为单片机内存资源非常有限,js原生支持的buffer在使用过程中会引导用户不断的申请内存空间,导致资源会被很快的消耗完。虽然JS引擎自带了内存回收机制来保证内存不会产生垃圾资源,但是频繁的启动内存回收会导致系统运行效率低下,甚至某些时刻因为内存不足导致部分代码无法正常工作。 这里可以简单的向大家介绍一下什么是内存垃圾以及内存回收是如何工作的。首先我们看一个例子: var data = buf.alloc(1000); data = 1; 上面的代码首先分配了一个1000字节的缓存,并赋值给data。但是当运行到第二行的时候,这个data变量却变成了一个整型数字1。这个时候,我们可以认为单片机的内存里面有1000个字节变成了垃圾内存,因为我们再也无法访问到这个缓存占用的内存空间了。那么内存垃圾是如何被回收呢?这里启动回收的触发条件是当内存空间不足的时候,无法再继续分配内存空间时,JS引擎则开始清理内存里面的垃圾,并释放空间。
http模块封装了如下几个API可供使用: use(name) http选择底层通信类型 参数 | | | 字符串型,只识别eth、wifi、gprs这三个字符串,分别代表以太网、WIFI和GPRS通信。如果不使用这个函数,http默认使用以太网。 |
post(url, port, send_data, recv_data) Post方式发送请求
get(url, port, recv_data) Get方式发送请求
[mw_shl_code=javascript,true]//获取http模块
var http = require("http");
//获取按键模块
var key = require("key");
//获取buffer缓存模块
var buf = require("buffer");
//申请1000个字节的缓存
var data = buf.alloc(1000);
//按键回调函数
function key_cb(name){
print(name);
if(name == "key0") //按下key0,连接到server(可以下载tcpip调试助手)
{
//http的get协议获取数据,这里可以根据情况更改url地址和端口
print(http.get("http://192.168.0.103/index.html", 8080, data));
//打印获取到的数据内容
print(data.toString());
}
}
//注册按键回调函数
key.on(key_cb);
function loop(){
while(true){
}
}
loop();
[/mw_shl_code]
实验结果 按下key0发送get请求,服务器返回index.html文件内容。
Javascript WIFI客户端代码
[mw_shl_code=applescript,true]//获取http模块
var http = require("http");
//获取按键模块
var key = require("key");
//获取buffer缓存模块
var buf = require("buffer");
//获取wifi模块
var wifi = require("wifi");
//申请1000个字节的缓存
var data = buf.alloc(1000);
//wifi连接到无线路由器,参数为ssid、密码
print(wifi.init("TP-LINK_B957FD", "87654321"));
//http模块使用wifi通信
http.use("wifi");
//按键回调函数
function key_cb(name){
print(name);
if(name == "key0") //按下key0,连接到server(可以下载tcpip调试助手)
{
//http的get协议获取数据,这里可以根据情况更改url地址和端口
print(http.get("http://www.sohu.com/index.html", 80, data));
//打印获取到的数据内容
print(data.toString());
}
}
//注册按键回调函数
key.on(key_cb);
function loop(){
while(true){
}
}
//无限循环
loop();
[/mw_shl_code]
实验结果 程序开始运行时,首先连接wifi到路由器,并且打印连接是否成功的返回值。当返回值为true时表示连接成功,然后按下key0发送get请求,服务器返回index.html文件内容。
|