编辑推荐: |
本文主要介绍如何实现利用NB-IoT技术实现基于UDP协议的数据传输,希望对您能有所帮助。
本文来自于CSDN,由火龙果软件Alice编辑推荐。 |
|
硬件平台: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安全组设置
图2udp调试
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;
} |
|