OpenEdv-开源电子网

 找回密码
 立即注册

扫一扫,访问微社区

正点原子新作:阿波罗STM32F767&F429&探索者STM32F4开发板&赶快来下载资料哦。

查看: 680|回复: 4

【JSDuino】HTTP客户端

[复制链接]

  离线 

45

主题

115

帖子

1

精华

版主

Rank: 7Rank: 7Rank: 7

积分
612
金钱
612
注册时间
2013-9-23
在线时间
80 小时
发表于 2017-6-24 10:49:40 | 显示全部楼层 |阅读模式
正点原子公众号
本帖最后由 edmund 于 2017-6-24 10:50 编辑

     通过本节的学习,您将了解到如何使用JavaScript代码来实现HTTP的客户端例子。JSDuino开发板上拥有3种可以上网的硬件模块:以太网,WIFIGPRShttp模块提供了一个叫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选择底层通信类型
参数
描述
name
字符串型,只识别ethwifigprs这三个字符串,分别代表以太网、WIFIGPRS通信。如果不使用这个函数,http默认使用以太网。

post(url, port, send_data, recv_data)
Post方式发送请求
参数
描述
url
字符串类型,请求的目标链接地址
port
整型类型,请求的目标端口
send_data
buffer类型,发送请求时附带的数据
recv_data
buffer类型,获取的返回数据

get(url, port, recv_data)
Get方式发送请求
参数
描述
url
字符串类型,请求的目标链接地址
port
整型类型,请求的目标端口
data
buffer类型,获取的返回数据

[JavaScript] 纯文本查看 复制代码
//获取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();

实验结果
按下key0发送get请求,服务器返回index.html文件内容。

Javascript  WIFI客户端代码

[AppleScript] 纯文本查看 复制代码
//获取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();

实验结果
程序开始运行时,首先连接wifi到路由器,并且打印连接是否成功的返回值。当返回值为true时表示连接成功,然后按下key0发送get请求,服务器返回index.html文件内容。


回复

使用道具 举报

  在线 

482

主题

8万

帖子

30

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
117111
金钱
117111
注册时间
2010-12-1
在线时间
898 小时
发表于 2017-6-26 00:33:27 | 显示全部楼层
回复 支持 反对

使用道具 举报

  离线 

11

主题

515

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2643
金钱
2643
注册时间
2015-1-7
在线时间
678 小时
发表于 2017-6-28 09:12:36 | 显示全部楼层
感谢分享
回复 支持 反对

使用道具 举报

  离线 

0

主题

1

帖子

0

精华

新手上路

Rank: 1

积分
12
金钱
12
注册时间
2017-9-7
在线时间
0 小时
发表于 2017-9-7 00:18:36 | 显示全部楼层
您好,请问支持es6吗?
回复 支持 反对

使用道具 举报

  离线 

45

主题

115

帖子

1

精华

版主

Rank: 7Rank: 7Rank: 7

积分
612
金钱
612
注册时间
2013-9-23
在线时间
80 小时
 楼主| 发表于 2017-9-7 16:24:21 | 显示全部楼层
水哥1992 发表于 2017-9-7 00:18
您好,请问支持es6吗?

不是支持js所有的语法标准
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则




QQ|联系我们|手机版|官方淘宝店|新浪微博|微信公众平台|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2017-11-19 16:28

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表
/* */