读过的书,看过的风景,都是你的格局。
这是我的第十二篇原创文章
这篇我们讲讲乐联云的基本使用方法和写一些简单的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-
领取专属 10元无门槛券
私享最新 技术干货