高级会员
- 积分
- 991
- 金钱
- 991
- 注册时间
- 2014-11-19
- 在线时间
- 357 小时
|
发表于 2018-2-5 10:47:49
|
显示全部楼层
独立调通IAP和GPRS通讯,再整合一起。你问的太广泛,技术实现是没问题的,我只用过网口和WiFi,但原理都一样,有服务器就在现成的通信协议下加上文件下载的协议就行了。如果没有服务器也没有软件开发同事,而且只是单纯的实现功能,那可以用花生壳内网穿透,随便用一台电脑做TFTP服务器(百度Tftpd32,安装使用),然后用tftp协议就可以远程下载程序文件,这样的好处是不需要重新定义协议和开发服务器,但是有一个问题,就是TFTP协议不提供校验功能,我的做法就是下载两次同样的数据块,对比数据是否一样来减少传输过程造成的数据错误,IAP方面用Bootloader+APP1+APP2的方式,更新失败后还可以运行旧程序再次更新。
给你贴点TFTP协议的程序参考
[mw_shl_code=c,true]//操作码Opcode
#define TFTP_RRQ 01 //读请求
#define TFTP_WRQ 02 //写请求
#define TFTP_DATA 03 //数据包
#define TFTP_ACK 04 //确认包
#define TFTP_ERROR 05 //错误代码
//模式
#define TFTP_NETASCII 0
#define TFTP_OCTET 1
//端口号
#define TFTP_PORT 69
//数据大小,0~512
#define TFTP_DATALEN 512
//数据+操作码+块号
#define TFTP_NOTEND_DATALEN TFTP_DATALEN+2+2
/* 读/写请求包报文格式:
*2 bytes string 1 byte string 1 byte
*-------------------------------------------------
*| Opcode | Filename | 0 | Mode | 0 |
*-------------------------------------------------
*参数说明:
*opcode:操作码
*mode:模式,netascii或octet
*filename:文件名
*buffer:填充缓存
*/
int tftp_makereq(unsigned short opcode,int mode,char *filename,char *buffer)
{
int pos = 0; //位置
int i = 0;
char str[32] = "";
if(mode==TFTP_NETASCII) //传输模式
strcpy(str,"netascii");
else strcpy(str,"octet");
buffer[pos] = opcode>>8; //操作码Opcode = 01(RRQ) or 02(WRQ)
pos++;
buffer[pos] = opcode&0xff;
pos++;
for(i=0;i<strlen(filename);i++) //文件名 &buffer[3] = Filename
{
buffer[pos] = filename;
pos++;
}
buffer[pos] = 0; //结束字节 0
pos++;
for(i=0;i<strlen(str);i++) //模式 Mode
{
buffer[pos] = str;
pos++;
}
buffer[pos] = 0; //结束字节 0
pos++;
return pos; // 返回请求包头长度
}
/* 数据包报文格式
* 2 bytes 2 bytes n bytes
*----------------------------------
*| Opcode | Block # | Data |
*----------------------------------
*参数说明:
*num:块编号
*data:数据
*datasize:数据大小
*buffer:填充缓存
*/
int tftp_makedata(int num,char *data,int datasize,char *buffer)
{
int pos = 0; //位置
buffer[pos] = TFTP_DATA>>8; //操作码Opcode = 03
pos++;
buffer[pos] = TFTP_DATA&0xff;
pos++;
buffer[pos] = num>>8; //Block # 块号
pos++;
buffer[pos] = num&0xff;
pos++;
memcpy(&buffer[pos],data,datasize); // Data 数据
pos = pos + datasize;
return pos;//返回请求包头长度
}
/* ACK 应答报文格式
*2 bytes 2 bytes
*---------------------
*| Opcode | Block # |
*---------------------
*参数说明:
*num:块编号
*buffer:填充缓存
*/
int tftp_makeack(unsigned short num,char *buffer)
{
int pos = 0;//位置
buffer[pos] = TFTP_ACK>>8; //操作码Opcode = 04
pos++;
buffer[pos] = TFTP_ACK&0xff;
pos++;
buffer[pos] = num>>8; //Block # 块号
pos++;
buffer[pos] = num&0xff;
pos++;
return pos;//返回请求包头长度
}[/mw_shl_code] |
|