基于Stm32的4G模块实现内网透传通信(代码后附)

2023-05-16

基于Stm32的4G模块实现内网透传通信

一、内网透传即内网映射,内网IP端口映射外网连接访问过程的实现。内网透传通信实现过程又有以下几种区别:
1)路由器映射。适合自己本地路由有公网IP网络环境,用路由当这个内网穿透介质,通过路由映射,实现外网对内网的访问。路由映射在登录路由后台管理功能可见,有的叫虚拟服务器,有的叫转发,有的叫端口映射,添加对应规则然后外网用路由IP访问。
2)自建转发。在自己公网IP(云)服务器上,部署内网穿透使用。
3)内网映射。可以上网,即可以通过内网映射方式,将本地内网IP端口映射到自己域名(或自动生成的二级域名上),再互联网上通过域名进行连接访问。
在使用移远EC600N-CN模块时
4G模块在项目里只需把它当成发送接收数据的中转,所以使用透传模式。透传模式是相对应的串口接收的数据会直接发送到网络端,从网络接收到的数据会从串口直接输出。
透传模式下,把模块当成一个串口设备,因此只需要连接以下四个引脚:
M_R:主串口接收(电平标准3.3V);
M_T:主串口发送(电平标准3.3V);
VIN:电源输入(5V-18V,功率要大于等于10W才能带动,因此最好12V)
GND:地
在这里插入图片描述
在这里插入图片描述
二、端口映射:
4G模块是和服务器实现数据交互的,因此只用自己电脑调试时需要将服务器相应端口映射到自己电脑上,用自己电脑实现和4G模块交互。
端口映射是将外网主机的IP 地址的一个端口映射到内网中一台机器,提供相应的服务。当用户访问该IP 的这个端口时,服务器自动将请求映射到对应局域网内部的机器上。但内网不能被外网直接的访问的,需要通过内网穿透,让内网“假装”成外网。
花生壳软件可以实现内网穿透。
因此,调试需要把网络调试助手的IP和端口号,通过花生壳工具,关联到外网服务器上,实际数据转发的时候,发送到网络调试助手的数据实际是发送到花生壳这边服务器,然后在网络调试助手上显示。
1、配置网络调试助手
电脑有0~65535个端口,动态端口的范围是从1024到65535。之所以称为动态端口,是因为它一般不固定分配某种服务,而是动态分配。动态分配是指当一个系统进程或应用程序进程需要网络通信时,它向主机申请一个端口,主机从可用的端口号中分配一个供它使用。当这个进程关闭时,同时也就释放了所占用的端口号。
首先查找电脑未被占用的TCP端口。cmd里输入netstat -ano查看电脑被占用的端口(即最后一列数据),找出TCP协议未被占用的端口。
找到某个未被占用的端口后,可以使用neystat -aon|findstr“端口号”命令来确认某个端口是否未被占用。
如下图20000端口未被占用则不返回数据,30160端口被占用了,会返回占用该端口的任务。
找到空闲端口后,开始配置网络调试助手。网络调试助手的协议类型选择TCP Server,然后添加本地主机IP地址和刚才找到的空闲端口号,点击下方“打开”按钮,该端口就配置好了,就可以通过下面操作把服务器数据映射到该端口。
在这里插入图片描述
2、内网穿透
网络调试助手配置完成后,电脑就有了映射到服务器的端口,然后就可以通过花生壳把该端口映射到服务器端口。
打开花生壳新建内网穿透项目,选择TCP协议,软件会分配免费的服务器IP和端口,然后输入刚才在网络调试助手配置好的电脑IP地址和端口号,保存配置。
在这里插入图片描述
右下角可以显示连接状态。连接成功后,可以看到分配的服务器的IP和端口号(若花生壳显示映射连接失败,大概率是花生壳自己的问题,可以尝试重启软件或者等待一段时间,就会连接成功)。
刚上电模块就绪后返回RDY,每发一次指令,模块收到并查询/设置完成后,会返回OK,最后设置好服务器IP和端口后,就可以进行模块与服务器直接数据收发了。
如下图所示,模块给服务器发送“0x02 0x03 0x45”,服务器收到的数据会在网络调试助手显示;服务器给模块发送“0x10 0x20 0x47”,串口助手显示收到的数据。
完成模块通过串口连接到电脑与服务器的通讯。
在这里插入图片描述
根据上述在线调试结果可知,上电以后,模块上电就绪后会返回RDY,提示可以进行后续操作了。主要有四个重要操作:
1、AT+CGREG?
4G入网同时连接CS和PS,即核心网分割为CS和PS,CS域是电路承载域,传输语音;PS域是数据域,走得是IP,用于手机上网。因此打电话信号走CS,数据业务信号走PS。
第一步发送AT+CGREG?,查询PS业务的状态。返回的第二个数字为1,表示已注册归属地网络PS 域网络注册状态。
2、AT+QICSGP
配置TCP/IP 场景参数。移动卡发送AT+QICSGP=1,1,“CMNET”,“”,“”,1 ;联通卡发送AT+QICSGP=1,1,“UNINET”,“”,“”,1,完成场景配置。
3、AT+QIACT
发送AT+QIACT=1,激活PDP 场景。场景激活后,可以通过AT+QIACT?查询IP 地址。
4、AT+QIOPEN
连接服务器对应IP和端口。打开Socket 服务AT+QIOPEN=1,0,“TCP”,“服务器IP”,服务器端口,0,2 成功会回复CONNECT,完成模块与服务器的连接。可以开始传输数据了。
在STM32种的C语言实现代码如下:
模块初始化函数如下:

void net_start(void)
{
	if (0x80==(DEBUG_USART_flag&0x80))
	{
		DEBUG_USART_flag = DEBUG_USART_flag&0x7f		;
		if(strstr(TEST7_USART_buff,"RDY") != NULL)  //是否返回RDY
		{	 
			//启动状态
			net_flag = net_flag | 0x01	;
			TEST7_USART_buff[net_cont] = 0x00		;
			TEST7_USART_buff[net_cont-1] = 0x00		;
			time_Delay(0x1FFFFFF);
			Usart_SendString( TEST7_USART, "AT+CGREG?\r\n");		
			USART_SendData(DEBUG_USART,net_flag);
		while (USART_GetFlagStatus(DEBUG_USART, USART_FLAG_TXE) == RESET);
		}	

		if ((0x01==(net_flag&0x03))&&(strstr(TEST7_USART_buff,"OK") != NULL))
		{
			net_flag = net_flag | 0x02	;
			TEST7_USART_buff[net_cont] = 0x00		;
			TEST7_USART_buff[net_cont-1] = 0x00		;
			time_Delay(0x1FFFFFF);
			Usart_SendString( TEST7_USART, "AT+QICSGP=1,1,\"CMNET\",\"\",\"\",1\r\n");

		}
		
		if ((0x03==(net_flag&0x07))&&(strstr(TEST7_USART_buff,"OK") != NULL))
		{
			net_flag = net_flag | 0x04	;
			TEST7_USART_buff[net_cont] = 0x00		;
			TEST7_USART_buff[net_cont-1] = 0x00		;
			//delay_ms(200);
			Usart_SendString( TEST7_USART, "AT+QIACT=1\r\n");
		}
		
		if ((0x07==(net_flag&0x0F))&&(strstr(TEST7_USART_buff,"OK") != NULL))
		{
			net_flag = net_flag | 0x08	;
			TEST7_USART_buff[net_cont] = 0x00		;
			TEST7_USART_buff[net_cont-1] = 0x00		;
			time_Delay(0x2FFFFFF);
			Usart_SendString( TEST7_USART, "AT+QIOPEN=1,0,\"TCP\",\"103.46.128.44\",19147,0,2");
		}
		
		if ((0x0F==(net_flag&0x1F))&&(strstr(TEST7_USART_buff,"CONNECT") != NULL))
		{
			net_flag = net_flag | 0x10	;
			TEST7_USART_buff[net_cont] = 0x00		;
			TEST7_USART_buff[net_cont-1] = 0x00		;
			time_Delay(0xFFFFFF);
			USART_SendData(TEST7_USART, 0x55);
			while(USART_GetFlagStatus(TEST7_USART,USART_FLAG_TC) == RESET);
			USART_SendData(TEST7_USART, 0xaa);
			while(USART_GetFlagStatus(TEST7_USART,USART_FLAG_TC) == RESET);
			USART_SendData(TEST7_USART, 0xaa);
			while(USART_GetFlagStatus(TEST7_USART,USART_FLAG_TC) == RESET);
			USART_SendData(TEST7_USART, 0x55);
			while(USART_GetFlagStatus(TEST7_USART,USART_FLAG_TC) == RESET);
			USART_SendData(TEST7_USART, 0x0d);
			while(USART_GetFlagStatus(TEST7_USART,USART_FLAG_TC) == RESET);
			USART_SendData(TEST7_USART, 0x0a);
			while(USART_GetFlagStatus(TEST7_USART,USART_FLAG_TC) == RESET);
		}		
		TEST7_USART_buff[net_cont] = 0x00		;
		TEST7_USART_buff[net_cont-1] = 0x00		;

	}

}

模块串口中断函数如下:

extern uint8_t net_cont ;		 //
extern uint8_t net_flag ;		 //

void TEST7_USART_IRQHandler(void)
{
	uint8_t DEBUG_USART_rx_data=0;
	if(USART_GetITStatus(TEST7_USART,USART_IT_RXNE)!=RESET)
	{		
		DEBUG_USART_rx_data = USART_ReceiveData( TEST7_USART );
		USART_ClearFlag(TEST7_USART, USART_FLAG_RXNE);     //清除中断标志	
		
		TEST7_USART_buff[net_USART_usRxCount++]=DEBUG_USART_rx_data;
		
		if (net_USART_usRxCount>=2)
		{
			if (0x1F==(net_flag&0x1F))
			{
				if ((TEST7_USART_buff[net_USART_usRxCount-2]==0xaa)&&(TEST7_USART_buff[net_USART_usRxCount-1]==0x55))
				{
					DEBUG_USART_flag =  0x80		;
					
					TEST7_USART_buff[ARM_USART_usRxCount-1] = 0x00;
					TEST7_USART_buff[ARM_USART_usRxCount-2] = 0x00;
					net_USART_usRxCount = 0 ;
					net_cont = net_USART_usRxCount-1	;
				}
			}else {
					if (TEST7_USART_buff[net_USART_usRxCount-2]==0x0d)
					{
						DEBUG_USART_flag =  0x80		;
						net_cont = net_USART_usRxCount-1	;
						TEST7_USART_buff[ARM_USART_usRxCount-1] = 0x00;
						TEST7_USART_buff[ARM_USART_usRxCount-2] = 0x00;
						net_USART_usRxCount = 0 ;
					}
				
			}
		} 	
	}	
	
}

通过上面代码实现了向平台发送0x55aaaa55这组数据。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于Stm32的4G模块实现内网透传通信(代码后附) 的相关文章

随机推荐

  • wireshark tcp报文深度解析

    封包详细信息是用来查看协议中的每一个字段 各行信息分别对应TCP IP协议的不同层级 以下图为例 xff0c 分别表示 xff1a 传输层 网络层 数据链路层 物理层 xff0c 一共四层 如果有应用层数据会显示第五层 xff0c 即一共会
  • 北京/西安内推 | 中国移动研究院NLP组招收自然语言处理算法实习生

    合适的工作难找 xff1f 最新的招聘信息也不知道 xff1f AI 求职为大家精选人工智能领域最新鲜的招聘信息 xff0c 助你先人一步投递 xff0c 快人一步入职 xff01 中国移动研究院 中国移动研究院 AI 中心是中国移动研究院
  • tcp 三次握手和四次挥手报文分析

    1 xff0c tcp 三次握手 报文抓取如下 xff1a 三段报文分析 xff1a 第一次 xff1a 26 gt 96报文交互 Seq num 61 567391014 ACK NUM 61 0 flags 61 SYN 第二次 xff
  • bootp引导程序协议

    bootp又称为引导程序协议 我们来简单了解一下这个协议以及他的用法 1 xff0c BOOTP 请求和应答均被封装在 U D P 数据报中 xff1b 2 xff0c B O O T P 使用 U D P xff0c 且通常需与 T F
  • http请求学习

    GET xff1a 向Web服务器请求一个文件 POST xff1a 向Web服务器发送数据让Web服务器进行处理 PUT xff1a 向Web服务器发送数据并存储在Web服务器内部 HEAD xff1a 检查一个对象是否存在 DELETE
  • linux c语言全面学习json解析函数

    1 json结构的定义 typedef struct cJSON cJSON结构体 struct cJSON next prev 遍历数组或对象链的前向或后向链表指针 struct cJSON child 数组或对象的孩子节点 int ty
  • matlab的图片滤波处理

    椒盐噪声 高斯噪声 MATLAB自带函数 均值滤波 中值滤波 自编模版 读取图片并转换为灰度图片 I 61 imread 39 1 jpg 39 imshow I I1 61 rgb2gray I imshow I1 椒盐噪声 I2 61
  • Linux 动态库的编译和执行

    静态库生成及测试 编码myccso脚本 gcc c Wall I inc src myadd c o myadd o ar rcs libmyadd a myadd o rm o mv libmyadd a lib gcc Wall g I
  • matlab中函数的定义和使用

    在matlab的选择框中的的新建中选择新建函数 xff0c 一般是以 m的文本文件 xff0c 新建后我们可以在里面写入我们的实现函数 xff0c 现在我们给出两个实例看一下 xff0c 分别是简单的求和和Fibonacci sequenc
  • matlab简单绘图plot,subplot

    a1 二维绘图plot的实现 subplot n m x 建立一个m n的绘图区域 xff0c 然后分别在其x 61 1 xff0c 2 xff0c 3 xff0c 4 区域绘制图像 function 61 plot1 x 61 0 0 3
  • python 函数的定义和应用

    1 xff0c 函数定义和使用 xff1a def substract sub a sub b sub res 61 sub a sub b return sub res sub test 61 substract 10 20 print
  • Linux shell中的-d,-f,-e,-n的作用

    1 xff0c d gt dirtionnary 判断目录是否存在 例 xff1a d tmp 返回为真便是 tmp是文件夹目录 2 xff0c e gt exist 判断是否存在 例 xff1a e filename 返回为真表示file
  • 「第四范式」2023届-秋季校园招聘正式启动!

  • Linux下用nginx和naxsi搭建web防火墙

    Linux下用nginx和naxsi搭建web防火墙 Naxsi Naxsi是一个开源 xff0c 高性能 xff0c 地位会规则 xff0c nginx的web应用程序防火墙模块 xff0c 著名的web服务器和反向代理 xff0c 它的
  • 【语义分割】类别不平衡损失函数合集

    在语义分割领域 xff0c 我们会常常遇到类别不平衡的问题 比如要分割的目标 xff08 前景 xff09 可能只占图像的一小部分 xff0c 因此负样本的比重很大 xff0c 导致网络倾向于将所有样本判断为负样本 本文介绍了在数据不平衡时
  • 小张学linux内核:十四. elf文件的加载和进程切换寄存器的保存

    重点关注虚拟内存的切换 xff0c pgd xff0c mm struct start code xff1b 理清楚这三个概念 pgd不是在这里设置的遵循COW xff0c 是在写时缺页中断填充的 start code只是一个段开始的标记
  • linux软中断和系统调用深入研究

    arm软中断模式 arm7种模式 有中断模式 xff0c 但是并没有软中断模式 那么arm的软中断是什么呢 xff1f arm的软中断是arm从用户模式切换到特权模式 xff0c 也就是linux中从用户态切换到内核态的过程 swi命令触发
  • 进程proc文件介绍

    进程proc文件 proc pid 下是每个进程的proc信息 xff0c proc self比较特殊 xff0c 哪个进程打开 xff0c 对应链接到哪个进程 1 xff09 内存相关 status xff1a 进程使用虚拟内存和物理内存
  • Win10系统下安装CAA二次开发程序,VS界面上不出现CAA菜单栏或菜单栏为灰色的

    问题描述 xff1a Win10系统下安装了CATIA CAA V5R19和V4R24两个版本 xff0c 其中V5R19版本安装完成后VS2005中没有出现CAA菜单栏 xff0c V5R24安装完成后VS2008中出现部分集成菜单且为灰
  • 基于Stm32的4G模块实现内网透传通信(代码后附)

    基于Stm32的4G模块实现内网透传通信 一 内网透传即内网映射 xff0c 内网IP端口映射外网连接访问过程的实现 内网透传通信实现过程又有以下几种区别 xff1a 1 xff09 路由器映射 适合自己本地路由有公网IP网络环境 xff0