做了20年的老码农-历数做过的系统

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了做了20年的老码农-历数做过的系统相关的知识,希望对你有一定的参考价值。


我毕业于2002年,算来已经从事软件开发20年了,期间开发过一些有意思的系统,给网友们分享下。

1)2000~2002年,FLASH动画展示。在校期间,用VC开发了Flash动画展示软件。我将大学学习的采矿工程用Flash软件做成动画,然后在VC上引用Flash插件,将动画硬编写到小软件中。在小软件做个动画展示,这算是未入行时做的学习软件吧。

CString Type="swf";

HRSRC res=FindResource (NULL,Name,Type);

HGLOBAL gl=LoadResource (NULL,res);
LPVOID lp=LockResource(gl);//返回指向资源内存的地址的指针。

CString filename="Temp.swf";//保存的临时文件名

// CREATE_ALWAYS为不管文件存不存在都产生新文件。

fp= CreateFile(filename ,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,0,NULL);

DWORD a;

//sizeofResource 得到资源文件的大小

if (!WriteFile (fp,lp,SizeofResource (NULL,res),&a,NULL))

return false;

CloseHandle (fp);//关闭句柄

FreeResource (gl);//释放内存

void CEmbedModuleView::OnInitialUpdate()



ChtmlView::OnInitialUpdate();

Navigate2(_T(“http://www.microsoft.com”),NULL,NULL);

2)2002~2004年,先后用C#开发了短信竞猜游戏、手机110一键报警等软件。当时的短信应用开发的挺多的,那时的SP挣得盆满钵满。后来工信部对行业做了整顿,那么靠短信正确的SP们纷纷倒闭了。

amespace mmsxx

public class MMessage

string Subject = "";
int nSeconds = 0; // 设置送达的时间,当前相对时间,以秒为单位
ArrayList lFile = new ArrayList(); // 彩信文件列表
ArrayList lDest = new ArrayList(); // 发送号码集合

static long nSeq = 0;

public MMessage()

//
// TODO: 在此处添加构造函数逻辑
//


public void SetSubject(string szSubject)

Subject = szSubject;

public void SetDeliverTime(int nSec)

nSeconds = nSec;

//
public void AddTo(string Dest)

lDest.Add(Dest);


public void AddFile(string File)

lFile.Add(File);


public void ClearTo()

lDest.Clear();


// 得到二进制编码字节
public byte[] GetContent()


byte[] byMms = new byte[0];
// 消息头开始
//X-Mms-Message-Type
byMms = AppendOct(new byte[] 0x8C, 0x80 , byMms);
//X-Mms-Transaction-ID
byMms = AppendOct(new byte[] 0x98 , byMms);
byMms = AppendOct(nSeq.ToString(), byMms);
nSeq++; // 序列号加1

byMms = AppendOct(new byte[] 0x0 , byMms);

//X-Mms-MMS-Version
byMms = AppendOct(new byte[] 0x8D, 0x90 , byMms);
//Date

//From,设置为 Insert-address-token
byMms = AppendOct(new byte[] 0x89, 0x01, 0x81 , byMms);

//To
for (int i = 0; i < lDest.Count; i++)

byMms = AppendOct(new byte[] 0x97 , byMms);
byMms = AppendOct("+86" + (string)lDest[i] + "/TYPE=PLMN", byMms);
byMms = AppendOct(new byte[] 0x0 , byMms);

//Subject
if (Subject.Length > 0) // 使用Utf8编码

byMms = AppendOct(new byte[] 0x96 , byMms);
// Value-length Char-set Text -string
byte[] byLen = new byte[1];
byLen[0] = (byte)(Encoding.UTF8.GetByteCount(Subject) + 2);
byMms = AppendOct(byLen, byMms);
// Char-set 为utf-8
byMms = AppendOct(new byte[] 0xEA , byMms);
byMms = AppendOct(Encoding.UTF8.GetBytes(Subject), byMms);
byMms = AppendOct(new byte[] 0x0 , byMms);

// X-Mms-Delivery-Time,递送时间 = Relative-token Delta-seconds-value
// Relative-token = 0x81
// Delta-seconds-value =Long-integer
// Long-integer = Short-length Multi-octet-integer
if (nSeconds > 0)

byMms = AppendOct(new byte[] 0x87 , byMms);
byte[] bfTime = BitConverter.GetBytes(nSeconds); // 默认使用Big-endian,需用改为Little-endian
// bfTime改为Little-endian
Array.Reverse(bfTime);
byte[] bfTimeLen = new byte[3];
bfTimeLen[0] = (byte)(bfTime.Length + 2);
bfTimeLen[1] = 0x81; // 相对时间格式
bfTimeLen[2] = (byte)bfTime.Length;
byMms = AppendOct(bfTimeLen, byMms);
byMms = AppendOct(bfTime, byMms);


//Content-Type:application/vnd.wap.multipart.mixed
byMms = AppendOct(new byte[] 0x84, 0xA3 , byMms);
// 消息体开始(MIME multipart)
// 8.5.2 Multipart Header
// nEntries Uintvar The number of entries in the multipart entity
byte[] byFileCount = new byte[1];
byFileCount[0] = (byte)lFile.Count;
byMms = AppendOct(byFileCount, byMms);
// 8.5.3 Multipart Entry,逐个加入媒体文件
for (int j = 0; j < lFile.Count; j++)

byMms = AppendOct(GetMmsContent(lFile[j].ToString()), byMms);

return byMms;


// Tools
// 加入媒体文件到彩信内容中去
private byte[] GetMmsContent(string FileName)

// 每一个Multipart Entry由5个部分组成
/* HeadersLen
* DataLen
* ContentType
* Headers
* Data
* */
byte[] byHeaders = new byte[0]; // ContentType和Headers组合
byte[] byData = ReadFromFile(FileName);

string FileID = getContentId(FileName);
// Set content-type
if (FileName.EndsWith(".txt"))

byHeaders = new byte[1];
byHeaders[0] = (byte)(Encoding.ASCII.GetByteCount(FileID) + 5);
byHeaders = AppendOct(new byte[] 0x83, 0x85 , byHeaders); // Utf-8
byHeaders = AppendOct(Encoding.ASCII.GetBytes(FileID), byHeaders);
byHeaders = AppendOct(new byte[] 0x00 , byHeaders);
byHeaders = AppendOct(new byte[] 0x81, 0xEA , byHeaders);

else if (FileName.EndsWith(".gif"))

byHeaders = new byte[] 0x9D ;

else if (FileName.EndsWith(".mid") || FileName.EndsWith(".midi"))

byHeaders = Encoding.ASCII.GetBytes("audio/midi");
byHeaders = AppendOct(new byte[] 0x00 , byHeaders); // 文本需要以0x00结尾


// 加入Content-ID和Content-Location
byHeaders = AppendOct(new byte[] 0xC0, 0x22, 0x3C , byHeaders);
byHeaders = AppendOct(Encoding.ASCII.GetBytes(FileID), byHeaders);
byHeaders = AppendOct(new byte[] 0x3E, 0x00 , byHeaders);
//加入Content-Location
byHeaders = AppendOct(new byte[] 0x8E , byHeaders);
byHeaders = AppendOct(Encoding.ASCII.GetBytes(FileID), byHeaders);
byHeaders = AppendOct(new byte[] 0x00 , byHeaders);

byte[] byHeaderLen = encodeUintvar(byHeaders.Length);
byte[] byDataLen = encodeUintvar(byData.Length);

byte[] byMmc = new byte[byHeaderLen.Length + byDataLen.Length + byHeaders.Length + byData.Length];
Array.Copy(byHeaderLen, byMmc, byHeaderLen.Length);
Array.Copy(byDataLen, 0, byMmc, byHeaderLen.Length, byDataLen.Length);
Array.Copy(byHeaders, 0, byMmc, byHeaderLen.Length + byDataLen.Length, byHeaders.Length);
Array.Copy(byData, 0, byMmc, byHeaderLen.Length + byDataLen.Length + byHeaders.Length, byData.Length);

return byMmc;


private byte[] encodeUintvar(int n)

byte[] buf = new byte[8];
int l = 0;
while (n >= 128)

byte b = (byte)(n & 0x7F);
n = n >> 7;
buf[l++] = b;

buf[l++] = (byte)n;

byte[] retBys = new byte[l];
for (int i = 0; i < l; ++i)

retBys[i] = (byte)(buf[l - i - 1] | 0x80);

retBys[l - 1] &= 0x7F;
return retBys;


// 从文件中读取字节
private byte[] ReadFromFile(string FileName)

byte[] bf = new byte[0];
FileStream fs = null;
try

fs = new FileStream(FileName, FileMode.Open, FileAccess.ReadWrite, FileShare.None); // 没有设定Buffsize

catch (Exception e)

Console.WriteLine(e.ToString());

if (fs != null)

bf = new byte[fs.Length];
fs.Read(bf, 0, (int)fs.Length);
fs.Close();

return bf;

// 得到文件名(不包含文件夹部分)
private string getContentId(string FileName)

int at = FileName.LastIndexOf("\\\\");
if (at < 0)
return FileName;
else
return FileName.Substring(at + 1);

// 增加字节
private byte[] AppendOct(byte[] bys, byte[] byDest)

byte[] bysNew = new byte[byDest.Length + bys.Length];
try

Array.Copy(byDest, bysNew, byDest.Length);
Array.Copy(bys, 0, bysNew, byDest.Length, bys.Length);

catch (Exception e)

Console.WriteLine(e);

return bysNew;

// 增加字符串
private byte[] AppendOct(string sz, byte[] byDest)

return AppendOct(Encoding.Default.GetBytes(sz), byDest);



3)2004~2009年,开发了GPS车辆监控系统、GPS高尔夫辅助系统、GPS轨迹系统等。这几年一直和GPS打交道了,其中GPS车辆监控系统主要应用在北京市出租车上。为出租车司机保驾护航。那时还没有手机支付,还没有扫码支付,出租车司机一般收现金。所以出租车司机是那些大夫的重点青睐对象,社会上经常有抢劫司机的案件发生。通过本系统保护了大量的司机师傅,记得有一次司机被抢劫,通过系统精确定位了车辆位置,并对车辆进行管控,保护了司机师傅,抓获了罪犯。这个系统有时还为司机师傅的家庭矛盾做调节,记得曾经有个出租车师傅跟家里闹矛盾,驾车出走了,深夜不归。根据家属的请求及公安民警的准许,在午夜十分,对车辆进行监控,引导家属和师傅会面。随着微信、支付宝等手机支付的普及,抢劫出租车师傅的事情可能也逐渐消失了。GPS车辆监控的安防功能可能用的越来越少了。

4)2009至今,一直从事通信软件的开发。先后开发维护了IP(智能外设)彩铃系统、SS7(7号信令)网关、SIP(SIP信令)网关、SIGTRAN信令网关、视频彩铃、语音识别系统。先后经历了电信的3G、4G、5G通信系统的更新换代,IMS、NGN等这些系统更新的眼花缭乱。系统云化、大数据、虚拟化、NFV等等。哪些电路域,2M线接入的设备,纷纷下电退网。哪些跟不上形势的厂家纷纷淘汰,索尼、爱立信、阿尔卡特、贝尔、摩托罗拉、诺基亚这些厂家纷纷出局。华为、中兴鱼跃龙门,逐渐成为国内运行商的主流厂商、耀眼的明星。

先后敲过了数十万代码吧,开发过系统为现实的生活有过带来了一点点的实在用途。也算是为这个世界的美好,敲下代码做点微薄贡献吧。

以上是关于做了20年的老码农-历数做过的系统的主要内容,如果未能解决你的问题,请参考以下文章

本人是工作 11 年的老前端,面试一个月忽悠了十几个 offer

20多年老码农的IT学习之路

老码农眼中的CRM 图解

”去他丫的北上广,老子要去成都定居了!“一名33岁老码农有话说

《前端之路》之 初识 JavaScript

8年Android老码农现身分享:一个月面试6家大厂屡败屡战,那些面试学习上走过的弯路