入坑俩月,收获就这么点,今天写写吧就当是笔记了。

nbiot连接不上云平台 nb连接阿里云_#include

大家买到开发板后,一定要反复仔细读官方手册。

第一步:BC28硬件板准备

准备一条 USB 转 RS232 的线接到板子上,注意要将板子上的 232_VCC 的跳线帽要跳接 上。这样是为了让 RS232 能够正常工作。注意一定要接,不然 RS232 是不工作的!

NB 卡可以在电信运营商 进行购买或者其他渠道获取。但是一定要注意所在地区是否已经有 NB 网络的覆盖。否则即 便有卡,也没法进行实际调试使用。移动的 NB 用普通的手机卡物联网都是可以的。电信的 必须是专用的。

打开提供的工具软件 QNavigator_NB-IoT_V1.0 来进行测试。下图就是我们已经插入 SIM 卡并且能够正常工作的。

nbiot连接不上云平台 nb连接阿里云_NB-IOT_02


打开QN软件后,设置端口(com3)、Connect to module。这里会出很多问题,如果顺利的话,你的模块信息还有卡状态都会出现,你也可以单独点击下面的Module information和Registration information。当然左边的信息都是可以通过AT指令查询到的,自己到AT指令手册上去找吧

第二步:电信定向 IP 发数据 UDP

对于定向发 IP,就是用户可以任意发数据到公网服务器端,目前电信对于 IP 还是存在一 定的限制。所以这里的定向 IP 如果用户有自己的卡并绑定了对应的公网服务器即可使用。 对于移动联通目前并没有相关的限制,可以任意发到公网 IP。电信对 IP 的限制不光是 UDP 也会对 TCP 端发送进行限制。

我们要连接服务器,需要首先设置 APN。那么这里的 APN 就是需要连接 到华为的地址上来。所以首先第一步先去激活 PDP,让模块具备发数据的基础

nbiot连接不上云平台 nb连接阿里云_BC28_03


通过调节成功之后呢,图片上会出现模块注册到服务器所分配的 IP 地址,这个就是和调试 2G 模块是一个道理。所以熟悉 2G 模块, 再来调试 NB-IOT 其实并没那么复杂。

nbiot连接不上云平台 nb连接阿里云_IP_04


在这里设置阿里云的IP地址和 端口号。 端口号这里需要大家在服务器上打开一个UDP端口,并设置开放状态,具体大家也是去看阿里云的手册=。=这里我已经在阿里云上部署了一个程序,在文章的最后分享给大家,当然这类转发程序网上有很多,这个并不是很好。当然 UDP 是无连接模式。如果你服务器 不存在或者有问题,他也会显示连接 OK 的,既然无需连接那么建立一个UDP的通话很简单: 1. Create a socket 2.Send a message 反正我不管他连没连上,我就往这个IP地址发消息就是了,剩下的我就不管了,类似于写信。

nbiot连接不上云平台 nb连接阿里云_#include_05


大家注意这里发送的都是十六进制的数据,并且我在测试的时候全部使用指令来发送,左边的Send不知为何不管用,还有一点我的AT+NSOST=1, 第一个<> 里不一定非得是1 0,1,2都可以的。

第三步:数据在阿里云上显示

在阿里云上部署如下程序。

#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 successful\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 success\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 success:%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 successful\n”);
 }
 }
 close(sock_fd);
 return 0;
 }

运行后是这样:

nbiot连接不上云平台 nb连接阿里云_nbiot连接不上云平台_06


收到数据是这样:

nbiot连接不上云平台 nb连接阿里云_nbiot连接不上云平台_07