网上的一些文章写得简直是天花乱坠,一会说NB只能连电信,一会说NB只能连联通或者移动。。。。笔者之前被很多人给忽悠了,导致项目进度拖延。
关于NB模块(BC28)的使用,之前写了一篇文章:https://yangyuanxin.blog.csdn.net/article/details/80724712
人总要有点钻研精神,不能说自己不是搞网络的,网络协议的东西就一直说不会,毕竟随着时代的发展,也要跟随一起进步,于是经过自己的研究就成功的把数据发送到自己搭建的后台管理系统了,操作如下:
后台的ip和端口号保密,所以本文你所看到的都会打上马赛克,谢谢谅解!
1、先查询BC28的信号强度
AT+CSQ\r\n
确定没问题后,进行第二步。
2、创建一个TCP Socket
AT+NSOCR=STREAM,6,56000,1
3、连接自己服务器和端口号
AT+NSOCO=1,xxx.xxx.xxx.xxx,xxxx
在我不知道数据如何发的时候,我使用Postman这个软件,填下我的from-data数据,可以成功推送到我的后台:
使用Wireshark软件抓HTTP POST数据包:
将抓取到的数据包保存成一个txt文件,下面这个文件里的数据就是成功发送到后台的原始数据。怎么抓?
1、输入过滤条件
2、找到那条你要抓的数据
鼠标右键点击,出现追踪流,选HTTP流
就可以看到啦 :
如法炮制,找到我的数据
接下来,编写一个字符串转16进制的程序。有人到这里会说,网上不是有很多转化工具吗?这里答复:不行!通过Wireshark抓到的数据包中,每一行都带有\r\n(回车换行),如果不把这些格式加进去,是发送不成功的。
str_to_hex.c
#include
#include
#include
#include
#include
int Str2Hex(char *str,char *hex);
int main(void)
{
char from_data[2048] = {0};
char buffer[2048] = {0};
int fd_f = open("Http_from_data.txt",O_RDWR);
read(fd_f,from_data,785);
close(fd_f);
printf("%s",from_data);
int fd = open("1.txt",O_RDWR|O_CREAT);
Str2Hex(from_data,buffer);
write(fd,buffer,strlen(buffer));
close(fd);
return 0 ;
}
int Str2Hex(char *str,char *hex)
{
int high = 0;
int low = 0;
int temp = 0;
if (NULL==str || NULL==hex){
return -1;
}
if (0==strlen(str)){
return -2;
}
while(*str)
{
temp = (int)(*str);
high = temp>>4;
low = temp & 15;
itoa(high,hex,16);
hex++;
itoa(low,hex,16);
hex++;
str++;
}
*hex = '\0';
return 0;
}
转换完的格式是这样的:
通过属性我们可以查到未转换成十六进制的原始数据长度为:
而转换后的16进制的数据是:
由于BC28发送的是16进制的数据,而后台接收的是原始数据,所以我们这里的长度一定要填成原始数据的长度,这点切记!不然是发不成功的,笔者之前就是因为这个问题折腾了很长时间,又被很多人给忽悠了。
接下来通过NB的发送指令,把数据发到后台:
通过串口发送工具:
最后可以看到,后台回了一个OK给我,证明数据已经发送成功了!
最后要注意的是,NB发送完一条数据以后,需要按以下步骤执行:
//创建Socket
AT+NSOCR=STREAM,6,56000,1
//连接服务器
AT+NSOCO=1,120.78.136.134,9001
//发送数据
AT+NSOSD=1,xxx,xxxxxxxxxxxxxxxxx