网络编程-乐联云的使用

读过的书,看过的风景,都是你的格局。

这是我的第十二篇原创文章

这篇我们讲讲乐联云的基本使用方法和写一些简单的socket编程,实现一下数据往云端服务器传输的过程。

这篇文章主要是个人总结了一下当初毕设中使用将传感器数据通过wifi上传云服务器的的一部分内容。其实过程没有你想的那么难,当然想做好也没那么简单。来吧,那么开始呗。

1

乐联云的基本信息

乐联网是啥?就是一个简单,免费的硬件云平台。因为我毕设涉及到服务器,腾讯和ali的服务器有点贵,就用这免费的。当然这个功能没腾讯和ali的服务器牛逼,但是学习使用还是可以的。下面是乐联网的网址:

https://www.lewei50.com/

2

乐联云的基本信息配置

进入网站后先注册一个账号。这里就不做细说明,注册一个信息也就1min的时间,快的很。 注册完之后,我们要设置一些设备和传感器的基本信息,例如设备号,传感器上传的数据单位什么的。如下图配置:

设备配置

这里的设备标识在写socket编程会用到。配置完设备还有传感器信息需要配置,点击左侧的”传感器与控制器“栏目,添加一些传感器信息即可,如下:

传感器配置

传感器列表

这里还需要配置一个userkey,在用户信息中,如下图:

用户信息配置

这里差不多就配置这些东西,接下来讲解下乐联网的长连接方法的实现和代码的仿真。

3

发送用户网关数据到服务器

·端口 : 9960

我们给服务器发数据的数据格式是json格式,但是C中没有这个,这个我们在写代码的时候在说怎么解决这个问题。如果你想连接乐联网,就得给服务器发送用户信息。格式如下:

1 {

2

3"method":"update",

4

5"gatewayNo":"你的⽹关号",

6

7"userkey":"你的userkey"

8

9 }&^!

method固定为update;TCP服务器对于1min之内未发送数据的客户端主动断开,所以请保证定时间隔小1min;必须发送该数据才能让TCP服务器识别出用户身份,才能进行下一步的上传数据,每次重新连接都需要重新发送该数据,这里设置的网关号是之前设置的设备标识,我设置的是02。

·如果只想反向控制,仅需要定时发送网关数据,并及时响应服务器发来的各种请求即可。

·如果需要上传测量设备数据,需要在首次连接时发送网关数据,然后定时上传测量设备数据。

·发送和接收都以&^!为结束符来判断是否完整包。

4

通过TCP长链接上传数据

{

"method":"upload",

"data":[

{

"Name":"humi",

"Value":"data"

},

{

"Name":"press",

"Value":"data"

}

]

}&^!

method固定为upload,name为传感器的名称,Value的值为传感器的采集到的数据,值得注意的是各个传感器的中间有一个“,”隔开。

关于乐联网的使用,大概说到这里。其实他的使用不仅仅只有这些,这里使用的仅仅是往服务器发数据而已,其实我们还可以通过服务器反向控制我们的硬件,这里我就不多说了,有兴趣可以自己去官网了解下,下面给出一份乐联网TCP长链接参考文档。点击这里

5

代码测试

本该用板子搭载wifi联网发数据的,这里我没有硬件平台,我就在linux下写个网络socket仿真下整个过程。如果感兴趣的话,可以自己在stm32上搭载一个wifi(esp8266),因为这个比较常见,而且他们都把lwip给你们移植好了,简单点。

写代码之前说下这个,因为C没有json,要么一直一个Cjson,要么就模拟一个json数据包,为了方便测试,我选择模拟一个json数据包的方式。先贴上代码:

#include

#include

#include

#include

#include

#include

#include

#define PORT9960// 端口号

#define KEY"6e0a78ea8e"// userkey

#define GATEWAY"02"

#define MAXDATASIZE255// 数据缓冲区最大长度

int main(int argc, char *argv[])

{

int num =;

int sockfd =;

struct hostent *he = NULL;

char buffer[MAXDATASIZE] = {};

struct sockaddr_in server;

int i =;

// 参数判断, 需要输入IP地址

if(argc !=2) {

printf("Usage: %s \n", argv[]);

return;

}

//通过gethostbyname()得到服务端的主机信息

if((he = gethostbyname(argv[1])) == NULL) {

printf("gethostbyname() error\n");

return;

}

//使用socket()创建套接字

if((sockfd= socket(AF_INET, SOCK_STREAM,))==-1)

{

printf("socket() error\n");

return;

}

//初始化server地址信息

bzero(&server, sizeof(server));

server.sin_family = AF_INET;

server.sin_port = htons(PORT);

server.sin_addr = *((struct in_addr *)he->h_addr);

//使用connect()建立一个与TCP服务器的连接

if(connect(sockfd,

(struct sockaddr *)&server,

sizeof(server))==-1) {

printf("connect() error\n");

return;

}

while(1) {

i++;

if(i ==70) {

i =;

}

//clear buffer

memset(buffer,, MAXDATASIZE);

//组成buffer信息,发送给服务器

sprintf(buffer,"{\"method\":\"update\","

"\"gatewayNo\":\"%s\","

"\"userkey\":\"%s\"}&^!",GATEWAY,KEY);

send(sockfd, buffer, strlen(buffer),);

// 接受服务器返回的数据

recv(sockfd, buffer, strlen(buffer),);

printf("1.received data is %s\n", buffer);

// clear buffer

memset(buffer,, MAXDATASIZE);

// 组成传感器信息,发送给服务器

sprintf(buffer,"{\"method\":\"upload\","

"\"data\":["

"{\"Name\":\"temp\","

"\"Value\":\"%d\"},"

"{\"Name\":\"humi\","

"\"Value\":\"%d\"}"

"]}&^!", i,11);

send(sockfd, buffer, strlen(buffer),);

recv(sockfd, buffer, strlen(buffer),);

printf("2. %s \n", buffer);

//原则上要延时10s 因为服务器是10s更新一次

sleep(5);

}

return;

}

代码的实现也是比较简单的,就是一个单纯的给服务器发数据的过程,应该比较好理解。但是有一点要提示下,应为乐联网如果发的数据有问题(不符合格式规定),他会主动断开TCP连接。下面是代码测试的实验现象。

我在linux下测试代码,测试得保证虚拟机可以上网,用gcc编译之后,运行的时候需要添加一个参数,就是服务器的IP地址,类似这样:

gcc -o xxxx

./a.out 101.37.32.173

demo测试

这里我打印的数据是,我给服务器发数据后,服务器给我返回的数据。

然后我们看服务器端的数据变化,其实服务器提供了图形界面,还有手机APP,这里我们看看图形界面变化数据,代码中的temp是0~70的变化,而humi是一个定值。看图:

乐联云显示数据的走势图

好晚了,睡觉去了,好梦。

-END-

  • 发表于:
  • 原文链接:https://kuaibao.qq.com/s/20180826G0008Q00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券