物流追踪 - -GPS和GPRS应用
源码1:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<termios.h>
#include<signal.h>
#include<fcntl.h>
#include<semaphore.h>
#include<sys/sem.h>
#include<pthread.h>
#include<locale.h>
#define SIZE 500
pthread_t pth1,pth2;
int fd_gprs = 0;
int fd_gps = 0;
int fd_read = 0;
char * gga_start;
char * gga_end;
char * rmc_start;
char * rmc_end;
char * buf;
char * GGA;
char * RMC;
char msg_gps[100] = {'\0'};
//pthread_mutex_t mp=PTHREAD_MUTEX_INITIALIZER;
//signal function
void handler(int sig);
//pthread 1 (send message)
void * pthread_send(void * arg);
//pthread 2 (recive message)
void * pthread_recive(void * arg);
//exchange parity
char * change(char a[]);
//change chinese to PDU
int utf_unicode(char * output,char * input,int x);
//change PDU to chinese
char * unicode_utf8(char ch[]);
char * get_gps_info(char * gga,char * rmc);
int main()
{
struct termios old_gprs;
struct termios new_gprs;
struct termios old_gps;
struct termios new_gps;
int flag_getattr_gprs = 0;
int flag_setattr_gprs = 0;
int flag_getattr_gps = 0;
int flag_setattr_gps = 0;
// pthread_mutex_init(&mp,NULL);
signal(SIGALRM,handler);
//open GPRS
fd_gprs = open("/dev/ttyUSB0",O_NONBLOCK|O_RDWR);
if(fd_gprs < 0)
{
perror("open GPRS error");
return 1;
}
//open GPS
fd_gps = open("/dev/ttyUSB1",O_RDONLY);
if(fd_gps < 0)
{
perror("open GPS error");
return 1;
}
//set attribute of serial GPRS
flag_getattr_gprs = tcgetattr(fd_gprs,&old_gprs);
if(flag_getattr_gprs != 0)
{
perror("get attribute of serial GPRS error");
return 1;
}
new_gprs = old_gprs;
cfsetispeed(&new_gprs,B9600);
cfsetospeed(&new_gprs,B9600);
new_gprs.c_cflag&=~CSIZE;
new_gprs.c_cflag|=CS8;
new_gprs.c_cflag&=~CSTOPB;
new_gprs.c_cflag&=~PARENB;
flag_setattr_gprs=tcsetattr(fd_gprs,TCSANOW,&new_gprs);
if(flag_setattr_gprs != 0)
{
perror("set attribute of serial GPRS error");
return 1;
}
//set attribute of serial GPS
flag_getattr_gps = tcgetattr(fd_gps,&old_gps);
if(flag_getattr_gps != 0)
{
perror("get attribute of serial GPS error");
return 1;
}
new_gps = old_gps;
cfsetispeed(&new_gps,B4800);
cfsetospeed(&new_gps,B4800);
new_gps.c_cflag&=~CSIZE;
new_gps.c_cflag|=CS8;
new_gps.c_cflag&=~CSTOPB;
new_gps.c_cflag&=~PARENB;
flag_setattr_gps=tcsetattr(fd_gps,TCSANOW,&new_gps);
if(flag_setattr_gps != 0)
{
perror("set attribute of serial GPRS error");
return 1;
}
//create pthread(recive)
pthread_create(&pth2,NULL,pthread_recive,NULL);
raise(SIGALRM);
//wait pthread
pthread_join(pth2,NULL);
//pthread_mutex_destroy(&mp);
//close file
close(fd_gprs);
close(fd_gps);
return 0;
}
//create pth1
void handler(int sig)
{
if(sig == SIGALRM)
{
pthread_create(&pth1,NULL,pthread_send,NULL);
pthread_join(pth1,NULL);
}
alarm(90);
}
//send message
void * pthread_send(void * arg)
{
// pthread_mutex_lock(&mp);
buf = (char *)malloc(SIZE * (sizeof(char)));
if(NULL == buf)
{
printf("apply buf_memory error\n");
return ;
}
GGA = (char *)malloc(100 * (sizeof(char)));
if(NULL == GGA)
{
printf("apply GGA_memory error\n");
return ;
}
RMC = (char *)malloc(100 * (sizeof(char)));
if(NULL == RMC)
{
printf("apply RMC_memory error\n");
return ;
}
char PDU[400] = {'\0'};
char core_pre[10] = "089168"; //中心号码前缀
char core_tle_num[20] = "13800907500";//"13800290500"; //中心号码
char usr_pre[12] = "11000D9168"; //用户前缀
char usr_tle_num[20] = "18629535392"; //用户号码
char form[5] = "0008"; //格式
char msg_len[10];//信息长度
char msg[70]; //信息内容
char *output = (char *)malloc(300);
char * gps_msg = (char *)malloc(300 * sizeof(char));
//读取GPS信息
while(1)
{
//read information from serial
memset(buf,'\0',SIZE);
tcflush(fd_gps,TCIOFLUSH);
fd_read = 0;
while(fd_read < SIZE)
{
fd_read += read(fd_gps,buf + fd_read,SIZE - fd_read);
}
gga_start = strstr(buf,"GPGGA");
if(NULL == gga_start)
{
continue;
}
gga_end = strchr(gga_start + 1,'*');
if(NULL == gga_end)
{
continue;
}
rmc_start = strstr(buf,"GPRMC");
if(NULL == rmc_start)
{
continue;
}
rmc_end = strchr(rmc_start + 1,'*');
if(NULL == rmc_end)
{
continue;
}
memset(GGA,'\0',100);
memset(RMC,'\0',100);
memcpy(GGA,gga_start,gga_end - gga_start);
memcpy(RMC,rmc_start,rmc_end - rmc_start);
gps_msg = get_gps_info(GGA,RMC);
if(gps_msg != NULL)
{
break;
}
}
strcat(PDU,core_pre);
// printf("请输入中心号码:\n");
// printf("%s\n",core_tle_num);
change(core_tle_num);
strcat(PDU,core_tle_num);
strcat(PDU,usr_pre);
// printf("请输入用户号码:\n");
//gets(usr_tle_num);
// printf("%s\n",usr_tle_num);
change(usr_tle_num);
strcat(PDU,usr_tle_num);
strcat(PDU,form);
//printf("请输入新信息内容:\n");
// printf("%s\n",gps_msg);
int len = 0;
// char *input =(char *)malloc(70);
//gets(input);
len = utf_unicode(output,gps_msg,300);
printf("%s\n",output);
// printf("%d\n",sizeof(gps_msg));
sprintf(msg_len,"%04X",len/2);
strcat(PDU,msg_len);
strcat(PDU,output);
char com1[20] = "at+cmgf=0";
com1[strlen(com1)] = '\r';
com1[strlen(com1)] = '\0';
write(fd_gprs,com1,strlen(com1));
sleep(1);
char com2[20] = "at+cmgs=";
printf("%d\n",strlen(PDU));
sprintf(msg_len,"%d",(strlen(PDU)-18)/2);
strcat(com2,msg_len);
com2[strlen(com2)] = '\r';
com2[strlen(com2)] = '\0';
write(fd_gprs,com2,strlen(com2));
sleep(1);
printf("%s\n",PDU);
write(fd_gprs,PDU,strlen(PDU));
sleep(1);
char com3[4] = {'\0'};
com3[0] = 0x1a;
com3[1] = '\r';
write(fd_gprs,com3,strlen(com3));
sleep(1);
if(NULL != buf)
{
free(buf);
buf=NULL;
}
if(NULL != GGA)
{
free(GGA);
GGA=NULL;
}
if(NULL != RMC)
{
free(RMC);
RMC=NULL;
}
// pthread_mutex_unlock(&mp);
pthread_exit(&pth1);
}
//recive message
void * pthread_recive(void * arg)
{
//pthread_mutex_lock(&mp);
while(1)
{
char * propt;
char * point;
struct TIME
{
char year[3];
char mon[3];
char day[3];
char hour[3];
char min[3];
char sec[3];
char minsec[3];
}tm={0,0,0,0,0,0,0};
char position[4] = {'\0'};
int i;
char com[20] = "at+cmgr=";
char a[10];
char core_tle_num[20] = {'\0'}; //中心号码
char usr_tle_num[20] = {'\0'}; //用户号码
char time[15] = {'\0'};
char msg[70]; //信息内容
char * utf;
char ch[256] = {'\0'};
printf("Wait...\n");
//sleep(1);
memset(ch,'\0',256);
read(fd_gprs,ch,255);
printf("%s\n",ch);
sleep(1);
propt = strstr(ch,"+CMTI");
if(NULL == propt)
{
continue;
}
point = strchr(ch,',');
if(NULL == point)
{
continue;
}
memcpy(position,point+1,ch+strlen(ch)-point);
strcat(com,position);
com[strlen(com)] = '\r';
com[strlen(com)] = '\0';
write(fd_gprs,com,strlen(com));
sleep(1);
memset(ch,'\0',256);
read(fd_gprs,ch,sizeof(ch));
printf("%s\n",ch);
sleep(1);
propt = strstr(ch,"+CMGR");
if(NULL == propt)
{
continue;
}
point = strstr(propt,"0891");
if(NULL == point)
{
continue;
}
sscanf(point,"%6s%12s%8s%12s%4s%14s%2s%s",a,core_tle_num,a,usr_tle_num,a,time,a,msg);
// sscanf(ch+26,"%12s%4s%14s%2s%s",usr_tle_num,a,time,a,msg);
change(usr_tle_num);
printf("用户号码:\n");
for(i = 0;i < 11;i++)
{
printf("%c",usr_tle_num[i]);
}
printf("\n");
change(time);
sscanf(time,"%2s%2s%2s%2s%2s%2s%2s",tm.year,tm.mon,tm.day,tm.hour,tm.min,tm.sec,tm.minsec);
printf("时间:\n");
printf("%s年%s月%s日%s时%s分%s秒%s毫秒\n",tm.year,tm.mon,tm.day,tm.hour,tm.min,tm.sec,tm.minsec);
utf = unicode_utf8(msg);
printf("信息内容:\n");
printf("%s\n",utf);
sleep(2);
if(strcmp(usr_tle_num,"18629535392") == 0)
{
raise(SIGALRM);
sleep(1);
}
}
//pthread_mutex_unlock(&mp);
}
//exchange parity
char * change(char a[])
{
int len;
int temp;
int i = 0;
len = strlen(a);
if(len%2 == 0)
{
for(i = 0;i < len;i = i+2)
{
temp = a[i];
a[i] = a[i+1];
a[i+1] = temp;
}
}
else
{
a[len] = 'F';
for(i = 0;i <= len;i = i+2)
{
temp = a[i];
a[i] = a[i+1];
a[i+1] = temp;
}
}
return a;
}
//change chinese to PDU
int utf_unicode(char * output,char * input,int x)
{
int i;
int n;
wchar_t wt[300] = L"\0";
setlocale(LC_ALL,"zh_CN.UTF-8");
n = mbstowcs(wt,input,x);
for(i = 0;i < n;i++)
{
sprintf(output+4*i,"%04X",wt[i]);
}
return strlen(output);
}
//change PDU to chinese
char * unicode_utf8(char ch[])
{
int x=0;
int n;
int unicode_len=strlen(ch);
wchar_t wch[70]=L"\0";
char *utf=(char *)malloc(70);
setlocale(LC_ALL,"zh_CN.UTF-8");
for(x=0;x<unicode_len-1;x++)
{
sscanf(ch+4*x,"%04X",wch+x);
}
*(wch+x)='\0';
n=wcstombs(utf,wch,unicode_len);
*(utf+x)='\0';
return utf;
}
char * get_gps_info(char * gga,char * rmc)
{
struct GPS
{
int hour;
int minite;
int second;
float longitude; //经度
char tag_longitude;
float latitude; //纬度
char tag_latitude;
float high;
float speed;
int year;
int month;
int day;
char flag;
}gps={0,0,0,0,'\0',0,'\0',0,0,0,0,0,'\0'};
char tag[20] = {'\0'};
float a = 0;
sscanf(gga,"GPGGA,%2d%2d%2d%4s,%f,%c,%f,%c,%1s,%2s,%3s,%f,%1s,%f,M,,0000*4F",&gps.hour,&gps.minite,&gps.second,tag,&gps.longitude,&gps.tag_longitude,&gps.latitude,&gps.tag_latitude,tag,tag,tag,&gps.high,tag,&gps.speed);
//速度小于0的默认为0
if(gps.speed < 0)
{
gps.speed = 0;
}
sscanf(rmc,"GPRMC,%f,%c,%f,%1s,%f,%1s,%f,%f,%2d%2d%2d,,,A*70",&a,&gps.flag,&a,tag,&a,tag,&a,&a,&gps.day,&gps.month,&gps.year);
#if 1//时间转换
gps.year += 2000;
gps.hour += 8;
if(gps.hour > 24)
{
gps.hour -= 24;
gps.day++;
}
switch(gps.month)
{
case 1:;
case 3:;
case 5:;
case 7:;
case 8:;
case 10:if(gps.day>31)
{
gps.day-=31;
gps.month++;
}
break;
case 2:if(((gps.year%4==0)&&(gps.year%100!=0))||(gps.year%400==0))
{
if(gps.day>29)
{
gps.day-=29;
gps.month++;
}
}
else
{
if(gps.day>28)
{
gps.day-=28;
gps.month++;
}
}
break;
case 4:;
case 6:;
case 9:;
case 11:if(gps.day>30)
{
gps.day-=30;
gps.month++;
}
break;
case 12:if(gps.day>31)
{
gps.day-=31;
gps.month++;
gps.month-=12;
gps.year++;
}
break;
}
#endif
//判断数据是否有效
if(gps.flag == 'A')
{
// printf("数据有效!\n");
// printf("时间:%d:%d:%d\n经度:%.2f 半球:%c\n纬度:%.2f 半球:%c\n高度:%.2f\n速度:%.2f\n日期:%d年%d月%d日\n",gps.hour,gps.minite,gps.second,gps.longitude,gps.tag_longitude,gps.latitude,gps.tag_latitude,gps.high,gps.speed,gps.year,gps.month,gps.day);
sprintf(msg_gps,"%d:%d:%d %d-%d-%d 经度:%.2f 半球:%c 纬度:%.2f 半球:%c速度:%.2f",gps.hour,gps.minite,gps.second,gps.year,gps.month,gps.day,gps.longitude,gps.tag_longitude,gps.latitude,gps.tag_latitude,gps.speed);
return msg_gps;
}
if(gps.flag == 'V');
{
// printf("数据无效!\n");
//printf("时间:%d:%d:%d\n日期:%d年%d月%d日\n",gps.hour,gps.minite,gps.second,gps.year,gps.month,gps.day);
return NULL;
}
}
源码2:
#include<stdio.h>
#include<stdlib.h>
#include<fcntl.h>
#include<signal.h>
#include<pthread.h>
#include<termios.h>
#include<locale.h>
#include<string.h>
#include<sys/types.h>
void getgps(int a);//alarm函数
char * gpsprintf(char * rmc,char *gga);//gps读取
int utf_unicode(char *output,char* input,int x);//汉字转换内容
void zhuanhuan(char*a);//奇偶位交换
void * thread1(void * arg);
char * zuhe(char*pp);
void send(char * pdu);
pthread_mutex_t mp=PTHREAD_MUTEX_INITIALIZER;
int gprsid,gpsid;
int j=0;
int main()
{
pthread_mutex_init(&mp,NULL);
signal(SIGALRM,getgps);
//signal(SIGUSR1,getmsg);
pthread_t thd;
//打开gprs
gprsid=open("/dev/ttyUSB2",O_RDWR|O_NONBLOCK);
if(gprsid<0)
{
perror("open gprs error");
return 1;
}
//设置属性
struct termios tgprs;
tcgetattr(gprsid,&tgprs);
cfsetspeed(&tgprs,B9600);
tgprs.c_cflag &= ~CSIZE;
tgprs.c_cflag |= CS8;
tgprs.c_cflag &= ~CSTOPB;
tgprs.c_cflag &= ~PARENB;
tcsetattr(gprsid,TCSANOW,&tgprs);
//打开gps
gpsid=open("/dev/ttyUSB1",O_RDONLY);
if(gpsid<0)
{
perror("open gps error");
return 1;
}
//设置属性
struct termios tgps;
tcgetattr(gpsid,&tgps);
cfsetspeed(&tgps,B4800);
tgps.c_cflag &= ~CSIZE;
tgps.c_cflag |= CS8;
tgps.c_cflag &= ~CSTOPB;
tgps.c_cflag &= ~PARENB;
tcsetattr(gpsid,TCSANOW,&tgps);
write(gprsid,"at+cmgf=0\r",10);
pthread_create(&thd,NULL,thread1,NULL); //创建线程
raise(SIGALRM);
//alarm(60);//300秒后触发alarm信号
pthread_join(thd,NULL);//等待
pthread_mutex_destroy(&mp);
close(gprsid);//关闭
close(gpsid);
}
void getgps(int a)
{
pthread_mutex_lock(&mp);
char buf[300];
int len=0,k=0;
char *pcs,*pce,*pas,*pae;
char *wish;
char *pdu;
char *rmc;
char *gga;
while(1)
{
memset(buf,'\0',300);
setbuf(stdin,NULL);
len=0;
while(len<300)
{
len+=read(gpsid,buf+len,300-len);
}
pcs=strstr(buf,"$GPRMC");
if(pcs==NULL)
{
continue;
}
pce=strchr(pcs+1,'*');
if(pce==NULL)
{
continue;
}
pas=strstr(buf,"$GPGGA");
if(pas==NULL)
{
continue;
}
pae=strchr(pas+1,'*');
if(pae==NULL)
{
continue;
}
rmc=(char*)malloc(pce-buf);
gga=(char*)malloc(pae-buf);
memset(rmc,'\0',pce-buf);
memset(gga,'\0',pae-buf);
strncpy(rmc,pcs,pce-pcs);
strncpy(gga,pas,pae-pas);
if(rmc[18]=='A')
{
wish=gpsprintf(rmc,gga);
if(k!=0)strcat(wish,"刚才GPS信号中断,此短信为检测到信号后第一时间发送。");
}
if(rmc[18]=='V')
{
k=1;
continue;
}
//发送 内容是wish.
printf("wish=%s\n",wish);
pdu=zuhe(wish);
printf("%s\n",pdu);
//pdu出来了
send(pdu); //调用send函数
if(rmc!=NULL)
{
free(rmc);
rmc=NULL;
}
if(gga!=NULL)
{
free(gga);
gga=NULL;
}
if(wish!=NULL)
{
free(wish);
wish=NULL;
}
if(pdu!=NULL)
{
free(pdu);
pdu=NULL;
}
break;
}
alarm(300);
pthread_mutex_unlock(&mp);
}
char* gpsprintf(char * rmc,char *gga)
{
char * xx=(char*)malloc(300);
memset(xx,'\0',300);
char x,we,ns;
float jd,wd,l;
int sudu,gao,i;
char laji[30];
char day[10]="\0";
char jing[20]="\0";
char wei[20]="\0";
char gaoo[20]="\0";
char suduu[20]="\0";
char *p,*q;
sscanf(rmc+18,"%c,%f,%c,%f,%c,%f,%f,%6s",&x,&jd,&ns,&wd,&we,&l,&l,day);
sscanf(gga+18,"%f,%1s,%f,%1s,%1s,%f,%f,%d.%f,M,%d",&l,laji,&l,laji,laji,&l,&l,&gao,&l,&sudu);
if(sudu<0)sudu=0;
sprintf(jing,"%f",jd);//float 转字符串
sprintf(wei,"%f",wd);
sprintf(gaoo,"%d",gao);//int 转字符串
sprintf(suduu,"%d",sudu);
jing[strlen(jing)-2]='\0';
wei[strlen(wei)-2]='\0';
gaoo[strlen(gaoo)]='M';
strcat(suduu,"M/S");
strcpy(xx,"经度:");
strcat(xx,jing);
xx[strlen(xx)]=ns;
strcat(xx,"\n纬度:");
strcat(xx,wei);
xx[strlen(xx)]=we;
strcat(xx," \n高度:");
strcat(xx,gaoo);
strcat(xx," \n速度:");
strcat(xx,suduu);
strcat(xx,"\n一切正常请放心!");
return xx;
}
int utf_unicode(char *output,char* input,int x)//汉字转换函数
{
int i;
int n;
wchar_t wt[300]=L"\0";//定义宽字符型数组
setlocale(LC_ALL,"zh_CN.UTF-8");//本地字符编码
n=mbstowcs(wt,input,x);//将汉字转换成宽字符类型
for(i=0;i<n;i++)
sprintf(output+4*i,"%04X",wt[i]);//将宽字符型转换成十六进制
return strlen(output);
}
void zhuanhuan(char*a)//奇偶位交换
{
int ret=0;
int i=0;
char x;
ret=strlen(a);
if(ret%2!=0)
{
a[ret]='F';
}
ret=strlen(a);
for(i=0;i<ret;i=i+2)
{
x=a[i];
a[i]=a[i+1];
a[i+1]=x;
}
}
char* zuhe(char*pp)
{
char c[10]="\0";
char cc[30]="0891683108808905F011000D9168";
char s[15]="18191255873";
char n[300]="\0";
char *output=(char*)malloc(300);
memset(output,'\0',300);
char q[4]="\0";
int ret=0,x;
char *z=(char*)malloc(300);
memset(z,'\0',300);
zhuanhuan(s);
strcat(s,"0008");
strncpy(n,pp,290);
x=strlen(n);
ret=utf_unicode(output,n,x);
printf("%d\n",ret);
sprintf(q,"%04X",ret/2);
strcat(z,cc);
strcat(z,s);
strcat(z,q);
strcat(z,output);
free(output);
return z;
}
void * thread1(void * arg)
{
char du[30]="\0";
char dd[300]="\0";
int i=0,ret=0;
char cmid[5]="\0";
char dakai[20]="\0";
char * bf;
char * cmti;
char * cmtie;
char haoma[20]="\0";
while(1)
{
pthread_mutex_lock(&mp);
pthread_mutex_unlock(&mp);
memset(du,'\0',30);
setbuf(stdin,NULL);
read(gprsid,du,29);
printf("du=%s\n",du);
sleep(1);
cmti=strstr(du,"+CMTI");
if(cmti==NULL)
{
continue;
}
cmtie=strstr(cmti+1,"SM");
if(cmtie==NULL)
{
continue;
}
//读到+CMTI: "SM",x
ret=strlen(du);//把后面的数字,放进at+cmgr中
for(i=0;i<ret-14;i++)
{
cmid[i]=du[14+i];
}
strcpy(dakai,"at+cmgr=");
strcat(dakai,cmid);
printf("dakai=%s\n",dakai);
ret=strlen(dakai);
write(gprsid,dakai,ret);//打开新短信
sleep(1);
read(gprsid,dd,299);
sleep(1);
cmti=strstr(dd,"+CMGR");
if(cmti==NULL)
{
continue;
}
cmtie=strstr(cmti+1,"0891");
if(cmtie==NULL)
{
continue;
}
memcpy(haoma,cmtie+26,12);
haoma[12]='\0';
zhuanhuan(haoma);
haoma[11]='\0';
printf("haoma=%s\n",haoma);
if(strcmp(haoma,"18191255873")==0)
{
raise(SIGALRM);
sleep(3);
}
}
}
void send(char * pdu)
{
int len=0;
write(gprsid,"at+cmgf=0\r",10);
sleep(1);
len=(strlen(pdu)-18)/2;
char length[15]="at+cmgs=";
sprintf(length+8,"%d",len);
strcat(length,"\r");
write(gprsid,length,strlen(length));
sleep(1);
strcat(pdu,"\x1A\r");
write(gprsid,pdu,strlen(pdu));
sleep(1);
}
物流追踪 - -GPS和GPRS应用的更多相关文章
- 基于GPS\北斗、GIS、GPRS技术构建智能巡检系统
巡线工负责输油管网设施的日常巡查,可以及时发现管网设施是否完好.但巡检工作辛苦,加之管线在大部分情况下又处于良好状态,使得巡检人员麻痹大意,往往不能按规定程序进行巡检,造成巡检不到位,这样就不能从根本 ...
- linux下编程epoll实现将GPS定位信息上报到服务器
操作系统:CentOS 开发板:fl2440 开发模块:A7(GPS/GPRS),RT3070(无线网卡) ********************************************** ...
- 物流跟踪 调用快递鸟API
概要:关于调用快递鸟API,我有几句话想说,有几行代码想写 业务需求:就是做做商城,卖卖东西.然后需要做个物流跟踪的功能 需要获取的信息大概就是这个样子 现在看这个快递怎么这么慢 如何实现? 直接调用 ...
- 全渠道后端 : RFID在仓储物流中的运用
核心提示 沃尔玛的业务之所以能够迅速增长,并且成为现在非常著名的公司之一,是因为沃尔玛在节省成本以及在物流配送系统与供应链管理方面取得了巨大的成就. 最后为一个业务展望,从B端工厂提货 到C端交付的系 ...
- 从程序员到CTO的Java技术路线图(我爱分享)
在技术方面无论我们怎么学习,总感觉需要提升自已不知道自己处于什么水平了.但如果有清晰的指示图供参考还是非常不错的,这样我们清楚的知道我们大概处于那个阶段和水平. Java程序员 高级特性 反射.泛型. ...
- B2C电子商务基础系统架构解析(转载)
系统的开发与演化,前台严格follow消费者的购买流程,后台则盯牢订单流转,牢牢抓住这两条主线,才能高屋建瓴的看清B2C的逻辑链和数据流,更深刻的规划功能模块,从而更有效支撑实际业务的流转. 前台 前 ...
- 从程序员到CTO的Java技术路线图 作者:zz563143188
在技术方面无论我们怎么学习,总感觉需要提升自已不知道自己处于什么水平了.但如果有清晰的指示图供参考还是非常不错的,这样我们清楚的知道我们大概处于那个阶段和水平. Java程序员 高级特性 反射.泛型. ...
- Android和Linux应用综合对比分析
原文地址:http://www.cnblogs.com/beer/p/3325242.html 免责声明: 当时写完这篇调查报告,给同事看了后,他觉得蛮喜欢,然后想把这篇文章修改一下,然后往期刊上发表 ...
- UART Explained(转载)
做嵌入式开发,UART几乎是必不可少的,调试串口.GPS.GPRS.Bluetooth等模块很多都是用的UART接口.时下火热的IoT也不乏UART的身影,串口的BLE.WIFI.Zigbee.Lor ...
随机推荐
- VIM在文件夹中查找
在vim中提供2中方法来在其他文件或者文件夹中搜索字符串,第一种是vimgrep还有一种是grep. 如果只是在当前打开的文件中查找字符串的,使用 :? 后面加上想要搜索的字符串就可以. 这里要解决的 ...
- 1.语言概述-JavaScript权威指南笔记
上周三的时候交给老板目前的项目第一个迭代回顾会的总结.原本是以综述性的表述方式写的,交给他之后表示程序员不要长篇大论.总结要分为优点缺点期望等等块,每块列出条目,简明扼要的表达出来.这里也用这种风格. ...
- 如何得到Sessionid的值
当用户向一个网站请求第一个页面时,用户会话启动.当第一个页面被请求时,web服务器将asp.net_sessionID cookie添加进用户的浏览器.可以使用newsession属性探测新会话的启 ...
- CSS了一个浮动导航条
绝对浏览器窗口定位positio:FIXED: 下拉后出现返回顶部按钮 图片是我们美工给做的.55*55px,中间缝隙3px. css: html,body { height:100%}html,bo ...
- Linux 中 java 访问 windows共享目录
有两个方案: 1.将windows共享目录,挂载到linux系统下,通过使用本地目录访问windows共享目录 2.通过samba的java实现包,不过需要开个windows共享目录的账户 http ...
- 【转】使用Boost Graph library(二)
原文转自:http://shanzhizi.blog.51cto.com/5066308/942972 让我们从一个新的图的开始,定义一些属性,然后加入一些带属性的顶点和边.我们将给出所有的代码,这样 ...
- 用于COB工艺的PCB设计指导
绑定角度尽量在45°之内,多于这个角度,绑定时候,银线不好打入焊盘.而且打入焊盘的尾部可能短路到相邻的焊盘,绑定焊盘之间的间距一般在4MIL为极限,半场的工艺一般就这样了.而且焊盘离被绑定的IC引脚最 ...
- (C#)Windows Shell 外壳编程系列9 - QueryInfo 扩展提示
原文 (C#)Windows Shell 外壳编程系列9 - QueryInfo 扩展提示 (本系列文章由柠檬的(lc_mtt)原创,转载请注明出处,谢谢-) 接上一节:(C#)Windows She ...
- Mysql-udf-http 插件的安装与使用
1. 在Linux系统上安装Mysql-udf-http ulimit -SHn wget http://curl.haxx.se/download/curl-7.21.1.tar.gz .tar ...
- Home | WebScraping.com
Home | WebScraping.com We specialize in extracting data from websites, which is known as web scrapin ...