利用NB-IoT技术实现数据上传至阿里云

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/pengpengjy/article/details/78813619

本文主要实现利用NB-IoT技术实现基于UDP协议的数据传输。

硬件平台:BC95-B5 ,在淘宝上购买即可,可以直接购买模块,然后自己利用USB转串口接到PC上。也可以购买有MCU地板的,本人购买的是基于MSP430地板的开发板,不需要自己接USB转串口工具,当然价格会贵一些。

软件平台:由于本文只是实现简单的数据收发,不需要跑MCU程序,所以主要用的工具是 NB-IoT QNavigator 工具,读者可去网上自行下载。之前我使用串口直接发AT指令,比较麻烦,因为在正式使用nb模块发数据之前,需要一些指令进行配置。使用 NB-IoT QNavigator ,该软件内置了很多指令,比如创建套接字这些指令,都是自动配置好的,相当方便。

云平台阿里云。去阿里云官网购买一个最便宜的ECS,预装ubuntu14,当然也可以选择其他系统。使用云服务器的一个好处就是只要购买看ECS,以后可以随便更换系统,几分钟就可以搞定。主要在购买的时候,选择专有网络,不要选择经典网络,这是方便后面安全组的设置。

NB专用卡可以通过电信运营商购买,移动也有。

 在上面的条件都满足下来后,可以进行下面的操作:

SP1:在阿里云上运行一个UDP服务器程序(参见博客后面),主要实现接受数据并将数据返回的功能,需要设置服务端的UDP端口号,我这里设置为3001,然后使用gcc指令编译程序。在运行程序之前,需要先在阿里云的ECS的安全组中将3001端口放行(参见图1),如何添加安全组规则可以参考阿里云的安全组相关文档。设置好安全组之后,运行UDP服务器程序。这里可以先使用tcp/udp socket调试工具,建立一个UDP客户端(参见图2),选择ECS的IP地址和你所设置的端口号,进行数据测试,如果通信成功,说明服务器运行正常,可进行下一步操作。


图1  安全组设置


图2  udp调试

SP2:将开发板通过USB线插入PC,打开 NB-IoT QNavigator ,点击Connect to module.就会自动连接。这一步会出现很多问题,这些问题多数与你的模块所在地有没有信号覆盖有关,如果你所在地没有基站,你的模块就无法附着,也就无法通信。初始化完成之后,可以看到模块的相关信息和卡的相关信息。如图3。如果一直无法注册到网络,试一试换一个位置,或者将开发板举高一点,因为这一步需要有NB信覆盖。


SP3:点击 NB-IoT QNavigator左侧的UDP,将阿里云服务器的IP地址和dup服务器的端口号填入,点击连接。如图4.


连接成功后,发送数据123456789,在接收端会收到313233343536373839.数据通过NB模块将发送到阿里云服务器,然后服务器将数据发回来。

图5为实物图


至此,利用NBIoT技术完成了数据传输。

后续可以利用MCU底板设计采集数据的程序,设计云服务的数据库,提供移动开发分API接口,以及数据展现等功能。以后采用基于UDP协议的CoAP协议进行数据传输。

问题1:以后使用电信的NB卡,都需要走电信的统一平台,也就是数据不能之间发送到自己的服务器。

问题2:NB的信号目前不稳定,对NB来说,如果20秒之内没有连接成功,就进入睡眠状态,后续就无法连接。据说可以更改这个时间,具体需要去查阅资料

                                                               《完》

附:UDP服务端程序

 #include<stdio.h>
 #include<sys/types.h>
 #include<sys/socket.h>
 #include<netinet/in.h>
 #include<unistd.h>
 #include<errno.h>
 #include<string.h>
 #include<stdlib.h>

 #define SERV_PORT 3001
 
 int main()
 {
 int sock_fd; 
 int recv_num;
 int send_num;
 int client_len;
 char recv_buf[20];
 struct sockaddr_in addr_serv;
 struct sockaddr_in addr_client;
 sock_fd = socket(AF_INET,SOCK_DGRAM,0);
 if(sock_fd < 0){
 perror("socket");
 exit(1);
 } else{

printf("sock sucessful\n");
 } 
 memset(&addr_serv,0,sizeof(struct sockaddr_in));
 addr_serv.sin_family = AF_INET;
 addr_serv.sin_port = htons(SERV_PORT);
 addr_serv.sin_addr.s_addr = htonl(INADDR_ANY);
 client_len = sizeof(struct sockaddr_in);
 
 if(bind(sock_fd,(struct sockaddr *)&addr_serv,sizeof(struct sockaddr_in))<0 ){
 perror("bind");
 exit(1);
} else{
 
 printf("bind sucess\n");
 }
 while(1){
 printf("begin recv:\n");
 recv_num = recvfrom(sock_fd,recv_buf,sizeof(recv_buf),0,(struct sockaddr *)&addr_client,&client_len);
 if(recv_num < 0){
 printf("bad\n");
 perror("again recvfrom");
 exit(1);
 } else{
 recv_buf[recv_num]='\0';
 printf("recv sucess:%s\n",recv_buf);
 }
 printf("begin send:\n");
 send_num = sendto(sock_fd,recv_buf,recv_num,0,(struct sockaddr *)&addr_client,client_len);
 if(send_num < 0){
 perror("sendto");
 exit(1);
 } else{
 printf("send sucessful\n");
 }
 }
 close(sock_fd);
return 0;
 }


  

阅读更多

没有更多推荐了,返回首页